diff --git a/admin/themes/default/template/controllers/normal_products/helpers/form/form.tpl b/admin/themes/default/template/controllers/normal_products/helpers/form/form.tpl index 7b70d1c05..3fe9645bf 100644 --- a/admin/themes/default/template/controllers/normal_products/helpers/form/form.tpl +++ b/admin/themes/default/template/controllers/normal_products/helpers/form/form.tpl @@ -82,6 +82,9 @@ var with_room_type = {Product::SERVICE_PRODUCT_WITH_ROOMTYPE|intval}; var without_room_type = {Product::SERVICE_PRODUCT_WITHOUT_ROOMTYPE|intval}; + var price_addition_type_with_room = {Product::PRICE_ADDITION_TYPE_WITH_ROOM|intval}; + var price_addition_type_independent = {Product::PRICE_ADDITION_TYPE_INDEPENDENT|intval}; + var has_combinations = {$has_combinations|intval}; diff --git a/admin/themes/default/template/controllers/normal_products/prices.tpl b/admin/themes/default/template/controllers/normal_products/prices.tpl index 231a821a5..ecd8fbbcb 100644 --- a/admin/themes/default/template/controllers/normal_products/prices.tpl +++ b/admin/themes/default/template/controllers/normal_products/prices.tpl @@ -139,7 +139,14 @@ $(document).ready(function () { -
+
auto_add_to_cart || $product->price_addition_type != Product::PRICE_ADDITION_TYPE_WITH_ROOM}style="display:none"{/if}> +
+
+ {l s='This service product price will be auto added to room price so the tax rule set on room type will be applied on this service product'} +
+
+
+
auto_add_to_cart && $product->price_addition_type == Product::PRICE_ADDITION_TYPE_WITH_ROOM}style="display:none"{/if}>
{include file="controllers/products/multishop/checkbox.tpl" field="id_tax_rules_group" type="default"}
-
+
auto_add_to_cart && $product->price_addition_type == Product::PRICE_ADDITION_TYPE_WITH_ROOM}style="display:none"{/if}>
{$currency->prefix}{$currency->suffix} diff --git a/admin/themes/default/template/controllers/products/serviceproduct.tpl b/admin/themes/default/template/controllers/products/serviceproduct.tpl index de03ff8de..e7b2001cb 100644 --- a/admin/themes/default/template/controllers/products/serviceproduct.tpl +++ b/admin/themes/default/template/controllers/products/serviceproduct.tpl @@ -81,17 +81,21 @@
-
- -
-
{l s='Default tax rule: %s' sprintf=$service_product.association_info.default_tax_rules_group_name}
+ {if $service_product.association_info.auto_add_to_cart && $service_product.association_info.price_addition_type == Product::PRICE_ADDITION_TYPE_WITH_ROOM} + {l s='-'} + {else} +
+ +
+
{l s='Default tax rule: %s' sprintf=$service_product.association_info.default_tax_rules_group_name}
+ {/if} {/foreach} diff --git a/classes/Product.php b/classes/Product.php index 3fb1f8ee5..d9fb9d6b3 100644 --- a/classes/Product.php +++ b/classes/Product.php @@ -2999,7 +2999,7 @@ public static function getCover($id_product, Context $context = null) public static function getPriceStatic($id_product, $usetax = true, $id_product_attribute = null, $decimals = 6, $divisor = null, $only_reduc = false, $usereduc = true, $quantity = 1, $force_associated_tax = false, $id_customer = null, $id_cart = null, $id_address = null, &$specific_price_output = null, $with_ecotax = true, $use_group_reduction = true, Context $context = null, - $use_customer_price = true, $id_roomtype = false) + $use_customer_price = true, $id_product_roomtype = false) { if (!$context) { $context = Context::getContext(); @@ -3065,9 +3065,9 @@ public static function getPriceStatic($id_product, $usetax = true, $id_product_a if (!$id_address) { if (!Product::isBookingProduct($id_product)) { - if ($id_roomtype) { + if ($id_product_roomtype) { // if room type is provided with product then we know that the service product price should be calculated accroding to roomt type - $id_address = Cart::getIdAddressForTaxCalculation($id_roomtype); + $id_address = Cart::getIdAddressForTaxCalculation($id_product_roomtype); } } else { $id_address = Cart::getIdAddressForTaxCalculation($id_product); @@ -3121,7 +3121,7 @@ public static function getPriceStatic($id_product, $usetax = true, $id_product_a $use_customer_price, $id_cart, $cart_quantity, - $id_roomtype + $id_product_roomtype ); return $return; @@ -3155,9 +3155,8 @@ public static function getPriceStatic($id_product, $usetax = true, $id_product_a **/ public static function priceCalculation($id_shop, $id_product, $id_product_attribute, $id_country, $id_state, $zipcode, $id_currency, $id_group, $quantity, $use_tax, $decimals, $only_reduc, $use_reduc, $with_ecotax, &$specific_price, $use_group_reduction, - $id_customer = 0, $use_customer_price = true, $id_cart = 0, $real_quantity = 0, $id_roomtype = false) + $id_customer = 0, $use_customer_price = true, $id_cart = 0, $real_quantity = 0, $id_product_roomtype = false) { - static $address = null; static $context = null; @@ -3184,7 +3183,7 @@ public static function priceCalculation($id_shop, $id_product, $id_product_attri $cache_id = (int)$id_product.'-'.(int)$id_shop.'-'.(int)$id_currency.'-'.(int)$id_country.'-'.$id_state.'-'.$zipcode.'-'.(int)$id_group. '-'.(int)$quantity.'-'.(int)$id_product_attribute. '-'.(int)$with_ecotax.'-'.(int)$id_customer.'-'.(int)$use_group_reduction.'-'.(int)$id_cart.'-'.(int)$real_quantity. - '-'.($only_reduc?'1':'0').'-'.($use_reduc?'1':'0').'-'.($use_tax?'1':'0').'-'.(int)$decimals.'-'.($id_roomtype?(int)$id_roomtype:'0'); + '-'.($only_reduc?'1':'0').'-'.($use_reduc?'1':'0').'-'.($use_tax?'1':'0').'-'.(int)$decimals.'-'.($id_product_roomtype?(int)$id_product_roomtype:'0'); // reference parameter is filled before any returns $specific_price = SpecificPrice::getSpecificPrice( @@ -3248,10 +3247,10 @@ public static function priceCalculation($id_shop, $id_product, $id_product_attri $result = self::$_pricesLevel2[$cache_id_2][(int)$id_product_attribute]; // get price per room type - if ($id_roomtype) { + if ($id_product_roomtype) { $priceForRoomInfo = RoomTypeServiceProductPrice::getProductRoomTypePriceAndTax( $id_product, - $id_roomtype, + $id_product_roomtype, RoomTypeServiceProduct::WK_ELEMENT_TYPE_ROOM_TYPE ); } diff --git a/controllers/admin/AdminNormalProductsController.php b/controllers/admin/AdminNormalProductsController.php index baeded608..89d0327ac 100644 --- a/controllers/admin/AdminNormalProductsController.php +++ b/controllers/admin/AdminNormalProductsController.php @@ -1905,6 +1905,12 @@ public function processUpdate() // set product visibility to none for current flow. $object->visibility = 'none'; + // if service is auto_added and price addition is in room price, then the tax rule is applied of room price. + // so setting tax rule as no tax for now + if ($object->auto_add_to_cart && $object->price_addition_type == Product::PRICE_ADDITION_TYPE_WITH_ROOM) { + $object->id_tax_rules_group = 0; + } + // Duplicate combinations if not associated to shop if ($this->context->shop->getContext() == Shop::CONTEXT_SHOP && !$object->isAssociatedToShop()) { $is_associated_to_shop = false; diff --git a/controllers/admin/AdminProductsController.php b/controllers/admin/AdminProductsController.php index ccf491954..8d57d805d 100644 --- a/controllers/admin/AdminProductsController.php +++ b/controllers/admin/AdminProductsController.php @@ -3007,6 +3007,7 @@ public function initFormServiceProduct($obj) $associationInfo['id_product'] = $objProduct->id; $associationInfo['name'] = $objProduct->name; $associationInfo['auto_add_to_cart'] = $objProduct->auto_add_to_cart; + $associationInfo['price_addition_type'] = $objProduct->price_addition_type; $associationInfo['category'] = $objProduct->category; $associationInfo['default_price'] = $objProduct->price; $associationInfo['id_tax_rules_group'] = $objProduct->id_tax_rules_group; @@ -3137,7 +3138,9 @@ public function processServiceProduct() } $objRoomTypeServiceProductPrice->price = $price; - $objRoomTypeServiceProductPrice->id_tax_rules_group = $idTaxRulesGroup; + if ($idTaxRulesGroup) { + $objRoomTypeServiceProductPrice->id_tax_rules_group = $idTaxRulesGroup; + } $objRoomTypeServiceProductPrice->save(); } else { diff --git a/js/admin/normal_products.js b/js/admin/normal_products.js index e602d75f1..c01ff7832 100644 --- a/js/admin/normal_products.js +++ b/js/admin/normal_products.js @@ -498,7 +498,25 @@ product_tabs['Informations'] = new function(){ $('#max_quantity_container').show('fast'); } } + toggleAutoAddWithRoomNotice(); }); + + $('#price_addition_type').on('change', function () { + toggleAutoAddWithRoomNotice(); + }); + + function toggleAutoAddWithRoomNotice() + { + if ($('#auto_add_to_cart_on').prop('checked') + && $('#price_addition_type').val() == price_addition_type_with_room + ) { + $('.hide_on_auto_add_Withroom').hide(); + $('.show_on_auto_add_Withroom').show(); + } else { + $('.hide_on_auto_add_Withroom').show(); + $('.show_on_auto_add_Withroom').hide(); + } + } } this.bindTagImage = function (){ diff --git a/modules/hotelreservationsystem/classes/RoomTypeServiceProductPrice.php b/modules/hotelreservationsystem/classes/RoomTypeServiceProductPrice.php index fc4235a05..bfbf62f2b 100644 --- a/modules/hotelreservationsystem/classes/RoomTypeServiceProductPrice.php +++ b/modules/hotelreservationsystem/classes/RoomTypeServiceProductPrice.php @@ -69,12 +69,24 @@ public static function deleteRoomProductPrices($idProduct, $elementType = 0, $id public static function getProductRoomTypePriceAndTax($idProduct, $idElement, $elementType) { - return Db::getInstance()->getRow( - 'SELECT `price`, `id_tax_rules_group` FROM `'._DB_PREFIX_.'htl_room_type_service_product_price` - WHERE `id_product`='.(int)$idProduct. - ' AND `id_element`='.(int)$idElement. - ' AND `element_type`='.(int)$elementType - ); + if ($result = Db::getInstance()->getRow(' + SELECT spp.`price`, spp.`id_tax_rules_group`, p.`auto_add_to_cart`, p.`price_addition_type` + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'htl_room_type_service_product` sp ON (sp.`id_product` = p.`id_product`) + LEFT JOIN `'._DB_PREFIX_.'htl_room_type_service_product_price` spp ON (spp.`id_product` = p.`id_product`) + WHERE p.`id_product`='.(int)$idProduct. + ' AND sp.`id_element`='.(int)$idElement. + ' AND sp.`element_type`='.(int)$elementType) + ) { + if ($result['auto_add_to_cart'] && $result['price_addition_type'] == Product::PRICE_ADDITION_TYPE_WITH_ROOM) { + // if service is auto add to cart and added in room price, we need to find room type tax rule group + if ($elementType == RoomTypeServiceProduct::WK_ELEMENT_TYPE_ROOM_TYPE) { + $result['id_tax_rules_group'] = Product::getIdTaxRulesGroupByIdProduct((int)$idElement); + } + } + } + + return $result; } public function getProductRoomTypeLinkPriceInfo($idProduct, $idElement, $elementType)