Files
redline.com.pl/modules/gmparcellocker/gmparcellocker.php
2024-11-11 18:46:54 +01:00

368 lines
15 KiB
PHP

<?php
/**
* Parcel Locker Module
*
* @package gmparcellocker
* @author Dariusz Tryba (contact@greenmousestudio.com)
* @copyright Copyright (c) Green Mouse Studio (http://www.greenmousestudio.com)
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
*/
if (!defined('_PS_VERSION_')) {
exit;
}
if (!class_exists('BaseLinkerOrder')) {
require_once(_PS_MODULE_DIR_ . 'gmparcellocker/classes/BaseLinkerOrder.php');
}
use PrestaShop\PrestaShop\Core\Module\WidgetInterface;
class GmParcelLocker extends Module implements WidgetInterface {
public function __construct() {
$this->name = 'gmparcellocker';
$this->prefix = strtoupper($this->name);
$this->tab = 'shipping_logistics';
$this->version = '1.4.0';
$this->author = 'GreenMouseStudio.com';
$this->need_instance = 0;
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l('Parcel locker');
$this->description = $this->l('Allows the customer to chose a parcel locker in the cart');
$this->ps_versions_compliancy = array('min' => '1.7', 'max' => _PS_VERSION_);
$this->templateFile = 'module:gmparcellocker/views/templates/choice.tpl';
}
public function install() {
if (Shop::isFeatureActive()) {
Shop::setContext(Shop::CONTEXT_ALL);
}
if (!parent::install() || !$this->registerHook('displayCarrierExtraContent') || !$this->installDb() || !$this->createCarriers() || !$this->registerHook('header') || !$this->registerHook('actionValidateOrder') || !$this->registerHook('sendMailAlterTemplateVars') || !$this->registerHook('addWebserviceResources')
) {
Configuration::updateValue('GMPARCELLOCKER_REPLACE', false);
Configuration::updateValue('GMPARCELLOCKER_DISPLAY', 'modal');
return false;
}
return true;
}
public function getContent() {
$content = '';
$content .= '<p class="alert alert-warning">' . $this->l('Remember to configure and activate the new Parcel Locker carrier created by the module') . '</p>';
if (Tools::isSubmit('submit' . $this->name)) {
Configuration::updateValue('GMPARCELLOCKER_REPLACE', (int) Tools::getValue('GMPARCELLOCKER_REPLACE'));
Configuration::updateValue('GMPARCELLOCKER_DISPLAY', Tools::getValue('GMPARCELLOCKER_DISPLAY'));
$content .= $this->displayConfirmation($this->l('Settings updated'));
}
$content .= $this->renderForm();
return $content . $this->context->smarty->fetch($this->local_path . 'views/templates/admin/gms.tpl');
}
public function renderForm() {
$displays = array(
array(
'id' => 'modal',
'name' => $this->l('Modal')
),
array(
'id' => 'dropdown',
'name' => $this->l('Dropdown')
),
);
$fields_form = array(
'form' => array(
'legend' => array(
'title' => $this->l('Settings'),
'icon' => 'icon-cogs',
),
'input' => array(
array(
'type' => 'switch',
'label' => $this->l('Replace delivery address with parcel locker address'),
'name' => 'GMPARCELLOCKER_REPLACE',
'is_bool' => true,
'values' => array(
array(
'id' => 'active_on',
'value' => 1,
'label' => $this->l('Yes'),
),
array(
'id' => 'active_off',
'value' => 0,
'label' => $this->l('No'),
),
),
),
array(
'type' => 'select',
'label' => $this->l('Display type'),
'name' => 'GMPARCELLOCKER_DISPLAY',
'options' => array(
'query' => $displays,
'id' => 'id',
'name' => 'name'
),
),
),
'submit' => array(
'title' => $this->l('Save'),
),
),
);
$helper = new HelperForm();
$helper->show_toolbar = false;
$helper->table = $this->table;
$lang = new Language((int) Configuration::get('PS_LANG_DEFAULT'));
$helper->default_form_language = $lang->id;
$helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
$this->fields_form = array();
$helper->identifier = $this->identifier;
$helper->submit_action = 'submit' . $this->name;
$helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false) . '&configure=' . $this->name . '&tab_module=' . $this->tab
. '&module_name=' . $this->name;
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->tpl_vars = array(
'fields_value' => $this->getConfigFieldsValues(),
'languages' => $this->context->controller->getLanguages(),
'id_language' => $this->context->language->id,
);
return $helper->generateForm(array($fields_form));
}
public function getConfigFieldsValues() {
return array(
'GMPARCELLOCKER_REPLACE' => (bool) Tools::getValue('GMPARCELLOCKER_REPLACE', Configuration::get('GMPARCELLOCKER_REPLACE')),
'GMPARCELLOCKER_DISPLAY' => Tools::getValue('GMPARCELLOCKER_DISPLAY', Configuration::get('GMPARCELLOCKER_DISPLAY')),
);
}
public function displayInfoByCart($cartId) {
$pointData = $this->getPointDataForCart($cartId);
$this->context->smarty->assign('gmChosenParcel', $pointData);
return $this->context->smarty->fetch($this->local_path . 'views/templates/admin/parcel.tpl');
}
protected function createCarriers() {
$carrier = new Carrier();
$carrier->name = $this->l('Parcel Locker');
$carrier->active = 0;
$carrier->is_free = 0;
$carrier->shipping_handling = 1;
$carrier->shipping_external = 0;
$carrier->shipping_method = 1;
$carrier->max_width = 0;
$carrier->max_height = 0;
$carrier->max_depth = 0;
$carrier->max_weight = 0;
$carrier->grade = 0;
$carrier->is_module = 1;
$carrier->need_range = 1;
$carrier->range_behavior = 1;
$carrier->external_module_name = $this->name;
$carrier->url = 'https://inpost.pl/sledzenie-przesylek?number=@';
$delay = array();
foreach (Language::getLanguages(false) as $language) {
$delay[$language['id_lang']] = $this->l('Parcel Locker');
}
$carrier->delay = $delay;
if (!$carrier->save()) {
return false;
}
$groups = [];
foreach (Group::getGroups((int) Context::getContext()->language->id) as $group) {
$groups[] = $group['id_group'];
}
if (!$carrier->setGroups($groups)) {
return false;
}
return true;
}
protected function installDb() {
return Db::getInstance()->execute('
CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'gmparcellocker` (
`id_cart` int(10) unsigned NOT NULL,
`parcel` varchar(128),
PRIMARY KEY (`id_cart`)
) ENGINE=' . _MYSQL_ENGINE_ . ' default CHARSET=utf8');
}
public function uninstall() {
Db::getInstance()->execute('DROP TABLE IF EXISTS `' . _DB_PREFIX_ . 'gmparcellocker`');
Configuration::deleteByName('GMPARCELLOCKER_REPLACE');
Configuration::deleteByName('GMPARCELLOCKER_DISPLAY');
return parent::uninstall();
}
public function hookDisplayCarrierExtraContent($params) {
$cart = $this->context->cart;
//$deliveryAddress = new Address($cart->id_address_delivery);
//$searchAddress = $deliveryAddress->address1 . ' ' . $deliveryAddress->postcode . ' ' . $deliveryAddress->city;
$pointData = $this->getPointDataForCart($cart->id);
$this->context->smarty->assign([
'gmChosenParcel' => $pointData,
//'gmSearchAddress' => $searchAddress
]);
$displayOption = Configuration::get('GMPARCELLOCKER_DISPLAY');
if ($displayOption == 'dropdown') {
return $this->context->smarty->fetch($this->local_path . 'views/templates/dropdown.tpl');
} else {
return $this->context->smarty->fetch($this->local_path . 'views/templates/button.tpl');
}
}
public function getParcelAddressForCart($cartId) {
$pointData = $this->getPointDataForCart($cartId, true);
$parts = explode('|', $pointData);
$address = [
'parcel_name' => $parts[0],
'address' => $parts[1],
'postcode' => substr(trim($parts[2]), 0, 6),
'city' => trim(substr($parts[2], 7))
];
return $address;
}
public function getPointDataForCart($cartId, $raw = false) {
$pointData = Db::getInstance()->getValue('SELECT `parcel` FROM `' . _DB_PREFIX_ . 'gmparcellocker` WHERE `id_cart` = ' . $cartId);
if ($pointData) {
if (!$raw) {
$pointData = str_replace('|', ',', $pointData);
}
return $pointData;
}
return '---';
}
public function hookHeader() {
if ($this->context->controller->php_self === 'order' || Tools::getValue('controller') == 'supercheckout' || Tools::getValue('controller') == 'checkout') {
$cartId = Context::getContext()->cart->id;
Media::addJsDef(['gmCartId' => $cartId,
'gmParcelLockerAjaxUrl' => $this->context->link->getModuleLink('gmparcellocker', 'ajax', array(), null,
null, null, true),]);
$this->context->controller->registerStylesheet('gmparcellocker-css',
'modules/' . $this->name . '/views/css/gmparcellocker.css',
[
'media' => 'all',
'priority' => 200,
]);
$displayOption = Configuration::get('GMPARCELLOCKER_DISPLAY');
if ($displayOption == 'dropdown') {
$this->context->controller->registerJavascript('gmparcellocker-js130-dropdown',
'modules/' . $this->name . '/views/js/gmparcellocker-dropdown.js',
[
'position' => 'bottom',
'priority' => 150
]);
} else {
$this->context->controller->registerJavascript('gmparcellocker-js130',
'modules/' . $this->name . '/views/js/gmparcellocker.js',
[
'position' => 'bottom',
'priority' => 150
]);
}
return '<script src="https://geowidget.easypack24.net/js/sdk-for-javascript.js"></script>
<link rel="stylesheet" href="https://geowidget.easypack24.net/css/easypack.css"/>';
}
}
public function hookActionValidateOrder($params) {
if ((bool) Configuration::get('GMPARCELLOCKER_REPLACE')) {
$order = $params['order'];
$cart = $params['cart'];
$carrier = new Carrier($order->id_carrier);
if ($carrier->external_module_name == $this->name) {
try {
$current = new Address($order->id_address_delivery);
$a = new Address();
$parcelAddress = $this->getParcelAddressForCart($cart->id);
$a->alias = $parcelAddress['parcel_name'];
$a->id_customer = $current->id_customer;
$a->id_country = $current->id_country;
$a->firstname = $this->l('Parcel');
$a->lastname = '.';
$a->address1 = $parcelAddress['address'];
if (strlen($current->address2) > 0) {
$a->address2 = '.';
}
$a->city = $parcelAddress['city'];
$a->postcode = $parcelAddress['postcode'];
$a->phone = $current->phone;
$a->phone_mobile = $current->phone_mobile;
$a->deleted = true;
$a->save();
$this->forceParcelName($a->id, $parcelAddress['parcel_name']);
$order->id_address_delivery = $a->id;
$order->update();
} catch (Exception $e) {
PrestaShopLogger::addLog($e->getMessage(), 3);
}
}
}
}
protected function forceParcelName($addressId, $parcelName) {
Db::getInstance()->update('address', ['lastname' => $parcelName], 'id_address = ' . (int) $addressId);
}
public function hookSendMailAlterTemplateVars($params) {
$template = $params['template'];
$vars = &$params['template_vars'];
$vars['{gmparcellocker}'] = '';
if (in_array($template, ['order_conf', 'new_order'])) {
if (stripos($vars['{carrier}'], 'paczkomat') !== false) {
$cartId = $this->context->cart->id;
$chosenParcel = $this->getPointDataForCart($cartId);
$vars['{gmparcellocker}'] = $chosenParcel;
}
}
}
public function hookAddWebserviceResources() {
return array(
'bl_order' => array('description' => 'Extended order data for use by BaseLinker', 'class' => 'BaseLinkerOrder'),
);
}
public function getWidgetVariables($hookName, array $configuration) {
$cartId = $this->context->cart->id;
if (!$cartId) {
$cartId = Tools::getValue('id_cart');
}
if (!$cartId) {
return false;
}
$cart = new Cart($cartId);
$carrier = new Carrier($cart->id_carrier);
if ($carrier->external_module_name == $this->name) {
return array(
'gmChosenParcel' => $this->getPointDataForCart($cartId)
);
}
return false;
}
public function renderWidget($hookName, array $configuration) {
$variables = $this->getWidgetVariables($hookName, $configuration);
if (empty($variables)) {
return false;
}
$this->smarty->assign($variables);
return $this->fetch($this->templateFile);
}
}