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)