Fixed: Tourism tax flow and code review changes implemented
This commit is contained in:
@@ -505,6 +505,7 @@ abstract class PaymentModuleCore extends Module
|
||||
$objMail = new Mail();
|
||||
$objServiceProductCartDetail = new ServiceProductCartDetail();
|
||||
$cart_rules = $this->context->cart->getCartRules();
|
||||
$useTourismTax = (bool) Configuration::get('QLO_USE_TOURISM_TAX');
|
||||
foreach ($order_detail_list as $key => $order_detail) {
|
||||
/** @var OrderDetail $order_detail */
|
||||
|
||||
@@ -902,41 +903,34 @@ abstract class PaymentModuleCore extends Module
|
||||
}
|
||||
}
|
||||
if ($objBookingDetail->save()) {
|
||||
if (Configuration::get('QLO_USE_TOURISM_TAX')) {
|
||||
$idTourismTrg = (int) Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(
|
||||
'SELECT `id_tourism_tax_rules_group`
|
||||
FROM `' . _DB_PREFIX_ . 'product_shop` product_shop
|
||||
WHERE `id_product` = ' . (int) $idProduct
|
||||
. Shop::addSqlRestriction(false, 'product_shop')
|
||||
if ($useTourismTax && ($idTourismTaxRulesGroup = Product::getIdTourismTaxRulesGroupByIdProduct($idProduct))) {
|
||||
$hotelTaxContext = TourismTax::resolveHotelAddressAndCollectionType(
|
||||
(int) $objCartBookingData->id_hotel,
|
||||
new Address((int) Cart::getIdAddressForTaxCalculation($idProduct))
|
||||
);
|
||||
$numNights = max(1, (int) HotelHelper::getNumberOfDays($objBookingDetail->date_from, $objBookingDetail->date_to));
|
||||
$numAdults = (int) $objCartBookingData->adults;
|
||||
$childAges = !empty($objCartBookingData->child_ages) ? (array) json_decode($objCartBookingData->child_ages, true) : array();
|
||||
$unitPriceTaxExcl = (float) $total_price['total_price_tax_excl'] / $numNights;
|
||||
|
||||
OrderTourismTax::saveTourismTax(
|
||||
$idTourismTaxRulesGroup,
|
||||
$hotelTaxContext['address'],
|
||||
$unitPriceTaxExcl,
|
||||
$objBookingDetail->date_from,
|
||||
$numNights,
|
||||
$numAdults,
|
||||
$childAges,
|
||||
(int) $this->context->cart->id_currency,
|
||||
$hotelTaxContext['collectionType'],
|
||||
(int) $idLang,
|
||||
1,
|
||||
$order->id,
|
||||
(int) $id_order_detail,
|
||||
$objBookingDetail->id,
|
||||
0,
|
||||
(int) $objCartBookingData->id_hotel
|
||||
);
|
||||
if ($idTourismTrg) {
|
||||
$htlTaxAddressId = Cart::getIdAddressForTaxCalculation($idProduct);
|
||||
$htlTaxAddress = new Address($htlTaxAddressId ?: 0);
|
||||
$checkInDt = new DateTime($objBookingDetail->date_from);
|
||||
$checkOutDt = new DateTime($objBookingDetail->date_to);
|
||||
$ttNumNights = max(1, (int) $checkInDt->diff($checkOutDt)->days);
|
||||
$ttNumAdults = (int) $objCartBookingData->adults;
|
||||
$ttChildAges = !empty($objCartBookingData->child_ages) ? (array) json_decode($objCartBookingData->child_ages, true) : array();
|
||||
$ttUnitTe = (float) $total_price['total_price_tax_excl'] / $ttNumNights;
|
||||
$ttCollType = Validate::isLoadedObject($objHotelBranch) ? (int) $objHotelBranch->tourism_tax_collection_type : 0;
|
||||
|
||||
HotelTourismTaxCalculator::computeAndSave(
|
||||
$order->id,
|
||||
(int) $id_order_detail,
|
||||
$objBookingDetail->id,
|
||||
(int) $objCartBookingData->id_hotel,
|
||||
$idTourismTrg,
|
||||
$htlTaxAddress,
|
||||
$ttUnitTe,
|
||||
$objBookingDetail->date_from,
|
||||
$ttNumNights,
|
||||
$ttNumAdults,
|
||||
$ttChildAges,
|
||||
(int) $this->context->cart->id_currency,
|
||||
$ttCollType,
|
||||
(int) $idLang
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// save extra demands info
|
||||
@@ -1038,7 +1032,29 @@ abstract class PaymentModuleCore extends Module
|
||||
$objServiceProductOrderDetail->name = $product['name'];
|
||||
$objServiceProductOrderDetail->quantity = $roomTypeService['quantity'];
|
||||
$objServiceProductOrderDetail->auto_added = $product['auto_add_to_cart'];
|
||||
$objServiceProductOrderDetail->save();
|
||||
if ($objServiceProductOrderDetail->save()) {
|
||||
if ($useTourismTax && ($idTourismTaxRulesGroup = Product::getIdTourismTaxRulesGroupByIdProduct($idProduct))) {
|
||||
$tourismTaxContext = TourismTax::resolveServiceLineTaxContext($roomBookingDetail['id_hotel'], $roomBookingDetail['id'], new Address((int) Cart::getIdAddressForTaxCalculation($idProduct)));
|
||||
OrderTourismTax::saveTourismTax(
|
||||
$idTourismTaxRulesGroup,
|
||||
$tourismTaxContext['address'],
|
||||
(float) $objServiceProductOrderDetail->unit_price_tax_excl,
|
||||
$tourismTaxContext['checkInDate'],
|
||||
$tourismTaxContext['numNights'],
|
||||
$tourismTaxContext['numAdults'],
|
||||
$tourismTaxContext['childrenAges'],
|
||||
(int) $this->context->cart->id_currency,
|
||||
$tourismTaxContext['collectionType'],
|
||||
(int) $idLang,
|
||||
(int) $objServiceProductOrderDetail->quantity,
|
||||
$order->id,
|
||||
(int) $objServiceProductOrderDetail->id_order_detail,
|
||||
0,
|
||||
(int) $objServiceProductOrderDetail->id,
|
||||
(int) $roomBookingDetail['id_hotel']
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} elseif (Product::SELLING_PREFERENCE_HOTEL_STANDALONE == $product['selling_preference_type']) {
|
||||
@@ -1071,7 +1087,29 @@ abstract class PaymentModuleCore extends Module
|
||||
$objServiceProductOrderDetail->hotel_name = $objHotelBranch->hotel_name;
|
||||
}
|
||||
$objServiceProductOrderDetail->quantity = $hotelProduct['quantity'];
|
||||
$objServiceProductOrderDetail->save();
|
||||
if ($objServiceProductOrderDetail->save()) {
|
||||
if ($useTourismTax && ($idTourismTaxRulesGroup = Product::getIdTourismTaxRulesGroupByIdProduct($idProduct))) {
|
||||
$tourismTaxContext = TourismTax::resolveServiceLineTaxContext($product['id_hotel'], 0, new Address((int) Cart::getIdAddressForTaxCalculation($idProduct)));
|
||||
OrderTourismTax::saveTourismTax(
|
||||
$idTourismTaxRulesGroup,
|
||||
$tourismTaxContext['address'],
|
||||
(float) $objServiceProductOrderDetail->unit_price_tax_excl,
|
||||
$tourismTaxContext['checkInDate'],
|
||||
$tourismTaxContext['numNights'],
|
||||
$tourismTaxContext['numAdults'],
|
||||
$tourismTaxContext['childrenAges'],
|
||||
(int) $this->context->cart->id_currency,
|
||||
$tourismTaxContext['collectionType'],
|
||||
(int) $idLang,
|
||||
(int) $objServiceProductOrderDetail->quantity,
|
||||
$order->id,
|
||||
(int) $objServiceProductOrderDetail->id_order_detail,
|
||||
0,
|
||||
(int) $objServiceProductOrderDetail->id,
|
||||
(int) $product['id_hotel']
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1099,7 +1137,29 @@ abstract class PaymentModuleCore extends Module
|
||||
$objServiceProductOrderDetail->name = $standaloneProduct['name'];
|
||||
$objServiceProductOrderDetail->option_name = $standaloneProduct['option_name'];
|
||||
$objServiceProductOrderDetail->quantity = $standaloneProduct['quantity'];
|
||||
$objServiceProductOrderDetail->save();
|
||||
if ($objServiceProductOrderDetail->save()) {
|
||||
if ($useTourismTax && ($idTourismTaxRulesGroup = Product::getIdTourismTaxRulesGroupByIdProduct($idProduct))) {
|
||||
$tourismTaxContext = TourismTax::resolveServiceLineTaxContext(0, 0, new Address((int) Cart::getIdAddressForTaxCalculation($idProduct)));
|
||||
OrderTourismTax::saveTourismTax(
|
||||
$idTourismTaxRulesGroup,
|
||||
$tourismTaxContext['address'],
|
||||
(float) $objServiceProductOrderDetail->unit_price_tax_excl,
|
||||
$tourismTaxContext['checkInDate'],
|
||||
$tourismTaxContext['numNights'],
|
||||
$tourismTaxContext['numAdults'],
|
||||
$tourismTaxContext['childrenAges'],
|
||||
(int) $this->context->cart->id_currency,
|
||||
$tourismTaxContext['collectionType'],
|
||||
(int) $idLang,
|
||||
(int) $objServiceProductOrderDetail->quantity,
|
||||
$order->id,
|
||||
(int) $objServiceProductOrderDetail->id_order_detail,
|
||||
0,
|
||||
(int) $objServiceProductOrderDetail->id,
|
||||
0
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1156,7 +1216,31 @@ abstract class PaymentModuleCore extends Module
|
||||
$objServiceProductOrderDetail->id_htl_booking_detail = $roomBookingDetail['id'];
|
||||
$objServiceProductOrderDetail->auto_added = $product['auto_add_to_cart'];
|
||||
}
|
||||
$objServiceProductOrderDetail->save();
|
||||
if ($objServiceProductOrderDetail->save()) {
|
||||
$idHotel = $serviceProduct['id_hotel'] ? $serviceProduct['id_hotel'] : (isset($roomBookingDetail['id_hotel']) ? (int) $roomBookingDetail['id_hotel'] : 0);
|
||||
$idHtlBookingDetail = $serviceProduct['id_hotel'] ? 0 : (isset($roomBookingDetail['id']) ? (int) $roomBookingDetail['id'] : 0);
|
||||
if ($useTourismTax && ($idTourismTaxRulesGroup = Product::getIdTourismTaxRulesGroupByIdProduct($idProduct))) {
|
||||
$tourismTaxContext = TourismTax::resolveServiceLineTaxContext($idHotel, $idHtlBookingDetail, new Address((int) Cart::getIdAddressForTaxCalculation($idProduct)));
|
||||
OrderTourismTax::saveTourismTax(
|
||||
$idTourismTaxRulesGroup,
|
||||
$tourismTaxContext['address'],
|
||||
(float) $objServiceProductOrderDetail->unit_price_tax_excl,
|
||||
$tourismTaxContext['checkInDate'],
|
||||
$tourismTaxContext['numNights'],
|
||||
$tourismTaxContext['numAdults'],
|
||||
$tourismTaxContext['childrenAges'],
|
||||
(int) $this->context->cart->id_currency,
|
||||
$tourismTaxContext['collectionType'],
|
||||
(int) $idLang,
|
||||
(int) $objServiceProductOrderDetail->quantity,
|
||||
$order->id,
|
||||
(int) $objServiceProductOrderDetail->id_order_detail,
|
||||
0,
|
||||
(int) $objServiceProductOrderDetail->id,
|
||||
$idHotel
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1292,7 +1376,8 @@ abstract class PaymentModuleCore extends Module
|
||||
|
||||
$service_products_tax = ($standalone_products_price_tax_incl + $hotel_standalone_products_price_tax_incl) - ($standalone_products_price_tax_excl + $hotel_standalone_products_price_tax_excl);
|
||||
|
||||
$total_order_tax = $room_tax + $additional_service_tax + $total_convenience_fee_tax + $service_products_tax;
|
||||
$totalTourismTax = OrderTourismTax::getOrderTourismTaxTotal((int) $order->id);
|
||||
$total_order_tax = max(0, $room_tax + $additional_service_tax + $total_convenience_fee_tax + $service_products_tax - $totalTourismTax);
|
||||
|
||||
$total_products = Tools::displayPrice(Product::getTaxCalculationMethod() == PS_TAX_EXC ? $order->total_products : $order->total_products_wt, $this->context->currency, false);
|
||||
|
||||
@@ -1318,6 +1403,8 @@ abstract class PaymentModuleCore extends Module
|
||||
),
|
||||
'service_products_tax' => Tools::displayPrice($service_products_tax, $this->context->currency, false),
|
||||
'total_order_tax' => Tools::displayPrice($total_order_tax, $this->context->currency, false),
|
||||
'total_tourism_tax' => Tools::displayPrice($totalTourismTax, $this->context->currency, false),
|
||||
'has_tourism_tax' => $totalTourismTax > 0,
|
||||
'total_paid' => Tools::displayPrice($order->total_paid, $this->context->currency, false),
|
||||
'total_products' => Tools::displayPrice($total_products, $this->context->currency, false),
|
||||
'total_discounts' => Tools::displayPrice(-$order->total_discounts, $this->context->currency, false),
|
||||
|
||||
Reference in New Issue
Block a user