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">×</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">×</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 }