Merge pull request #1784 from AradhanaSingh63/gli-3049

Added: Hooks to add an extra column for additional information in order details in back-office
This commit is contained in:
Rohit Jain
2026-10-27 20:37:15 +05:30
committed by GitHub
29 changed files with 141 additions and 17 deletions

View File

@@ -253,6 +253,7 @@ $(document).ready(function () {
</div>
</div>
</div>
{hook h='displayAdminProductPriceCalculationMethodAfter' product=$product}
<script type="text/javascript">
$(document).ready(function() {
var togglePcmDays = function() {
@@ -688,4 +689,4 @@ $(document).ready(function () {
//unitPriceWithTax('unit');
});
</script>
{/if}
{/if}

View File

@@ -26,6 +26,7 @@
<div class="panel-heading">
<i class="icon-shopping-cart"></i>
{l s='Cart Details'}
{hook h='displayAdminCartDetailsPanelTitleAfter'}
</div>
<div class="row">
<div class="col-lg-12 table-responsive">
@@ -120,6 +121,7 @@
</div>
</div>
</div>
{hook h='displayAdminOrderCartRoomOccupancyAfter' data=$data}
</td>
{/if}
<td id="cart_detail_data_unit_price_{$data.id|escape:'html':'UTF-8'}">
@@ -152,6 +154,7 @@
<button class="delete_hotel_cart_data btn btn-danger" data-id_room="{$data.id_room|escape:'html':'UTF-8'}" data-id_product="{$data.id_product|escape:'html':'UTF-8'}" data-id="{$data.id|escape:'html':'UTF-8'}" data-id_cart="{$data.id_cart|escape:'html':'UTF-8'}" data-date_to="{$data.date_to|escape:'html':'UTF-8'}" data-date_from="{$data.date_from|escape:'html':'UTF-8'}">
<i class="icon-trash"></i>&nbsp;{l s='Delete'}
</button>
{hook h='displayAdminCartDetailsDeleteActionAfter' data=$data}
<br />
<a href="#" id_hotel_cart_booking="{$data.id|escape:'html':'UTF-8'}" id_room="{$data.id_room|escape:'html':'UTF-8'}" date_from="{$data.date_from|escape:'html':'UTF-8'}" date_to="{$data.date_to|escape:'html':'UTF-8'}" id_product="{$data.id_product|escape:'html':'UTF-8'}" id_cart="{$data.id_cart|escape:'html':'UTF-8'}" class="open_rooms_extra_services btn btn-success" title="{l s='Click here to add or remove the extra services of this room type.'}">
<i class="icon-pencil"></i>&nbsp;{l s='Services'}

View File

@@ -62,6 +62,7 @@
</div>
</div>
{/if}
{hook h='displayAdminOrderProductLineOccupancyAfter' data=$data}
</td>
<td class="center">
<p>

View File

@@ -2316,6 +2316,7 @@
</div>
</div>
{hook h="displayAdminOrderMessageBefore"}
<div class="row">
<div class="order_message_right col-lg-12">
<div class="form-group">
@@ -2441,12 +2442,14 @@
<p class="help-block">{l s='Select or type the payment method using which payment for booking will be made.'}</p>
</div>
</div>
{hook h="displayAdminOrderPaymentSelectionAfter"}
<div class="form-group" {if $order_total <= 0}style="display: none;"{/if}>
<label class="control-label col-lg-3">{l s='Transaction ID'}</label>
<div class="col-lg-9">
<input type="text" class="fixed-width-xxl" name="payment_transaction_id" id="payment_transaction_id" value="{if isset($smarty.post.payment_transaction_id)}{$smarty.post.payment_transaction_id}{/if}" />
</div>
</div>
{hook h="displayAdminOrderFormFieldsAfter"}
<div class="form-group">
<div class="col-lg-9 col-lg-offset-3">
<button type="submit" name="submitAddOrder" class="btn btn-default" />

View File

@@ -518,6 +518,7 @@
{if $customer->phone}
<dd><i class="icon-phone"></i> &nbsp;<b><a href="tel:{$customer->phone}">{$customer->phone}</a></b></dd>
{/if}
{hook h='displayAdminOrderCustomerPhoneAfter'}
</dl>
<dl class="list-detail col-sm-6">
<label class="label-title">{l s='Customer Info'}</label>

View File

@@ -29,6 +29,7 @@
<li role="presentation">
<a href="#room_type_service_product_desc" aria-controls="services" role="tab" data-toggle="tab">{l s='Services'}</a>
</li>
{hook h='displayAdminOrderEditRoomTab' data=$data}
</ul>
<div class="tab-content clearfix">
@@ -36,6 +37,7 @@
{* below tpl contains tab contents for facilities and service products *}
{include file='controllers/orders/modals/_partials/_room_extra_services_content.tpl'}
{hook h='displayAdminOrderEditRoomTabContent' data=$data}
</div>
</div>

View File

@@ -46,6 +46,7 @@
<th>{l s='Total Price (tax excl.)'}</th>
<th>{l s='Total Price (tax incl.)'}</th>
<th class="text-right">{l s='Action'}</th>
{hook h="displayAdminOrderSelectedServicesHeading"}
</tr>
</thead>
<tbody>
@@ -105,6 +106,7 @@
<td>{displayPrice price=$service['total_price_tax_excl']|escape:'html':'UTF-8' currency=$orderCurrency}</td>
<td>{displayPrice price=$service['total_price_tax_incl']|escape:'html':'UTF-8' currency=$orderCurrency}</td>
<td class="text-right"><a class="btn btn-danger pull-right del_room_additional_service" data-id_service_product_order_detail="{$service['id_service_product_order_detail']}" href="#"><i class="icon-trash"></i></a></td>
{hook h="displayAdminOrderSelectedServicesData" id_service_product=$service['id_product'] id_htl_booking_detail=$id_booking_detail id_service_product_order_detail=$service['id_service_product_order_detail'] room_type_id_product=$additionalServices['room_type_id_product']}
</tr>
{/foreach}
{else}
@@ -135,6 +137,7 @@
<th class="fixed-width-sm"> </th>
<th class="fixed-width-sm text-center">{l s='Quantity'}</th>
<th>{l s='Unit Price (tax excl.)'}</th>
{hook h="displayAdminOrderAvailableServicesHeading"}
</tr>
</thead>
<tbody>
@@ -183,6 +186,7 @@
<input type="text" class="form-control unit_price" name="service_price[{$product['id_product']|escape:'html':'UTF-8'}]" value="{$product['price_tax_exc']}" data-id-product="{$product.id_product}">
</div>
</td>
{hook h="displayAdminOrderAvailableServicesData" id_service_product=$product['id_product'] id_htl_booking_detail=$id_booking_detail}
</tr>
{/foreach}
</tbody>
@@ -313,6 +317,7 @@
<th>{l s='Unit Price (tax excl.)'}</th>
<th>{l s='Total Price (tax excl.)'}</th>
<th>{l s='Total Price (tax incl.)'}</th>
{hook h="displayAdminOrderViewServicesHeading"}
</tr>
</thead>
</tbody>
@@ -361,6 +366,7 @@
<td>
{displayPrice price=$service['total_price_tax_incl'] currency=$orderCurrency}
</td>
{hook h="displayAdminOrderViewServicesData" id_service_product=$service['id_product'] id_htl_booking_detail=$id_booking_detail id_service_product_order_detail=$service['id_service_product_order_detail'] room_type_id_product=$additionalServices['room_type_id_product']}
</tr>
{/foreach}
</tbody>

View File

@@ -204,6 +204,7 @@
<input maxlength="12" type="text" id="upc" name="upc" value="{$product->upc|escape:'html':'UTF-8'}" />
</div>
</div>
{hook h='displayAdminProductInformationAfter' item=$product}
<!-- <hr/> -->

View File

@@ -23,6 +23,7 @@
* International Registered Trademark & Property of PrestaShop SA
*}
{hook h='displayAdminKpiBefore'}
<div class="panel kpi-container{if isset($no_wrapping) && $no_wrapping} no-wrapping{/if}">
<div class="kpis-wrap">
{foreach from=$kpis item=kpi}

View File

@@ -158,17 +158,26 @@
{if $has_actions}
<td class="text-right">
{assign var='compiled_actions' value=array()}
{capture assign='row_actions_before_delete'}{hook h='displayAdminListRowActionsDeleteBefore' table=$table identifier=$identifier id=$tr.$identifier token=$token}{/capture}
{assign var='row_actions_before_delete_added' value=false}
{foreach $actions AS $key => $action}
{if isset($tr.$action)}
{if $key == 0}
{assign var='action' value=$action}
{/if}
{if $action == 'delete' && $actions|@count > 2}
{$compiled_actions[] = 'divider'}
{if $action == 'delete'}
{if $row_actions_before_delete}
{$compiled_actions[] = $row_actions_before_delete}
{assign var='row_actions_before_delete_added' value=true}
{/if}
{if $actions|@count > 2}
{$compiled_actions[] = 'divider'}
{/if}
{/if}
{$compiled_actions[] = $tr.$action}
{/if}
{/foreach}
{if $row_actions_before_delete && !$row_actions_before_delete_added}{$compiled_actions[] = $row_actions_before_delete}{/if}
{if $compiled_actions|count > 0}
{if $compiled_actions|count > 1}<div class="btn-group-action">{/if}
<div class="btn-group pull-right">

View File

@@ -1073,6 +1073,7 @@ class CartCore extends ObjectModel
unset(self::$_totalWeight[$this->id]);
}
$isCatalogMode = (Configuration::get('PS_CATALOG_MODE') && !defined('_PS_ADMIN_DIR_'));
Hook::exec('actionBeforeCartUpdateQty', array(
'cart' => $this,
'product' => $product,
@@ -1083,11 +1084,12 @@ class CartCore extends ObjectModel
'id_address_delivery' => $id_address_delivery,
'shop' => $shop,
'auto_add_cart_rule' => $auto_add_cart_rule,
'enable_catalog_mode' => &$isCatalogMode
));
if ((int)$quantity <= 0) {
return $this->deleteProduct($id_product, $id_product_attribute, (int)$id_customization, 0, $auto_add_cart_rule);
} elseif (Configuration::get('PS_CATALOG_MODE') && !defined('_PS_ADMIN_DIR_')) {
} elseif ($isCatalogMode) {
return false;
} else {
/* Check if the product is already in the cart */

View File

@@ -264,6 +264,13 @@ class MailCore extends ObjectModel
$transport = new SendmailTransport();
}
// Allow modules to supply a different mail transport (e.g. a third-party
// email API provider) instead of the SMTP/sendmail transport chosen above.
Hook::exec('actionMailAlterTransportBeforeSend', array(
'configuration' => $configuration,
'transport' => &$transport,
));
$mailer = new Mailer($transport);
/* Get templates content */
$iso = Language::getIsoById((int)$id_lang);
@@ -414,10 +421,11 @@ class MailCore extends ObjectModel
$email->from(new Address($from, (string) $from_name));
// Hook to alter Symfony Mailer before sending mail
Hook::exec('actionMailAlterMessageBeforeSend', [
'message' => &$message,
Hook::exec('actionMailAlterMessageBeforeSend', array(
'template' => &$template,
'message' => &$email,
]);
'template_vars' => &$template_vars,
));
$mailer->send($email);
@@ -518,6 +526,12 @@ class MailCore extends ObjectModel
$transport = new SendmailTransport();
}
// Same extension point as Send(), so the test email also uses the transport supplied by modules.
Hook::exec('actionMailAlterTransportBeforeSend', array(
'configuration' => array('PS_MAIL_METHOD' => Configuration::get('PS_MAIL_METHOD')),
'transport' => &$transport,
));
$mailer = new Mailer($transport);
$email = (new Email())
->from($from)

View File

@@ -3321,6 +3321,14 @@ class ProductCore extends ObjectModel
$sql->select('product_option.id_product_option, product_option.price_impact as option_impact_price');
$sql->leftJoin('product_option', 'product_option', '(product_option.id_product = p.id_product AND product_option.id_product_option = '.(int)$id_product_option.')');
}
Hook::exec('actionAdminProductPriceSqlModifier', array(
'id_product' => $id_product,
'id_product_option' => $id_product_option,
'id_shop' => $id_shop,
'sql' => &$sql,
));
$res = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
if (is_array($res) && count($res)) {
@@ -3396,14 +3404,6 @@ class ProductCore extends ObjectModel
}
}
Hook::exec(
'actionProductPriceModifier',
array(
'price' => &$price,
'type' => 'pre_tax'
)
);
// Tax
$address->id_country = $id_country;
$address->id_state = $id_state;
@@ -3415,6 +3415,17 @@ class ProductCore extends ObjectModel
$id_tax_rule_group = Product::getIdTaxRulesGroupByIdProduct((int)$id_product, $context);
}
Hook::exec(
'actionProductPriceModifier',
array(
'price' => &$price,
'type' => 'pre_tax',
'id_product' => $id_product,
'id_tax_rule_group' => &$id_tax_rule_group
)
);
$tax_manager = TaxManagerFactory::getManager($address, $id_tax_rule_group);
$product_tax_calculator = $tax_manager->getTaxCalculator();

View File

@@ -632,6 +632,7 @@ class AdminOrdersControllerCore extends AdminController
if (Context::getContext()->shop->getContext() != Shop::CONTEXT_SHOP && isset($this->toolbar_btn['new']) && Shop::isFeatureActive()) {
unset($this->toolbar_btn['new']);
}
return $res;
}
@@ -2217,6 +2218,11 @@ class AdminOrdersControllerCore extends AdminController
}
}
Hook::exec('actionAdminOrderValidateBefore', array(
'cart' => $objCart,
'errors' => &$this->errors
));
if (!count($this->errors)) {
// Set payment module details
@@ -2298,6 +2304,11 @@ class AdminOrdersControllerCore extends AdminController
}
if ($objPaymentModule->currentOrder) {
Hook::exec('actionAdminOrderAddAfter', array(
'cart' => $objCart,
'order' => new Order((int) $objPaymentModule->currentOrder)
));
Tools::redirectAdmin(self::$currentIndex.'&id_order='.$objPaymentModule->currentOrder.'&vieworder'.'&token='.$this->token.'&conf=3');
}
}
@@ -6732,6 +6743,14 @@ class AdminOrdersControllerCore extends AdminController
}
$this->sendChangedNotification($order);
Hook::exec('actionHotelRoomBookingUpdateAfter', array(
'id_order' => $id_order,
'id_room' => $id_room,
'date_from' => $new_date_from,
'date_to' => $new_date_to
));
die(json_encode(array(
'result' => $res,
'view' => $view,
@@ -8977,6 +8996,11 @@ class AdminOrdersControllerCore extends AdminController
{
$idHotelBookingDetail = (int) Tools::getValue('id_hotel_booking_detail');
if (Validate::isLoadedObject($objHotelBookingDetail = new HotelBookingDetail($idHotelBookingDetail))) {
Hook::exec('actionAdminRoomStatusChangeAfter', array(
'post_data' => Tools::getAllValues(),
'errors' => &$this->errors
));
$newStatus = (int) Tools::getValue('booking_order_status');
$statusRemark = Tools::getValue('status_remark');
// date choosen for the status change
@@ -9034,6 +9058,15 @@ class AdminOrdersControllerCore extends AdminController
}
}
Hook::exec('actionRoomBookingStatusUpdateBefore', array(
'id_hotel_booking_detail' => $objHotelBookingDetail->id,
'id_order' => $objHotelBookingDetail->id_order,
'id_room' => $objHotelBookingDetail->id_room,
'new_status' => $newStatus,
'status_date' => $statusDate,
'errors' => &$this->errors
));
if (empty($this->errors)) {
$id_order = $objHotelBookingDetail->id_order;

View File

@@ -151,6 +151,20 @@ class AdminProductsControllerCore extends AdminController
}
}
// Allow modules to override the labels of the product tabs
$tabNameOverrides = Hook::exec('actionAdminProductTabNameModifier', array('id_product' => (int) Tools::getValue('id_product')), null, true);
if (is_array($tabNameOverrides)) {
foreach ($tabNameOverrides as $moduleOverrides) {
if (is_array($moduleOverrides)) {
foreach ($moduleOverrides as $key => $newLabel) {
if (isset($this->available_tabs_lang[$key])) {
$this->available_tabs_lang[$key] = $newLabel;
}
}
}
}
}
if (Tools::getValue('productFilter_a!id_category_default') === '') {
$this->context->cookie->id_category_room_types_filter = false;
}

View File

@@ -838,6 +838,7 @@ class HotelBookingDetail extends ObjectModel
$unavailableRoomTypes = array();
$avai_rooms = Db::getInstance()->executeS($sql);
if ($avai_rooms) {
$availableRoomTypes = array(
'roomTypes' => array(),

View File

@@ -153,6 +153,9 @@ class HotelRoomInformation extends ObjectModel
'status' => self::getRoomStatusTitle(HotelRoomInformation::STATUS_INACTIVE)
),
);
Hook::exec('actionAdminRoomStatusModifier', array('status' => &$status));
return $status;
}
@@ -166,6 +169,8 @@ class HotelRoomInformation extends ObjectModel
HotelRoomInformation::STATUS_SEARCH_OCCUPANCY_UNSATISFIED => $moduleInstance->l('Occupancy exceeds room capacity', 'hotelreservationsystem'),
);
Hook::exec('actionAdminRoomStatusTitle', array('status' => &$status, 'id_status' => $idStatus));
return isset($status[$idStatus]) ? $status[$idStatus] : '';
}

View File

@@ -232,6 +232,12 @@ class HotelRoomTypeFeaturePricing extends ObjectModel
$res &= $objFeaturePriceRestriction->deleteFeaturePriceRestrictionsById($existingFeaturePrices);
}
Hook::exec('actionFeaturePriceRestrictionsSaveAfter', array(
'id_feature_price' => $idFeaturePrice,
'restrictions' => $restrictions,
'existing_feature_prices' => $existingFeaturePrices
));
return $res;
}

View File

@@ -454,4 +454,4 @@ class RoomTypeServiceProduct extends ObjectModel
AND rsp.`id_product` = '.(int) $movedBlock['id_product']
));
}
}
}

View File

@@ -303,7 +303,7 @@ class ServiceProductCartDetail extends ObjectModel
null,
$product['htl_cart_booking_id']
) / max($numDays, 1);
$priceTaxExcl = Product::getServiceProductPrice(
$objProduct->id,
$product['id_product_option'],

View File

@@ -52,6 +52,7 @@
{/if}
<td>
{$service['name']}
{hook h='displayInvoiceServiceProductNameAfter' id_service_product_order_detail=$service['id_service_product_order_detail']}
</td>
<td class="center">
{if isset($service['product_tax_label']) && $service['product_tax_label']}{$service['product_tax_label']}{else}{l s='No tax' pdf='true'}{/if}

View File

@@ -68,6 +68,7 @@
{/capture}
{include file='_partials/ui-tooltip.tpl' tooltip_content=$smarty.capture.htl_pcm_tooltip allow_html=true}
</div>
{hook h='displayOrderDetailServiceProductNameBlockAfter' product_order_detail=$additionalService}
</div>
<div class="">
<span>

View File

@@ -90,6 +90,7 @@
<dt class="col-xs-5">{l s='Guests'}</dt>
<dd class="col-xs-7">
{$rm_v.adults|string_format:'%02d'} {if $rm_v.adults > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if $rm_v.children}, {$rm_v.children|string_format:'%02d'} {if $rm_v.children > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if}
{hook h='displayOrderDetailOccupancyAfter' data=$data_v room=$rm_v id_order=$order->id}
</dd>
</div>
</div>

View File

@@ -178,6 +178,7 @@
<div class="noRoomsAvailAlert">
<span>{l s='No room available for this property!'}</span>
</div>
{hook h='displayNoRoomAvailableBlockAfter'}
{/if}
{block name='displayRoomTypeListAfter'}

View File

@@ -41,6 +41,7 @@
<div class="rte{if $content_only} content_only{/if}">
{$cms->content}
</div>
{hook h='displayCMSPageContentAfter' page=$cms}
{elseif isset($cms_category)}
<div class="block-cms">
<h1><a href="{if $cms_category->id eq 1}{if isset($force_ssl) && $force_ssl}{$base_dir_ssl}{else}{$base_dir}{/if}{else}{$link->getCMSCategoryLink($cms_category->id, $cms_category->link_rewrite)}{/if}">{$cms_category->name|escape:'html':'UTF-8'}</a></h1>

View File

@@ -191,6 +191,7 @@
<input type="hidden" name="contactKey" value="{$contactKey}" />
<button class="btn button button-medium contact_btn" type="submit" name="submitMessage" id="submitMessage" ><span>{l s='Send Message'}</span></button>
</div>
{hook h='displayContactFormSubmitButtonAfter'}
</form>
{/block}
</div>

View File

@@ -95,6 +95,7 @@
{$data_v['name']}
</a>
</p>
{hook h='displayOrderConfirmationRoomTypeNameAfter' id_product=$data_v['id_product']}
</div>
</div>
@@ -126,6 +127,7 @@
<dt class="col-xs-5">{l s='Guests'}</dt>
<dd class="col-xs-7">
{$rm_v.adults|string_format:'%02d'} {if $rm_v.adults > 1}{l s='Adults'}{else}{l s='Adult'}{/if}{if $rm_v.children}, {$rm_v.children|string_format:'%02d'} {if $rm_v.children > 1}{l s='Children'}{else}{l s='Child'}{/if}{/if}
{hook h='displayOrderConfirmationOccupancyAfter' data=$data_v room=$rm_v}
</dd>
</div>
</div>

View File

@@ -419,6 +419,7 @@
<div class="submit opc-add-save clearfix">
<button type="submit" name="submitAccount" id="submitAccount" class="btn btn-default button button-medium pull-right"><span>{l s='Save'}<i class="icon-chevron-right right"></i></span></button>
</div>
{hook h='displayCustomerAccountFormBottom'}
{/block}
<!-- END Account -->
</div>

View File

@@ -177,6 +177,7 @@
{/if}
</div>
{/block}
{hook h='displayCheckoutGuestDetailsAfter'}
{* proceed only if no order restrict errors are there *}
{if !$orderRestrictErr}