Merge branch 'develop' into hourly
This commit is contained in:
@@ -356,9 +356,8 @@
|
||||
file="controllers/products/textarea_lang.tpl"
|
||||
languages=$languages
|
||||
input_name='description_short'
|
||||
class="autoload_rte"
|
||||
input_value=$product->description_short
|
||||
max=$PS_PRODUCT_SHORT_DESC_LIMIT}
|
||||
maxlength=$PS_PRODUCT_SHORT_DESC_LIMIT}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
|
||||
@@ -86,16 +86,27 @@
|
||||
|
||||
{if isset($auto_select_children) && $auto_select_children == true}
|
||||
$('#{$id|escape:'html':'UTF-8'}').find(':input[type=checkbox]').on('click', function(){
|
||||
if ($(this).is(":checked")) {
|
||||
$(this).closest('.tree-folder').find(':input[type=checkbox]').each(function(){
|
||||
$(this).prop('checked', true);
|
||||
$(this).parent().addClass('tree-selected');
|
||||
});
|
||||
} else {
|
||||
$(this).closest('.tree-folder').find(':input[type=checkbox]').each(function(){
|
||||
$(this).prop('checked', false);
|
||||
$(this).parent().removeClass('tree-selected');
|
||||
});
|
||||
if ($(this).closest('.tree-item').length ==0) {
|
||||
if ($(this).is(":checked")) {
|
||||
$(this).closest('.tree-folder').find(':input[type=checkbox]').each(function(){
|
||||
$(this).prop('checked', true);
|
||||
$(this).parent().addClass('tree-selected');
|
||||
});
|
||||
} else {
|
||||
$(this).closest('.tree-folder').find(':input[type=checkbox]').each(function(){
|
||||
$(this).prop('checked', false);
|
||||
$(this).parent().removeClass('tree-selected');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if ($(this).closest('.tree-item').length) {
|
||||
if (!$(this).is(":checked")) {
|
||||
$(this).parents('.tree-folder').find(':input[type=checkbox]:first').each(function(){
|
||||
$(this).prop('checked', false);
|
||||
$(this).parent().removeClass('tree-selected');
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
{/if}
|
||||
|
||||
@@ -186,6 +186,8 @@ class CartCore extends ObjectModel
|
||||
const ONLY_ROOM_SERVICES_WITH_AUTO_ADD_WITHOUT_CONVENIENCE_FEE = 17;
|
||||
const ONLY_CONVENIENCE_FEE = 18;
|
||||
|
||||
const ONLY_PRODUCTS_WITH_DEMANDS = 19;
|
||||
|
||||
public function __construct($id = null, $id_lang = null)
|
||||
{
|
||||
parent::__construct($id);
|
||||
@@ -366,8 +368,8 @@ class CartCore extends ObjectModel
|
||||
*/
|
||||
public function getAverageProductsTaxRate(&$cart_amount_te = null, &$cart_amount_ti = null)
|
||||
{
|
||||
$cart_amount_ti = $this->getOrderTotal(true, Cart::ONLY_PRODUCTS);
|
||||
$cart_amount_te = $this->getOrderTotal(false, Cart::ONLY_PRODUCTS);
|
||||
$cart_amount_ti = $this->getOrderTotal(true, Cart::ONLY_PRODUCTS_WITH_DEMANDS);
|
||||
$cart_amount_te = $this->getOrderTotal(false, Cart::ONLY_PRODUCTS_WITH_DEMANDS);
|
||||
|
||||
$cart_vat_amount = $cart_amount_ti - $cart_amount_te;
|
||||
|
||||
@@ -1029,6 +1031,9 @@ class CartCore extends ObjectModel
|
||||
if ((int)$cartRule->gift_product) {
|
||||
$this->updateQty(1, $cartRule->gift_product, $cartRule->gift_product_attribute, false, 'up', 0, null, false);
|
||||
}
|
||||
// after adding new cart rule, check if any of the appled cart rules are not being used
|
||||
CartRule::autoRemoveFromCart(Context::getContext());
|
||||
CartRule::autoAddToCart(Context::getContext());
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1612,6 +1617,7 @@ class CartCore extends ObjectModel
|
||||
Cart::ONLY_PHYSICAL_PRODUCTS_WITHOUT_SHIPPING,
|
||||
Cart::ADVANCE_PAYMENT,
|
||||
Cart::ADVANCE_PAYMENT_ONLY_PRODUCTS,
|
||||
Cart::ONLY_PRODUCTS_WITH_DEMANDS,
|
||||
);
|
||||
|
||||
// Define virtual context to prevent case where the cart is not the in the global context
|
||||
@@ -1875,16 +1881,14 @@ class CartCore extends ObjectModel
|
||||
|
||||
|
||||
// price of extra demands on room type in the cart
|
||||
if ($type == Cart::BOTH || $type == Cart::BOTH_WITHOUT_SHIPPING || $type == Cart::ADVANCE_PAYMENT) {
|
||||
$totalDemandsPrice += $objCartBookingData->getCartExtraDemands($this->id, $product['id_product'], 0, 0, 0, 1, 0, (int)$with_taxes);
|
||||
}
|
||||
$totalDemandsPrice += $objCartBookingData->getCartExtraDemands($this->id, $product['id_product'], 0, 0, 0, 1, 0, (int)$with_taxes);
|
||||
}
|
||||
|
||||
foreach ($products_total as $key => $price) {
|
||||
$order_total += $price;
|
||||
}
|
||||
|
||||
$order_total_products = $order_total;
|
||||
$order_total_products = $order_total + $totalDemandsPrice;
|
||||
|
||||
if ($type == Cart::ONLY_DISCOUNTS) {
|
||||
$order_total = 0;
|
||||
@@ -1904,7 +1908,11 @@ class CartCore extends ObjectModel
|
||||
}
|
||||
|
||||
// price of extra demands on room type in the cart
|
||||
if ($type == Cart::BOTH || $type == Cart::BOTH_WITHOUT_SHIPPING || $type == Cart::ADVANCE_PAYMENT) {
|
||||
if ($type == Cart::BOTH
|
||||
|| $type == Cart::BOTH_WITHOUT_SHIPPING
|
||||
|| $type == Cart::ADVANCE_PAYMENT
|
||||
|| $type == Cart::ONLY_PRODUCTS_WITH_DEMANDS
|
||||
) {
|
||||
$order_total += $totalDemandsPrice;
|
||||
}
|
||||
|
||||
@@ -1921,7 +1929,8 @@ class CartCore extends ObjectModel
|
||||
Cart::ONLY_CONVENIENCE_FEE,
|
||||
Cart::ONLY_ROOM_SERVICES_WITHOUT_AUTO_ADD,
|
||||
Cart::ONLY_ROOM_SERVICES_WITHOUT_CONVENIENCE_FEE,
|
||||
Cart::ONLY_ROOM_SERVICES_WITH_AUTO_ADD_WITHOUT_CONVENIENCE_FEE)
|
||||
Cart::ONLY_ROOM_SERVICES_WITH_AUTO_ADD_WITHOUT_CONVENIENCE_FEE,
|
||||
Cart::ONLY_PRODUCTS_WITH_DEMANDS)
|
||||
) && CartRule::isFeatureActive()
|
||||
) {
|
||||
// First, retrieve the cart rules associated to this "getOrderTotal"
|
||||
@@ -3814,10 +3823,6 @@ class CartCore extends ObjectModel
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (((float)$cart_rule['value_real'] == 0 && (int)$cart_rule['free_shipping'] == 0)) {
|
||||
unset($cart_rules[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
$objHotelAdvancedPayment = new HotelAdvancedPayment();
|
||||
|
||||
@@ -564,6 +564,9 @@ class CartRuleCore extends ObjectModel
|
||||
if (strtotime($this->date_to) < time()) {
|
||||
return (!$display_error) ? false : Tools::displayError('This voucher has expired');
|
||||
}
|
||||
if (!$alreadyInCart && $context->cart->getOrderTotal(true, Cart::BOTH) <= 0) {
|
||||
return (!$display_error) ? false : Tools::displayError('You cannot add more vouchers. Please remove an existing voucher before applying a new one.');
|
||||
}
|
||||
|
||||
if ($context->cart->id_customer) {
|
||||
$quantityUsed = Db::getInstance()->getValue('
|
||||
@@ -970,8 +973,8 @@ class CartRuleCore extends ObjectModel
|
||||
|
||||
$all_cart_rules_ids = $context->cart->getOrderedCartRulesIds();
|
||||
|
||||
$cart_amount_ti = $context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS);
|
||||
$cart_amount_te = $context->cart->getOrderTotal(false, Cart::ONLY_PRODUCTS);
|
||||
$cart_amount_ti = $context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS_WITH_DEMANDS);
|
||||
$cart_amount_te = $context->cart->getOrderTotal(false, Cart::ONLY_PRODUCTS_WITH_DEMANDS);
|
||||
|
||||
// Free shipping on selected carriers
|
||||
if ($this->free_shipping && in_array($filter, array(CartRule::FILTER_ACTION_ALL, CartRule::FILTER_ACTION_ALL_NOCAP, CartRule::FILTER_ACTION_SHIPPING))) {
|
||||
@@ -997,7 +1000,7 @@ class CartRuleCore extends ObjectModel
|
||||
// Discount (%) on the whole order
|
||||
if ($this->reduction_percent && $this->reduction_product == 0) {
|
||||
// Do not give a reduction on free products!
|
||||
$order_total = $context->cart->getOrderTotal($use_tax, Cart::ONLY_PRODUCTS, $package_products);
|
||||
$order_total = $context->cart->getOrderTotal($use_tax, Cart::ONLY_PRODUCTS_WITH_DEMANDS, $package_products);
|
||||
foreach ($context->cart->getCartRules(CartRule::FILTER_ACTION_GIFT) as $cart_rule) {
|
||||
$order_total -= Tools::ps_round($cart_rule['obj']->getContextualValue($use_tax, $context, CartRule::FILTER_ACTION_GIFT, $package), _PS_PRICE_COMPUTE_PRECISION_);
|
||||
}
|
||||
@@ -1070,9 +1073,9 @@ class CartRuleCore extends ObjectModel
|
||||
if ((float)$this->reduction_amount > 0) {
|
||||
$prorata = 1;
|
||||
if (!is_null($package) && count($all_products)) {
|
||||
$total_products = $context->cart->getOrderTotal($use_tax, Cart::ONLY_PRODUCTS);
|
||||
$total_products = $context->cart->getOrderTotal($use_tax, Cart::ONLY_PRODUCTS_WITH_DEMANDS);
|
||||
if ($total_products) {
|
||||
$prorata = $context->cart->getOrderTotal($use_tax, Cart::ONLY_PRODUCTS, $package['products']) / $total_products;
|
||||
$prorata = $context->cart->getOrderTotal($use_tax, Cart::ONLY_PRODUCTS_WITH_DEMANDS, $package['products']) / $total_products;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1121,7 +1124,7 @@ class CartRuleCore extends ObjectModel
|
||||
if ($this->reduction_tax == $use_tax) {
|
||||
// The reduction cannot exceed the products total, except when we do not want it to be limited (for the partial use calculation)
|
||||
if ($filter != CartRule::FILTER_ACTION_ALL_NOCAP) {
|
||||
$cart_amount = $context->cart->getOrderTotal($use_tax, Cart::ONLY_PRODUCTS);
|
||||
$cart_amount = $context->cart->getOrderTotal($use_tax, Cart::ONLY_PRODUCTS_WITH_DEMANDS);
|
||||
$reduction_amount = min($reduction_amount, $cart_amount);
|
||||
}
|
||||
$reduction_value += $prorata * $reduction_amount;
|
||||
@@ -1377,12 +1380,20 @@ class CartRuleCore extends ObjectModel
|
||||
return array();
|
||||
}
|
||||
|
||||
$order_total = $context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS_WITH_DEMANDS, null, null, false);
|
||||
static $errors = array();
|
||||
foreach ($context->cart->getCartRules() as $cart_rule) {
|
||||
if ($error = $cart_rule['obj']->checkValidity($context, true)) {
|
||||
$context->cart->removeCartRule($cart_rule['obj']->id);
|
||||
$context->cart->update();
|
||||
$errors[] = $error;
|
||||
} else {
|
||||
if ($order_total <= 0) {
|
||||
// remove cart rule if cart amount is already reached 0
|
||||
$context->cart->removeCartRule($cart_rule['obj']->id);
|
||||
} else {
|
||||
$order_total = $order_total - $cart_rule['value_real'];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $errors;
|
||||
|
||||
@@ -265,6 +265,7 @@ abstract class PaymentModuleCore extends Module
|
||||
}
|
||||
}
|
||||
|
||||
$orderTotals = array();
|
||||
Hook::exec('actionPackageListGenerateOrder', array('package_list' => &$package_list));
|
||||
foreach ($package_list as $id_address => $packageByAddress) {
|
||||
foreach ($packageByAddress as $id_package => $package) {
|
||||
@@ -364,6 +365,7 @@ abstract class PaymentModuleCore extends Module
|
||||
|
||||
// advance payment information
|
||||
$order->is_advance_payment = $this->context->cart->is_advance_payment;
|
||||
$order->amount_paid = 0;
|
||||
if ($order->is_advance_payment) {
|
||||
$order->advance_paid_amount = (float)Tools::ps_round(
|
||||
(float)$this->context->cart->getOrderTotal(true, Cart::ADVANCE_PAYMENT, $order->product_list, $id_carrier),
|
||||
@@ -390,6 +392,7 @@ abstract class PaymentModuleCore extends Module
|
||||
|
||||
// Creating order
|
||||
$result = $order->add();
|
||||
$orderTotals[$order->id] = array('incl' => $order->total_products_wt, 'excl' => $order->total_products);
|
||||
|
||||
if (!$result) {
|
||||
PrestaShopLogger::addLog('PaymentModule::validateOrder - Order cannot be created', 3, null, 'Cart', (int)$id_cart, true);
|
||||
@@ -492,6 +495,7 @@ abstract class PaymentModuleCore extends Module
|
||||
// Make sure CartRule caches are empty
|
||||
CartRule::cleanCache();
|
||||
$objRoomType = new HotelRoomType();
|
||||
$cart_rules = $this->context->cart->getCartRules();
|
||||
foreach ($order_detail_list as $key => $order_detail) {
|
||||
/** @var OrderDetail $order_detail */
|
||||
|
||||
@@ -604,7 +608,7 @@ abstract class PaymentModuleCore extends Module
|
||||
}
|
||||
|
||||
$cart_rules_list = array();
|
||||
foreach ($cart_rules as $cart_rule) {
|
||||
foreach ($cart_rules as $key => $cart_rule) {
|
||||
if ($cart_rule['obj']->reduction_product > 0 && !$order->orderContainProduct($cart_rule['obj']->reduction_product)) {
|
||||
continue;
|
||||
}
|
||||
@@ -620,90 +624,40 @@ abstract class PaymentModuleCore extends Module
|
||||
continue;
|
||||
}
|
||||
|
||||
// IF
|
||||
// The value of the voucher is greater than the total of the order
|
||||
// Partial use is allowed
|
||||
// This is an "amount" reduction, not a reduction in % or a gift
|
||||
// THEN
|
||||
// The voucher is cloned with a new value corresponding to the remainder
|
||||
$reduction_amount_converted = $cart_rule['obj']->reduction_amount;
|
||||
if ((int) $cart_rule['obj']->reduction_currency !== (int) $this->context->cart->id_currency) {
|
||||
$reduction_amount_converted = Tools::convertPriceFull(
|
||||
$cart_rule['obj']->reduction_amount,
|
||||
new Currency($cart_rule['obj']->reduction_currency),
|
||||
new Currency($this->context->cart->id_currency)
|
||||
);
|
||||
$used = array('incl' => 0, 'excl' => 0);
|
||||
if (!isset($cart_rules[$key]['remaining'])) {
|
||||
$cart_rules[$key]['remaining'] = $cart_rule['obj']->reduction_amount;
|
||||
if ((int) $cart_rule['obj']->reduction_currency !== (int) $cart->id_currency) {
|
||||
$cart_rules[$key]['remaining'] = Tools::convertPriceFull(
|
||||
$cart_rule['obj']->reduction_amount,
|
||||
new Currency($cart_rule['obj']->reduction_currency),
|
||||
new Currency($cart->id_currency)
|
||||
);
|
||||
}
|
||||
}
|
||||
if ($cart_rule['obj']->reduction_tax) {
|
||||
$remaining_amount = $values['tax_incl'] - $order->total_products_wt;
|
||||
|
||||
if ($cart_rule['reduction_tax']) {
|
||||
if ($orderTotals[$order->id]['incl'] > $values['tax_incl']) {
|
||||
$used['incl'] = $values['tax_incl'];
|
||||
$used['excl'] = $values['tax_excl'];
|
||||
} else {
|
||||
$used['incl'] = $orderTotals[$order->id]['incl'];
|
||||
$used['excl'] = $orderTotals[$order->id]['excl'];
|
||||
}
|
||||
$orderTotals[$order->id]['incl'] -= $used['incl'];
|
||||
$orderTotals[$order->id]['excl'] -= $used['excl'];
|
||||
$cart_rules[$key]['remaining'] -= $used['incl'];
|
||||
} else {
|
||||
$remaining_amount = $values['tax_excl'] - $order->total_products;
|
||||
}
|
||||
if ($remaining_amount > 0 && $cart_rule['obj']->partial_use == 1 && $reduction_amount_converted > 0) {
|
||||
// Create a new voucher from the original
|
||||
$voucher = new CartRule((int)$cart_rule['obj']->id); // We need to instantiate the CartRule without lang parameter to allow saving it
|
||||
unset($voucher->id);
|
||||
|
||||
// Set a new voucher code
|
||||
// For a customer, applying voucher ABCD will create partial vouchers ABCD-2, ABCD-3 and so on, and
|
||||
// applying voucher ABCD-2 will create vouchers ABCD-2-2, ABCD-2-3 and so on
|
||||
$voucher->code = empty($voucher->code) ? substr(md5($order->id.'-'.$order->id_customer.'-'.$cart_rule['obj']->id), 0, 16) : $voucher->code.'-2';
|
||||
while (CartRule::cartRuleExists($voucher->code, $order->id_customer)) {
|
||||
if (preg_match('/\-([0-9]{1,2})$/', $voucher->code, $matches)) {
|
||||
$voucher->code = preg_replace('/'.$matches[1].'$/', (intval($matches[1]) + 1), $voucher->code);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the new voucher value
|
||||
$voucher->reduction_amount = $remaining_amount;
|
||||
if ($voucher->reduction_tax) {
|
||||
// Add total shipping amout only if reduction amount > total shipping
|
||||
if ($voucher->free_shipping == 1 && $voucher->reduction_amount >= $order->total_shipping_tax_incl) {
|
||||
$voucher->reduction_amount -= $order->total_shipping_tax_incl;
|
||||
}
|
||||
if ($orderTotals[$order->id]['excl'] > $values['tax_excl']) {
|
||||
$used['incl'] = $values['tax_incl'];
|
||||
$used['excl'] = $values['tax_excl'];
|
||||
} else {
|
||||
// Add total shipping amout only if reduction amount > total shipping
|
||||
if ($voucher->free_shipping == 1 && $voucher->reduction_amount >= $order->total_shipping_tax_excl) {
|
||||
$voucher->reduction_amount -= $order->total_shipping_tax_excl;
|
||||
}
|
||||
}
|
||||
if ($voucher->reduction_amount <= 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($this->context->customer->isGuest()) {
|
||||
$voucher->id_customer = 0;
|
||||
} else {
|
||||
$voucher->id_customer = $order->id_customer;
|
||||
}
|
||||
|
||||
$voucher->quantity = 1;
|
||||
$voucher->reduction_currency = $order->id_currency;
|
||||
$voucher->quantity_per_user = 1;
|
||||
$voucher->free_shipping = 0;
|
||||
if ($voucher->add()) {
|
||||
// If the voucher has conditions, they are now copied to the new voucher
|
||||
CartRule::copyConditions($cart_rule['obj']->id, $voucher->id);
|
||||
if ($send_mails) {
|
||||
$params = array(
|
||||
'{voucher_amount}' => Tools::displayPrice($voucher->reduction_amount, $this->context->currency, false),
|
||||
'{voucher_num}' => $voucher->code,
|
||||
'{firstname}' => $this->context->customer->firstname,
|
||||
'{lastname}' => $this->context->customer->lastname,
|
||||
'{id_order}' => $order->reference,
|
||||
'{order_name}' => $order->getUniqReference()
|
||||
);
|
||||
Mail::Send(
|
||||
(int)$order->id_lang,
|
||||
'voucher',
|
||||
sprintf(Mail::l('New voucher for your order %s', (int)$order->id_lang), $order->reference),
|
||||
$params,
|
||||
$this->context->customer->email,
|
||||
$this->context->customer->firstname.' '.$this->context->customer->lastname,
|
||||
null, null, null, null, _PS_MAIL_DIR_, false, (int)$order->id_shop
|
||||
);
|
||||
}
|
||||
$used['incl'] = $orderTotals[$order->id]['incl'];
|
||||
$used['excl'] = $orderTotals[$order->id]['excl'];
|
||||
}
|
||||
$orderTotals[$order->id]['incl'] -= $used['incl'];
|
||||
$orderTotals[$order->id]['excl'] -= $used['excl'];
|
||||
$cart_rules[$key]['remaining'] -= $used['excl'];
|
||||
}
|
||||
|
||||
$order->addCartRule($cart_rule['obj']->id, $cart_rule['obj']->name, $values, 0, $cart_rule['obj']->free_shipping);
|
||||
@@ -1423,6 +1377,85 @@ abstract class PaymentModuleCore extends Module
|
||||
}
|
||||
} // End foreach $order_detail_list
|
||||
|
||||
if (count($cart_rules)) {
|
||||
foreach ($cart_rules as $idCartRule => $cartRule) {
|
||||
|
||||
if ($cartRule['remaining'] > 0 && $cartRule['obj']->partial_use == 1) {
|
||||
// IF
|
||||
// The value of the voucher is greater than the used value
|
||||
// Partial use is allowed
|
||||
// This is an "amount" reduction, not a reduction in % or a gift
|
||||
// THEN
|
||||
// The voucher is cloned with a new value corresponding to the remainder
|
||||
|
||||
// Create a new voucher from the original
|
||||
$voucher = new CartRule((int)$cartRule['obj']->id); // We need to instantiate the CartRule without lang parameter to allow saving it
|
||||
unset($voucher->id);
|
||||
|
||||
// Set a new voucher code
|
||||
// For a customer, applying voucher ABCD will create partial vouchers ABCD-2, ABCD-3 and so on, and
|
||||
// applying voucher ABCD-2 will create vouchers ABCD-2-2, ABCD-2-3 and so on
|
||||
$voucher->code = empty($voucher->code) ? substr(md5($order->id.'-'.$order->id_customer.'-'.$cartRule['obj']->id), 0, 16) : $voucher->code.'-2';
|
||||
while (CartRule::cartRuleExists($voucher->code, $order->id_customer)) {
|
||||
if (preg_match('/\-([0-9]{1,2})$/', $voucher->code, $matches)) {
|
||||
$voucher->code = preg_replace('/'.$matches[1].'$/', (intval($matches[1]) + 1), $voucher->code);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the new voucher value
|
||||
$voucher->reduction_amount = $cartRule['remaining'];
|
||||
if ($voucher->reduction_tax) {
|
||||
// Add total shipping amout only if reduction amount > total shipping
|
||||
if ($voucher->free_shipping == 1 && $voucher->reduction_amount >= $order->total_shipping_tax_incl) {
|
||||
$voucher->reduction_amount -= $order->total_shipping_tax_incl;
|
||||
}
|
||||
} else {
|
||||
// Add total shipping amout only if reduction amount > total shipping
|
||||
if ($voucher->free_shipping == 1 && $voucher->reduction_amount >= $order->total_shipping_tax_excl) {
|
||||
$voucher->reduction_amount -= $order->total_shipping_tax_excl;
|
||||
}
|
||||
}
|
||||
if ($voucher->reduction_amount <= 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($this->context->customer->isGuest()) {
|
||||
$voucher->id_customer = 0;
|
||||
} else {
|
||||
$voucher->id_customer = $order->id_customer;
|
||||
}
|
||||
|
||||
$voucher->quantity = 1;
|
||||
$voucher->reduction_currency = $order->id_currency;
|
||||
$voucher->quantity_per_user = 1;
|
||||
$voucher->free_shipping = 0;
|
||||
if ($voucher->add()) {
|
||||
// If the voucher has conditions, they are now copied to the new voucher
|
||||
CartRule::copyConditions($cartRule['obj']->id, $voucher->id);
|
||||
if ($send_mails) {
|
||||
$params = array(
|
||||
'{voucher_amount}' => Tools::displayPrice($voucher->reduction_amount, $this->context->currency, false),
|
||||
'{voucher_num}' => $voucher->code,
|
||||
'{firstname}' => $this->context->customer->firstname,
|
||||
'{lastname}' => $this->context->customer->lastname,
|
||||
'{id_order}' => $order->reference,
|
||||
'{order_name}' => $order->getUniqReference()
|
||||
);
|
||||
Mail::Send(
|
||||
(int)$order->id_lang,
|
||||
'voucher',
|
||||
sprintf(Mail::l('New voucher for your order %s', (int)$order->id_lang), $order->reference),
|
||||
$params,
|
||||
$this->context->customer->email,
|
||||
$this->context->customer->firstname.' '.$this->context->customer->lastname,
|
||||
null, null, null, null, _PS_MAIL_DIR_, false, (int)$order->id_shop
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Use the last order as currentOrder
|
||||
if (isset($order) && $order->id) {
|
||||
$this->currentOrder = (int)$order->id;
|
||||
|
||||
@@ -357,7 +357,7 @@ class ProductCore extends ObjectModel
|
||||
),
|
||||
'name' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => true, 'size' => 128),
|
||||
'description' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'),
|
||||
'description_short' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'),
|
||||
'description_short' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCleanHtml'),
|
||||
'available_now' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255),
|
||||
'available_later' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'IsGenericName', 'size' => 255),
|
||||
),
|
||||
|
||||
@@ -320,6 +320,9 @@ class AdminControllerCore extends Controller
|
||||
/** @var string */
|
||||
protected $display;
|
||||
|
||||
/** @var array */
|
||||
public $kpis = array();
|
||||
|
||||
/** @var bool */
|
||||
protected $_includeContainer = true;
|
||||
|
||||
@@ -2682,6 +2685,24 @@ class AdminControllerCore extends Controller
|
||||
|
||||
public function renderKpis()
|
||||
{
|
||||
Hook::exec('action'.$this->controller_name.'KPIListingModifier', array(
|
||||
'kpis' => &$this->kpis,
|
||||
));
|
||||
|
||||
if (count($this->kpis)) {
|
||||
foreach ($this->kpis as $key => &$kpi) {
|
||||
if (count($kpi->exclude_id_hotels)) {
|
||||
if (empty($kpi->id_hotels)) {
|
||||
$kpi->id_hotels = HotelBranchInformation::getProfileAccessedHotels($this->context->employee->id_profile, 1, 1);
|
||||
}
|
||||
$kpi->id_hotels = array_diff($kpi->id_hotels, $kpi->exclude_id_hotels);
|
||||
}
|
||||
}
|
||||
|
||||
$helper = new HelperKpiRow();
|
||||
$helper->kpis = $this->kpis;
|
||||
return $helper->generate();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -38,6 +38,8 @@ class HelperKpiCore extends Helper
|
||||
public $value;
|
||||
public $data;
|
||||
public $source;
|
||||
public $id_hotels = false;
|
||||
public $exclude_id_hotels = array();
|
||||
public $href;
|
||||
public $target;
|
||||
public $tooltip;
|
||||
@@ -57,6 +59,8 @@ class HelperKpiCore extends Helper
|
||||
'value' => $this->value,
|
||||
'data' => $this->data,
|
||||
'source' => $this->source,
|
||||
'id_hotels' => $this->id_hotels,
|
||||
'exclude_id_hotels' => $this->exclude_id_hotels,
|
||||
'href' => $this->href,
|
||||
'target' => $this->target,
|
||||
'tooltip' => $this->tooltip,
|
||||
|
||||
@@ -197,7 +197,7 @@ class AdminCartsControllerCore extends AdminController
|
||||
$helper->data = ConfigurationKPI::get('CONVERSION_RATE_CHART');
|
||||
}
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=conversion_rate';
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-carts';
|
||||
@@ -209,7 +209,7 @@ class AdminCartsControllerCore extends AdminController
|
||||
$helper->subtitle = sprintf($this->l('From %s to %s', null, null, false), $date_from, $date_to);
|
||||
$helper->href = $this->context->link->getAdminLink('AdminCarts').'&action=filterOnlyAbandonedCarts&date_from='.$date_from.'&date_to='.$date_to;
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=abandoned_cart';
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$daysForAvgOrderVal = Configuration::get('PS_ORDER_KPI_AVG_ORDER_VALUE_NB_DAYS');
|
||||
$helper = new HelperKpi();
|
||||
@@ -219,7 +219,7 @@ class AdminCartsControllerCore extends AdminController
|
||||
$helper->title = $this->l('Average Order Value', null, null, false);
|
||||
$helper->subtitle = $daysForAvgOrderVal.' '.$this->l('days', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=average_order_value';
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$daysForProfitPerVisitor = Configuration::get('PS_ORDER_KPI_PER_VISITOR_PROFIT_NB_DAYS');
|
||||
$helper = new HelperKpi();
|
||||
@@ -229,15 +229,9 @@ class AdminCartsControllerCore extends AdminController
|
||||
$helper->title = $this->l('Net Profit per Visitor', null, null, false);
|
||||
$helper->subtitle = $daysForProfitPerVisitor.' '.$this->l('days', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=netprofit_visit';
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
Hook::exec('action'.$this->controller_name.'KPIListingModifier', array(
|
||||
'kpis' => &$kpis,
|
||||
));
|
||||
|
||||
$helper = new HelperKpiRow();
|
||||
$helper->kpis = $kpis;
|
||||
return $helper->generate();
|
||||
return parent::renderKpis();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -524,7 +524,7 @@ class AdminCustomerThreadsControllerCore extends AdminController
|
||||
$helper->color = 'color1';
|
||||
$helper->title = $this->l('Pending Discussion Threads', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=pending_messages';
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-age';
|
||||
@@ -533,7 +533,7 @@ class AdminCustomerThreadsControllerCore extends AdminController
|
||||
$helper->title = $this->l('Average Response Time', null, null, false);
|
||||
$helper->subtitle = $this->l('30 days', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=avg_msg_response_time';
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-messages-per-thread';
|
||||
@@ -542,15 +542,9 @@ class AdminCustomerThreadsControllerCore extends AdminController
|
||||
$helper->title = $this->l('Messages per Thread', null, null, false);
|
||||
$helper->subtitle = $this->l('30 day', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=messages_per_thread';
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
Hook::exec('action'.$this->controller_name.'KPIListingModifier', array(
|
||||
'kpis' => &$kpis,
|
||||
));
|
||||
|
||||
$helper = new HelperKpiRow();
|
||||
$helper->kpis = $kpis;
|
||||
return $helper->generate();
|
||||
return parent::renderKpis();
|
||||
}
|
||||
|
||||
public function renderView()
|
||||
|
||||
@@ -709,7 +709,7 @@ class AdminCustomersControllerCore extends AdminController
|
||||
$helper->subtitle = $this->l('All Time', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=orders_per_customer';
|
||||
$helper->tooltip = $this->l('The average number of orders placed per customer in given period of time.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-total-frequent-customers';
|
||||
@@ -720,7 +720,7 @@ class AdminCustomersControllerCore extends AdminController
|
||||
$helper->href = $this->context->link->getAdminLink('AdminCustomers').'&submitFiltercustomer=1&customerFilter_total_orders%5B0%5D='.Configuration::get('PS_KPI_FREQUENT_CUSTOMER_NB_ORDERS').'&customerFilter_o%21date_add%5B0%5D='.date('Y-m-d', strtotime('-365 day')).'&customerFilter_o%21date_add%5B1%5D='.date('Y-m-d');
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=total_frequent_customers';
|
||||
$helper->tooltip = $this->l('The total number of frequent customers in given period of time.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-revenue-per-available-customer';
|
||||
@@ -731,7 +731,7 @@ class AdminCustomersControllerCore extends AdminController
|
||||
$helper->subtitle = sprintf($this->l('%d Days', null, null, false), (int) $nbDaysRevPac);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=revenue_per_available_customer';
|
||||
$helper->tooltip = $this->l('Revenue per Available Customer (RevPAC) in given period of time.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-total-newsletter-registrations';
|
||||
@@ -741,7 +741,7 @@ class AdminCustomersControllerCore extends AdminController
|
||||
$helper->subtitle = $this->l('All Time', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=total_newsletter_registrations';
|
||||
$helper->tooltip = $this->l('The total number of newsletter registrations in given period of time.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-conversion-rate';
|
||||
@@ -752,7 +752,7 @@ class AdminCustomersControllerCore extends AdminController
|
||||
$helper->subtitle = sprintf($this->l('%d Days', null, null, false), (int) $nbDaysConversionRate);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=conversion_rate';
|
||||
$helper->tooltip = $this->l('The percentage of visitors who created a booking in given period of time.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-total-new-customers';
|
||||
@@ -766,7 +766,7 @@ class AdminCustomersControllerCore extends AdminController
|
||||
$helper->subtitle = sprintf($this->l('%d Days', null, null, false), (int) $nbDaysNewCustomers);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=total_new_customers';
|
||||
$helper->tooltip = $this->l('The total number of new customers who registered in given period of time.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-total-banned-customers';
|
||||
@@ -777,7 +777,7 @@ class AdminCustomersControllerCore extends AdminController
|
||||
$helper->href = $this->context->link->getAdminLink('AdminCustomers').'&customerFilter_deleted=1';
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=total_banned_customers';
|
||||
$helper->tooltip = $this->l('The total number of banned customers.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-gender';
|
||||
@@ -787,15 +787,9 @@ class AdminCustomersControllerCore extends AdminController
|
||||
$helper->subtitle = $this->l('All Time', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=customer_main_gender';
|
||||
$helper->tooltip = $this->l('The main gender from all the customers.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
Hook::exec('action'.$this->controller_name.'KPIListingModifier', array(
|
||||
'kpis' => &$kpis,
|
||||
));
|
||||
|
||||
$helper = new HelperKpiRow();
|
||||
$helper->kpis = $kpis;
|
||||
return $helper->generate();
|
||||
return parent::renderKpis();
|
||||
}
|
||||
|
||||
public function renderView()
|
||||
|
||||
@@ -1333,7 +1333,7 @@ class AdminModulesControllerCore extends AdminController
|
||||
$helper->color = 'color1';
|
||||
$helper->title = $this->l('Installed Modules', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=installed_modules';
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-disabled-modules';
|
||||
@@ -1341,7 +1341,7 @@ class AdminModulesControllerCore extends AdminController
|
||||
$helper->color = 'color2';
|
||||
$helper->title = $this->l('Disabled Modules', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=disabled_modules';
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-update-modules';
|
||||
@@ -1349,15 +1349,9 @@ class AdminModulesControllerCore extends AdminController
|
||||
$helper->color = 'color3';
|
||||
$helper->title = $this->l('Modules to Update', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=update_modules';
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
Hook::exec('action'.$this->controller_name.'KPIListingModifier', array(
|
||||
'kpis' => &$kpis,
|
||||
));
|
||||
|
||||
$helper = new HelperKpiRow();
|
||||
$helper->kpis = $kpis;
|
||||
return $helper->generate();
|
||||
return parent::renderKpis();
|
||||
}
|
||||
|
||||
public function initModal()
|
||||
|
||||
@@ -2384,7 +2384,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->title = $this->l('Order Date');
|
||||
$helper->tooltip = $this->l('The date when the order was placed.');
|
||||
$helper->value = Tools::displayDate($objOrder->date_add);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-order-total';
|
||||
@@ -2393,7 +2393,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->title = $this->l('Bookings Total');
|
||||
$helper->tooltip = $this->l('Total booking amount of this order.');
|
||||
$helper->value = Tools::displayPrice($objOrder->total_paid_tax_incl, new Currency($objOrder->id_currency));
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-total-paid';
|
||||
@@ -2402,7 +2402,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->title = $this->l('Total Paid');
|
||||
$helper->tooltip = $this->l('Total paid is the amount which customer has already paid for this order.');
|
||||
$helper->value = Tools::displayPrice($objOrder->total_paid_real, new Currency($objOrder->id_currency));
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-total-due';
|
||||
@@ -2411,7 +2411,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->title = $this->l('Total Due');
|
||||
$helper->tooltip = $this->l('Total due is the amount which customer has to pay for this order.');
|
||||
$helper->value = Tools::displayPrice(($objOrder->total_paid_tax_incl - $objOrder->total_paid_real), new Currency($objOrder->id_currency));
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$orderHistory = array_reverse($objOrder->getHistory($this->context->language->id));
|
||||
$helper = new HelperKpi();
|
||||
@@ -2422,7 +2422,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->tooltip = $this->l('Order source shows from which source the order was placed.');
|
||||
$helper->subtitle = $orderHistory[0]['id_employee'] ? $this->l('Back office') : $this->l('Front office');
|
||||
$helper->value = $objOrder->source;
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-messages';
|
||||
@@ -2432,7 +2432,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->tooltip = $this->l('Messages is the number of customer messages for this order.');
|
||||
$helper->href = $this->context->link->getAdminLink('AdminCustomerThreads').'&id_order='.$objOrder->id;
|
||||
$helper->value = count(CustomerThread::getCustomerMessages($objOrder->id_customer, null, $objOrder->id));
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$objHotelBookingDetail = new HotelBookingDetail();
|
||||
$numRooms = count($objHotelBookingDetail->getBookingDataByOrderId($objOrder->id));
|
||||
@@ -2444,7 +2444,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->tooltip = $this->l('Total rooms is the number of rooms booked in this order.');
|
||||
$helper->href = '#start_products';
|
||||
$helper->value = $numRooms;
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-payment-type';
|
||||
@@ -2453,7 +2453,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->title = $this->l('Payment Type');
|
||||
$helper->tooltip = $this->l('The payment type refers to the type of payment that customer selected while placing this order.');
|
||||
$helper->value = $objOrder->is_advance_payment ? $this->l('Partial Payment') : $this->l('Full Payment');
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
if ($objOrder->is_advance_payment) {
|
||||
$helper = new HelperKpi();
|
||||
@@ -2463,7 +2463,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->title = $this->l('Partial Payment Amount');
|
||||
$helper->tooltip = $this->l('Partial payment amount refers to the amount that customer has to pay as advance payment, if payment type selected as partial payment while placing this order.');
|
||||
$helper->value = Tools::displayPrice($objOrder->advance_paid_amount, new Currency($objOrder->id_currency));
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
}
|
||||
|
||||
$objOrderReturn = new OrderReturn();
|
||||
@@ -2476,7 +2476,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->title = $this->l('Refunded Amount');
|
||||
$helper->tooltip = $this->l('Refunded amount refers to the amount that has been refunded for this order.');
|
||||
$helper->value = Tools::displayPrice($refundedAmount, new Currency($objOrder->id_currency));
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
}
|
||||
} else {
|
||||
$time = time();
|
||||
@@ -2489,7 +2489,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->title = $this->l('Total Sales', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=total_sales';
|
||||
$helper->tooltip = $this->l('Total sales/revenue of all the orders created.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-total-due-amount';
|
||||
@@ -2499,7 +2499,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->href = $this->context->link->getAdminLink('AdminOrders').'&submitResetorder=1&due_amount_orders=1';
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=total_due_amount';
|
||||
$helper->tooltip = $this->l('Total due amount of all the orders created.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$arivalDate = date('Y-m-d');
|
||||
$helper = new HelperKpi();
|
||||
@@ -2511,7 +2511,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->href = $this->context->link->getAdminLink('AdminOrders').'&orders_arrival_today=1';
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=today_arrivals';
|
||||
$helper->tooltip = $this->l('Total number of arrivals for today.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$departureDate = date('Y-m-d');
|
||||
$helper = new HelperKpi();
|
||||
@@ -2523,7 +2523,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->href = $this->context->link->getAdminLink('AdminOrders').'&orders_departures_today=1';
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=today_departures';
|
||||
$helper->tooltip = $this->l('Total number of departures for today.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$dateFrom = date('Y-m-d');
|
||||
$dateTo = date('Y-m-d', strtotime('+1 day'));
|
||||
@@ -2536,7 +2536,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->href = $this->context->link->getAdminLink('AdminOrders').'&orders_stay_over=1';
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=today_stay_over';
|
||||
$helper->tooltip = $this->l('Total number of stay overs for today.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-carts';
|
||||
@@ -2549,7 +2549,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->href = $this->context->link->getAdminLink('AdminCarts').'&action=filterOnlyAbandonedCarts&date_from='.$dateFrom.'&date_to='.$dateTo;
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=abandoned_cart';
|
||||
$helper->tooltip = $this->l('Total number of abandoned carts in given period of time.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$daysForConversionRate = Configuration::get('PS_KPI_CONVERSION_RATE_NB_DAYS');
|
||||
$helper = new HelperKpi();
|
||||
@@ -2560,7 +2560,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->subtitle = $daysForConversionRate.' '.$this->l('days', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=conversion_rate';
|
||||
$helper->tooltip = $this->l('Percentage of visits that resulted in an order/booking in given period of time.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$daysForAvgOrderVal = Configuration::get('PS_ORDER_KPI_AVG_ORDER_VALUE_NB_DAYS');
|
||||
$helper = new HelperKpi();
|
||||
@@ -2571,7 +2571,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->subtitle = $daysForAvgOrderVal.' '.$this->l('days', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=average_order_value';
|
||||
$helper->tooltip = $this->l('Total average order value without tax in given period of time.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-average-lead-time';
|
||||
@@ -2580,7 +2580,7 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->title = $this->l('Average Lead Time', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=average_lead_time';
|
||||
$helper->tooltip = $this->l('Average number of days between the time guests book their rooms and the time guest schedule to arrive at the hotel.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-average-guest-in-booking';
|
||||
@@ -2589,16 +2589,14 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$helper->title = $this->l('Average Guest Per Booking', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=average_guest_in_booking';
|
||||
$helper->tooltip = $this->l('Average number of guests per booking.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
}
|
||||
|
||||
Hook::exec('action'.$this->controller_name.'KPIListingModifier', array(
|
||||
'kpis' => &$kpis,
|
||||
));
|
||||
|
||||
$helper = new HelperKpiRow();
|
||||
$helper->kpis = $kpis;
|
||||
return $helper->generate();
|
||||
return parent::renderKpis();
|
||||
}
|
||||
|
||||
public function renderView()
|
||||
@@ -5039,11 +5037,15 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$newTotalPriceTaxExcl = $newNumDays * $objRoomTypeServiceProductOrderDetail->quantity * $unitPriceTaxExcl; $unitPriceTaxIncl = $objRoomTypeServiceProductOrderDetail->unit_price_tax_incl;
|
||||
$newTotalPriceTaxIncl = $newNumDays * $objRoomTypeServiceProductOrderDetail->quantity * $unitPriceTaxIncl;
|
||||
|
||||
$objOrder->total_products -= $objRoomTypeServiceProductOrderDetail->total_price_tax_excl;
|
||||
$objOrder->total_products_wt -= $objRoomTypeServiceProductOrderDetail->total_price_tax_incl;
|
||||
$objOrder->total_paid_tax_excl -= $objRoomTypeServiceProductOrderDetail->total_price_tax_excl;
|
||||
$objOrder->total_paid_tax_incl -= $objRoomTypeServiceProductOrderDetail->total_price_tax_incl;
|
||||
$objOrder->total_paid -= $objRoomTypeServiceProductOrderDetail->total_price_tax_incl;
|
||||
|
||||
// change order total
|
||||
$objOrder->total_products += $newTotalPriceTaxExcl;
|
||||
$objOrder->total_products_wt += $newTotalPriceTaxIncl;
|
||||
$objOrder->total_paid_tax_excl += $newTotalPriceTaxExcl;
|
||||
$objOrder->total_paid_tax_incl += $newTotalPriceTaxIncl;
|
||||
$objOrder->total_paid += $newTotalPriceTaxIncl;
|
||||
@@ -6309,6 +6311,8 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$res &= $order_invoice->update();
|
||||
}
|
||||
|
||||
$order->total_products += $priceDiffTaxExcl;
|
||||
$order->total_products_wt += $priceDiffTaxIncl;
|
||||
$order->total_paid_tax_excl += $priceDiffTaxExcl;
|
||||
$order->total_paid_tax_incl += $priceDiffTaxIncl;
|
||||
$order->total_paid += $priceDiffTaxIncl;
|
||||
@@ -6374,6 +6378,8 @@ class AdminOrdersControllerCore extends AdminController
|
||||
$res &= $objOrderInvoice->update();
|
||||
}
|
||||
|
||||
$order->total_products -= $priceTaxExcl;
|
||||
$order->total_products_wt -= $priceTaxIncl;
|
||||
$order->total_paid_tax_excl -= $priceTaxExcl;
|
||||
$order->total_paid_tax_incl -= $priceTaxIncl;
|
||||
$order->total_paid -= $priceTaxIncl;
|
||||
|
||||
@@ -2457,7 +2457,6 @@ class AdminProductsControllerCore extends AdminController
|
||||
public function renderKpis()
|
||||
{
|
||||
$time = time();
|
||||
$kpis = array();
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-total-rooms';
|
||||
@@ -2467,7 +2466,7 @@ class AdminProductsControllerCore extends AdminController
|
||||
$helper->subtitle = $this->l('Today', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=total_rooms';
|
||||
$helper->tooltip = $this->l('The total number of rooms in all hotels.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-occupied-rooms';
|
||||
@@ -2477,7 +2476,7 @@ class AdminProductsControllerCore extends AdminController
|
||||
$helper->subtitle = $this->l('Today', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=occupied_rooms';
|
||||
$helper->tooltip = $this->l('The count of rooms that are currently occupied by guests.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-vacant-rooms';
|
||||
@@ -2487,7 +2486,7 @@ class AdminProductsControllerCore extends AdminController
|
||||
$helper->subtitle = $this->l('Today', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=vacant_rooms';
|
||||
$helper->tooltip = $this->l('The count of rooms that are either booked but currently unoccupied or available for booking', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-reserved-rooms';
|
||||
@@ -2497,7 +2496,7 @@ class AdminProductsControllerCore extends AdminController
|
||||
$helper->subtitle = $this->l('Today', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=booked_rooms';
|
||||
$helper->tooltip = $this->l('The total number of rooms that are currently booked and and awaiting guest check-in', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-disabled-rooms';
|
||||
@@ -2507,7 +2506,7 @@ class AdminProductsControllerCore extends AdminController
|
||||
$helper->subtitle = $this->l('Today', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=disabled_rooms';
|
||||
$helper->tooltip = $this->l('The total number of rooms that are currently disabled.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-online-bookable-rooms';
|
||||
@@ -2517,7 +2516,7 @@ class AdminProductsControllerCore extends AdminController
|
||||
$helper->subtitle = $this->l('Today', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=online_bookable_rooms';
|
||||
$helper->tooltip = $this->l('The total number of rooms that can be booked directly from the front office.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-offline-bookable-rooms';
|
||||
@@ -2527,7 +2526,7 @@ class AdminProductsControllerCore extends AdminController
|
||||
$helper->subtitle = $this->l('Today', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=offline_bookable_rooms';
|
||||
$helper->tooltip = $this->l('The total number of rooms available for booking through the back office.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-best-selling-room-type';
|
||||
@@ -2538,7 +2537,7 @@ class AdminProductsControllerCore extends AdminController
|
||||
$helper->subtitle = sprintf($this->l('%d Days', null, null, false), (int) $nbDaysBestSelling);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=best_selling_room_type';
|
||||
$helper->tooltip = $this->l('Displays the best selling room type based on the last 30 days of sales.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-disbled-room-types';
|
||||
@@ -2548,16 +2547,9 @@ class AdminProductsControllerCore extends AdminController
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=disabled_room_types';
|
||||
$helper->href = Context::getContext()->link->getAdminLink('AdminProducts').'&productFilter_sa!active=0&submitFilterproduct=1';
|
||||
$helper->tooltip = $this->l('The total number of room types that are currently disabled.', null, null, false);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
Hook::exec('action'.$this->controller_name.'KPIListingModifier', array(
|
||||
'kpis' => &$kpis,
|
||||
));
|
||||
|
||||
$helper = new HelperKpiRow();
|
||||
$helper->kpis = $kpis;
|
||||
|
||||
return $helper->generate();
|
||||
return parent::renderKpis();
|
||||
}
|
||||
|
||||
public function renderList()
|
||||
|
||||
@@ -226,17 +226,17 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
if ($granularity == 'day') {
|
||||
$sales = array();
|
||||
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(
|
||||
'SELECT LEFT(`invoice_date`, 10) AS date, SUM(total_paid_tax_excl / o.conversion_rate) AS sales,
|
||||
(
|
||||
SELECT hbd.`id_hotel`
|
||||
FROM`'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order` LIMIT 1
|
||||
) AS id_hotel
|
||||
'SELECT LEFT(`invoice_date`, 10) AS date, SUM(total_paid_tax_excl / o.conversion_rate) AS sales
|
||||
FROM `'._DB_PREFIX_.'orders` o
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_state` os ON o.current_state = os.id_order_state
|
||||
WHERE os.logable = 1'. (($date_from && $date_to) ? ' AND `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"' : '').' GROUP BY LEFT(`invoice_date`, 10) HAVING 1 '.HotelBranchInformation::addHotelRestriction($id_hotel)
|
||||
WHERE os.logable = 1'. (($date_from && $date_to) ? ' AND `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"' : '').'
|
||||
AND EXISTS (
|
||||
SELECT 1
|
||||
FROM `qlo_htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order`' . HotelBranchInformation::addHotelRestriction($idHotel).'
|
||||
)
|
||||
GROUP BY LEFT(`invoice_date`, 10)'
|
||||
);
|
||||
|
||||
foreach ($result as $row) {
|
||||
$sales[strtotime($row['date'])] = $row['sales'];
|
||||
}
|
||||
@@ -244,15 +244,16 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
} elseif ($granularity == 'month') {
|
||||
$sales = array();
|
||||
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(
|
||||
'SELECT LEFT(`invoice_date`, 7) AS date, SUM(total_paid_tax_excl / o.conversion_rate) AS sales,
|
||||
(
|
||||
SELECT hbd.`id_hotel`
|
||||
FROM`'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order` LIMIT 1
|
||||
) AS id_hotel
|
||||
'SELECT LEFT(`invoice_date`, 7) AS date, SUM(total_paid_tax_excl / o.conversion_rate) AS sales
|
||||
FROM `'._DB_PREFIX_.'orders` o
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_state` os ON o.current_state = os.id_order_state
|
||||
WHERE os.logable = 1'. (($date_from && $date_to) ? ' AND `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"' : '').' GROUP BY LEFT(`invoice_date`, 7) HAVING 1 '.HotelBranchInformation::addHotelRestriction($id_hotel)
|
||||
WHERE os.logable = 1'. (($date_from && $date_to) ? ' AND `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"' : '').'
|
||||
AND EXISTS (
|
||||
SELECT 1
|
||||
FROM `qlo_htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order`' . HotelBranchInformation::addHotelRestriction($idHotel).'
|
||||
)
|
||||
GROUP BY LEFT(`invoice_date`, 7)'
|
||||
);
|
||||
|
||||
foreach ($result as $row) {
|
||||
@@ -262,15 +263,16 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
return $sales;
|
||||
} else {
|
||||
return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue(
|
||||
'SELECT SUM(total_paid_tax_excl / o.conversion_rate),
|
||||
(
|
||||
SELECT hbd.`id_hotel`
|
||||
FROM`'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order` LIMIT 1
|
||||
) AS id_hotel
|
||||
'SELECT SUM(total_paid_tax_excl / o.`conversion_rate`), t.`id_hotel`
|
||||
FROM `'._DB_PREFIX_.'orders` o
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_state` os ON o.current_state = os.id_order_state
|
||||
WHERE os.logable = 1'. (($date_from && $date_to) ? ' AND `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"' : '').' HAVING 1 '.HotelBranchInformation::addHotelRestriction($id_hotel)
|
||||
LEFT JOIN (
|
||||
SELECT hbd.`id_hotel` as id_hotel, hbd.`id_order` as id_order
|
||||
FROM`'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
GROUP BY hbd.`id_order`
|
||||
) t ON (t.`id_order` = o.`id_order`)
|
||||
WHERE os.logable = 1'. (($date_from && $date_to) ? ' AND `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"' : '').
|
||||
HotelBranchInformation::addHotelRestriction($id_hotel)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -472,7 +474,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
{
|
||||
if ($granularity == 'day') {
|
||||
$purchases = array();
|
||||
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
|
||||
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
|
||||
SELECT
|
||||
LEFT(`invoice_date`, 10) as date,
|
||||
SUM(od.`product_quantity` * IF(
|
||||
@@ -488,8 +490,13 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
FROM `'._DB_PREFIX_.'orders` o
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_state` os ON o.current_state = os.id_order_state
|
||||
WHERE `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59" AND os.logable = 1'.'
|
||||
GROUP BY LEFT(`invoice_date`, 10) HAVING 1 '.HotelBranchInformation::addHotelRestriction($id_hotel));
|
||||
WHERE `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"
|
||||
AND os.logable = 1 AND EXISTS (
|
||||
SELECT 1
|
||||
FROM `qlo_htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order`' . HotelBranchInformation::addHotelRestriction($idHotel).'
|
||||
)
|
||||
GROUP BY LEFT(`invoice_date`, 10)');
|
||||
|
||||
foreach ($result as $row) {
|
||||
$purchases[strtotime($row['date'])] = $row['total_purchase_price'];
|
||||
@@ -502,16 +509,16 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
od.`purchase_supplier_price` > 0,
|
||||
od.`purchase_supplier_price`,
|
||||
(od.`original_product_price` / `conversion_rate`) * '.(int)Configuration::get('CONF_AVERAGE_PRODUCT_MARGIN').' / 100
|
||||
)),
|
||||
(
|
||||
SELECT hbd.`id_hotel`
|
||||
FROM`'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order` LIMIT 1
|
||||
) AS id_hotel
|
||||
))
|
||||
FROM `'._DB_PREFIX_.'orders` o
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON o.id_order = od.id_order
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_state` os ON o.current_state = os.id_order_state
|
||||
WHERE `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59" AND os.logable = 1 HAVING 1 '.HotelBranchInformation::addHotelRestriction($id_hotel)
|
||||
WHERE `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"
|
||||
AND os.logable = 1 AND EXISTS (
|
||||
SELECT 1
|
||||
FROM `qlo_htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order`' . HotelBranchInformation::addHotelRestriction($idHotel).'
|
||||
)'
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -520,20 +527,20 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
{
|
||||
if ($granularity == 'day') {
|
||||
$refunds = array();
|
||||
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
|
||||
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
|
||||
SELECT
|
||||
LEFT(`invoice_date`, 10) as date,
|
||||
SUM(orr.`refunded_amount`) as total_refund_amount,
|
||||
(
|
||||
SELECT hbd.`id_hotel`
|
||||
FROM`'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order` LIMIT 1
|
||||
) AS id_hotel
|
||||
SUM(orr.`refunded_amount`) as total_refund_amount
|
||||
FROM `'._DB_PREFIX_.'orders` o
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_return` orr ON (o.id_order = orr.id_order)
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (o.current_state = os.id_order_state)
|
||||
WHERE orr.`payment_mode` != "" AND `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59" AND os.logable = 1'.'
|
||||
GROUP BY LEFT(`invoice_date`, 10) HAVING 1 '.HotelBranchInformation::addHotelRestriction($id_hotel));
|
||||
WHERE orr.`payment_mode` != "" AND `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00"
|
||||
AND "'.pSQL($date_to).' 23:59:59" AND EXISTS (
|
||||
SELECT 1
|
||||
FROM `qlo_htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order`' . HotelBranchInformation::addHotelRestriction($idHotel).'
|
||||
)
|
||||
GROUP BY LEFT(`invoice_date`, 10)');
|
||||
|
||||
foreach ($result as $row) {
|
||||
$refunds[strtotime($row['date'])] = $row['total_refund_amount'];
|
||||
@@ -551,7 +558,13 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
FROM `'._DB_PREFIX_.'orders` o
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_return` orr ON (o.id_order = orr.id_order)
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (o.current_state = os.id_order_state)
|
||||
WHERE orr.`payment_mode` != "" AND orr.`id_transaction` != "" AND `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59" AND os.logable = 1 HAVING 1 '.HotelBranchInformation::addHotelRestriction($id_hotel)
|
||||
WHERE orr.`payment_mode` != "" AND orr.`id_transaction` != ""
|
||||
AND `invoice_date` BETWEEN "'.pSQL($date_from).' 00:00:00" AND "'.pSQL($date_to).' 23:59:59"
|
||||
AND EXISTS (
|
||||
SELECT 1
|
||||
FROM `qlo_htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order`' . HotelBranchInformation::addHotelRestriction($idHotel).'
|
||||
)'
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -633,7 +646,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
|
||||
public function displayAjaxGetKpi()
|
||||
{
|
||||
$value = $this->getLatestKpiValue(Tools::getValue('kpi'));
|
||||
$value = $this->getLatestKpiValue(Tools::getValue('kpi'), Tools::getValue('id_hotels'));
|
||||
if ($value !== false) {
|
||||
$array = array('value' => $value);
|
||||
if (isset($data)) {
|
||||
@@ -644,7 +657,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
die(json_encode(array('has_errors' => true)));
|
||||
}
|
||||
|
||||
public function getLatestKpiValue($kpi)
|
||||
public function getLatestKpiValue($kpi, $idHotels)
|
||||
{
|
||||
$currency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT'));
|
||||
$value = false;
|
||||
@@ -662,7 +675,8 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
$orders = AdminStatsController::getOrders(
|
||||
date('Y-m-d', strtotime('-'.($nbDaysConversionRate + 1).' day')),
|
||||
date('Y-m-d', strtotime('-1 day')),
|
||||
false /*'day'*/
|
||||
false /*'day'*/,
|
||||
$idHotels
|
||||
);
|
||||
|
||||
$visits_sum = $visitors; //array_sum($visitors);
|
||||
@@ -720,7 +734,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
break;
|
||||
|
||||
case 'disabled_room_types':
|
||||
$value = AdminStatsController::getDisabledRoomTypes(0);
|
||||
$value = AdminStatsController::getDisabledRoomTypes($idHotels);
|
||||
ConfigurationKPI::updateValue('DISABLED_ROOM_TYPES', $value);
|
||||
ConfigurationKPI::updateValue('DISABLED_ROOM_TYPES_EXPIRE', strtotime('+2 hour'));
|
||||
break;
|
||||
@@ -824,15 +838,15 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
$row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow('
|
||||
SELECT
|
||||
COUNT(o.`id_order`) as orders,
|
||||
SUM(o.`total_paid_tax_excl` / o.`conversion_rate`) as total_paid_tax_excl,
|
||||
(
|
||||
SELECT hbd.`id_hotel`
|
||||
FROM`'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order` LIMIT 1
|
||||
) AS id_hotel
|
||||
SUM(o.`total_paid_tax_excl` / o.`conversion_rate`) as total_paid_tax_excl
|
||||
FROM `'._DB_PREFIX_.'orders` o
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_state` os ON os.`id_order_state` = o.`current_state`
|
||||
WHERE o.`invoice_date` BETWEEN "'.pSQL(date('Y-m-d', strtotime('-'.($daysForAvgOrderVal + 1).' day'))).' 00:00:00" AND "'.pSQL(date('Y-m-d', strtotime('-1 day'))).' 23:59:59" AND os.`logable` = 1 HAVING 1 '.HotelBranchInformation::addHotelRestriction(false));
|
||||
WHERE o.`invoice_date` BETWEEN "'.pSQL(date('Y-m-d', strtotime('-'.($daysForAvgOrderVal + 1).' day'))).' 00:00:00"
|
||||
AND "'.pSQL(date('Y-m-d')).' 23:59:59" AND os.`logable` = 1 AND EXISTS (
|
||||
SELECT 1
|
||||
FROM `qlo_htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order`' . HotelBranchInformation::addHotelRestriction($idHotel).'
|
||||
)');
|
||||
$value = Tools::displayPrice($row['orders'] ? $row['total_paid_tax_excl'] / $row['orders'] : 0, $currency).' ('.$this->l('tax excl.').')';
|
||||
|
||||
break;
|
||||
@@ -844,9 +858,9 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
$date_to = date('Y-m-d', strtotime('-1 day'));
|
||||
|
||||
$total_visitors = AdminStatsController::getVisits(false, $date_from, $date_to);
|
||||
$net_profits = AdminStatsController::getTotalSales($date_from, $date_to);
|
||||
$net_profits -= AdminStatsController::getExpenses($date_from, $date_to);
|
||||
$net_profits -= AdminStatsController::getPurchases($date_from, $date_to);
|
||||
$net_profits = AdminStatsController::getTotalSales($date_from, $date_to, false, $idHotels);
|
||||
$net_profits -= AdminStatsController::getExpenses($date_from, $date_to, false, $idHotels);
|
||||
$net_profits -= AdminStatsController::getPurchases($date_from, $date_to, false, $idHotels);
|
||||
|
||||
if ($total_visitors) {
|
||||
$value = Tools::displayPrice($net_profits / $total_visitors, $currency);
|
||||
@@ -880,7 +894,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
if (!($idProduct = AdminStatsController::getBestSellingRoomType(
|
||||
date('Y-m-d', strtotime('-'.($nbDaysBestSelling + 1).' day')),
|
||||
date('Y-m-d', strtotime('-1 day')),
|
||||
0
|
||||
$idHotels
|
||||
))) {
|
||||
$value = $this->l('--', null, null, false);
|
||||
} else {
|
||||
@@ -891,7 +905,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
break;
|
||||
|
||||
case 'total_rooms':
|
||||
$value = AdminStatsController::getTotalRooms(0);
|
||||
$value = AdminStatsController::getTotalRooms($idHotels);
|
||||
|
||||
break;
|
||||
|
||||
@@ -899,20 +913,20 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
$value = AdminStatsController::getDistinctRoomBookingsCount(
|
||||
date('Y-m-d', strtotime('-1 day')),
|
||||
date('Y-m-d'),
|
||||
0,
|
||||
$idHotels,
|
||||
HotelBookingDetail::STATUS_CHECKED_IN
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
case 'vacant_rooms':
|
||||
$totalUnAvailRooms = AdminStatsController::getDisabledRoomsForDiscreteDates(date('Y-m-d'), null, 0);
|
||||
$totalUnAvailRooms = AdminStatsController::getDisabledRoomsForDiscreteDates(date('Y-m-d'), null, $idHotels);
|
||||
$totalUnAvailRooms = $totalUnAvailRooms[strtotime(date('Y-m-d'))];
|
||||
$totalRooms = AdminStatsController::getTotalRooms(0);
|
||||
$totalRooms = AdminStatsController::getTotalRooms($idHotels);
|
||||
$totalOccupiedRooms = AdminStatsController::getDistinctRoomBookingsCount(
|
||||
date('Y-m-d', strtotime('-1 day')),
|
||||
date('Y-m-d'),
|
||||
0,
|
||||
$idHotels,
|
||||
HotelBookingDetail::STATUS_CHECKED_IN
|
||||
);
|
||||
$value = $totalRooms - ($totalUnAvailRooms + $totalOccupiedRooms);
|
||||
@@ -923,26 +937,26 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
$value = AdminStatsController::getDistinctRoomBookingsCount(
|
||||
date('Y-m-d'),
|
||||
date('Y-m-d', strtotime('+1 day')),
|
||||
0,
|
||||
$idHotels,
|
||||
HotelBookingDetail::STATUS_ALLOTED
|
||||
);
|
||||
|
||||
break;
|
||||
|
||||
case 'disabled_rooms':
|
||||
$value = AdminStatsController::getDisabledRoomsForDiscreteDates(date('Y-m-d'), null, 0);
|
||||
$value = AdminStatsController::getDisabledRoomsForDiscreteDates(date('Y-m-d'), null, $idHotels);
|
||||
$value = $value[strtotime(date('Y-m-d'))];
|
||||
|
||||
break;
|
||||
|
||||
case 'online_bookable_rooms':
|
||||
$value = AdminStatsController::getAvailableRoomsForDiscreteDates(date('Y-m-d'), null, 0, 1);
|
||||
$value = AdminStatsController::getAvailableRoomsForDiscreteDates(date('Y-m-d'), null, $idHotels, 1);
|
||||
$value = $value[strtotime(date('Y-m-d'))];
|
||||
|
||||
break;
|
||||
|
||||
case 'offline_bookable_rooms':
|
||||
$value = AdminStatsController::getAvailableRoomsForDiscreteDates(date('Y-m-d'), null, 0);
|
||||
$value = AdminStatsController::getAvailableRoomsForDiscreteDates(date('Y-m-d'), null, $idHotels);
|
||||
$value = $value[strtotime(date('Y-m-d'))];
|
||||
|
||||
break;
|
||||
@@ -954,7 +968,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
date('Y-m-d', strtotime('-365 day')),
|
||||
date('Y-m-d'),
|
||||
$nbOrdersFrequentCustomers,
|
||||
0
|
||||
$idHotels
|
||||
);
|
||||
|
||||
break;
|
||||
@@ -965,7 +979,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
$value = AdminStatsController::getRevenuePerAvailableCustomer(
|
||||
date('Y-m-d', strtotime('-'.($nbDaysRevPac + 1).' day')),
|
||||
date('Y-m-d', strtotime('-1 day')),
|
||||
0
|
||||
$idHotels
|
||||
);
|
||||
|
||||
$value = Tools::displayPrice($value, $currency);
|
||||
@@ -989,7 +1003,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
|
||||
break;
|
||||
case 'total_sales':
|
||||
$totalSales = AdminStatsController::getTotalSales('', '', false, false, 1);
|
||||
$totalSales = AdminStatsController::getTotalSales('', '', false, $idHotels);
|
||||
if ($totalSales > 0) {
|
||||
$value = Tools::displayPrice($totalSales, $currency);
|
||||
} else {
|
||||
@@ -999,24 +1013,24 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
case 'today_arrivals':
|
||||
$dateToday = date('Y-m-d');
|
||||
$value = 0;
|
||||
if ($arrivalsData = AdminStatsController::getArrivalsByDate($dateToday)) {
|
||||
if ($arrivalsData = AdminStatsController::getArrivalsByDate($dateToday, $idHotels)) {
|
||||
$value = $arrivalsData['total_arrivals'];
|
||||
}
|
||||
break;
|
||||
case 'today_departures':
|
||||
$dateToday = date('Y-m-d');
|
||||
$value = 0;
|
||||
if ($departureData = AdminStatsController::getDeparturesByDate($dateToday)) {
|
||||
if ($departureData = AdminStatsController::getDeparturesByDate($dateToday, $idHotels)) {
|
||||
$value = $departureData['total_departures'];
|
||||
}
|
||||
break;
|
||||
case 'today_stay_over':
|
||||
$dateToday = date('Y-m-d');
|
||||
$value = AdminStatsController::getStayOversByDate($dateToday);
|
||||
$value = AdminStatsController::getStayOversByDate($dateToday, $idHotels);
|
||||
break;
|
||||
case 'total_due_amount':
|
||||
$dateToday = date('Y-m-d');
|
||||
$dueAmount = AdminStatsController::getTotalDueAmount('', '', false, 1);
|
||||
$dueAmount = AdminStatsController::getTotalDueAmount('', '', $idHotels, 1);
|
||||
if ($dueAmount > 0) {
|
||||
$value = Tools::displayPrice($dueAmount, $currency);
|
||||
} else {
|
||||
@@ -1025,7 +1039,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
break;
|
||||
case 'average_lead_time':
|
||||
$dateToday = date('Y-m-d');
|
||||
$value = Tools::ps_round(AdminStatsController::getAverageLeadTime(), 2);
|
||||
$value = Tools::ps_round(AdminStatsController::getAverageLeadTime('', '', $idHotels), 2);
|
||||
if ($value && $value <= 1) {
|
||||
$value .= ' '.$this->l('day');
|
||||
} else {
|
||||
@@ -1035,7 +1049,7 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
break;
|
||||
case 'average_guest_in_booking':
|
||||
$dateToday = date('Y-m-d');
|
||||
$value = AdminStatsController::getAverageGuestsPerBooking();
|
||||
$value = AdminStatsController::getAverageGuestsPerBooking('', '', $idHotels);
|
||||
$value = Tools::ps_round($value['avg_adults'], 2).''.$this->l('Adults').', '.Tools::ps_round($value['avg_children'], 2).''.$this->l('Children');
|
||||
break;
|
||||
default:
|
||||
@@ -1893,16 +1907,15 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
{
|
||||
$sql = 'SELECT COUNT(t.`id_customer`)
|
||||
FROM (
|
||||
SELECT o.`id_customer`, COUNT(o.`id_order`) AS nb_orders,
|
||||
(
|
||||
SELECT hbd.`id_hotel`
|
||||
FROM `'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order` LIMIT 1
|
||||
) AS id_hotel
|
||||
SELECT o.`id_customer`, COUNT(o.`id_order`) AS nb_orders
|
||||
FROM `'._DB_PREFIX_.'orders` o
|
||||
WHERE o.`valid` = 1 AND o.`date_add` BETWEEN "'.pSQL($dateFrom).' 00:00:00" AND "'.pSQL($dateTo).' 23:59:59"
|
||||
AND EXISTS (
|
||||
SELECT 1
|
||||
FROM `qlo_htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order`' . HotelBranchInformation::addHotelRestriction($idHotel).'
|
||||
)
|
||||
GROUP BY o.`id_customer`
|
||||
HAVING 1 '.(!is_null($idHotel) ? HotelBranchInformation::addHotelRestriction($idHotel) : '').'
|
||||
) AS t
|
||||
WHERE t.`nb_orders` >= '.(int) $nbOrders;
|
||||
$result = Db::getInstance()->getValue($sql);
|
||||
@@ -2407,16 +2420,17 @@ class AdminStatsControllerCore extends AdminStatsTabController
|
||||
$objHotelBooking = new HotelBookingDetail();
|
||||
$invalidOrderStates = $objHotelBooking->getOrderStatusToFreeBookedRoom();
|
||||
|
||||
$sql = 'SELECT (' . ($useTax ? 'SUM(o.`total_paid_tax_incl` / o.`conversion_rate`)' : 'SUM(o.`total_paid_tax_excl` / o.`conversion_rate`)') . ' - SUM(o.`total_paid_real` / o.`conversion_rate`)),
|
||||
(
|
||||
SELECT hbd.`id_hotel`
|
||||
FROM`'._DB_PREFIX_.'htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order` LIMIT 1
|
||||
) AS id_hotel
|
||||
$sql = 'SELECT ' . ($useTax ? 'SUM(o.`total_paid_tax_incl` / o.`conversion_rate`)' : 'SUM(o.`total_paid_tax_excl` / o.`conversion_rate`)') . ' - SUM(o.`total_paid_real` / o.`conversion_rate`)
|
||||
FROM `'._DB_PREFIX_.'orders` o
|
||||
LEFT JOIN `'._DB_PREFIX_.'order_state` os ON o.current_state = os.id_order_state
|
||||
WHERE 1 ' . ($invalidOrderStates ? ' AND o.`current_state` NOT IN ('.implode(',', $invalidOrderStates).')' : '') . (($dateFrom && $dateTo) ? ' AND o.`date_add` BETWEEN "'.pSQL($dateFrom).' 00:00:00" AND "'.pSQL($dateTo).' 23:59:59"' : '').' HAVING 1 '.HotelBranchInformation::addHotelRestriction($idHotel);
|
||||
|
||||
WHERE 1 ' .
|
||||
($invalidOrderStates ? ' AND o.`current_state` NOT IN ('.implode(',', $invalidOrderStates).')' : '') .
|
||||
(($dateFrom && $dateTo) ? ' AND o.`date_add` BETWEEN "'.pSQL($dateFrom).' 00:00:00" AND "'.pSQL($dateTo).' 23:59:59"' : '').
|
||||
' AND EXISTS (
|
||||
SELECT 1
|
||||
FROM `qlo_htl_booking_detail` hbd
|
||||
WHERE hbd.`id_order` = o.`id_order`' . HotelBranchInformation::addHotelRestriction($idHotel).'
|
||||
)';
|
||||
return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($sql);
|
||||
}
|
||||
|
||||
|
||||
@@ -1374,7 +1374,7 @@ class AdminTranslationsControllerCore extends AdminController
|
||||
$helper->href = $this->context->link->getAdminLink('AdminLanguages');
|
||||
$helper->title = $this->l('Enabled Languages', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=enabled_languages';
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-fo-translations';
|
||||
@@ -1382,7 +1382,7 @@ class AdminTranslationsControllerCore extends AdminController
|
||||
$helper->color = 'color3';
|
||||
$helper->title = $this->l('Front office Translations', null, null, false);
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=frontoffice_translations';
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
$helper = new HelperKpi();
|
||||
$helper->id = 'box-bo-translations';
|
||||
@@ -1394,15 +1394,9 @@ class AdminTranslationsControllerCore extends AdminController
|
||||
}
|
||||
$helper->source = $this->context->link->getAdminLink('AdminStats').'&ajax=1&action=getKpi&kpi=backoffice_translations';
|
||||
$helper->refresh = (bool)(ConfigurationKPI::get('BACKOFFICE_TRANSLATIONS_EXPIRE') < $time);
|
||||
$kpis[] = $helper;
|
||||
$this->kpis[] = $helper;
|
||||
|
||||
Hook::exec('action'.$this->controller_name.'KPIListingModifier', array(
|
||||
'kpis' => &$kpis,
|
||||
));
|
||||
|
||||
$helper = new HelperKpiRow();
|
||||
$helper->kpis = $kpis;
|
||||
return $helper->generate();
|
||||
return parent::renderKpis();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -72,6 +72,13 @@ const RoomReallocationModal = {
|
||||
$("span.modal_curr_room_num").text(roomObj.data('room_num') + ', ' + roomObj.data('room_type_name'));
|
||||
$(".cust_name").text(roomObj.data('cust_name'));
|
||||
$(".cust_email").text(roomObj.data('cust_email'));
|
||||
$(".modal_curr_allotent_type").text(roomObj.data('allotment_type_label'));
|
||||
|
||||
if ((roomObj.data('comment') == '') || (roomObj.data('comment') == null)) {
|
||||
$(".allotment_comment_block").hide();
|
||||
} else {
|
||||
$(".modal_curr_allotment_comment").text(roomObj.data('comment'));
|
||||
}
|
||||
|
||||
// reset price difference fields
|
||||
$("#reallocation_price_diff").val(0);
|
||||
|
||||
@@ -852,11 +852,19 @@ class HotelBranchInformation extends ObjectModel
|
||||
$idProfile = Context::getContext()->employee->id_profile;
|
||||
}
|
||||
|
||||
$accessedIds = self::getProfileAccessedHotels($idProfile, 1, 1);
|
||||
if (!$idsHotel) {
|
||||
$idsHotel = self::getProfileAccessedHotels($idProfile, 1, 1);
|
||||
$idsHotel = $accessedIds;
|
||||
} else {
|
||||
$idsHotel = array($idsHotel);
|
||||
if (!is_array($idsHotel)) {
|
||||
$idsHotel = array($idsHotel);
|
||||
}
|
||||
// check if passed hotel id's are available for current employee
|
||||
$idsHotel = array_filter($idsHotel, function ($idHotel) use($accessedIds) {
|
||||
return in_array($idHotel, $accessedIds);
|
||||
});
|
||||
}
|
||||
|
||||
$restriction = ' AND ';
|
||||
if (count($idsHotel)) {
|
||||
if ($alias) {
|
||||
@@ -866,7 +874,7 @@ class HotelBranchInformation extends ObjectModel
|
||||
$identifier = "`$identifier`";
|
||||
$restriction .= $alias.$identifier.' IN ('.implode(', ', $idsHotel).') ';
|
||||
} else {
|
||||
$restriction .= 1;
|
||||
$restriction .= 0;
|
||||
}
|
||||
|
||||
return $restriction;
|
||||
|
||||
@@ -430,6 +430,9 @@ class HotelCartBookingData extends ObjectModel
|
||||
}
|
||||
}
|
||||
}
|
||||
// after room is removed from cart, check if any of the appled cart rules are not being used
|
||||
CartRule::autoRemoveFromCart(Context::getContext());
|
||||
CartRule::autoAddToCart(Context::getContext());
|
||||
|
||||
// return number of rooms deleted
|
||||
return true;
|
||||
@@ -1912,6 +1915,15 @@ class HotelCartBookingData extends ObjectModel
|
||||
}
|
||||
}
|
||||
|
||||
public function save($null_values = false, $auto_date = true)
|
||||
{
|
||||
$return = parent::save($null_values = false, $auto_date = true);
|
||||
// after updating cart data, check if any of the appled cart rules are not being used
|
||||
CartRule::autoRemoveFromCart(Context::getContext());
|
||||
CartRule::autoAddToCart(Context::getContext());
|
||||
return $return;
|
||||
}
|
||||
|
||||
public function update($null_values = false)
|
||||
{
|
||||
if (!$this->extra_demands) {
|
||||
|
||||
@@ -171,6 +171,36 @@ class AdminAddHotelController extends ModuleAdminController
|
||||
}
|
||||
}
|
||||
$smartyVars['order_restrict_date_info'] = $restrictDateInfo;
|
||||
$objHotelFeatures = new HotelFeatures();
|
||||
$hotelFeatures = $this->object->getFeaturesOfHotelByHotelId($this->object->id);
|
||||
if ($features = $objHotelFeatures->HotelBranchSelectedFeaturesArray($hotelFeatures)) {
|
||||
foreach ($features as $idFeature => $feature) {
|
||||
$features[$idFeature]['value'] = $idFeature;
|
||||
$features[$idFeature]['input_name'] = 'id_feature_parents';
|
||||
if (isset($feature['children']) && $feature['children']) {
|
||||
$selectedChildFeatures = 0;
|
||||
foreach ($feature['children'] as $childKey => $childFeature) {
|
||||
$features[$idFeature]['children'][$childKey]['value'] = $childFeature['id'];
|
||||
$features[$idFeature]['children'][$childKey]['input_name'] = 'id_features';
|
||||
if (isset($childFeature['selected']) && $childFeature['selected']) {
|
||||
$selectedChildFeatures++;
|
||||
}
|
||||
}
|
||||
|
||||
if ($selectedChildFeatures == count($feature['children'])) {
|
||||
$features[$idFeature]['selected'] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$tree = new HelperTree('hotel-features-tree', $features);
|
||||
$tree->setShowCollapseExpandButton(true)
|
||||
->setUseCheckBox(true)
|
||||
->setAutoSelectChildren(true)
|
||||
->setUseBulkActions(true);
|
||||
$treeContent = $tree->render();
|
||||
$smartyVars['hotel_feature_tree'] = $treeContent;
|
||||
}
|
||||
} else {
|
||||
$idCountry = Tools::getValue('hotel_country');
|
||||
}
|
||||
@@ -226,6 +256,7 @@ class AdminAddHotelController extends ModuleAdminController
|
||||
$longitude = Tools::getValue('loclongitude');
|
||||
$map_formated_address = Tools::getValue('locformatedAddr');
|
||||
$map_input_text = Tools::getValue('googleInputField');
|
||||
$hotelFeatures = Tools::getValue('id_features', array());
|
||||
|
||||
// check if field is atleast in default language. Not available in default prestashop
|
||||
$defaultLangId = Configuration::get('PS_LANG_DEFAULT');
|
||||
@@ -640,6 +671,12 @@ class AdminAddHotelController extends ModuleAdminController
|
||||
$objHotelOrderRestrictDate->preparation_time = $preparationTime;
|
||||
}
|
||||
$objHotelOrderRestrictDate->save();
|
||||
|
||||
$objHotelFeatures = new HotelBranchFeatures();
|
||||
$objHotelFeatures->deleteBranchFeaturesByHotelId($idHotel);
|
||||
if (!$objHotelFeatures->assignFeaturesToHotel($idHotel, $hotelFeatures)) {
|
||||
$this->errors[] = $this->l('Some problem occurred while assigning features to the hotel.');
|
||||
}
|
||||
}
|
||||
|
||||
if (Tools::isSubmit('submitAdd'.$this->table.'AndStay')) {
|
||||
|
||||
@@ -1,229 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* 2010-2020 Webkul.
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* All right is reserved,
|
||||
* Please go through this link for complete license : https://store.webkul.com/license.html
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade this module to newer
|
||||
* versions in the future. If you wish to customize this module for your
|
||||
* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information.
|
||||
*
|
||||
* @author Webkul IN <support@webkul.com>
|
||||
* @copyright 2010-2020 Webkul IN
|
||||
* @license https://store.webkul.com/license.html
|
||||
*/
|
||||
|
||||
class AdminAssignHotelFeaturesController extends ModuleAdminController
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
$this->bootstrap = true;
|
||||
$this->table = 'htl_branch_features';
|
||||
$this->className = 'HotelBranchFeatures';
|
||||
$this->identifier = 'id';
|
||||
$this->context = Context::getContext();
|
||||
|
||||
// START send access query information to the admin controller
|
||||
$this->access_select = ' SELECT a.`id` FROM '._DB_PREFIX_.'htl_branch_features a';
|
||||
$this->access_join = ' INNER JOIN '._DB_PREFIX_.'htl_branch_info hbi ON (hbi.id = a.id_hotel)';
|
||||
if ($acsHtls = HotelBranchInformation::getProfileAccessedHotels($this->context->employee->id_profile, 1, 1)) {
|
||||
$this->access_where = ' WHERE hbi.id IN ('.implode(',', $acsHtls).')';
|
||||
}
|
||||
|
||||
parent::__construct();
|
||||
|
||||
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'htl_branch_info` hi ON (hi.`id` = a.`id_hotel`)';
|
||||
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'htl_branch_info_lang` hil
|
||||
ON (hi.`id` = hil.`id` AND hil.id_lang = '.(int)$this->context->language->id.')';
|
||||
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'address` addr ON (addr.`id_hotel` = hi.`id`)';
|
||||
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'state` s ON (s.`id_state` = addr.`id_state`)';
|
||||
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'country_lang` cl ON (cl.`id_country` = addr.`id_country`
|
||||
AND cl.`id_lang` = '.(int)$this->context->language->id.')';
|
||||
|
||||
$this->_select .= 'addr.`city` as htl_city, hi.`id` as htl_id, hil.`hotel_name` as htl_name,
|
||||
s.`name` as `state_name`, cl.`name`';
|
||||
$this->_group = 'GROUP BY a.`id_hotel`';
|
||||
|
||||
$this->fields_list = array(
|
||||
'htl_id' => array(
|
||||
'title' => $this->l('Hotel ID'),
|
||||
'align' => 'center',
|
||||
'filter_key' => 'hi!id',
|
||||
),
|
||||
'htl_name' => array(
|
||||
'title' => $this->l('Hotel Name'),
|
||||
'align' => 'center',
|
||||
'filter_key' => 'hil!hotel_name',
|
||||
),
|
||||
'htl_city' => array(
|
||||
'title' => $this->l('City'),
|
||||
'align' => 'center',
|
||||
'filter_key' => 'addr!city',
|
||||
),
|
||||
|
||||
'state_name' => array(
|
||||
'title' => $this->l('State'),
|
||||
'align' => 'center',
|
||||
'filter_key' => 's!name',
|
||||
),
|
||||
'name' => array(
|
||||
'title' => $this->l('Country'),
|
||||
'align' => 'center',
|
||||
'filter_key' => 'cl!name',
|
||||
),
|
||||
'date_add' => array(
|
||||
'title' => $this->l('Date Added'),
|
||||
'align' => 'center',
|
||||
'type' => 'datetime',
|
||||
'filter_key' => 'a!date_add',
|
||||
)
|
||||
);
|
||||
|
||||
$this->bulk_actions = array(
|
||||
'delete' => array(
|
||||
'text' => $this->l('Delete selected'),
|
||||
'icon' => 'icon-trash',
|
||||
'confirm' => $this->l('Delete selected items?')
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public function initToolbar()
|
||||
{
|
||||
parent::initToolbar();
|
||||
|
||||
$this->page_header_toolbar_btn['new_feature'] = array(
|
||||
'href' => $this->context->link->getAdminLink('AdminHotelFeatures'),
|
||||
'desc' => $this->l('Hotel Features'),
|
||||
'imgclass' => 'back'
|
||||
);
|
||||
|
||||
$this->page_header_toolbar_btn['assignfeatures'] = array(
|
||||
'href' => self::$currentIndex.'&add'.$this->table.'&token='.$this->token,
|
||||
'desc' => $this->l('Assign Features'),
|
||||
'imgclass' => 'new'
|
||||
);
|
||||
}
|
||||
|
||||
public function renderList()
|
||||
{
|
||||
$this->addRowAction('edit');
|
||||
$this->addRowAction('delete');
|
||||
|
||||
return parent::renderList();
|
||||
}
|
||||
|
||||
public function renderForm()
|
||||
{
|
||||
$smartyVars = array();
|
||||
if ($this->display == 'add') {
|
||||
$objHotelFeatures = new HotelFeatures();
|
||||
$featuresList = $objHotelFeatures->HotelAllCommonFeaturesArray();
|
||||
$objBranchInfo = new HotelBranchInformation();
|
||||
$unassignedFtrsHotels = $objBranchInfo->getUnassignedFeaturesHotelIds();
|
||||
// filter hotels as per accessed hotels
|
||||
$unassignedFtrsHotels = HotelBranchInformation::filterDataByHotelAccess(
|
||||
$unassignedFtrsHotels,
|
||||
$this->context->employee->id_profile,
|
||||
1
|
||||
);
|
||||
|
||||
$smartyVars['hotels'] = $unassignedFtrsHotels;
|
||||
$smartyVars['features_list'] = $featuresList;
|
||||
} elseif ($this->display == 'edit') {
|
||||
$id = Tools::getValue('id');
|
||||
$objBranchFeatures = new HotelBranchFeatures($id);
|
||||
$smartyVars['edit'] = 1;
|
||||
$objHotelFeatures = new HotelFeatures();
|
||||
$objBranchInfo = new HotelBranchInformation();
|
||||
|
||||
$features_hotel = $objBranchInfo->getFeaturesOfHotelByHotelId($objBranchFeatures->id_hotel);
|
||||
$featuresList = $objHotelFeatures->HotelBranchSelectedFeaturesArray($features_hotel);
|
||||
|
||||
$hotels = $objBranchInfo->hotelsNameAndId();
|
||||
$smartyVars['hotel_id'] = $objBranchFeatures->id_hotel;
|
||||
$smartyVars['hotels'] = $hotels;
|
||||
$smartyVars['features_list'] = $featuresList;
|
||||
}
|
||||
|
||||
$this->context->smarty->assign($smartyVars);
|
||||
|
||||
$this->fields_form = array(
|
||||
'submit' => array(
|
||||
'title' => $this->l('Save')
|
||||
)
|
||||
);
|
||||
return parent::renderForm();
|
||||
}
|
||||
|
||||
public function processSave()
|
||||
{
|
||||
if ($editId = Tools::getValue('edit_hotel_id')) {
|
||||
$objBranchFeatures = new HotelBranchFeatures();
|
||||
$objBranchFeatures->deleteBranchFeaturesByHotelId($editId);
|
||||
}
|
||||
if (!$hotelFeatures = Tools::getValue('hotel_fac')) {
|
||||
$this->errors[] = $this->l('Please select at least one feature to assign to a hotel.');
|
||||
}
|
||||
if (!$idHotel = Tools::getValue('id_hotel')) {
|
||||
$this->errors[] = $this->l('Please select a hotel first.');
|
||||
}
|
||||
if (!count($this->errors)) {
|
||||
$objHotelFeatures = new HotelBranchFeatures();
|
||||
if (!$objHotelFeatures->assignFeaturesToHotel($idHotel, $hotelFeatures)) {
|
||||
$this->errors[] = $this->l('Some problem occure while assigning Features to the hotel.');
|
||||
}
|
||||
if (empty($this->errors)) {
|
||||
if (Tools::isSubmit('submitAdd'.$this->table.'AndStay')) {
|
||||
Tools::redirectAdmin(
|
||||
self::$currentIndex.'&id='.(int)$idHotel.'&update'.$this->table.'&conf=3&token='.$this->token
|
||||
);
|
||||
} else {
|
||||
Tools::redirectAdmin(self::$currentIndex.'&conf=4&token='.$this->token);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$this->display = 'add';
|
||||
}
|
||||
}
|
||||
|
||||
public function processDelete()
|
||||
{
|
||||
if (Validate::isLoadedObject($object = $this->loadObject())) {
|
||||
$object = $this->loadObject();
|
||||
if ($object->id) {
|
||||
$objBranchFeatures = new HotelBranchFeatures();
|
||||
$objBranchFeatures->deleteBranchFeaturesByHotelId($object->id_hotel);
|
||||
}
|
||||
} else {
|
||||
$this->errors[] = $this->l('An error occurred while deleting the object.').'<b>'.$this->table.'</b> '.
|
||||
$this->l('(cannot load object)');
|
||||
}
|
||||
parent::processDelete();
|
||||
}
|
||||
|
||||
protected function processBulkDelete()
|
||||
{
|
||||
if (is_array($this->boxes) && !empty($this->boxes)) {
|
||||
foreach ($this->boxes as $key => $value) {
|
||||
$objBranchFeatures = new HotelBranchFeatures($value);
|
||||
$objBranchFeatures->deleteBranchFeaturesByHotelId($objBranchFeatures->id_hotel);
|
||||
}
|
||||
parent::processBulkDelete();
|
||||
} else {
|
||||
$this->errors[] = $this->l('You must select at least one element to delete.');
|
||||
}
|
||||
}
|
||||
|
||||
public function setMedia()
|
||||
{
|
||||
parent::setMedia();
|
||||
$this->addJs(_MODULE_DIR_.'hotelreservationsystem/views/js/HotelReservationAdmin.js');
|
||||
$this->addCSS(_MODULE_DIR_.'hotelreservationsystem/views/css/HotelReservationAdmin.css');
|
||||
}
|
||||
}
|
||||
@@ -41,11 +41,6 @@ class AdminHotelFeaturesController extends ModuleAdminController
|
||||
'desc' => $this->l('Add new Features'),
|
||||
'imgclass' => 'new'
|
||||
);
|
||||
|
||||
$this->page_header_toolbar_btn['new'] = array(
|
||||
'href' => $this->context->link->getAdminLink('AdminAssignHotelFeatures'),
|
||||
'desc' => $this->l('Assign Features To Hotel'),
|
||||
);
|
||||
}
|
||||
|
||||
public function renderView()
|
||||
|
||||
@@ -577,7 +577,6 @@ class HotelReservationSystem extends Module
|
||||
$this->installTab('AdminHotelGeneralSettings', 'Hotel General Configuration', 'AdminHotelConfigurationSetting', false);
|
||||
$this->installTab('AdminHotelFeaturePricesSettings', 'Advanced Price Rules', 'AdminHotelConfigurationSetting', false);
|
||||
$this->installTab('AdminRoomTypeGlobalDemand', 'Additional Demand Configuration', 'AdminHotelConfigurationSetting', false);
|
||||
$this->installTab('AdminAssignHotelFeatures', 'Assign Hotel Features', false, false);
|
||||
$this->installTab('AdminBookingDocument', 'Booking Documents', false, false);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -83,6 +83,12 @@
|
||||
{l s='Refund Policies' mod='hotelreservationsystem'}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#hotel-features" data-toggle="tab">
|
||||
<i class="icon-list-alt"></i>
|
||||
{l s='Features' mod='hotelreservationsystem'}
|
||||
</a>
|
||||
</li>
|
||||
{hook h='displayAdminAddHotelFormTab' id_hotel=$hook_arg_id_hotel}
|
||||
</ul>
|
||||
<div class="tab-content panel collapse in">
|
||||
@@ -488,6 +494,29 @@
|
||||
|
||||
{hook h='displayAdminAddHotelFormRefundPoliciesTabAfter' id_hotel=$hook_arg_id_hotel}
|
||||
</div>
|
||||
<div class="tab-pane" id="hotel-features">
|
||||
{hook h='displayAdminAddHotelFormFeaturesTabBefore' id_hotel=$hook_arg_id_hotel}
|
||||
{if isset($hotel_feature_tree)}
|
||||
<div class="form-group">
|
||||
<label for="hotel_feature" class="control-label col-sm-3">
|
||||
<span title="" data-toggle="tooltip" class="label-tooltip" data-original-title='{l s='Select features for this hotel.' mod='hotelreservationsystem'}'>{l s='Select feature' mod='hotelreservationsystem'}</span>
|
||||
</label>
|
||||
<div class="col-xs-7 hotel_features_tree">
|
||||
{$hotel_feature_tree}
|
||||
</div>
|
||||
</div>
|
||||
{elseif isset($hotel_info.id) && $hotel_info.id}
|
||||
<div class="alert alert-warning">
|
||||
{l s='No features created yet.' mod='hotelreservationsystem'} {l s='You can create features by visiting ' mod='hotelreservationsystem'} <a target="_blank" href="{$link->getAdminLink('AdminHotelFeatures')}">{l s='manage hotel features.' mod='hotelreservationsystem'}</a>
|
||||
</div>
|
||||
{else}
|
||||
<div class="alert alert-warning">
|
||||
{l s='Please save hotel information before assigning hotel features.' mod='hotelreservationsystem'}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{hook h='displayAdminAddHotelFormFeaturesTabAfter' id_hotel=$hook_arg_id_hotel}
|
||||
</div>
|
||||
{hook h='displayAdminAddHotelFormTabContent' id_hotel=$hook_arg_id_hotel}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -224,7 +224,7 @@
|
||||
</td>
|
||||
<td>
|
||||
{if $rm_dtl_v['booking_type'] == HotelBookingDetail::ALLOTMENT_AUTO}
|
||||
<button type="button" class="btn btn-primary room_reallocate_swap" id="reallocate_room_{$rm_dtl_v['id_htl_booking']}" data-room_type_name="{$rm_dtl_v['room_type_name']}" data-id_htl_booking="{$rm_dtl_v['id_htl_booking']}" data-id_order="{$rm_dtl_v['id_order']}" data-room_num='{$booked_v['room_num']}' data-currency_sign='{$rm_dtl_v['currency_sign']}' data-id_room_type='{$booked_v['id_product']}' data-cust_name='{$rm_dtl_v['alloted_cust_name']}' data-cust_email='{$rm_dtl_v['alloted_cust_email']}' data-avail_rm_swap='{$rm_dtl_v['avail_rooms_to_swap']|@json_encode}' data-avail_realloc_room_types='{$rm_dtl_v['avail_room_types_to_realloc']|@json_encode}'>
|
||||
<button type="button" class="btn btn-primary room_reallocate_swap" id="reallocate_room_{$rm_dtl_v['id_htl_booking']}" data-room_type_name="{$rm_dtl_v['room_type_name']}" data-id_htl_booking="{$rm_dtl_v['id_htl_booking']}" data-id_order="{$rm_dtl_v['id_order']}" data-room_num='{$booked_v['room_num']}' data-currency_sign='{$rm_dtl_v['currency_sign']}' data-id_room_type='{$booked_v['id_product']}' data-cust_name='{$rm_dtl_v['alloted_cust_name']}' data-cust_email='{$rm_dtl_v['alloted_cust_email']}' data-avail_rm_swap='{$rm_dtl_v['avail_rooms_to_swap']|@json_encode}' data-avail_realloc_room_types='{$rm_dtl_v['avail_room_types_to_realloc']|@json_encode}' data-allotment_type_label='{if $rm_dtl_v['booking_type'] == $ALLOTMENT_MANUAL}{l s='Manual'}{else}{l s='Auto'}{/if}' data-comment='{$rm_dtl_v.comment}'>
|
||||
{l s='Reallocate Room' mod='hotelreservationsystem'}
|
||||
</button>
|
||||
{else}
|
||||
|
||||
@@ -208,6 +208,7 @@ class AdminAboutHotelBlockSettingController extends ModuleAdminController
|
||||
$this->l('Maximum image size: %1s'),
|
||||
Tools::formatBytes(Tools::getMaxUploadSize())
|
||||
),
|
||||
'desc' => $this->l('Recommended resolution: 720 x 360 pixels.'),
|
||||
),
|
||||
array(
|
||||
'type' => 'switch',
|
||||
@@ -272,12 +273,11 @@ class AdminAboutHotelBlockSettingController extends ModuleAdminController
|
||||
} while ((bool)Tools::file_get_contents(
|
||||
$this->context->link->getMediaLink(_MODULE_DIR_.$this->module->name.'/views/img/hotel_interior/'.$tmp_name.'.jpg')
|
||||
));
|
||||
$imageSize = ImageType::getByName(ImageType::getFormatedName('large'));
|
||||
ImageManager::resize(
|
||||
$file['tmp_name'],
|
||||
_PS_MODULE_DIR_.$this->module->name.'/views/img/hotel_interior/'.$tmp_name.'.jpg',
|
||||
$imageSize['width'],
|
||||
$imageSize['height']
|
||||
720,
|
||||
360
|
||||
);
|
||||
|
||||
$objHtlInteriorImg->name = $tmp_name;
|
||||
|
||||
@@ -201,6 +201,7 @@ class AdminFeaturesModuleSettingController extends ModuleAdminController
|
||||
$this->l('Maximum image size: %1s'),
|
||||
Tools::formatBytes(Tools::getMaxUploadSize())
|
||||
),
|
||||
'desc' => $this->l('Recommended resolution: 720 x 540 pixels.'),
|
||||
),
|
||||
array(
|
||||
'type' => 'switch',
|
||||
@@ -319,12 +320,11 @@ class AdminFeaturesModuleSettingController extends ModuleAdminController
|
||||
if (file_exists($imgPath)) {
|
||||
unlink($imgPath);
|
||||
}
|
||||
$imageSize = ImageType::getByName(ImageType::getFormatedName('large'));
|
||||
ImageManager::resize(
|
||||
$file['tmp_name'],
|
||||
$imgPath,
|
||||
$imageSize['width'],
|
||||
$imageSize['height']
|
||||
720,
|
||||
540
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -17,18 +17,53 @@
|
||||
* @license https://store.webkul.com/license.html
|
||||
*/
|
||||
|
||||
.hotelRoomDescContainer{
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background-color: rgba(255, 255, 255, 0.85);
|
||||
margin-left: 15px;
|
||||
margin-right: 15px;
|
||||
padding: 20px;
|
||||
z-index: 10;
|
||||
.htlRoomTypeDescTextContainer {
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 3;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
.htlRoomTypeDescReadmore, .htlRoomTypeDescReadless{
|
||||
cursor: pointer;
|
||||
font-weight: 400;
|
||||
display: none;
|
||||
}
|
||||
.htlRoomTypeDescExtras {
|
||||
display: none;
|
||||
}
|
||||
@media (min-width: 530px) {
|
||||
.hotelRoomDescContainer{
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background-color: rgba(255, 255, 255, 0.8);
|
||||
margin-left: 10px;
|
||||
margin-right: 10px;
|
||||
padding: 20px;
|
||||
z-index: 10;
|
||||
}
|
||||
.htlRoomTypePriceText{
|
||||
float :right;
|
||||
}
|
||||
}
|
||||
@media (max-width: 530px) {
|
||||
.hotelRoomDescContainer{
|
||||
padding: 10px;
|
||||
}
|
||||
.wk_roomType_price_type{
|
||||
font-size: 16px;
|
||||
font-weight: 400;
|
||||
}
|
||||
.htlRoomTypeNameText {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.room_type_old_price {
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
.htlRoomTypeNameText, .htlRoomTypePriceText {
|
||||
font-size: 18px;
|
||||
color: #222222;
|
||||
@@ -37,17 +72,19 @@
|
||||
}
|
||||
.htlRoomTypeDescText{
|
||||
font-size: 16px;
|
||||
word-break: break-word;
|
||||
color: #555555;
|
||||
font-weight: 300;
|
||||
line-height: 21px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.htlRoomTypeBookNow {
|
||||
font-size: 15px!important;
|
||||
color: #333333!important;
|
||||
font-weight: 400!important;
|
||||
background: transparent!important;
|
||||
border: 1px solid #333333!important;
|
||||
padding: 10px 30px!important;
|
||||
a.htlRoomTypeBookNow {
|
||||
font-size: 15px;
|
||||
color: #333333;
|
||||
font-weight: 400;
|
||||
background: transparent;
|
||||
border: 1px solid #333333;
|
||||
padding: 10px 30px;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
@@ -55,10 +92,6 @@
|
||||
border: 1px solid #333333;
|
||||
}
|
||||
|
||||
.htlRoomTypeDescText {
|
||||
padding-bottom: 9px;
|
||||
}
|
||||
|
||||
.room_type_old_price {
|
||||
text-decoration: line-through;
|
||||
color:#555555;
|
||||
|
||||
78
modules/wkhotelroom/views/js/WkHotelRoomBlockFront.js
Normal file
78
modules/wkhotelroom/views/js/WkHotelRoomBlockFront.js
Normal file
@@ -0,0 +1,78 @@
|
||||
/**
|
||||
* Since 2010 Webkul.
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* All right is reserved,
|
||||
* Please go through this link for complete license : https://store.webkul.com/license.html
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade this module to newer
|
||||
* versions in the future. If you wish to customize this module for your
|
||||
* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information.
|
||||
*
|
||||
* @author Webkul IN <support@webkul.com>
|
||||
* @copyright Since 2010 Webkul IN
|
||||
* @license https://store.webkul.com/license.html
|
||||
*/
|
||||
|
||||
$(document).ready(function() {
|
||||
applyChangesToDescription();
|
||||
$(window).on('resize', function() {
|
||||
resetDescriptionChanges();
|
||||
applyChangesToDescription();
|
||||
});
|
||||
|
||||
$(document).on('click', '.htlRoomTypeDescReadmore', function(e) {
|
||||
e.preventDefault();
|
||||
var target = (e.target).closest(".htlRoomTypeDescText");
|
||||
$(target).removeClass('htlRoomTypeDescTextContainer');
|
||||
$(target).html($(e.target).closest(".hotelRoomDescContainer").find('.htlRoomTypeDescOriginal').html());
|
||||
$(target).append($('.htlRoomTypeDescExtras').html());
|
||||
$(target).find('.htlRoomTypeDescReadless').show().css('display', 'inline-block');
|
||||
});
|
||||
|
||||
$(document).on('click', '.htlRoomTypeDescReadless', function(e) {
|
||||
e.preventDefault();
|
||||
var target = (e.target).closest(".htlRoomTypeDescText");
|
||||
$(target).addClass('htlRoomTypeDescTextContainer');
|
||||
initToggleOptions($(target));
|
||||
});
|
||||
});
|
||||
|
||||
function resetDescriptionChanges() {
|
||||
$(document).find('.htlRoomTypeDescText').each(function() {
|
||||
$(this).addClass('htlRoomTypeDescTextContainer');
|
||||
$(this).html($(this).parent().find('.htlRoomTypeDescOriginal').html());
|
||||
});
|
||||
}
|
||||
|
||||
function applyChangesToDescription() {
|
||||
$(document).find('.htlRoomTypeDescText').each(function() {
|
||||
// checking if the display:overFlow has been applied to the description. using 14px since font size is 14px.
|
||||
if ($(this).prop('scrollHeight') - $(this).prop('clientHeight') > 14) {
|
||||
initToggleOptions($(this)[0]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function initToggleOptions(target) {
|
||||
truncatedText = truncateText(target);
|
||||
$(target).text(truncatedText);
|
||||
$(target).append($('.htlRoomTypeDescExtras').html());
|
||||
$(target).find('.htlRoomTypeDescReadmore').first().show().css('display', 'inline-block');
|
||||
}
|
||||
|
||||
function truncateText(target) {
|
||||
var lineHeight = parseInt($(target).css('line-height'), 10);
|
||||
var containerHeight = lineHeight * 3;
|
||||
|
||||
text = $(target).text();
|
||||
while ($(target).prop('scrollHeight') > containerHeight) {
|
||||
text = text.slice(0, -10);
|
||||
$(target).text(text + ' ... ' + $('.htlRoomTypeDescReadmore').first().text());
|
||||
}
|
||||
|
||||
return text;
|
||||
}
|
||||
@@ -45,22 +45,24 @@
|
||||
<div class="row margin-lr-0">
|
||||
<p class="htlRoomTypeNameText pull-left">{$roomDisplay.name|escape:'htmlall':'UTF-8'}</p>
|
||||
{if $roomDisplay.show_price && !isset($restricted_country_mode) && !$PS_CATALOG_MODE}
|
||||
<p class="htlRoomTypePriceText pull-right">
|
||||
<p class="htlRoomTypePriceText">
|
||||
{if $roomDisplay.feature_price_diff >= 0}
|
||||
<span class="wk_roomType_price {if $roomDisplay.feature_price_diff>0}room_type_old_price{/if}">{convertPrice price = $roomDisplay.price_without_reduction}</span>
|
||||
{/if}
|
||||
{if $roomDisplay.feature_price_diff}
|
||||
<span class="wk_roomType_price">{convertPrice price = $roomDisplay.feature_price}</span>
|
||||
{/if}
|
||||
/ {l s='Per Night' mod='wkhotelroom'}
|
||||
<span class="wk_roomType_price_type">
|
||||
/ {l s='Per Night' mod='wkhotelroom'}
|
||||
</span>
|
||||
</p>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="row margin-lr-0 htlRoomTypeDescText">
|
||||
{$roomDisplay.description}
|
||||
</div>
|
||||
<div class="row margin-lr-0 htlRoomTypeDescText htlRoomTypeDescTextContainer">{$roomDisplay.description|escape:'html':'UTF-8'}</div>
|
||||
<div class="row htlRoomTypeDescOriginal" hidden>{$roomDisplay.description|escape:'html':'UTF-8'}</div>
|
||||
<div class="htlRoomTypeDescExtras"><span class='htlRoomTypeDescReadmore'>...{l s='Read More.' mod='wkhotelroom'}</span><span class='htlRoomTypeDescReadless'>...{l s='Read Less.' mod='wkhotelroom'}</span></div>
|
||||
<div class="row margin-lr-0">
|
||||
<a class="btn btn-default button htlRoomTypeBookNow" href="{$link->getProductLink($roomDisplay.id_product)|escape:'html':'UTF-8'}"><span>{if !isset($restricted_country_mode) && !$PS_CATALOG_MODE}{l s='book now' mod='wkhotelroom'}{else}{l s='View' mod='wkhotelroom'}{/if}</span></a>
|
||||
<a class="btn htlRoomTypeBookNow" href="{$link->getProductLink($roomDisplay.id_product)|escape:'html':'UTF-8'}"><span>{if !isset($restricted_country_mode) && !$PS_CATALOG_MODE}{l s='book now' mod='wkhotelroom'}{else}{l s='View' mod='wkhotelroom'}{/if}</span></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -115,6 +115,7 @@ class WkHotelRoom extends Module
|
||||
)
|
||||
);
|
||||
|
||||
$this->context->controller->addJs($this->_path.'/views/js/WkHotelRoomBlockFront.js');
|
||||
$this->context->controller->addCSS($this->_path.'/views/css/WkHotelRoomBlockFront.css');
|
||||
|
||||
return $this->display(__FILE__, 'hotelRoomDisplayBlock.tpl');
|
||||
|
||||
@@ -185,6 +185,7 @@ class AdminTestimonialsModuleSettingController extends ModuleAdminController
|
||||
'display_image' => true,
|
||||
'image' => $imgExist ? $image : false,
|
||||
'hint' => $this->l('Upload an image of the person to whom this testimonial belongs.'),
|
||||
'desc' => $this->l('Recommended resolution: 98 x 98 pixels.'),
|
||||
),
|
||||
array(
|
||||
'type' => 'switch',
|
||||
|
||||
@@ -387,10 +387,6 @@
|
||||
{if sizeof($discounts)}
|
||||
<div class="row">
|
||||
{foreach $discounts as $discount}
|
||||
{if ((float)$discount.value_real == 0 && $discount.free_shipping != 1) || ((float)$discount.value_real == 0 && $discount.code == '')}
|
||||
{continue}
|
||||
{/if}
|
||||
|
||||
<div class="col-sm-12 margin-btm-10 cart_discount {if $discount@last}last_item{elseif $discount@first}first_item{else}item{/if}" id="cart_discount_{$discount.id_discount}">
|
||||
<span class="cart_discount_name">
|
||||
{$discount.name|escape:'html':'UTF-8'}
|
||||
|
||||
@@ -148,6 +148,7 @@
|
||||
</li>
|
||||
{/foreach}
|
||||
{/if}
|
||||
{hook h='displayRoomTypeThumbnailsBottom'}
|
||||
</ul>
|
||||
</div> <!-- end thumbs_list -->
|
||||
{if isset($images) && count($images) > 2}
|
||||
@@ -155,6 +156,7 @@
|
||||
{l s='Next'}
|
||||
</a>
|
||||
{/if}
|
||||
{hook h="displayRoomTypeThumbnailsAfter"}
|
||||
</div> <!-- end views-block -->
|
||||
<!-- end thumbnails -->
|
||||
{/if}
|
||||
|
||||
Reference in New Issue
Block a user