shop.balmet.com

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

econt_delivery.php (22383B)


      1 <?php
      2 
      3 /** @noinspection PhpUndefinedClassInspection */
      4 
      5 /**
      6  * @property Language $language
      7  * @property DB $db
      8  * @property Loader $load
      9  * @property ModelExtensionShippingEcontDelivery $model_extension_shipping_econt_delivery
     10  * @property Document $document
     11  * @property Response $response
     12  * @property Request $request
     13  * @property Url $url
     14  * @property Session $session
     15  * @property ModelLocalisationGeoZone $model_localisation_geo_zone
     16  * @property ModelSettingSetting $model_setting_setting
     17  * @property ModelSettingEvent $model_setting_event
     18  * @property \Cart\User $user
     19  * @property ModelAccountOrder $model_account_order
     20  * @property Config $config
     21  * @property ModelSaleOrder $model_sale_order
     22  * @property ControllerSaleOrder $controller_sale_order
     23  */
     24 class ControllerExtensionShippingEcontDelivery extends Controller {
     25 
     26     private $error = array();
     27 
     28     private $systemUrls = array(
     29         'production' => 'https://delivery.econt.com',
     30         'testing' => 'http://delivery.demo.econt.com'
     31     );
     32     private $trackShipmentUrl = 'https://www.econt.com/services/track-shipment';
     33 
     34     public function index() {
     35         $this->language->load('extension/shipping/econt_delivery');
     36 
     37         $this->load->model('setting/setting');
     38         $this->load->model('localisation/geo_zone');
     39 
     40         if (isset($this->request->post['action']) && $this->request->post['action'] === 'save_settings' && $this->validate()) {
     41             $this->model_setting_setting->editSetting('shipping_econt_delivery', $this->request->post);
     42 
     43             $this->session->data['success'] = $this->language->get('text_success_setting_update');
     44             $this->response->redirect($this->url->link('marketplace/extension', http_build_query(array(
     45                 'user_token' => $this->session->data['user_token'],
     46                 'type' => 'shipping'
     47             )), true));
     48         }
     49 
     50         $this->document->setTitle($this->language->get('heading_title'));
     51         $this->response->setOutput($this->load->view('extension/shipping/econt_delivery', array(
     52             'header' => $this->load->controller('common/header'),
     53             'left_menu' => $this->load->controller('common/column_left'),
     54             'breadcrumbs' => array(array(
     55                 'text' => $this->language->get('text_home'),
     56                 'href' => $this->url->link('common/dashboard', http_build_query(array(
     57                     'user_token' => $this->session->data['user_token']
     58                 )), true)
     59             ), array(
     60                 'text' => $this->language->get('text_extensions'),
     61                 'href' => $this->url->link('marketplace/extension', http_build_query(array(
     62                     'user_token' => $this->session->data['user_token'],
     63                     'type' => 'shipping'
     64                 )), true)
     65             ), array(
     66                 'text' => $this->language->get('heading_title'),
     67                 'href' => $this->url->link('extension/shipping/econt_delivery', http_build_query(array(
     68                     'user_token' => $this->session->data['user_token']
     69                 )), true)
     70             )),
     71             'geo_zones' => $this->model_localisation_geo_zone->getGeoZones(),
     72             'settings' => $this->model_setting_setting->getSetting('shipping_econt_delivery'),
     73             'system_urls' => $this->systemUrls,
     74             'actions' => array(
     75                 'submit_url' => $this->url->link('extension/shipping/econt_delivery', http_build_query(array(
     76                     'user_token' => $this->session->data['user_token']
     77                 )), true),
     78                 'cancel_url' => $this->url->link('marketplace/extension', http_build_query(array(
     79                     'user_token' => $this->session->data['user_token'],
     80                     'type' => 'shipping'
     81                 )), true)
     82             ),
     83             'footer' => $this->load->controller('common/footer')
     84         )));
     85     }
     86 
     87     public function validate() {
     88         if (!$this->user->hasPermission('modify', 'extension/shipping/econt_delivery')) $this->error['warning'] = $this->language->get('error_permission');
     89 
     90         return empty($this->error);
     91     }
     92 
     93     public function install() {
     94         $this->load->model('setting/event');
     95 
     96         $this->db->query(sprintf("
     97             CREATE TABLE IF NOT EXISTS `%s`.`%secont_delivery_customer_info` (
     98                 `id_order` INT(11) NOT NULL DEFAULT '0',
     99                 `customer_info` MEDIUMTEXT NULL,
    100                 PRIMARY KEY (`id_order`)
    101             )
    102             COLLATE = 'utf8_general_ci'
    103             ENGINE = InnoDB
    104         ",
    105             DB_DATABASE,
    106             DB_PREFIX
    107         ));
    108 
    109         $this->model_setting_event->addEvent('econt_delivery', 'catalog/controller/checkout/payment_method/save/before', 'extension/shipping/econt_delivery/beforeCartSavePayment');
    110         $this->model_setting_event->addEvent('econt_delivery', 'catalog/controller/checkout/shipping_method/save/before', 'extension/shipping/econt_delivery/beforeCartSaveShipping');
    111         $this->model_setting_event->addEvent('econt_delivery', 'catalog/view/checkout/guest/after', 'extension/shipping/econt_delivery/afterViewCheckoutBilling');
    112         $this->model_setting_event->addEvent('econt_delivery', 'catalog/view/checkout/register/after', 'extension/shipping/econt_delivery/afterViewCheckoutBilling');
    113         $this->model_setting_event->addEvent('econt_delivery', 'catalog/controller/checkout/confirm/after', 'extension/shipping/econt_delivery/afterCheckoutConfirm');
    114 
    115         $this->model_setting_event->addEvent('econt_delivery', 'catalog/controller/api/*/before', 'extension/shipping/econt_delivery/loadEcontDeliveryData');
    116         $this->model_setting_event->addEvent('econt_delivery', 'catalog/controller/api/shipping/econt_delivery_beforeApi/before', 'extension/shipping/econt_delivery/beforeApi');
    117         $this->model_setting_event->addEvent('econt_delivery', 'catalog/controller/api/shipping/econt_delivery_getCustomerInfoParams/before', 'extension/shipping/econt_delivery/getCustomerInfoParams');
    118 
    119         $this->model_setting_event->addEvent('econt_delivery', 'admin/view/sale/order_info/before', 'extension/shipping/econt_delivery/beforeAdminViewSaleOrderInfo');
    120         $this->model_setting_event->addEvent('econt_delivery', 'admin/view/sale/order_form/before', 'extension/shipping/econt_delivery/beforeAdminViewSaleOrderFrom');
    121         $this->model_setting_event->addEvent('econt_delivery', 'catalog/model/checkout/order/addOrderHistory/after', 'extension/shipping/econt_delivery/afterModelCheckoutOrderAddHistory');
    122         $this->model_setting_event->addEvent('econt_delivery', 'admin/model/sale/order/getOrder/after', 'extension/shipping/econt_delivery/afterAdminModelSaleOrderGetOrder');
    123     }
    124     public function uninstall() {
    125         $this->load->model('setting/event');
    126 
    127         $this->model_setting_event->deleteEventByCode('econt_delivery');
    128     }
    129 
    130     private function traceShipment($orderId) {
    131         $orderId = intval($orderId);
    132         if ($orderId <= 0) return array();
    133 
    134         $this->load->model('setting/setting');
    135         $settings = $this->model_setting_setting->getSetting('shipping_econt_delivery');
    136 
    137         try {
    138             $curl = curl_init();
    139             curl_setopt($curl, CURLOPT_URL, "{$settings['shipping_econt_delivery_system_url']}/services/OrdersService.getTrace.json");
    140             curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    141             curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    142             curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    143             curl_setopt($curl, CURLOPT_HTTPHEADER, [
    144                 'Content-Type: application/json',
    145                 "Authorization: {$settings['shipping_econt_delivery_private_key']}"
    146             ]);
    147             curl_setopt($curl, CURLOPT_POST, true);
    148             curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(array(
    149                 'orderNumber' => $orderId
    150             )));
    151             curl_setopt($curl, CURLOPT_TIMEOUT, 6);
    152             $response = json_decode(curl_exec($curl), true);
    153             $responseInfo = curl_getinfo($curl);
    154             if ($responseInfo['http_code'] !== 200) $response['error'] = $response;
    155             curl_close($curl);
    156         } catch (Exception $exception) {
    157             $response['error'] = $exception;
    158         }
    159 
    160         return $response;
    161     }
    162 
    163     public function beforeAdminViewSaleOrderFrom(/** @noinspection PhpUnusedParameterInspection */ $eventRoute, &$data) {
    164         $this->language->load('extension/shipping/econt_delivery');
    165 
    166         $this->load->model('setting/setting');
    167 
    168         $econtDeliverySettings = $this->model_setting_setting->getSetting('shipping_econt_delivery');
    169 
    170         ob_start(); ?>
    171             <style>
    172                 #econt-delivery-customer-info-modal iframe {
    173                     border: 0;
    174                     width: 100%;
    175                     height: 608px;
    176                 }
    177             </style>
    178             <div id="econt-delivery-customer-info-modal" class="modal fade" role="dialog">
    179                 <div class="modal-dialog">
    180                     <div class="modal-content">
    181                         <div class="modal-header">
    182                             <button type="button" class="close" data-dismiss="modal">&times;</button>
    183                             <h4 class="modal-title"><?=$this->language->get('heading_title')?></h4>
    184                         </div>
    185                         <div class="modal-body">
    186                             <iframe src="about:blank"></iframe>
    187                         </div>
    188                     </div>
    189                 </div>
    190             </div>
    191             <script>
    192                 window.econtDelivery = window.econtDelivery || {
    193                     empty: function(thingy) {
    194                         return thingy == 0 || !thingy || (typeof(thingy) === 'object' && $.isEmptyObject(thingy));
    195                     },
    196 
    197                     systemUrl: '<?=$econtDeliverySettings['shipping_econt_delivery_system_url']?>',
    198                     orderId: <?=json_encode($data['order_id'])?>,
    199                     customerInfo: {}
    200                 };
    201                 $(function($) {
    202                     var $shippingMethod = $('#input-shipping-method');
    203                     var $customerInfoWindow = $('#econt-delivery-customer-info-modal').modal({
    204                         'show': false,
    205                         'backdrop': 'static'
    206                     });
    207 
    208                     var $customerInfoLink = $('<a></a>').attr({'href': '#', 'target': '_self'}).text('<?=$this->language->get('text_edit_customer_info')?>');
    209                     $customerInfoLink.show = function() { $customerInfoLink.css({'display': 'inline-block'}); }
    210                     $customerInfoLink.hide = function() { $customerInfoLink.css({'display': 'none'}); }
    211                     $customerInfoLink.hide();
    212                     $((((function($parent) { return ((parseInt($parent.length, 10) || 0) <= 0 ? false : $parent); })($shippingMethod.parents('.input-group')) || $shippingMethod).parent())).append($customerInfoLink);
    213                     $customerInfoLink.click(function(event) {
    214                         event.preventDefault();
    215 
    216                         $.post('<?=HTTP_CATALOG?>index.php?<?=http_build_query(array(
    217                             'route' => 'api/shipping/econt_delivery_getCustomerInfoParams',
    218                             'api_token' => $data['api_token'],
    219                             'order_id' => $data['order_id']
    220                         ))?>', {}, function(response) {
    221                             if (!window.econtDelivery.empty(response['error'])) {
    222                                 alert(response['error']);
    223                                 return;
    224                             }
    225 
    226                             if (window.econtDelivery.empty(response['customer_info_url'])) {
    227                                 alert('<?=$this->language->get('text_empty_customer_info_url')?>');
    228                                 return;
    229                             }
    230 
    231                             $customerInfoWindow.find('iframe').attr('src', response['customer_info_url']);
    232                             $customerInfoWindow.modal('show');
    233                         }, 'json').fail(function(xhr, textStatus, errorThrown) {
    234                             alert('<?=$this->language->get('text_default_error_message')?>');
    235                             console.error(errorThrown);
    236                         });
    237                     });
    238                     $(window).on('message', function(event){
    239                         if (event['originalEvent']['origin'] != window.econtDelivery.systemUrl) return;
    240 
    241                         var messageData = event['originalEvent']['data'];
    242                         if (!messageData) return;
    243 
    244                         var withShippingError = false;
    245                         if (!window.econtDelivery.empty(messageData['shipment_error'])) {
    246                             withShippingError = true;
    247                             alert(messageData['shipment_error']);
    248                         }
    249 
    250                         $.post('<?=HTTP_CATALOG?>index.php?<?=http_build_query(array(
    251                             'route' => 'api/shipping/econt_delivery_beforeApi',
    252                             'api_token' => $data['api_token'],
    253                             'order_id' => $data['order_id'],
    254                             'action' => 'updateCustomerInfo'
    255                         ))?>', messageData, function(response) {
    256                             if (!withShippingError) $customerInfoWindow.modal('hide');
    257                             window.econtDelivery.customerInfo = (response['customer_info']);
    258                         }, 'json');
    259                     });
    260 
    261                     if ($shippingMethod.val() === 'econt_delivery.econt_delivery') $customerInfoLink.show();
    262                     else $customerInfoLink.hide();
    263 
    264                     $shippingMethod.change(function() {
    265                         if ($(this).val() !== 'econt_delivery.econt_delivery') $customerInfoLink.hide();
    266                         else {
    267                             $customerInfoLink.show();
    268                             if (window.econtDelivery.empty(window.econtDelivery.customerInfo)) $customerInfoLink.click();
    269                         }
    270                     });
    271 
    272                     var loadCustomerInfo = function(showWindow) {
    273                         $.post('<?=HTTP_CATALOG?>index.php?<?=http_build_query(array(
    274                             'route' => 'api/shipping/econt_delivery_beforeApi',
    275                             'api_token' => $data['api_token'],
    276                             'order_id' => $data['order_id']
    277                         ))?>', {}, function(response) {
    278                             window.econtDelivery.customerInfo = response;
    279                             if (showWindow && showWindow === true && window.econtDelivery.empty(window.econtDelivery.customerInfo)) {
    280                                 $shippingMethod.change();
    281                             }
    282                         }, 'json');
    283                     }
    284                     $('#button-shipping-address').click(function() {
    285                         loadCustomerInfo(true);
    286                     });
    287                     if (window.econtDelivery.empty(window.econtDelivery.customerInfo)) loadCustomerInfo(false)
    288                 });
    289             </script>
    290         <?php $data['footer'] = str_replace('</body>', sprintf('%s</body>', ob_get_contents()), $data['footer']);
    291         ob_end_clean();
    292     }
    293     public function beforeAdminViewSaleOrderInfo(/** @noinspection PhpUnusedParameterInspection */ $eventRoute, &$data) {
    294         $orderId = intval($this->request->get['order_id']);
    295         if ($orderId <= 0) return;
    296 
    297         $this->load->model('sale/order');
    298         $orderData = $this->model_sale_order->getOrder($orderId);
    299 
    300         if ($orderData['shipping_code'] !== 'econt_delivery.econt_delivery') return;
    301 
    302         $this->language->load('extension/shipping/econt_delivery');
    303 
    304         $data['shipping_method'] = $this->language->get('text_shipping_via_econt');
    305         $shipment = $this->traceShipment($orderId);
    306         if (!empty($shipment['shipmentNumber'])) {
    307             $data['shipping_method'] .= sprintf(' - №<a href="%s" target="_blank" data-toggle="tooltip" data-original-title="%s">%s</a>',
    308                 "{$this->trackShipmentUrl}/{$shipment['shipmentNumber']}",
    309                 $this->language->get('text_trace_shipping'),
    310                 $shipment['shipmentNumber']
    311             );
    312             if (!empty($shipment['pdfURL'])) $data['shipping'] = $shipment['pdfURL'];
    313         } else {
    314             $this->load->model('setting/setting');
    315             $econtDeliverySettings = $this->model_setting_setting->getSetting('shipping_econt_delivery');
    316 
    317             $data['shipping'] = '#open_econt_delivery_create_label_window';
    318             ob_start(); ?>
    319                 <style>
    320                     #econt-delivery-create-label-modal .modal-dialog {
    321                         width: 520px;
    322                     }
    323                     #econt-delivery-create-label-modal .modal-body {
    324                         padding: 0;
    325                     }
    326                     #econt-delivery-create-label-modal iframe {
    327                         border: 0;
    328                         width: 100%;
    329                         height: 280px;
    330                     }
    331                 </style>
    332                 <div id="econt-delivery-create-label-modal" class="modal fade" role="dialog">
    333                     <div class="modal-dialog">
    334                         <div class="modal-content">
    335                             <div class="modal-header">
    336                                 <button type="button" class="close" data-dismiss="modal">&times;</button>
    337                                 <h4 class="modal-title"><?=$this->language->get('heading_title')?></h4>
    338                             </div>
    339                             <div class="modal-body">
    340                                 <iframe src="about:blank"></iframe>
    341                             </div>
    342                         </div>
    343                     </div>
    344                 </div>
    345                 <script>
    346                     window.econtDelivery = window.econtDelivery || {
    347                         empty: function(thingy) {
    348                             return thingy == 0 || !thingy || (typeof(thingy) === 'object' && $.isEmptyObject(thingy));
    349                         },
    350 
    351                         orderId: <?=json_encode($orderId)?>
    352                     };
    353                     $(function($) {
    354                         var $createLabelWindow = $('#econt-delivery-create-label-modal').modal({
    355                             'show': false,
    356                             'backdrop': 'static'
    357                         });
    358                         $('a[href="#open_econt_delivery_create_label_window"]').click(function(event) {
    359                             event.preventDefault();
    360                             event.stopPropagation();
    361 
    362                             $createLabelWindow.find('iframe').attr('src', '<?=$econtDeliverySettings['shipping_econt_delivery_system_url'] . '/create_label.php?'. http_build_query(array(
    363                                 'order_number' => $orderId,
    364                                 'token' => $econtDeliverySettings['shipping_econt_delivery_private_key']
    365                             ))?>');
    366                             $createLabelWindow.modal('show');
    367                         });
    368                         $(window).on('message', function(event){
    369                             if (event['originalEvent']['origin'] != '<?=$econtDeliverySettings['shipping_econt_delivery_system_url']?>') return;
    370 
    371                             var messageData = event['originalEvent']['data'];
    372                             if (!messageData) return;
    373 
    374                             switch (messageData['event']) {
    375                                 case 'cancel':
    376                                     $createLabelWindow.modal('hide');
    377                                     break;
    378                                 case 'confirm':
    379                                     if (messageData['printPdf'] === true && !window.econtDelivery.empty(messageData['shipmentStatus']['pdfURL'])) window.open(messageData['shipmentStatus']['pdfURL'], '_blank');
    380                                     window.location.href = window.location.href;
    381                                     break;
    382                             }
    383                         });
    384                     });
    385                 </script>
    386             <?php $data['footer'] = str_replace('</body>', sprintf('%s</body>', ob_get_contents()), $data['footer']);
    387             ob_end_clean();
    388         }
    389     }
    390     public function afterAdminModelSaleOrderGetOrder(/** @noinspection PhpUnusedParameterInspection */ &$eventRoute, &$data, &$returnData) {
    391         $orderId = $returnData['order_id'];
    392         if ($orderId <= 0) return;
    393 
    394         $customerInfo = $this->db->query(sprintf("
    395             SELECT
    396                 ci.customer_info AS customerInfo
    397             FROM `%s`.`%secont_delivery_customer_info` AS ci
    398             WHERE TRUE
    399                 AND ci.id_order = {$orderId}
    400             LIMIT 1
    401         ",
    402             DB_DATABASE,
    403             DB_PREFIX
    404         ));
    405         $customerInfo = @json_decode($customerInfo->row['customerInfo'], true);
    406         if (!$customerInfo) return;
    407 
    408         if (
    409                 $returnData['shipping_code'] === 'econt_delivery.econt_delivery'
    410             &&  (
    411                     @empty($returnData['shipping_firstname'])
    412                 ||  @empty($returnData['shipping_lastname'])
    413             )
    414             &&  @!empty($customerInfo)
    415         ) {
    416             $shippingName = '';
    417             if (@!empty($customerInfo['name']) && @!empty($customerInfo['face'])) {
    418                 $shippingName = $customerInfo['face'];
    419             } elseif (@!empty($customerInfo['name']) && @empty($customerInfo['face'])) {
    420                 $shippingName = $customerInfo['name'];
    421             } elseif (@empty($customerInfo['name']) && @!empty($customerInfo['face'])) {
    422                 $shippingName = $customerInfo['face'];
    423             }
    424             if (!empty($shippingName)) {
    425                 $shippingNameParts = explode(' ', trim($shippingName));
    426                 if (!empty($shippingNameParts)) {
    427                     $returnData['shipping_firstname'] = reset($shippingNameParts);
    428                     $returnData['shipping_lastname'] = end($shippingNameParts);
    429                 }
    430             }
    431         }
    432     }
    433 
    434 }