hotel_commerce/modules/hotelreservationsystem/controllers/admin/AdminOrderRefundRulesController.php
2023-06-26 13:09:26 +05:30

320 lines
14 KiB
PHP

<?php
class AdminOrderRefundRulesController extends ModuleAdminController
{
public function __construct()
{
$this->bootstrap = true;
$this->className = 'HotelOrderRefundRules';
$this->table = 'htl_order_refund_rules';
$this->_select = ' IF(a.payment_type='.(int) HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE.' , CONCAT(round(a.deduction_value_full_pay, 2), " ", "%"), a.deduction_value_full_pay) AS payment_amount_full_pay';
$this->_select .= ' ,IF(a.payment_type='.(int) HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE.' , CONCAT(round(a.deduction_value_adv_pay, 2), " ", "%"), a.deduction_value_adv_pay) AS payment_amount_adv_pay';
$this->_select .= ' ,IF(a.payment_type='.(int) HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE.' , \''.$this->l('Percentage').'\', \''.$this->l('Fixed Amount').'\') AS payment_way';
$this->_select .= ' ,orrl.`name`';
$this->identifier = 'id_refund_rule';
parent::__construct();
$this->_join .= 'LEFT JOIN `'._DB_PREFIX_.'htl_order_refund_rules_lang` orrl
ON (a.id_refund_rule = orrl.id_refund_rule AND orrl.`id_lang` = '.(int) $this->context->language->id.')';
$CMSs = array ();
if ($allCms = CMS::getCMSPages($this->context->language->id)) {
foreach ($allCms as $key => $cms) {
$CMSs[$key]['id_cms'] = $cms['id_cms'];
$CMSs[$key]['name'] = $cms['meta_title'];
}
}
$this->fields_options = array(
'modulesetting' => array(
'title' => $this->l('Order Refund Setting'),
'fields' => array(
'WK_ORDER_REFUND_ALLOWED' => array(
'title' => $this->l('Enable Order Refund'),
'hint' => $this->l('Enable, if you want to enable order refund feature.'),
'validation' => 'isBool',
'cast' => 'intval',
'type' => 'bool',
'required' => true
),
'WK_GLOBAL_REFUND_POLICY_CMS' => array(
'title' => $this->l('Detailed refund policy'),
'type' => 'select',
'list' => $CMSs,
'identifier' => 'id_cms',
'hint' => $this->l('Select CMS for detailed refund policy for the customer.'),
),
),
'submit' => array('title' => $this->l('Save'))
),
);
$paymentType = array(
HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE => 'Percentage',
HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_FIXED => 'Fixed'
);
$this->fields_list = array(
'id_refund_rule' => array(
'title' => $this->l('ID'),
'align' => 'center',
),
'name' => array(
'title' => $this->l('Name'),
),
'payment_way' => array(
'title' => $this->l('Payment Type'),
'align' => 'center',
'type' => 'select',
'filter_key' => 'a!payment_type',
'list' => $paymentType,
),
'payment_amount_full_pay' => array(
'title' => $this->l('Full Payment Deduction Percentage/Amount'),
'align' => 'center',
'type' => 'price',
'currency' => true,
'filter_key' => 'a!deduction_value_full_pay',
'callback' => 'setOrderCurrency',
),
'payment_amount_adv_pay' => array(
'title' => $this->l('Adv. Payment Deduction Percentage/Amount'),
'align' => 'center',
'type' => 'price',
'currency' => true,
'filter_key' => 'a!deduction_value_adv_pay',
'callback' => 'setOrderCurrency',
),
'days' => array(
'title' => $this->l('Days Before Check-in'),
'align' => 'center',
)
);
$this->addRowAction('edit');
$this->addRowAction('delete');
$this->bulk_actions = array(
'delete' => array(
'text' => $this->l('Delete selected'),
'icon' => 'icon-trash',
'confirm' => $this->l('Delete selected items?')
)
);
}
public function initContent()
{
parent::initContent();
// to customize the view as per our requirements
if ($this->display != 'add' && $this->display != 'edit') {
$this->content = $this->renderOptions();
$this->content .= $this->renderList();
$this->context->smarty->assign('content', $this->content);
}
}
/**
* [setOrderCurrency description] - A callback function for setting currency sign with amount
* @param [type] $echo [description]
* @param [type] $tr [description]
*/
public function setOrderCurrency($echo, $tr)
{
$currency_default = Configuration::get('PS_CURRENCY_DEFAULT');
return Tools::displayPrice($echo, (int)$currency_default);
}
public function initToolbar()
{
parent::initToolbar();
$this->page_header_toolbar_btn['new'] = array(
'href' => self::$currentIndex.'&add'.$this->table.'&token='.$this->token,
'desc' => $this->l('Add new refund rule')
);
}
public function renderForm()
{
$smartyVars = array();
$objCurrency = new Currency(Configuration::get('PS_CURRENCY_DEFAULT'));
$smartyVars['objCurrency'] = $objCurrency;
if ($this->display == 'edit'
&& $refundRuleInfo = $this->loadObject(true)
) {
$smartyVars['edit'] = 1;
$idRefundRule = Tools::getValue('id_refund_rule');
$objRefundRule = new HotelOrderRefundRules();
$smartyVars['refund_rules_info'] = (array)$refundRuleInfo;
}
//lang vars
$currentLangId = Configuration::get('PS_LANG_DEFAULT');
$smartyVars['languages'] = Language::getLanguages(false);
$smartyVars['currentLang'] = Language::getLanguage((int) $currentLangId);
$smartyVars['WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE'] = HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE;
$smartyVars['WK_REFUND_RULE_PAYMENT_TYPE_FIXED'] = HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_FIXED;
$smartyVars['ps_img_dir'] = _PS_IMG_.'l/';
$this->context->smarty->assign($smartyVars);
Media::addJsDef(
array (
'img_dir_l' => _PS_IMG_.'l/',
'default_currency_sign' => $objCurrency->sign,
'WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE' => HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE,
'WK_REFUND_RULE_PAYMENT_TYPE_FIXED' => HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_FIXED,
)
);
$this->fields_form = array(
'submit' => array(
'title' => $this->l('Save')
)
);
return parent::renderForm();
}
public function processSave()
{
$idRefundRule = Tools::getValue('id_refund_rule');
$paymentType = Tools::getValue('refund_payment_type');
$fullPayAmount = Tools::getValue('deduction_value_full_pay');
$advPayAmount = Tools::getValue('deduction_value_adv_pay');
$cancelationDays = Tools::getValue('cancelation_days');
// check if field is atleast in default language. Not available in default prestashop
$defaultLangId = Configuration::get('PS_LANG_DEFAULT');
$defaultLanguage = Language::getLanguage((int) $defaultLangId);
$languages = Language::getLanguages(false);
if (!trim(Tools::getValue('name_'.$defaultLangId))) {
$this->errors[] = $this->l('Name is required at least in ').$defaultLanguage['name'];
} elseif (!trim(Tools::getValue('description_'.$defaultLangId))) {
$this->errors[] = $this->l('Description is required at least in ').$defaultLanguage['name'];
} else {
foreach ($languages as $lang) {
// validate non required fields
if (trim(Tools::getValue('name_'.$lang['id_lang']))) {
if (!Validate::isGenericName(Tools::getValue('name_'.$lang['id_lang']))) {
$this->errors[] = $this->l('Invalid name in ').$lang['name'];
}
}
if (trim(Tools::getValue('description_'.$lang['id_lang']))) {
if (!Validate::isGenericName(Tools::getValue('description_'.$lang['id_lang']))) {
$this->errors[] = sprintf($this->l('Description is not valid in %s'), $lang['name']);
}
}
}
}
if ($paymentType == '') {
$this->errors[] = $this->l('Invalid payment type.');
}
if (!$fullPayAmount) {
$this->errors[] = $this->l('Enter deduction value for full payment.');
}
if (!$advPayAmount) {
$this->errors[] = $this->l('Enter deduction value for advance payment.');
}
if ($paymentType == HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_PERCENTAGE) {
if (!Validate::isFloat($fullPayAmount)) {
$this->errors[] = $this->l('Enter a valid deduction percentage for full payment.');
} elseif ($fullPayAmount > 100 || $fullPayAmount < 0) {
$this->errors[] = $this->l('Enter a valid percentage(0 < % and 100 >= %) for full payment.');
}
if (!Validate::isFloat($advPayAmount)) {
$this->errors[] = $this->l('Enter a valid deduction percentage for advance payment.');
} elseif ($advPayAmount > 100 || $advPayAmount < 0) {
$this->errors[] = $this->l('Enter a valid percentage(0 < % and 100 > %) for advance payment.');
}
} elseif ($paymentType == HotelOrderRefundRules::WK_REFUND_RULE_PAYMENT_TYPE_FIXED) {
if (!Validate::isPrice($fullPayAmount)) {
$this->errors[] = $this->l('Enter a valid deduction amount for full payment.');
}
if (!Validate::isPrice($advPayAmount)) {
$this->errors[] = $this->l('Enter a valid deduction amount for advance payment.');
}
}
$objRefundRule = new HotelOrderRefundRules($idRefundRule);
if ($cancelationDays == '') {
$this->errors[] = $this->l('Enter number of days before check-in date for this rule to be applicable.');
} else if (!Validate::isUnsignedInt($cancelationDays)) {
$this->errors[] = $this->l('Enter valid number of days.');
} else if ($objRefundRule->checkIfRuleExistsByCancelationdays($cancelationDays)) {
if ($idRefundRule) {
if ($objRefundRule->days != $cancelationDays) {
$this->errors[] = $this->l('Refund rule for ').$cancelationDays.$this->l(' days already exists.');
}
} else {
$this->errors[] = $this->l('Refund rule for ').$cancelationDays.$this->l(' days already exists.');
}
}
if (!count($this->errors)) {
if ($idRefundRule) {
$objRefundRule = new HotelOrderRefundRules($idRefundRule);
} else {
$objRefundRule = new HotelOrderRefundRules();
}
foreach ($languages as $lang) {
if (!trim(Tools::getValue('name_'.$lang['id_lang']))) {
$objRefundRule->name[$lang['id_lang']] = Tools::getValue(
'name_'.$defaultLangId
);
} else {
$objRefundRule->name[$lang['id_lang']] = Tools::getValue(
'name_'.$lang['id_lang']
);
}
if (!trim(Tools::getValue('description_'.$lang['id_lang']))) {
$objRefundRule->description[$lang['id_lang']] = trim(Tools::getValue('description_'.$defaultLangId));
} else {
$objRefundRule->description[$lang['id_lang']] = trim(Tools::getValue('description_'.$lang['id_lang']));
}
}
$objRefundRule->payment_type = $paymentType;
$objRefundRule->deduction_value_full_pay = $fullPayAmount;
$objRefundRule->deduction_value_adv_pay = $advPayAmount;
$objRefundRule->days = $cancelationDays;
$objRefundRule->save();
if ($newIdRefundRule = $objRefundRule->id) {
if (Tools::isSubmit('submitAdd'.$this->table.'AndStay')) {
if ($idRefundRule) {
Tools::redirectAdmin(self::$currentIndex.'&id_refund_rule='.(int)$newIdRefundRule.'&update'.$this->table.'&conf=4&token='.$this->token);
} else {
Tools::redirectAdmin(self::$currentIndex.'&id_refund_rule='.(int)$newIdRefundRule.'&update'.$this->table.'&conf=3&token='.$this->token);
}
} else {
if ($idRefundRule) {
Tools::redirectAdmin(self::$currentIndex.'&conf=4&token='.$this->token);
} else {
Tools::redirectAdmin(self::$currentIndex.'&conf=3&token='.$this->token);
}
}
} else {
$this->errors[] = $this->l('Some error occurred. Please try again.');
}
} else {
if ($idRefundRule) {
$this->display = 'edit';
} else {
$this->display = 'add';
}
}
}
public function setMedia()
{
parent::setMedia();
$this->addJs(_MODULE_DIR_.$this->module->name.'/views/js/admin/wk_refund_rule.js');
$this->addJS(_MODULE_DIR_.$this->module->name.'/views/js/HotelReservationAdmin.js');
}
}