diff --git a/admin/themes/default/template/controllers/orders/_product_line.tpl b/admin/themes/default/template/controllers/orders/_product_line.tpl index fe5039d2c..e68b185df 100644 --- a/admin/themes/default/template/controllers/orders/_product_line.tpl +++ b/admin/themes/default/template/controllers/orders/_product_line.tpl @@ -221,10 +221,14 @@ {/if} - {if isset($refundReqBookings) && $refundReqBookings} + {if (isset($refundReqBookings) && $refundReqBookings) || (isset($isCancelledRoom) && $isCancelledRoom)} - {if isset($data.refund_info) && $data.refund_info} + {if $data.is_cancelled} + {l s='Cancelled'} + {elseif isset($data.refund_info) && $data.refund_info} {$data.refund_info.name|escape:'html':'UTF-8'} + {else} + -- {/if} diff --git a/admin/themes/default/template/controllers/orders/_rooms_informaion_table.tpl b/admin/themes/default/template/controllers/orders/_rooms_informaion_table.tpl index 0419ec9cd..41d7b56c5 100644 --- a/admin/themes/default/template/controllers/orders/_rooms_informaion_table.tpl +++ b/admin/themes/default/template/controllers/orders/_rooms_informaion_table.tpl @@ -16,12 +16,12 @@ {l s='Extra Services/Fee (Tax excl.)'} {l s='Total Tax'} {l s='Total Price (Tax incl.)'} - {if isset($refundReqBookings) && $refundReqBookings} - {l s='Refund State'} + {if (isset($refundReqBookings) && $refundReqBookings) || (isset($isCancelledRoom) && $isCancelledRoom)} + {l s='Refund/Cancellation Status'} {l s='Refunded amount'} {/if} {if ($can_edit && !$order->hasBeenDelivered())} - {l s='Edit Order'} + {l s='Edit Order'} {/if} diff --git a/admin/themes/default/template/controllers/orders/helpers/view/view.tpl b/admin/themes/default/template/controllers/orders/helpers/view/view.tpl index cb757e317..0c58d10b2 100644 --- a/admin/themes/default/template/controllers/orders/helpers/view/view.tpl +++ b/admin/themes/default/template/controllers/orders/helpers/view/view.tpl @@ -281,55 +281,57 @@ {if isset($htl_booking_order_data) && $htl_booking_order_data} {foreach from=$htl_booking_order_data item=data} - - - {$data['room_num']} - - - - {$data['hotel_name']} - - - - {dateFormat date=$data['date_from']} - {dateFormat date=$data['date_to']} - - - - - {l s='Documents'} {$data.num_checkin_documents} - - - -
-
- + {if !$data.is_refunded} + + + {$data['room_num']} + + + + {$data['hotel_name']} + + + + {dateFormat date=$data['date_from']} - {dateFormat date=$data['date_to']} + + + + + {l s='Documents'} {$data.num_checkin_documents} + + + + +
+ - {if $data['id_status'] == $hotel_order_status['STATUS_CHECKED_IN']['id_status']} -

{l s='Checked in on'} {dateFormat date=$data['check_in']}

- {elseif $data['id_status'] == $hotel_order_status['STATUS_CHECKED_OUT']['id_status']} -

{l s='Checked out on'} {dateFormat date=$data['check_out']}

- {/if} + {if $data['id_status'] == $hotel_order_status['STATUS_CHECKED_IN']['id_status']} +

{l s='Checked in on'} {dateFormat date=$data['check_in']}

+ {elseif $data['id_status'] == $hotel_order_status['STATUS_CHECKED_OUT']['id_status']} +

{l s='Checked out on'} {dateFormat date=$data['check_out']}

+ {/if} - {* field for the current date *} - + {* field for the current date *} + - - - - -
-
- -
- - - + + + + +
+
+ +
+ + + + {/if} {/foreach} {else} @@ -2101,4 +2103,4 @@ }); -{/block} +{/block} \ No newline at end of file diff --git a/classes/Product.php b/classes/Product.php index 5be2d2244..84fc215a2 100644 --- a/classes/Product.php +++ b/classes/Product.php @@ -3078,7 +3078,7 @@ class ProductCore extends ObjectModel $address_infos = Address::getCountryAndState($id_address); } - if (isset($address_infos['id_country'])) { + if (isset($address_infos['id_country']) && $address_infos['id_country']) { $id_country = (int)$address_infos['id_country']; $id_state = (int)$address_infos['id_state']; $zipcode = $address_infos['postcode']; diff --git a/classes/order/Order.php b/classes/order/Order.php index ee5ed845d..73d0a801e 100644 --- a/classes/order/Order.php +++ b/classes/order/Order.php @@ -1781,7 +1781,7 @@ class OrderCore extends ObjectModel // We put autodate parameter of add method to true if date_add field is null if ($res = $order_payment->add(is_null($order_payment->date_add))) { if ($update_payment_detail) { - $res &= $this->addOrderPaymentDetail($order_payment, $amount_paid, $order_invoice); + $res = $res && $this->addOrderPaymentDetail($order_payment, $amount_paid, $order_invoice); } } @@ -2553,8 +2553,8 @@ class OrderCore extends ObjectModel // $refundFlag [ORDER_RETURN_STATE_FLAG_REFUNDED || ORDER_RETURN_STATE_FLAG_DENIED] public function hasCompletelyRefunded($refundFlag = 0) { + $objHotelBooking = new HotelBookingdetail(); if ($refundBookings = OrderReturn::getOrdersReturnDetail($this->id)) { - $objHotelBooking = new HotelBookingdetail(); if ($orderBookings = $objHotelBooking->getOrderCurrentDataByOrderId($this->id)) { if (count($refundBookings) == count($orderBookings)) { if ($refundFlag) { @@ -2578,6 +2578,12 @@ class OrderCore extends ObjectModel return true; } } + } elseif ($orderBookings = $objHotelBooking->getOrderCurrentDataByOrderId($this->id)) { + if (count(array_unique(array_column($orderBookings, 'is_cancelled'))) === 1 + && array_unique(array_column($orderBookings, 'is_cancelled'))[0] != 0 + ) { + return true; + } } return false; @@ -2599,4 +2605,4 @@ class OrderCore extends ObjectModel 'SELECT `id` FROM `'._DB_PREFIX_.'htl_booking_detail` WHERE `id_order` = '.(int)$this->id.' ORDER BY `id` ASC' ); } -} +} \ No newline at end of file diff --git a/classes/order/OrderReturn.php b/classes/order/OrderReturn.php index 0c27a44e7..92e0bad77 100644 --- a/classes/order/OrderReturn.php +++ b/classes/order/OrderReturn.php @@ -198,51 +198,43 @@ class OrderReturnCore extends ObjectModel $objBookingDemands = new HotelBookingDemands(); $objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail(); + $objOrder = new Order($idOrder); foreach ($returnDetails as &$bookingRow) { - $bookingRow['extra_demands_price_tax_incl'] = $objBookingDemands->getRoomTypeBookingExtraDemands( - $bookingRow['id_order'], - $bookingRow['id_product'], - $bookingRow['id_room'], - $bookingRow['date_from'], - $bookingRow['date_to'], - 0, - 1 - ); - $bookingRow['extra_demands_price_tax_excl'] = $objBookingDemands->getRoomTypeBookingExtraDemands( - $bookingRow['id_order'], - $bookingRow['id_product'], - $bookingRow['id_room'], - $bookingRow['date_from'], - $bookingRow['date_to'], - 0, - 1, - 0 - ); - $bookingRow['additional_services_tax_excl'] = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( - $bookingRow['id_order'], - 0, - 0, - $bookingRow['id_product'], - $bookingRow['date_from'], - $bookingRow['date_to'], - $bookingRow['id_room'], - 1, - 0, - null - ); - $bookingRow['additional_services_tax_incl'] = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( - $bookingRow['id_order'], - 0, - 0, - $bookingRow['id_product'], - $bookingRow['date_from'], - $bookingRow['date_to'], - $bookingRow['id_room'], - 1, - 1, - null - ); + $bookingRow['extra_service_total_paid_amount'] = 0; + $bookingRow['extra_service_total_price_tax_incl'] = 0; + $bookingRow['room_paid_amount'] = 0; + if ($objOrder->total_paid_real > 0) { + if ($bookingRow['total_price_tax_incl'] > 0) { + $bookingRow['room_paid_amount'] = ($objOrder->total_paid_real*$bookingRow['total_price_tax_incl'])/$objOrder->total_paid_tax_incl; + } + $roomSelectedDemands = $objBookingDemands->getRoomTypeBookingExtraDemands( + $idOrder, + $bookingRow['id_product'], + $bookingRow['id_room'], + $bookingRow['date_from'], + $bookingRow['date_to'], + 0 + ); + if (count($roomSelectedDemands)) { + foreach ($roomSelectedDemands as $demand) { + if ($demand['total_price_tax_incl'] > 0) { + $bookingRow['extra_service_total_paid_amount'] += ($objOrder->total_paid_real*$demand['total_price_tax_incl'])/$objOrder->total_paid_tax_incl; + $bookingRow['extra_service_total_price_tax_incl'] += $demand['total_price_tax_incl']; + } + } + } + if ($roomSelectedServices = $objRoomTypeServiceProductOrderDetail->getSelectedServicesForRoom($bookingRow['id_htl_booking'])) { + if (count($roomSelectedServices['additional_services'])) { + foreach ($roomSelectedServices['additional_services'] as $service) { + if ($service['total_price_tax_incl'] > 0) { + $bookingRow['extra_service_total_paid_amount'] += ($objOrder->total_paid_real*$service['total_price_tax_incl'])/$objOrder->total_paid_tax_incl; + $bookingRow['extra_service_total_price_tax_incl'] += $service['total_price_tax_incl']; + } + } + } + } + } if ($customerView) { $dateJoin = $bookingRow['id_product'].'_'.strtotime($bookingRow['date_from']).strtotime($bookingRow['date_to']); if (isset($returnsCustView[$dateJoin]['num_rooms'])) { @@ -250,10 +242,6 @@ class OrderReturnCore extends ObjectModel $returnsCustView[$dateJoin]['refunded_amount'] += $bookingRow['refunded_amount']; $returnsCustView[$dateJoin]['total_price_tax_incl'] += $bookingRow['total_price_tax_incl']; $returnsCustView[$dateJoin]['total_paid_amount'] += $bookingRow['total_paid_amount']; - $returnsCustView[$dateJoin]['extra_demands_price_tax_incl'] += $bookingRow['extra_demands_price_tax_incl']; - $returnsCustView[$dateJoin]['extra_demands_price_tax_incl'] += $bookingRow['additional_services_tax_incl']; - $returnsCustView[$dateJoin]['extra_demands_price_tax_excl'] += $bookingRow['extra_demands_price_tax_excl']; - $returnsCustView[$dateJoin]['extra_demands_price_tax_excl'] += $bookingRow['additional_services_tax_excl']; } else { unset($bookingRow['id_room']); unset($bookingRow['room_num']); @@ -277,10 +265,12 @@ class OrderReturnCore extends ObjectModel } $sql = 'SELECT orr.`id_order`, orr.`state`, orr.`id_order_return`, orr.`payment_mode`, orr.`id_transaction`, orr.`id_return_type`, orr.`return_type`, ors.`id_cart_rule`, orr.`date_add`, orr.`date_upd`, - COUNT(ord.`id_order_return_detail`) AS total_rooms + hbd.`is_cancelled`, COUNT(ord.`id_order_return_detail`) AS total_rooms FROM `'._DB_PREFIX_.'order_return` orr LEFT JOIN `'._DB_PREFIX_.'order_return_detail` ord ON (ord.`id_order_return` = orr.`id_order_return`) + LEFT JOIN `'._DB_PREFIX_.'htl_booking_detail` hbd + ON (hbd.`id` = ord.`id_htl_booking`) LEFT JOIN `'._DB_PREFIX_.'order_slip` ors ON (ors.`id_order_slip` = orr.`id_return_type` AND orr.`return_type` = '.(int) self::RETURN_TYPE_ORDER_SLIP.') WHERE orr.`id_customer` = '.(int)$customer_id. diff --git a/controllers/admin/AdminOrdersController.php b/controllers/admin/AdminOrdersController.php index 5f2f2f568..039260ad1 100644 --- a/controllers/admin/AdminOrdersController.php +++ b/controllers/admin/AdminOrdersController.php @@ -251,6 +251,7 @@ class AdminOrdersControllerCore extends AdminController $this->access_where = ' WHERE hbd.id_hotel IN ('.implode(',', $acsHtls).')'; } + parent::__construct(); } @@ -1729,6 +1730,10 @@ class AdminOrdersControllerCore extends AdminController $bookingOrderRoomInfo['num_checkin_documents'] = HotelBookingDocument::getCountByIdHtlBooking($bookingOrderRoomInfo['id']); } + $objHotelBookingDetail = new HotelBookingDetail(); + $htlBookingDetail = $objHotelBookingDetail->getOrderCurrentDataByOrderId($order->id); + $isCancelledRoom = in_array(1, array_column($htlBookingDetail, 'is_cancelled')); + // hotel booking statuses $htlOrderStatus = HotelBookingDetail::getAllHotelOrderStatus(); @@ -1826,6 +1831,7 @@ class AdminOrdersControllerCore extends AdminController 'products' => $products, 'customer' => $customer) ), + 'isCancelledRoom' => $isCancelledRoom, ); return parent::renderView(); @@ -3163,7 +3169,6 @@ class AdminOrdersControllerCore extends AdminController // delete cart feature prices after room addition success HotelRoomTypeFeaturePricing::deleteByIdCart($cart->id); - die(json_encode(array( 'result' => true, //'view' => $this->createTemplate('_product_line.tpl')->fetch(), @@ -3706,7 +3711,6 @@ class AdminOrdersControllerCore extends AdminController } $this->sendChangedNotification($order); - die(json_encode(array( 'result' => $res, 'view' => $view, @@ -4007,31 +4011,19 @@ class AdminOrdersControllerCore extends AdminController $objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail(); $additionlServicesTI = $objRoomTypeServiceProductOrderDetail->getSelectedServicesForRoom( - $id_order, - $id_product, - $date_from, - $date_to, - $id_room, + $idHotelBooking, 1, 1 ); $additionlServicesTE = $objRoomTypeServiceProductOrderDetail->getSelectedServicesForRoom( - $id_order, - $id_product, - $date_from, - $date_to, - $id_room, + $idHotelBooking, 1, 0 ); $selectedAdditonalServices = $objRoomTypeServiceProductOrderDetail->getSelectedServicesForRoom( - $id_order, - $id_product, - $date_from, - $date_to, - $id_room + $idHotelBooking ); @@ -4142,7 +4134,7 @@ class AdminOrdersControllerCore extends AdminController // delete the demands od this booking $objBookingDemand->deleteBookingDemands($idHotelBooking); - $objRoomTypeServiceProductOrderDetail->deleteRoomSevicesByIdHotelBookingDetail($idHotelBooking); + $objRoomTypeServiceProductOrderDetail->deleteRoomSevices($idHotelBooking); /*By webkul to delete cart and order entries from cart and order tables of hotelreservationsystem when delete booking form the order line in order detaoil page*/ $obj_htl_cart_booking = new HotelCartBookingData(); @@ -4162,7 +4154,6 @@ class AdminOrdersControllerCore extends AdminController )); $this->sendChangedNotification($order); - die(json_encode(array( 'result' => $res, 'order' => $order, @@ -4748,11 +4739,7 @@ class AdminOrdersControllerCore extends AdminController $objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail(); if ($additionalServices = $objRoomTypeServiceProductOrderDetail->getSelectedServicesForRoom( - $idOrder, - $idProduct, - $dateFrom, - $dateTo, - $idRoom + $htlBookingDetail['id'] )) { $smartyVars['additionalServices'] = $additionalServices; } @@ -4795,11 +4782,7 @@ class AdminOrdersControllerCore extends AdminController $smartyVars['id_booking_detail'] = $htlBookingDetail['id']; $objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail(); if ($additionalServices = $objRoomTypeServiceProductOrderDetail->getSelectedServicesForRoom( - $idOrder, - $idProduct, - $dateFrom, - $dateTo, - $idRoom + $htlBookingDetail['id'] )) { $smartyVars['additionalServices'] = $additionalServices; } diff --git a/controllers/front/OrderDetailController.php b/controllers/front/OrderDetailController.php index 286061863..196091216 100644 --- a/controllers/front/OrderDetailController.php +++ b/controllers/front/OrderDetailController.php @@ -242,7 +242,15 @@ class OrderDetailControllerCore extends FrontController } else { $hasError = 1; } + $res = true; if (!$hasError) { + if ((int)$order->total_paid_real == 0){ + foreach ($bookingRefunds as $idHtlBooking) { + $objHtlBooking = new HotelBookingDetail($idHtlBooking); + $objHtlBooking->save(); + } + } + $objOrderReturn = new OrderReturn(); $objOrderReturn->id_customer = $order->id_customer; $objOrderReturn->id_order = $order->id; @@ -381,6 +389,13 @@ class OrderDetailControllerCore extends FrontController if ($data_v['is_back_order']) { $anyBackOrder = 1; } + if ($data_v['is_refunded']) { + $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] += 1; + } + if ($data_v['is_cancelled']) { + $cartHotelData[$type_key]['date_diff'][$date_join]['count_cancelled'] += 1; + $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] -= 1; + } } else { $num_days = $objBookingDetail->getNumberOfDays($data_v['date_from'], $data_v['date_to']); $cartHotelData[$type_key]['date_diff'][$date_join]['num_rm'] = 1; @@ -400,8 +415,19 @@ class OrderDetailControllerCore extends FrontController if ($data_v['is_back_order']) { $anyBackOrder = 1; } + $cartHotelData[$type_key]['date_diff'][$date_join]['count_cancelled'] = 0; + $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] = 0; + if ($data_v['is_refunded']) { + $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] += 1; + } + if ($data_v['is_cancelled']) { + $cartHotelData[$type_key]['date_diff'][$date_join]['count_cancelled'] += 1; + $cartHotelData[$type_key]['date_diff'][$date_join]['count_refunded'] -= 1; + } } + $cartHotelData[$type_key]['date_diff'][$date_join]['is_refunded'] = $data_v['is_refunded']; + $cartHotelData[$type_key]['date_diff'][$date_join]['ids_htl_booking_detail'][] = $data_v['id']; $cartHotelData[$type_key]['date_diff'][$date_join]['extra_demands'] = $objBookingDemand->getRoomTypeBookingExtraDemands( @@ -575,6 +601,9 @@ class OrderDetailControllerCore extends FrontController $redirectTermsLink = $this->context->link->getCMSLink(new CMS(3, $this->context->language->id), null, $this->context->language->id); } + + $objHotelBookingDetail = new HotelBookingDetail(); + $htlBookingDetail = $objHotelBookingDetail->getOrderCurrentDataByOrderId($order->id); $this->context->smarty->assign( array( 'id_cms_refund_policy' => Configuration::get('WK_GLOBAL_REFUND_POLICY_CMS'), @@ -664,4 +693,4 @@ class OrderDetailControllerCore extends FrontController $this->addCSS(_THEME_CSS_DIR_.'addresses.css'); } } -} +} \ No newline at end of file diff --git a/controllers/front/OrderReturnController.php b/controllers/front/OrderReturnController.php index a1a16e861..6e59569b2 100644 --- a/controllers/front/OrderReturnController.php +++ b/controllers/front/OrderReturnController.php @@ -51,11 +51,17 @@ class OrderReturnControllerCore extends FrontController $orderCurrency = new Currency($objOrder->id_currency); $refundReqBookings = $objOrderReturn->getOrderRefundRequestedBookings($objOrderReturn->id_order, $objOrderReturn->id, 0, 1); - + $isCanceled = false; + if (count(array_unique(array_column($refundReqBookings, 'is_cancelled'))) === 1 + && array_unique(array_column($refundReqBookings, 'is_cancelled'))[0] != 0 + ) { + $isCanceled = true; + } $this->context->smarty->assign( array ( 'orderReturnInfo' => (array)$objOrderReturn, 'refundReqBookings' => $refundReqBookings, + 'isCanceled' => $isCanceled, 'orderInfo' => (array) $objOrder, 'orderCurrency' => (array) $orderCurrency, 'currentStateInfo' => (array) new OrderReturnState($objOrderReturn->state, diff --git a/install/data/xml/configuration.xml b/install/data/xml/configuration.xml index c9babed8d..935de20ba 100644 --- a/install/data/xml/configuration.xml +++ b/install/data/xml/configuration.xml @@ -906,4 +906,4 @@ 1 - + \ No newline at end of file diff --git a/modules/hotelreservationsystem/classes/HotelBookingDetail.php b/modules/hotelreservationsystem/classes/HotelBookingDetail.php index b3d34ef58..8f2b3ad49 100644 --- a/modules/hotelreservationsystem/classes/HotelBookingDetail.php +++ b/modules/hotelreservationsystem/classes/HotelBookingDetail.php @@ -44,6 +44,7 @@ class HotelBookingDetail extends ObjectModel public $is_back_order; public $id_status; public $is_refunded; + public $is_cancelled; // public $available_for_order; // hotel information/location/contact @@ -107,6 +108,7 @@ class HotelBookingDetail extends ObjectModel 'total_price_tax_incl' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice', 'required' => true), 'total_paid_amount' => array('type' => self::TYPE_FLOAT, 'validate' => 'isPrice', 'default' => 0, 'required' => true), 'is_refunded' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), + 'is_cancelled' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), // 'available_for_order' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'is_back_order' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), diff --git a/modules/hotelreservationsystem/classes/HotelOrderRefundRules.php b/modules/hotelreservationsystem/classes/HotelOrderRefundRules.php index 491c82c29..12ed9ae83 100644 --- a/modules/hotelreservationsystem/classes/HotelOrderRefundRules.php +++ b/modules/hotelreservationsystem/classes/HotelOrderRefundRules.php @@ -126,17 +126,16 @@ class HotelOrderRefundRules extends ObjectModel return Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'htl_order_refund_rules` WHERE days='.$days); } - public function calculateDeductionAmountFromRefundRules($idOrder, $idOrderReturn = 0, $idHtlBooking = 0) + public function getBookingCancellationDetails($idOrder, $idOrderReturn = 0, $idHtlBooking = 0) { - $totalCancelationCharges = 0; - + $bookingCancellations = array(); $objHtlRefundRules = new HotelBranchRefundRules(); $objHotelBookingDemands = new HotelBookingDemands(); $objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail(); if ($bookingsToRefund = OrderReturn::getOrdersReturnDetail($idOrder, $idOrderReturn, $idHtlBooking)) { foreach ($bookingsToRefund as $booking) { - $bookingCancellationCharge = 0; + $bookingCancellationDetail = array(); if (Validate::isLoadedObject($objHtlBooking = new HotelBookingDetail($booking['id_htl_booking']))) { $objOrder = new Order($objHtlBooking->id_order); @@ -153,17 +152,10 @@ class HotelOrderRefundRules extends ObjectModel 1 ); - $totalServicesPrice = $objRoomTypeServiceProductOrderDetail->getroomTypeServiceProducts( - $objHtlBooking->id_order, - 0, - 0, - $objHtlBooking->id_product, - $objHtlBooking->date_from, - $objHtlBooking->date_to, - $objHtlBooking->id_room, + $totalServicesPrice = $objRoomTypeServiceProductOrderDetail->getSelectedServicesForRoom( + $objHtlBooking->id, 1, - 1, - null + 1 ); if ($refundRules = $objHtlRefundRules->getHotelRefundRules($objHtlBooking->id_hotel, 0, 1)) { @@ -189,31 +181,34 @@ class HotelOrderRefundRules extends ObjectModel } else { $refundValue = $refRule['deduction_value_full_pay']; } + $bookingCancellationDetail['reduction_value'] = $refundValue; if ($refRule['payment_type'] == HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE) { - $bookingCancellationCharge = $paidAmount * ($refundValue / 100); + $bookingCancellationDetail['reduction_type'] = HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE; + $bookingCancellationDetail['cancelation_charge'] = $paidAmount * ($refundValue / 100); if ($defaultCurrency != $orderCurrency) { - $bookingCancellationCharge = Tools::convertPriceFull( - $bookingCancellationCharge, + $bookingCancellationDetail['cancelation_charge'] = Tools::convertPriceFull( + $bookingCancellationDetail['cancelation_charge'], $objDefaultCurrency, $objOrderCurrency ); } } else { + $bookingCancellationDetail['reduction_type'] = HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_FIXED; if ($defaultCurrency != $orderCurrency) { - $bookingCancellationCharge = Tools::convertPriceFull( + $bookingCancellationDetail['cancelation_charge'] = Tools::convertPriceFull( $refundValue, $objDefaultCurrency, $objOrderCurrency ); } else { - $bookingCancellationCharge = $refundValue; + $bookingCancellationDetail['cancelation_charge'] = $refundValue; } // if deduction amount is more than the order total cost - if ($bookingCancellationCharge > $paidAmount) { - $bookingCancellationCharge = $paidAmount; + if ($bookingCancellationDetail['cancelation_charge'] > $paidAmount) { + $bookingCancellationDetail['cancelation_charge'] = $paidAmount; } } @@ -223,18 +218,22 @@ class HotelOrderRefundRules extends ObjectModel } if (!$ruleApplied) { - $bookingCancellationCharge = ($objHtlBooking->total_price_tax_incl + $totalDemandsPrice); + $bookingCancellationDetail['cancelation_charge'] = ($objHtlBooking->total_price_tax_incl + $totalDemandsPrice); + $bookingCancellationDetail['reduction_type'] = HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE; + $bookingCancellationDetail['reduction_value'] = 100; } } else { - $bookingCancellationCharge = ($objHtlBooking->total_price_tax_incl + $totalDemandsPrice); + $bookingCancellationDetail['cancelation_charge'] = ($objHtlBooking->total_price_tax_incl + $totalDemandsPrice); + $bookingCancellationDetail['reduction_type'] = HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE; + $bookingCancellationDetail['reduction_value'] = 100; } } - $totalCancelationCharges += $bookingCancellationCharge; + $bookingCancellations[] = $bookingCancellationDetail; } } - return $totalCancelationCharges; + return $bookingCancellations; } public static function getApplicableRefundRules($idOrder) diff --git a/modules/hotelreservationsystem/classes/HotelReservationSystemDb.php b/modules/hotelreservationsystem/classes/HotelReservationSystemDb.php index 9518df583..5e8a45c1e 100644 --- a/modules/hotelreservationsystem/classes/HotelReservationSystemDb.php +++ b/modules/hotelreservationsystem/classes/HotelReservationSystemDb.php @@ -174,6 +174,7 @@ class HotelReservationSystemDb `children` smallint(6) NOT NULL DEFAULT '0', `child_ages` text NOT NULL, `is_refunded` tinyint(1) NOT NULL DEFAULT '0', + `is_cancelled` tinyint(1) NOT NULL DEFAULT '0', -- `available_for_order` tinyint(1) NOT NULL DEFAULT '0', `date_add` datetime NOT NULL, `date_upd` datetime NOT NULL, @@ -561,4 +562,4 @@ class HotelReservationSystemDb `'._DB_PREFIX_.'htl_access`' ); } -} +} \ No newline at end of file diff --git a/modules/hotelreservationsystem/classes/RoomTypeServiceProductOrderDetail.php b/modules/hotelreservationsystem/classes/RoomTypeServiceProductOrderDetail.php index 6e6f16e7b..4557cb4f0 100644 --- a/modules/hotelreservationsystem/classes/RoomTypeServiceProductOrderDetail.php +++ b/modules/hotelreservationsystem/classes/RoomTypeServiceProductOrderDetail.php @@ -185,11 +185,7 @@ class RoomTypeServiceProductOrderDetail extends ObjectModel } public function getSelectedServicesForRoom( - $idOrder, - $roomTypeIdProduct, - $dateFrom, - $dateTo, - $idRoom, + $idHotelBookingDetail, $getTotalPrice = 0, $useTax = null ) { @@ -204,9 +200,11 @@ class RoomTypeServiceProductOrderDetail extends ObjectModel od.`product_auto_add`, od.`product_price_calculation_method`, od.`product_price_addition_type`'; } $sql .= ' FROM `'._DB_PREFIX_.'htl_booking_detail` hbd - LEFT JOIN `'._DB_PREFIX_.'htl_room_type_service_product_order_detail` rsod ON(rsod.`id_htl_booking_detail` = hbd.`id`)'; + INNER JOIN `'._DB_PREFIX_.'htl_room_type_service_product_order_detail` rsod ON(rsod.`id_htl_booking_detail` = hbd.`id`)'; + $sql .= ' LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON(od.`id_order_detail` = rsod.`id_order_detail`)'; - $sql .= ' WHERE rsod.`id_order` = '.(int)$idOrder.' AND hbd.`id_product`='.(int) $roomTypeIdProduct .' AND hbd.`date_from` = \''.pSQL($dateFrom).'\' AND hbd.`date_to` = \''.pSQL($dateTo).'\' AND hbd.`id_room`='.(int) $idRoom; + + $sql .= ' WHERE hbd.`id` = '.(int)$idHotelBookingDetail; if ($getTotalPrice) { $totalPrice = 0; @@ -274,7 +272,7 @@ class RoomTypeServiceProductOrderDetail extends ObjectModel return $selectedAdditionalServices; } - public function deleteRoomSevicesByIdHotelBookingDetail($idHotelBookingDetail) + public function deleteRoomSevices($idHotelBookingDetail) { $services = Db::getInstance()->executeS( 'SELECT `id_room_type_service_product_order_detail` FROM `'._DB_PREFIX_.'htl_room_type_service_product_order_detail` pod diff --git a/modules/hotelreservationsystem/controllers/admin/AdminOrderRefundRequestsController.php b/modules/hotelreservationsystem/controllers/admin/AdminOrderRefundRequestsController.php index fe6d7f78c..f943ac8c8 100644 --- a/modules/hotelreservationsystem/controllers/admin/AdminOrderRefundRequestsController.php +++ b/modules/hotelreservationsystem/controllers/admin/AdminOrderRefundRequestsController.php @@ -220,11 +220,12 @@ class AdminOrderRefundRequestsController extends ModuleAdminController $objRefundRules = new HotelOrderRefundRules(); if ($refundReqBookings = $objOrderReturn->getOrderRefundRequestedBookings($objOrderReturn->id_order, $objOrderReturn->id)){ foreach ($refundReqBookings as &$booking) { - $booking['cancelation_charge'] = $objRefundRules->calculateDeductionAmountFromRefundRules( + $bookingCharges = $objRefundRules->getBookingCancellationDetails( $objOrderReturn->id_order, $objOrderReturn->id, $booking['id'] ); + $booking = array_merge($booking, array_shift($bookingCharges)); } } @@ -279,8 +280,7 @@ class AdminOrderRefundRequestsController extends ModuleAdminController if (Validate::isLoadedObject($objRefundState = new OrderReturnState($idRefundState))) { if ($objRefundState->refunded) { $refundedAmounts = Tools::getValue('refund_amounts'); - - if ((float) $orderTotalPaid) { + if ((float) $orderTotalPaid > 0) { if ($idsReturnDetail && count($idsReturnDetail)) { if ($refundedAmounts) { foreach ($idsReturnDetail as $idRetDetail) { @@ -327,6 +327,8 @@ class AdminOrderRefundRequestsController extends ModuleAdminController $totalRefundedAmount = 0; if ($objRefundState->refunded || $objRefundState->denied) { + $objHotelBookingDemands = new HotelBookingDemands(); + $objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail(); foreach ($idsReturnDetail as $idRetDetail) { $objOrderReturnDetail = new OrderReturnDetail($idRetDetail); @@ -334,24 +336,75 @@ class AdminOrderRefundRequestsController extends ModuleAdminController $idHtlBooking = $objOrderReturnDetail->id_htl_booking; $numDays = 1; $idOrderDetail = 0; + $reduction_amount = array( + 'total_price_tax_excl' => 0, + 'total_price_tax_incl' => 0, + 'total_products_tax_excl' => 0, + 'total_products_tax_incl' => 0, + ); if (Validate::isLoadedObject($objHtlBooking = new HotelBookingDetail($idHtlBooking))) { $objHtlBooking->is_refunded = 1; - - // if (Tools::isSubmit('unavailable_for_order')) { - // $objHtlBooking->available_for_order = 0; - // } else { - // $objHtlBooking->available_for_order = 1; - // } - - $objHtlBooking->is_refunded = 1; - - $objHtlBooking->save(); - $numDays = $objHtlBooking->getNumberOfDays( $objHtlBooking->date_from, $objHtlBooking->date_to ); + if ((float) $orderTotalPaid <= 0) { + $reduction_amount['total_price_tax_excl'] = $objHtlBooking->total_price_tax_excl; + $reduction_amount['total_products_tax_excl'] = $objHtlBooking->total_price_tax_excl; + $reduction_amount['total_price_tax_incl'] = $objHtlBooking->total_price_tax_incl; + $reduction_amount['total_products_tax_incl'] = $objHtlBooking->total_price_tax_incl; + // reduce facilities amount from order and services_detail + if ($roomDemands = $objHotelBookingDemands->getRoomTypeBookingExtraDemands( + $objHtlBooking->id_order, + $objHtlBooking->id_product, + $objHtlBooking->id_room, + $objHtlBooking->date_from, + $objHtlBooking->date_to, + 0 + )) { + foreach ($roomDemands as $roomDemand) { + $objHotelBookingDemands = new HotelBookingDemands($roomDemand['id_booking_demand']); + $reduction_amount['total_price_tax_excl'] += $objHotelBookingDemands->total_price_tax_excl; + $reduction_amount['total_price_tax_incl'] += $objHotelBookingDemands->total_price_tax_incl; + $objHotelBookingDemands->total_price_tax_excl = 0; + $objHotelBookingDemands->total_price_tax_incl = 0; + $objHotelBookingDemands->save(); + } + } + + // reduce services amount from order and services_detail + if ($roomServices = $objRoomTypeServiceProductOrderDetail->getSelectedServicesForRoom( + $objHtlBooking->id + )) { + foreach ($roomServices['additional_services'] as $roomService) { + $objRoomTypeServiceProductOrderDetail = new RoomTypeServiceProductOrderDetail( + $roomService['id_room_type_service_product_order_detail'] + ); + $reduction_amount['total_price_tax_excl'] += $objRoomTypeServiceProductOrderDetail->total_price_tax_excl; + $reduction_amount['total_products_tax_excl'] += $objRoomTypeServiceProductOrderDetail->total_price_tax_excl; + $reduction_amount['total_price_tax_incl'] += $objRoomTypeServiceProductOrderDetail->total_price_tax_incl; + $reduction_amount['total_products_tax_incl'] += $objRoomTypeServiceProductOrderDetail->total_price_tax_incl; + + if (Validate::isLoadedObject($objOrderDetail = new OrderDetail($objRoomTypeServiceProductOrderDetail->id_order_detail))) { + $objOrderDetail->product_quantity_refunded += $objRoomTypeServiceProductOrderDetail->quantity; + if ($objOrderDetail->product_quantity_refunded > $objOrderDetail->product_quantity) { + $objOrderDetail->product_quantity_refunded = $objOrderDetail->product_quantity; + } + + $objOrderDetail->total_price_tax_excl -= $objRoomTypeServiceProductOrderDetail->total_price_tax_excl; + $objOrderDetail->total_price_tax_incl -= $objRoomTypeServiceProductOrderDetail->total_price_tax_incl; + $objOrderDetail->save(); + } + + $objRoomTypeServiceProductOrderDetail->total_price_tax_excl = 0; + $objRoomTypeServiceProductOrderDetail->total_price_tax_incl = 0; + $objRoomTypeServiceProductOrderDetail->save(); + } + } + + } + // enter refunded quantity in the order detail table $idOrderDetail = $objHtlBooking->id_order_detail; if (Validate::isLoadedObject($objOrderDetail = new OrderDetail($idOrderDetail))) { @@ -359,8 +412,29 @@ class AdminOrderRefundRequestsController extends ModuleAdminController if ($objOrderDetail->product_quantity_refunded > $objOrderDetail->product_quantity) { $objOrderDetail->product_quantity_refunded = $objOrderDetail->product_quantity; } + + if ((float) $orderTotalPaid <= 0) { + // reduce room amount from order and order detail + $objOrderDetail->total_price_tax_incl -= $objHtlBooking->total_price_tax_incl; + $objOrderDetail->total_price_tax_excl -= $objHtlBooking->total_price_tax_excl; + if (Validate::isLoadedObject($objOrder = new Order($objHtlBooking->id_order))) { + $objOrder->total_paid -= $reduction_amount['total_price_tax_incl']; + $objOrder->total_paid_tax_excl -= $reduction_amount['total_price_tax_excl']; + $objOrder->total_paid_tax_incl -= $reduction_amount['total_price_tax_incl']; + $objOrder->total_products -= $reduction_amount['total_products_tax_excl']; + $objOrder->total_products_wt -= $reduction_amount['total_products_tax_incl']; + $objOrder->save(); + } + } $objOrderDetail->save(); } + if ((float) $orderTotalPaid <= 0) { + // reduce room amount from htl_booking_detail + $objHtlBooking->is_cancelled = 1; + $objHtlBooking->total_price_tax_excl = 0; + $objHtlBooking->total_price_tax_incl = 0; + } + $objHtlBooking->save(); } // save individual booking amount for every booking refund @@ -387,7 +461,7 @@ class AdminOrderRefundRequestsController extends ModuleAdminController } // if bookings are refunded then set the payment information - if ($objRefundState->refunded) { + if ($objRefundState->refunded && (float) $orderTotalPaid > 0) { if (Tools::isSubmit('refundTransactionAmount')) { $objOrderReturn->payment_mode = $paymentMode; $objOrderReturn->id_transaction = $idTransaction; diff --git a/modules/hotelreservationsystem/controllers/admin/AdminOrderRefundRulesController.php b/modules/hotelreservationsystem/controllers/admin/AdminOrderRefundRulesController.php index 33f8cb1c3..ffcf6ec19 100644 --- a/modules/hotelreservationsystem/controllers/admin/AdminOrderRefundRulesController.php +++ b/modules/hotelreservationsystem/controllers/admin/AdminOrderRefundRulesController.php @@ -52,7 +52,8 @@ class AdminOrderRefundRulesController extends ModuleAdminController ); $paymentType = array( - HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE => 'Percentage', HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_FIXED => 'Fixed' + HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE => 'Percentage', + HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_FIXED => 'Fixed' ); $this->fields_list = array( @@ -316,4 +317,4 @@ class AdminOrderRefundRulesController extends ModuleAdminController $this->addJs(_MODULE_DIR_.$this->module->name.'/views/js/admin/wk_refund_rule.js'); $this->addJS(_MODULE_DIR_.$this->module->name.'/views/js/HotelReservationAdmin.js'); } -} +} \ No newline at end of file diff --git a/modules/hotelreservationsystem/views/templates/admin/order_refund_requests/helpers/view/view.tpl b/modules/hotelreservationsystem/views/templates/admin/order_refund_requests/helpers/view/view.tpl index b099aa1ba..3149ab90f 100644 --- a/modules/hotelreservationsystem/views/templates/admin/order_refund_requests/helpers/view/view.tpl +++ b/modules/hotelreservationsystem/views/templates/admin/order_refund_requests/helpers/view/view.tpl @@ -118,8 +118,9 @@ {l s='Room type' mod='hotelreservationsystem'} {l s='Hotel' mod='hotelreservationsystem'} {l s='Duration' mod='hotelreservationsystem'} - {l s='Total rooms paid (tax incl.)'} - {l s='Additional services price (tax incl.)'} + {l s='Total room cost (tax incl.)'} + {l s='Room amount paid (tax incl.)'} + {l s='Additional services amount paid (tax incl.)'} {if !$isRefundCompleted} {l s='Rooms cancelation charges' mod='hotelreservationsystem'} {/if} @@ -136,10 +137,16 @@ {$booking['room_type_name']|escape:'htmlall':'UTF-8'} {$booking['hotel_name']|escape:'htmlall':'UTF-8'} {$booking['date_from']|date_format:"%d-%m-%Y"} {l s='To' mod='hotelreservationsystem'} {$booking['date_to']|date_format:"%d-%m-%Y"} - {displayPrice price=$booking['total_paid_amount'] currency=$orderCurrency['id']} - {displayPrice price=($booking['extra_demands_price_tax_incl'] + $booking['additional_services_tax_incl']) currency=$orderCurrency['id']} + {displayPrice price=$booking['total_price_tax_incl'] currency=$orderCurrency['id']} + {displayPrice price=$booking['room_paid_amount'] currency=$orderCurrency['id']} + {displayPrice price=$booking['extra_service_total_paid_amount'] currency=$orderCurrency['id']} {if !$isRefundCompleted} - {displayPrice price=$booking['cancelation_charge'] currency=$orderCurrency['id']} + + {displayPrice price=$booking['cancelation_charge'] currency=$orderCurrency['id']} + {if $booking['reduction_type'] == HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE} +

{Tools::ps_round($booking['reduction_value'])}{l s='% of'} {displayPrice price=$booking['total_price_tax_incl'] currency=$orderCurrency['id']}

+ {/if} + {/if} {if $orderTotalPaid|floatval} @@ -148,7 +155,7 @@ {displayPrice price=$booking['refunded_amount'] currency=$orderCurrency['id']} {else} {$orderCurrency['sign']|escape:'html':'UTF-8'} - + {l s='tax incl.' mod='hotelreservationsystem'} {/if} @@ -229,7 +236,7 @@
@@ -330,4 +337,4 @@ - + \ No newline at end of file diff --git a/themes/hotel-reservation-theme/order-detail.tpl b/themes/hotel-reservation-theme/order-detail.tpl index 5e932891b..532599299 100644 --- a/themes/hotel-reservation-theme/order-detail.tpl +++ b/themes/hotel-reservation-theme/order-detail.tpl @@ -23,684 +23,692 @@ * International Registered Trademark & Property of PrestaShop SA *} {if isset($order)} -
- {if isset($reorderingAllowed) && $reorderingAllowed} -
- - +
+ {if isset($reorderingAllowed) && $reorderingAllowed} + + + - {* {l s='Reorder'} -->