From dc0edebeb085760bf6364c421163d2dbdc9ed361 Mon Sep 17 00:00:00 2001 From: Preprod mutu Date: Tue, 12 Sep 2017 10:48:51 +0200 Subject: [PATCH] tnt --- ...'install du module TNT sous Prestashop.pdf | Bin 0 -> 260828 bytes .../tntofficiel/classes/TNTOfficielCart.php | 167 ++ www/modules/tntofficiel/classes/index.php | 18 + .../admin/AdminTNTOfficielController.php | 256 +++ .../tntofficiel/controllers/admin/index.php | 18 + .../tntofficiel/controllers/front/address.php | 187 ++ .../tntofficiel/controllers/front/carrier.php | 160 ++ .../tntofficiel/controllers/front/index.php | 18 + .../controllers/front/shippingMethod.php | 240 +++ .../controllers/front/tracking.php | 68 + www/modules/tntofficiel/controllers/index.php | 18 + www/modules/tntofficiel/index.php | 18 + .../libraries/TNTOfficiel_Address.php | 193 ++ .../libraries/TNTOfficiel_Cache.php | 69 + .../libraries/TNTOfficiel_Carrier.php | 330 ++++ .../libraries/TNTOfficiel_Cart.php | 121 ++ .../libraries/TNTOfficiel_DbUtils.php | 33 + .../libraries/TNTOfficiel_Debug.php | 604 ++++++ .../libraries/TNTOfficiel_Install.php | 578 ++++++ .../libraries/TNTOfficiel_JsonRPCClient.php | 410 ++++ .../libraries/TNTOfficiel_Logger.php | 181 ++ .../libraries/TNTOfficiel_Parcel.php | 95 + .../libraries/TNTOfficiel_PasswordManager.php | 63 + .../libraries/TNTOfficiel_Product.php | 50 + .../libraries/TNTOfficiel_ServiceCache.php | 30 + .../libraries/TNTOfficiel_SoapClient.php | 115 ++ .../libraries/TNTOfficiel_SysCheck.php | 256 +++ .../TNTOfficiel_MaxPackageWeightException.php | 12 + ...TOfficiel_OrderAlreadyShippedException.php | 12 + .../libraries/exceptions/index.php | 18 + .../helper/TNTOfficiel_AddressHelper.php | 224 +++ .../helper/TNTOfficiel_CarrierHelper.php | 284 +++ .../helper/TNTOfficiel_OrderHelper.php | 195 ++ .../helper/TNTOfficiel_ParcelsHelper.php | 492 +++++ .../helper/TNTOfficiel_RelayPointsHelper.php | 178 ++ .../helper/TNTOfficiel_ShipmentHelper.php | 440 +++++ .../helper/TNTOfficiel_ShippingHelper.php | 119 ++ .../tntofficiel/libraries/helper/index.php | 18 + www/modules/tntofficiel/libraries/index.php | 18 + .../libraries/pdf/TNTOfficiel_PDFMerger.php | 202 ++ .../libraries/pdf/fpdf/TNTOfficiel_FPDF.php | 1641 +++++++++++++++++ .../libraries/pdf/fpdf/font/courier.php | 15 + .../libraries/pdf/fpdf/font/helvetica.php | 43 + .../libraries/pdf/fpdf/font/helveticab.php | 23 + .../libraries/pdf/fpdf/font/helveticabi.php | 23 + .../libraries/pdf/fpdf/font/helveticai.php | 23 + .../libraries/pdf/fpdf/font/index.php | 18 + .../pdf/fpdf/font/makefont/cp1250.map | 251 +++ .../pdf/fpdf/font/makefont/cp1251.map | 255 +++ .../pdf/fpdf/font/makefont/cp1252.map | 251 +++ .../pdf/fpdf/font/makefont/cp1253.map | 239 +++ .../pdf/fpdf/font/makefont/cp1254.map | 249 +++ .../pdf/fpdf/font/makefont/cp1255.map | 233 +++ .../pdf/fpdf/font/makefont/cp1257.map | 244 +++ .../pdf/fpdf/font/makefont/cp1258.map | 247 +++ .../pdf/fpdf/font/makefont/cp874.map | 225 +++ .../pdf/fpdf/font/makefont/index.php | 18 + .../pdf/fpdf/font/makefont/iso-8859-1.map | 256 +++ .../pdf/fpdf/font/makefont/iso-8859-11.map | 248 +++ .../pdf/fpdf/font/makefont/iso-8859-15.map | 256 +++ .../pdf/fpdf/font/makefont/iso-8859-16.map | 256 +++ .../pdf/fpdf/font/makefont/iso-8859-2.map | 256 +++ .../pdf/fpdf/font/makefont/iso-8859-4.map | 256 +++ .../pdf/fpdf/font/makefont/iso-8859-5.map | 256 +++ .../pdf/fpdf/font/makefont/iso-8859-7.map | 250 +++ .../pdf/fpdf/font/makefont/iso-8859-9.map | 256 +++ .../pdf/fpdf/font/makefont/koi8-r.map | 256 +++ .../pdf/fpdf/font/makefont/koi8-u.map | 256 +++ .../pdf/fpdf/font/makefont/makefont.php | 397 ++++ .../libraries/pdf/fpdf/font/symbol.php | 23 + .../libraries/pdf/fpdf/font/times.php | 23 + .../libraries/pdf/fpdf/font/timesb.php | 23 + .../libraries/pdf/fpdf/font/timesbi.php | 23 + .../libraries/pdf/fpdf/font/timesi.php | 23 + .../libraries/pdf/fpdf/font/zapfdingbats.php | 23 + .../tntofficiel/libraries/pdf/fpdf/fpdf.css | 21 + .../tntofficiel/libraries/pdf/fpdf/index.php | 18 + .../libraries/pdf/fpdi/TNTOfficiel_FPDF2.php | 184 ++ .../pdf/fpdi/TNTOfficiel_FPDF_TPL.php | 431 +++++ .../libraries/pdf/fpdi/TNTOfficiel_FPDI.php | 522 ++++++ .../pdf/fpdi/TNTOfficiel_fpdi_pdf_parser.php | 408 ++++ .../pdf/fpdi/TNTOfficiel_pdf_context.php | 105 ++ .../pdf/fpdi/TNTOfficiel_pdf_parser.php | 725 ++++++++ .../filters/TNTOfficiel_FilterASCII85.php | 110 ++ .../TNTOfficiel_FilterASCII85_FPDI.php | 41 + .../fpdi/filters/TNTOfficiel_FilterLZW.php | 162 ++ .../filters/TNTOfficiel_FilterLZW_FPDI.php | 41 + .../libraries/pdf/fpdi/filters/index.php | 18 + .../tntofficiel/libraries/pdf/fpdi/index.php | 18 + .../tntofficiel/libraries/pdf/index.php | 18 + .../HTMLTemplateTNTOfficielManifest.php | 90 + .../pdf/manifest/TNTOfficiel_ManifestPDF.php | 34 + .../TNTOfficiel_ManifestPDFCreator.php | 105 ++ .../TNTOfficiel_ManifestPDFGenerator.php | 23 + .../libraries/pdf/manifest/index.php | 18 + .../TNTOfficiel_OrderSmartyFunction.php | 36 + ...TOfficiel_ShippingMethodSmartyFunction.php | 98 + .../tntofficiel/libraries/smarty/index.php | 18 + .../tntofficiel/log/TNT-request-20170911.log | 706 +++++++ .../tntofficiel/log/TNT-request-20170912.log | 214 +++ www/modules/tntofficiel/logo.gif | Bin 0 -> 1969 bytes www/modules/tntofficiel/logo.png | Bin 0 -> 909 bytes .../tntofficiel/override/classes/index.php | 18 + .../override/classes/order/Order.php | 63 + .../override/classes/order/OrderHistory.php | 360 ++++ .../override/classes/order/index.php | 18 + .../admin/AdminOrdersController.php | 498 +++++ .../override/controllers/admin/index.php | 18 + .../override/controllers/index.php | 18 + www/modules/tntofficiel/override/index.php | 18 + www/modules/tntofficiel/translations/fr.php | 381 ++++ .../tntofficiel/translations/index.php | 18 + www/modules/tntofficiel/upgrade/index.php | 18 + .../tntofficiel/upgrade/install-1.2.10.php | 67 + .../tntofficiel/upgrade/install-1.2.11.php | 67 + .../tntofficiel/upgrade/install-1.2.12.php | 67 + .../tntofficiel/upgrade/install-1.2.13.php | 75 + .../tntofficiel/upgrade/install-1.2.14.php | 67 + .../tntofficiel/upgrade/install-1.2.17.php | 64 + .../tntofficiel/upgrade/install-1.2.18.php | 67 + .../tntofficiel/upgrade/install-1.2.19.php | 67 + .../tntofficiel/upgrade/install-1.2.20.php | 150 ++ .../tntofficiel/upgrade/install-1.2.21.php | 70 + .../views/css/AdminTNTOfficiel.css | 15 + .../views/css/deliveryPointsBox.css | 735 ++++++++ .../views/css/extraAddressData.css | 31 + www/modules/tntofficiel/views/css/index.php | 18 + .../tntofficiel/views/css/manifest.css | 60 + www/modules/tntofficiel/views/css/style.css | 39 + .../tntofficiel/views/css/tracking.css | 208 +++ www/modules/tntofficiel/views/fonts/index.php | 18 + .../views/fonts/tnt-middleware.eot | Bin 0 -> 1904 bytes .../views/fonts/tnt-middleware.svg | 11 + .../views/fonts/tnt-middleware.ttf | Bin 0 -> 1712 bytes .../views/fonts/tnt-middleware.woff | Bin 0 -> 1788 bytes .../views/img/AdminTNTOfficiel.gif | Bin 0 -> 945 bytes www/modules/tntofficiel/views/img/_r2_c2.jpg | Bin 0 -> 1951 bytes www/modules/tntofficiel/views/img/_r2_c4.jpg | Bin 0 -> 1596 bytes .../tntofficiel/views/img/ajax-loader.gif | Bin 0 -> 4178 bytes www/modules/tntofficiel/views/img/arrow.png | Bin 0 -> 1136 bytes www/modules/tntofficiel/views/img/carrier.jpg | Bin 0 -> 9932 bytes .../views/img/carrier/delivery/index.php | 18 + .../img/carrier/delivery/option-ChezVous.png | Bin 0 -> 4484 bytes .../carrier/delivery/option-Entreprise.png | Bin 0 -> 4144 bytes .../carrier/delivery/option-RelaisColis.png | Bin 0 -> 4454 bytes .../tntofficiel/views/img/carrier/index.php | 18 + .../views/img/carrier/tntofficiel.jpg | Bin 0 -> 3643 bytes .../tntofficiel/views/img/depot_r8_c2.jpg | Bin 0 -> 8213 bytes .../tntofficiel/views/img/domicile_r4_c2.jpg | Bin 0 -> 4781 bytes .../views/img/entreprise_r2_c2.jpg | Bin 0 -> 8454 bytes www/modules/tntofficiel/views/img/index.php | 18 + .../tntofficiel/views/img/modal/index.php | 18 + .../views/img/modal/location-point-map.png | Bin 0 -> 1094 bytes .../views/img/modal/location-point.png | Bin 0 -> 533 bytes .../tntofficiel/views/img/modal/marker/1.png | Bin 0 -> 1366 bytes .../tntofficiel/views/img/modal/marker/10.png | Bin 0 -> 1497 bytes .../tntofficiel/views/img/modal/marker/2.png | Bin 0 -> 1480 bytes .../tntofficiel/views/img/modal/marker/3.png | Bin 0 -> 1502 bytes .../tntofficiel/views/img/modal/marker/4.png | Bin 0 -> 1446 bytes .../tntofficiel/views/img/modal/marker/5.png | Bin 0 -> 1487 bytes .../tntofficiel/views/img/modal/marker/6.png | Bin 0 -> 1509 bytes .../tntofficiel/views/img/modal/marker/7.png | Bin 0 -> 1412 bytes .../tntofficiel/views/img/modal/marker/8.png | Bin 0 -> 1531 bytes .../tntofficiel/views/img/modal/marker/9.png | Bin 0 -> 1504 bytes .../views/img/modal/marker/index.php | 18 + .../tntofficiel/views/img/modal/top-logo.png | Bin 0 -> 15629 bytes .../tntofficiel/views/img/modal/top-picto.png | Bin 0 -> 3805 bytes .../tntofficiel/views/img/relais_r6_c2.jpg | Bin 0 -> 5271 bytes .../views/js/address-city-check.js | 147 ++ .../tntofficiel/views/js/adminTntOrders.js | 20 + .../tntofficiel/views/js/deliveryPointsBox.js | 488 +++++ .../tntofficiel/views/js/displayAdminOrder.js | 277 +++ www/modules/tntofficiel/views/js/index.php | 18 + .../tntofficiel/views/js/lib/index.php | 18 + .../tntofficiel/views/js/lib/kvz/index.php | 18 + .../views/js/lib/kvz/phpjs/index.php | 18 + .../js/lib/kvz/phpjs/url/base64_decode.js | 64 + .../js/lib/kvz/phpjs/url/base64_encode.js | 59 + .../views/js/lib/kvz/phpjs/url/index.php | 18 + .../views/js/lib/nanoscroller/index.php | 18 + .../nanoscroller/jquery.nanoscroller.min.js | 3 + .../js/lib/nanoscroller/nanoscroller.css | 48 + .../tntofficiel/views/js/order-city-check.js | 119 ++ .../templates/hook/displayAdminOrder.tpl | 169 ++ .../templates/hook/displayBeforeCarrier.tpl | 19 + .../templates/hook/displayCarrierList.tpl | 2 +- .../displayCarrierList/deliveryPointSet.tpl | 80 + .../displayCarrierList/deliveryPointsBox.tpl | 33 + .../deliveryPointsBox/form.tpl | 58 + .../deliveryPointsBox/index.php | 18 + .../deliveryPointsBox/list.tpl | 100 + .../hook/displayCarrierList/index.php | 18 + .../templates/hook/displayCarrierList2.tpl | 637 +++++++ .../templates/hook/displayOrderDetail.tpl | 18 + 194 files changed, 23905 insertions(+), 1 deletion(-) create mode 100644 www/modules/tntofficiel/Manuel d'install du module TNT sous Prestashop.pdf create mode 100644 www/modules/tntofficiel/classes/TNTOfficielCart.php create mode 100644 www/modules/tntofficiel/classes/index.php create mode 100644 www/modules/tntofficiel/controllers/admin/AdminTNTOfficielController.php create mode 100644 www/modules/tntofficiel/controllers/admin/index.php create mode 100644 www/modules/tntofficiel/controllers/front/address.php create mode 100644 www/modules/tntofficiel/controllers/front/carrier.php create mode 100644 www/modules/tntofficiel/controllers/front/index.php create mode 100644 www/modules/tntofficiel/controllers/front/shippingMethod.php create mode 100644 www/modules/tntofficiel/controllers/front/tracking.php create mode 100644 www/modules/tntofficiel/controllers/index.php create mode 100644 www/modules/tntofficiel/index.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_Address.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_Cache.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_Carrier.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_Cart.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_DbUtils.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_Debug.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_Install.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_JsonRPCClient.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_Logger.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_Parcel.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_PasswordManager.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_Product.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_ServiceCache.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_SoapClient.php create mode 100644 www/modules/tntofficiel/libraries/TNTOfficiel_SysCheck.php create mode 100644 www/modules/tntofficiel/libraries/exceptions/TNTOfficiel_MaxPackageWeightException.php create mode 100644 www/modules/tntofficiel/libraries/exceptions/TNTOfficiel_OrderAlreadyShippedException.php create mode 100644 www/modules/tntofficiel/libraries/exceptions/index.php create mode 100644 www/modules/tntofficiel/libraries/helper/TNTOfficiel_AddressHelper.php create mode 100644 www/modules/tntofficiel/libraries/helper/TNTOfficiel_CarrierHelper.php create mode 100644 www/modules/tntofficiel/libraries/helper/TNTOfficiel_OrderHelper.php create mode 100644 www/modules/tntofficiel/libraries/helper/TNTOfficiel_ParcelsHelper.php create mode 100644 www/modules/tntofficiel/libraries/helper/TNTOfficiel_RelayPointsHelper.php create mode 100644 www/modules/tntofficiel/libraries/helper/TNTOfficiel_ShipmentHelper.php create mode 100644 www/modules/tntofficiel/libraries/helper/TNTOfficiel_ShippingHelper.php create mode 100644 www/modules/tntofficiel/libraries/helper/index.php create mode 100644 www/modules/tntofficiel/libraries/index.php create mode 100644 www/modules/tntofficiel/libraries/pdf/TNTOfficiel_PDFMerger.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/TNTOfficiel_FPDF.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/courier.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/helvetica.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/helveticab.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/helveticabi.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/helveticai.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/index.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1250.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1251.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1252.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1253.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1254.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1255.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1257.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1258.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp874.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/index.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-1.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-11.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-15.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-16.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-2.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-4.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-5.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-7.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-9.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/koi8-r.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/koi8-u.map create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/makefont.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/symbol.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/times.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/timesb.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/timesbi.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/timesi.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/font/zapfdingbats.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/fpdf.css create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdf/index.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_FPDF2.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_FPDF_TPL.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_FPDI.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_fpdi_pdf_parser.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_pdf_context.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_pdf_parser.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterASCII85.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterASCII85_FPDI.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterLZW.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterLZW_FPDI.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdi/filters/index.php create mode 100644 www/modules/tntofficiel/libraries/pdf/fpdi/index.php create mode 100644 www/modules/tntofficiel/libraries/pdf/index.php create mode 100644 www/modules/tntofficiel/libraries/pdf/manifest/HTMLTemplateTNTOfficielManifest.php create mode 100644 www/modules/tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDF.php create mode 100644 www/modules/tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFCreator.php create mode 100644 www/modules/tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFGenerator.php create mode 100644 www/modules/tntofficiel/libraries/pdf/manifest/index.php create mode 100644 www/modules/tntofficiel/libraries/smarty/TNTOfficiel_OrderSmartyFunction.php create mode 100644 www/modules/tntofficiel/libraries/smarty/TNTOfficiel_ShippingMethodSmartyFunction.php create mode 100644 www/modules/tntofficiel/libraries/smarty/index.php create mode 100644 www/modules/tntofficiel/log/TNT-request-20170911.log create mode 100644 www/modules/tntofficiel/log/TNT-request-20170912.log create mode 100644 www/modules/tntofficiel/logo.gif create mode 100644 www/modules/tntofficiel/logo.png create mode 100644 www/modules/tntofficiel/override/classes/index.php create mode 100644 www/modules/tntofficiel/override/classes/order/Order.php create mode 100644 www/modules/tntofficiel/override/classes/order/OrderHistory.php create mode 100644 www/modules/tntofficiel/override/classes/order/index.php create mode 100644 www/modules/tntofficiel/override/controllers/admin/AdminOrdersController.php create mode 100644 www/modules/tntofficiel/override/controllers/admin/index.php create mode 100644 www/modules/tntofficiel/override/controllers/index.php create mode 100644 www/modules/tntofficiel/override/index.php create mode 100644 www/modules/tntofficiel/translations/fr.php create mode 100644 www/modules/tntofficiel/translations/index.php create mode 100644 www/modules/tntofficiel/upgrade/index.php create mode 100644 www/modules/tntofficiel/upgrade/install-1.2.10.php create mode 100644 www/modules/tntofficiel/upgrade/install-1.2.11.php create mode 100644 www/modules/tntofficiel/upgrade/install-1.2.12.php create mode 100644 www/modules/tntofficiel/upgrade/install-1.2.13.php create mode 100644 www/modules/tntofficiel/upgrade/install-1.2.14.php create mode 100644 www/modules/tntofficiel/upgrade/install-1.2.17.php create mode 100644 www/modules/tntofficiel/upgrade/install-1.2.18.php create mode 100644 www/modules/tntofficiel/upgrade/install-1.2.19.php create mode 100644 www/modules/tntofficiel/upgrade/install-1.2.20.php create mode 100644 www/modules/tntofficiel/upgrade/install-1.2.21.php create mode 100644 www/modules/tntofficiel/views/css/AdminTNTOfficiel.css create mode 100644 www/modules/tntofficiel/views/css/deliveryPointsBox.css create mode 100644 www/modules/tntofficiel/views/css/extraAddressData.css create mode 100644 www/modules/tntofficiel/views/css/index.php create mode 100644 www/modules/tntofficiel/views/css/manifest.css create mode 100644 www/modules/tntofficiel/views/css/style.css create mode 100644 www/modules/tntofficiel/views/css/tracking.css create mode 100644 www/modules/tntofficiel/views/fonts/index.php create mode 100644 www/modules/tntofficiel/views/fonts/tnt-middleware.eot create mode 100644 www/modules/tntofficiel/views/fonts/tnt-middleware.svg create mode 100644 www/modules/tntofficiel/views/fonts/tnt-middleware.ttf create mode 100644 www/modules/tntofficiel/views/fonts/tnt-middleware.woff create mode 100644 www/modules/tntofficiel/views/img/AdminTNTOfficiel.gif create mode 100644 www/modules/tntofficiel/views/img/_r2_c2.jpg create mode 100644 www/modules/tntofficiel/views/img/_r2_c4.jpg create mode 100644 www/modules/tntofficiel/views/img/ajax-loader.gif create mode 100644 www/modules/tntofficiel/views/img/arrow.png create mode 100644 www/modules/tntofficiel/views/img/carrier.jpg create mode 100644 www/modules/tntofficiel/views/img/carrier/delivery/index.php create mode 100644 www/modules/tntofficiel/views/img/carrier/delivery/option-ChezVous.png create mode 100644 www/modules/tntofficiel/views/img/carrier/delivery/option-Entreprise.png create mode 100644 www/modules/tntofficiel/views/img/carrier/delivery/option-RelaisColis.png create mode 100644 www/modules/tntofficiel/views/img/carrier/index.php create mode 100644 www/modules/tntofficiel/views/img/carrier/tntofficiel.jpg create mode 100644 www/modules/tntofficiel/views/img/depot_r8_c2.jpg create mode 100644 www/modules/tntofficiel/views/img/domicile_r4_c2.jpg create mode 100644 www/modules/tntofficiel/views/img/entreprise_r2_c2.jpg create mode 100644 www/modules/tntofficiel/views/img/index.php create mode 100644 www/modules/tntofficiel/views/img/modal/index.php create mode 100644 www/modules/tntofficiel/views/img/modal/location-point-map.png create mode 100644 www/modules/tntofficiel/views/img/modal/location-point.png create mode 100644 www/modules/tntofficiel/views/img/modal/marker/1.png create mode 100644 www/modules/tntofficiel/views/img/modal/marker/10.png create mode 100644 www/modules/tntofficiel/views/img/modal/marker/2.png create mode 100644 www/modules/tntofficiel/views/img/modal/marker/3.png create mode 100644 www/modules/tntofficiel/views/img/modal/marker/4.png create mode 100644 www/modules/tntofficiel/views/img/modal/marker/5.png create mode 100644 www/modules/tntofficiel/views/img/modal/marker/6.png create mode 100644 www/modules/tntofficiel/views/img/modal/marker/7.png create mode 100644 www/modules/tntofficiel/views/img/modal/marker/8.png create mode 100644 www/modules/tntofficiel/views/img/modal/marker/9.png create mode 100644 www/modules/tntofficiel/views/img/modal/marker/index.php create mode 100644 www/modules/tntofficiel/views/img/modal/top-logo.png create mode 100644 www/modules/tntofficiel/views/img/modal/top-picto.png create mode 100644 www/modules/tntofficiel/views/img/relais_r6_c2.jpg create mode 100644 www/modules/tntofficiel/views/js/address-city-check.js create mode 100644 www/modules/tntofficiel/views/js/adminTntOrders.js create mode 100644 www/modules/tntofficiel/views/js/deliveryPointsBox.js create mode 100644 www/modules/tntofficiel/views/js/displayAdminOrder.js create mode 100644 www/modules/tntofficiel/views/js/index.php create mode 100644 www/modules/tntofficiel/views/js/lib/index.php create mode 100644 www/modules/tntofficiel/views/js/lib/kvz/index.php create mode 100644 www/modules/tntofficiel/views/js/lib/kvz/phpjs/index.php create mode 100644 www/modules/tntofficiel/views/js/lib/kvz/phpjs/url/base64_decode.js create mode 100644 www/modules/tntofficiel/views/js/lib/kvz/phpjs/url/base64_encode.js create mode 100644 www/modules/tntofficiel/views/js/lib/kvz/phpjs/url/index.php create mode 100644 www/modules/tntofficiel/views/js/lib/nanoscroller/index.php create mode 100644 www/modules/tntofficiel/views/js/lib/nanoscroller/jquery.nanoscroller.min.js create mode 100644 www/modules/tntofficiel/views/js/lib/nanoscroller/nanoscroller.css create mode 100644 www/modules/tntofficiel/views/js/order-city-check.js create mode 100644 www/modules/tntofficiel/views/templates/hook/displayAdminOrder.tpl create mode 100644 www/modules/tntofficiel/views/templates/hook/displayBeforeCarrier.tpl create mode 100644 www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointSet.tpl create mode 100644 www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox.tpl create mode 100644 www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox/form.tpl create mode 100644 www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox/index.php create mode 100644 www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox/list.tpl create mode 100644 www/modules/tntofficiel/views/templates/hook/displayCarrierList/index.php create mode 100644 www/modules/tntofficiel/views/templates/hook/displayCarrierList2.tpl create mode 100644 www/modules/tntofficiel/views/templates/hook/displayOrderDetail.tpl diff --git a/www/modules/tntofficiel/Manuel d'install du module TNT sous Prestashop.pdf b/www/modules/tntofficiel/Manuel d'install du module TNT sous Prestashop.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f86d8b0ba9a3f962f9a4e85624b3cf5283b5317b GIT binary patch literal 260828 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 N07U1{ORLHd{Xb&h0?GgY literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/classes/TNTOfficielCart.php b/www/modules/tntofficiel/classes/TNTOfficielCart.php new file mode 100644 index 00000000..2aaf40ee --- /dev/null +++ b/www/modules/tntofficiel/classes/TNTOfficielCart.php @@ -0,0 +1,167 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + +/** + * Class TNTOfficielCart + */ +class TNTOfficielCart extends ObjectModel +{ + // id_tntofficiel_cart + public $id; + + public $id_cart; + public $carrier_code; + public $carrier_label; + public $delivery_point; + public $delivery_price; + public $customer_email; + public $customer_mobile; + public $address_building; + public $address_accesscode; + public $address_floor; + + public static $definition = array( + 'table' => 'tntofficiel_cart', + 'primary' => 'id_tntofficiel_cart', + 'fields' => array( + 'id_cart' => array( + 'type' => ObjectModel::TYPE_INT, + 'validate' => 'isUnsignedId', + 'required' => true + ), + 'carrier_code' => array( + 'type' => ObjectModel::TYPE_STRING, + 'size' => 64 + ), + 'carrier_label' => array( + 'type' => ObjectModel::TYPE_STRING, + 'size' => 255 + ), + 'delivery_point' => array( + 'type' => ObjectModel::TYPE_STRING + /*, 'validate' => 'isSerializedArray', 'size' => 65000*/ + ), + 'delivery_price' => array( + 'type' => ObjectModel::TYPE_FLOAT, + 'validate' => 'isPrice' + ), + 'customer_email' => array( + 'type' => ObjectModel::TYPE_STRING, + 'validate' => 'isEmail', + 'size' => 128 + ), + 'customer_mobile' => array( + 'type' => ObjectModel::TYPE_STRING, + 'validate' => 'isPhoneNumber', + 'size' => 32 + ), + 'address_building' => array( + 'type' => ObjectModel::TYPE_STRING, + 'size' => 16 + ), + 'address_accesscode' => array( + 'type' => ObjectModel::TYPE_STRING, + 'size' => 16 + ), + 'address_floor' => array( + 'type' => ObjectModel::TYPE_STRING, + 'size' => 16 + ), + ), + ); + + /** + * Constructor. + */ + public function __construct($intArgId = null) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + parent::__construct($intArgId); + } + + public static function loadCartID($intArgCartId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $intCartId = (int)$intArgCartId; + + // No new cart ID. + if (!($intCartId > 0)) { + return false; + } + + // Search row for cart ID. + $objDbQuery = new DbQuery(); + $objDbQuery->select('*'); + $objDbQuery->from(TNTOfficielCart::$definition['table']); + $objDbQuery->where('id_cart = '.$intCartId); + + $objDB = Db::getInstance(); + $arrResult = $objDB->executeS($objDbQuery); + // If row found and match cart ID. + if (count($arrResult)===1 && $intCartId===(int)$arrResult[0]['id_cart']) { + // Load existing TNT cart entry. + $objTNTCartModel = new TNTOfficielCart((int)$arrResult[0]['id_tntofficiel_cart']); + } else { + // Create a new TNT cart entry. + $objTNTCartModel = new TNTOfficielCart(); + $objTNTCartModel->id_cart = $intCartId; + $objTNTCartModel->save(); + } + + // Check. + if ((int)$objTNTCartModel->id_cart !== $intCartId) { + return false; + } + + return $objTNTCartModel; + } + + /** + * @return array + */ + public function getDeliveryPoint() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrDeliveryPoint = Tools::unSerialize($this->delivery_point); + if (!is_array($arrDeliveryPoint)) { + $arrDeliveryPoint = array(); + } + + return $arrDeliveryPoint; + } + + /** + * @param $arrArgDeliveryPoint + * @return mixed + */ + public function setDeliveryPoint($arrArgDeliveryPoint) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (!is_array($arrArgDeliveryPoint)) { + return false; + } + + if (isset($arrArgDeliveryPoint['xett'])) { + unset($arrArgDeliveryPoint['pex']); + } elseif (isset($arrArgDeliveryPoint['pex'])) { + unset($arrArgDeliveryPoint['xett']); + } else { + $arrArgDeliveryPoint = array(); + } + + $this->delivery_point = serialize($arrArgDeliveryPoint); + return $this->save(); + } +} diff --git a/www/modules/tntofficiel/classes/index.php b/www/modules/tntofficiel/classes/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/classes/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/controllers/admin/AdminTNTOfficielController.php b/www/modules/tntofficiel/controllers/admin/AdminTNTOfficielController.php new file mode 100644 index 00000000..51c80c7e --- /dev/null +++ b/www/modules/tntofficiel/controllers/admin/AdminTNTOfficielController.php @@ -0,0 +1,256 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/tntofficiel.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_PasswordManager.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_ShipmentHelper.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDF.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFGenerator.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/pdf/manifest/HTMLTemplateTNTOfficielManifest.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFCreator.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/exceptions/TNTOfficiel_MaxPackageWeightException.php'; + +// Controller +class AdminTNTOfficielController extends ModuleAdminController +{ + /** + * Constructor. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // _PS_MODULE_DIR_.$this->module->name.'/views/templates/admin/' + // default : 'content.tpl'; + $this->template = 'AdminTNTOfficiel.tpl'; + + parent::__construct(); + } + + /** + * Add css files. + */ + public function setMedia() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->addCSS(_MODULE_DIR_.$this->module->name.'/views/css/AdminTNTOfficiel.css', 'all'); + $this->addCSS(_MODULE_DIR_.$this->module->name.'/views/css/style.css'); + parent::setMedia(); + } + + /** + * {@inheritdoc} + */ + public function createTemplate($tpl_name) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->context->smarty->assign(array( + 'username' => Configuration::get('TNT_CARRIER_USERNAME'), + 'account' => Configuration::get('TNT_CARRIER_ACCOUNT'), + 'password' => TNTOfficiel_PasswordManager::getHash(), + 'middlewareUrl' => Configuration::get('TNT_CARRIER_MIDDLEWARE_SHORT_URL'), + )); + + if (file_exists($this->getTemplatePath().$tpl_name) && $this->viewAccess()) { + return $this->context->smarty->createTemplate($this->getTemplatePath().$tpl_name, $this->context->smarty); + } + + return parent::createTemplate($tpl_name); + } + + /** + * Generate the manifest for an order (download). + */ + public function processGetManifest() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objManifestPDF = new TNTOfficiel_ManifestPDFCreator(); + $intOrderID = (int)Tools::getValue('id_order'); + $arrOrderIDList = array($intOrderID); + $objManifestPDF->createManifest($arrOrderIDList); + + // We want to be sure that displaying PDF is the last thing this controller will do. + exit; + } + + /** + * Downloads an archive containing all the logs files. + * /_admin/index.php?controller=AdminTNTOfficiel&action=downloadLogs + */ + public function processDownloadLogs() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $strLogPath = _PS_MODULE_DIR_.TNTOfficiel::MODULE_NAME.'/'.TNTOfficiel::LOG_DIR; + $zipName = 'logs.zip'; + // Remove Existing. + if (file_exists($strLogPath.$zipName)) { + unlink($strLogPath.$zipName); + } + // Create Zip file. + TNTOfficiel_Logger::getZip($strLogPath.$zipName); + // Download. + header('Content-Type: application/zip'); + header('Content-disposition: attachment; filename='.$zipName); + header('Content-Length: '.filesize($strLogPath.$zipName)); + // Get Content. + readfile($strLogPath.$zipName); + + // We want to be sure that displaying PDF is the last thing this controller will do. + exit; + } + + /** + * Add a parcel. + * + * @return array + */ + public function displayAjaxAddParcel() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $fltWeight = (float)Tools::getValue('weight'); + $intOderID = (int)Tools::getValue('orderId'); + + $arrResult = array(); + try { + $arrResult['parcel'] = TNTOfficiel_ParcelsHelper::getInstance()->addParcel($intOderID, $fltWeight, false); + $arrResult['result'] = true; + } catch (TNTOfficiel_MaxPackageWeightException $objException) { + $arrResult['result'] = false; + $arrResult['error'] = $objException->getMessage(); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + $arrResult['result'] = false; + } + + echo Tools::jsonEncode($arrResult); + + return true; + } + + /** + * Remove a parcel. + * + * @return array + */ + public function displayAjaxRemoveParcel() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $intParcelID = (int)Tools::getValue('parcelId'); + + $arrResult = array(); + try { + $arrResult['result'] = TNTOfficiel_ParcelsHelper::getInstance()->removeParcel($intParcelID); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + $arrResult['result'] = false; + } + + echo Tools::jsonEncode($arrResult); + + return true; + } + + /** + * Update a parcel. + * + * @return array + */ + public function displayAjaxUpdateParcel() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $intParcelID = (int)Tools::getValue('parcelId'); + $fltWeight = (float)Tools::getValue('weight'); + $intOderID = (int)Tools::getValue('orderId'); + + try { + $arrResult = TNTOfficiel_ParcelsHelper::getInstance()->updateParcel($intParcelID, $fltWeight, $intOderID); + } catch (TNTOfficiel_MaxPackageWeightException $objException) { + $arrResult['result'] = false; + $arrResult['error'] = $objException->getMessage(); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + $arrResult['result'] = false; + } + + echo Tools::jsonEncode($arrResult); + + return true; + } + + /** + * Checks the shipping. + */ + public function displayAjaxCheckShippingDateValid() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $intOrderID = (int)Tools::getValue('orderId'); + $strShippingDate = pSQL(Tools::getValue('shippingDate')); + + $arrPostDate = explode('/', $strShippingDate); + $strFormatedShippingDate = $arrPostDate[2].'-'.$arrPostDate[1].'-'.$arrPostDate[0]; + + $objTNTShipmentHelper = TNTOfficiel_ShipmentHelper::getInstance(); + $arrMDWShippingDate = $objTNTShipmentHelper->checkSaveShipmentDate($intOrderID, $strFormatedShippingDate); + if (!is_array($arrMDWShippingDate)) { + echo Tools::jsonEncode(array('error' => $arrMDWShippingDate)); + + return false; + } + if (array_key_exists('error', $arrMDWShippingDate)) { + if ($arrMDWShippingDate['error'] == 1) { + echo Tools::jsonEncode(array('error' => $arrMDWShippingDate['message'])); + + return false; + } else { + $arrMDWShippingDate['shippingDate'] = $strFormatedShippingDate; + /* $tntDate['dueDate'] = ""; */ + } + } + + $arrTNTOrder = TNTOfficiel_OrderHelper::getInstance()->getOrderData($intOrderID); + Db::getInstance()->update( + 'tntofficiel_order', + array( + 'shipping_date' => pSQL($arrMDWShippingDate['shippingDate']), + 'due_date' => pSQL($arrMDWShippingDate['dueDate']) + ), + 'id_tntofficiel_order = '.(int)$arrTNTOrder['id_tntofficiel_order'] + ); + + if (!$arrMDWShippingDate['dueDate']) { + $arrResult = array(); + } else { + $tempDate = explode('-', $arrMDWShippingDate['dueDate']); + $arrResult = array('dueDate' => $tempDate[2].'/'.$tempDate[1].'/'.$tempDate[0]); + } + + if (array_key_exists('message', $arrMDWShippingDate)) { + $arrResult['mdwMessage'] = $arrMDWShippingDate['message']; + } + + echo Tools::jsonEncode($arrResult); + + return true; + } +} diff --git a/www/modules/tntofficiel/controllers/admin/index.php b/www/modules/tntofficiel/controllers/admin/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/controllers/admin/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/controllers/front/address.php b/www/modules/tntofficiel/controllers/front/address.php new file mode 100644 index 00000000..5122393e --- /dev/null +++ b/www/modules/tntofficiel/controllers/front/address.php @@ -0,0 +1,187 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/classes/TNTOfficielCart.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_AddressHelper.php'; + +class TNTOfficielAddressModuleFrontController extends ModuleFrontController +{ + /** + * These constants are use in cpCityHelper.js + * Any change must be impacted in this file as well. + */ + const CHECK_POSTCODE_KO = 0; // postcode/city is not valid + const CHECK_POSTCODE_OK = 1; // postcode/city is valid + const CHECK_POSTCODE_NOT_REQUIRED = 2; // postcode/city does not require validation + + /** + * TNTOfficielAddressModuleFrontController constructor. + * Controller always used for AJAX response. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + parent::__construct(); + + // No header/footer. + $this->ajax = true; + } + + /** + * Saves the extra address data. + * + * @return string + */ + public function displayAjaxStoreDeliveryInfo() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Saves the extra address data. + $arrFormErrors = TNTOfficiel_Address::validate($_POST); + if (count($arrFormErrors)) { + echo Tools::jsonEncode(array( + 'result' => false, + 'form_errors' => $arrFormErrors, + )); + + return false; + } + + $objContext = $this->context; + $objCart = $objContext->cart; + $intCartID = (int)$objCart->id; + + // Load TNT cart info or create a new one for it's ID. + $objTNTCartModel = TNTOfficielCart::loadCartID($intCartID); + $boolResult = false; + if (Validate::isLoadedObject($objTNTCartModel)) { + $objTNTCartModel->hydrate(array( + 'customer_email' => pSQL(Tools::getValue('email')), + 'customer_mobile' => pSQL(Tools::getValue('mobile_phone')), + 'address_building' => pSQL(Tools::getValue('building_number')), + 'address_accesscode' => pSQL(Tools::getValue('intercom_code')), + 'address_floor' => pSQL(Tools::getValue('floor')), + )); + $boolResult = $objTNTCartModel->save(); + } + + if (!$boolResult) { + echo Tools::jsonEncode(array( + 'result' => false, + 'form_errors' => 'Une erreur s\'est produite', + )); + + return false; + } + + echo Tools::jsonEncode(array( + 'result' => true, + )); + + return true; + } + + /** + * Check if the city match the. + * + * @return string + */ + public function displayAjaxCheckPostcodeCity() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrResult = array(); + // check the country + $intCountryID = (int)Tools::getValue('countryId'); + $strPostCode = pSQL(Tools::getValue('postcode')); + $strCity = pSQL(Tools::getValue('city')); + + if (Country::getIsoById($intCountryID) != 'FR' || Tools::strlen($strPostCode) != 5) { + $arrResult['result'] = false; + $arrResult['resultCode'] = TNTOfficielAddressModuleFrontController::CHECK_POSTCODE_NOT_REQUIRED; + } else { + $objTNTAddressHelper = TNTOfficiel_AddressHelper::getInstance(); + //check the city/postcode + $mdwResult = $objTNTAddressHelper->checkPostcodeCityFromMiddleware( + $strPostCode, + $strCity, + $this->context->shop->id + ); + if (!$mdwResult['response']) { + //get cities from the middleware from the given postal code + $mdwResult = $objTNTAddressHelper->getCitiesFromMiddleware( + $strPostCode, + $this->context->shop->id + ); + $arrResult['result'] = false; + $arrResult['cities'] = $mdwResult['cities']; + $arrResult['resultCode'] = TNTOfficielAddressModuleFrontController::CHECK_POSTCODE_KO; + } else { + $arrResult['result'] = true; + $arrResult['resultCode'] = TNTOfficielAddressModuleFrontController::CHECK_POSTCODE_OK; + } + } + + echo Tools::jsonEncode($arrResult); + + return true; + } + + /** + * Get cities for a postcode. + * + * @return string + */ + public function displayAjaxGetCities() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $cart = $this->context->cart; + $deliveryAddress = new Address($cart->id_address_delivery); + $mdwResult = TNTOfficiel_AddressHelper::getInstance()->getCitiesFromMiddleware( + $deliveryAddress->postcode, + $this->context->shop->id + ); + + echo Tools::jsonEncode(array( + 'result' => true, + 'cities' => $mdwResult['cities'], + 'postcode' => $deliveryAddress->postcode + )); + + return true; + } + + /** + * Update the city for the current delivery address. + * + * @return array + */ + public function displayAjaxUpdateDeliveryAddress() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $strCity = pSQL(Tools::getValue('city')); + + if ($strCity) { + $objCart = $this->context->cart; + $objAddressDelivery = new Address($objCart->id_address_delivery); + $objAddressDelivery->city = $strCity; + $objAddressDelivery->save(); + } + + echo Tools::jsonEncode(array( + 'result' => true + )); + + return true; + } +} diff --git a/www/modules/tntofficiel/controllers/front/carrier.php b/www/modules/tntofficiel/controllers/front/carrier.php new file mode 100644 index 00000000..bf231bd1 --- /dev/null +++ b/www/modules/tntofficiel/controllers/front/carrier.php @@ -0,0 +1,160 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/tntofficiel.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Carrier.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_CarrierHelper.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/classes/TNTOfficielCart.php'; + +class TNTOfficielCarrierModuleFrontController extends ModuleFrontController +{ + /** + * TNTOfficielCarrierModuleFrontController constructor. + * Controller always used for AJAX response. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + parent::__construct(); + + // No header/footer. + $this->ajax = true; + } + + /** + * Store in session the tnt carrier name and store its price. + * + * @return string + */ + public function displayAjaxStoreProductPrice() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objContext = $this->context; + $objCart = $objContext->cart; + $intCartID = (int)$objCart->id; + + $strProductCode = pSQL(Tools::getValue('productCode')); + + $objTNTCarrierHelper = TNTOfficiel_CarrierHelper::getInstance(); + $arrAvailableTNTCarriers = $objTNTCarrierHelper->getMDWTNTCarrierList($objContext->customer); + $boolCarrierIsValid = false; + $arrTNTCarrier = null; + + if (!empty($arrAvailableTNTCarriers) && !empty($arrAvailableTNTCarriers['products'])) { + foreach ($arrAvailableTNTCarriers['products'] as $arrTNTCarrier) { + $arrTNTCarrier['label'] = ''; + if (strpos($arrTNTCarrier['type'], 'ENTERPRISE') !== false) { + if (strpos($arrTNTCarrier['code'], 'A') !== false) { + $arrTNTCarrier['label'] = '09:00 Express en Entreprise'; + } elseif (strpos($arrTNTCarrier['code'], 'J') !== false) { + $arrTNTCarrier['label'] = 'En entreprise'; + } elseif (strpos($arrTNTCarrier['code'], 'M') !== false) { + $arrTNTCarrier['label'] = '12:00 Express en Entreprise'; + } elseif (strpos($arrTNTCarrier['code'], 'T') !== false) { + $arrTNTCarrier['label'] = '10:00 Express en Entreprise'; + } + } elseif (strpos($arrTNTCarrier['type'], 'INDIVIDUAL') !== false) { + if (strpos($arrTNTCarrier['code'], 'AZ') !== false) { + $arrTNTCarrier['label'] = '09:00 Express à domicile'; + } elseif (strpos($arrTNTCarrier['code'], 'JZ') !== false) { + $arrTNTCarrier['label'] = 'À domicile'; + } elseif (strpos($arrTNTCarrier['code'], 'MZ') !== false) { + $arrTNTCarrier['label'] = '12:00 Express à domicile'; + } elseif (strpos($arrTNTCarrier['code'], 'TZ') !== false) { + $arrTNTCarrier['label'] = '10:00 Express à domicile'; + } + } elseif (strpos($arrTNTCarrier['type'], 'DROPOFFPOINT') !== false) { + $arrTNTCarrier['label'] = 'En Relais Colis®'; + } elseif (strpos($arrTNTCarrier['type'], 'DEPOT') !== false) { + $arrTNTCarrier['label'] = 'Dépôt restant'; + } + + // Found current TNT carrier code. + if ($arrTNTCarrier['code'].'_'.$arrTNTCarrier['type'] == $strProductCode) { + // Load TNT cart info or create a new one for it's ID. + $objTNTCartModel = TNTOfficielCart::loadCartID($intCartID); + $boolResult = false; + if (Validate::isLoadedObject($objTNTCartModel)) { + $objTNTCartModel->hydrate(array( + 'carrier_code' => $strProductCode, + 'carrier_label' => pSQL($arrTNTCarrier['label']), + 'delivery_price' => pSQL($arrTNTCarrier['price']) + )); + $boolResult = $objTNTCartModel->save(); + } + $boolCarrierIsValid = true; + break; + } + } + } + + echo Tools::jsonEncode(array( + 'result' => $boolCarrierIsValid && $boolResult, + 'product' => $arrTNTCarrier, + )); + + return true; + } + + /** + * Check TNT data before payment process. + * + * @return array + */ + public function displayAjaxCheckProductCode() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objContext = $this->context; + $objCart = $objContext->cart; + //$intCartID = (int)$objCart->id; + + //$strCarrierType = pSQL(Tools::getValue('product')); + $arrCarrierCode = (array)Tools::getValue('deliveryOptionTnt'); + + $strErrorMsg = null; + $arrResult = array( + 'error' => 0, + TNTOfficiel::MODULE_NAME => 1 + ); + + if (!$objCart) { + $strErrorMsg = 'No cart object'; + } elseif ($objCart->id_carrier == 0) { + $strErrorMsg = 'No carrier selected'; + } elseif (!$objCart->id_address_delivery) { + $strErrorMsg = 'No delivery address selected'; + } + + // If an error. + if ($strErrorMsg !== null) { + $arrResult = array('error' => 1, 'msg' => $strErrorMsg); + } else { + $boolIsTntCarrier = TNTOfficiel_Carrier::isTNTOfficielCarrierID($objCart->id_carrier); + + if (!$boolIsTntCarrier) { + // The preselected carrier is not TNT, don't handle. + $arrResult = array('error' => 0, TNTOfficiel::MODULE_NAME => 0); + } elseif (($boolIsTntCarrier && !Tools::getIsset('product')) + || !$arrCarrierCode + || !$objCart->delivery_option + ) { + // TNT is preselected and no service selected (individual, enterprise, dropoffpoint or depot) -> Error. + $arrResult = array('error' => 1); + } + } + + echo Tools::jsonEncode($arrResult); + + return true; + } +} diff --git a/www/modules/tntofficiel/controllers/front/index.php b/www/modules/tntofficiel/controllers/front/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/controllers/front/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/controllers/front/shippingMethod.php b/www/modules/tntofficiel/controllers/front/shippingMethod.php new file mode 100644 index 00000000..97b69950 --- /dev/null +++ b/www/modules/tntofficiel/controllers/front/shippingMethod.php @@ -0,0 +1,240 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/classes/TNTOfficielCart.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_RelayPointsHelper.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_ShippingHelper.php'; + +class TNTOfficielShippingMethodModuleFrontController extends ModuleFrontController +{ + /** + * TNTOfficielShippingMethodModuleFrontController constructor. + * Controller always used for AJAX response. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + parent::__construct(); + + // No header/footer. + $this->ajax = true; + } + + /** + * Get the relay points popup via Ajax. + * JD_DROPOFFPOINT (En Relais Colis®) : XETT + */ + public function displayAjaxBoxRelayPoints() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objContext = $this->context; + $objCart = $objContext->cart; + $intCartID = (int)$objCart->id; + $objShop = $objContext->shop; + + // Load TNT cart info or create a new one for it's ID. + $objTNTCartModel = TNTOfficielCart::loadCartID($intCartID); + if (Validate::isLoadedObject($objTNTCartModel)) { + // If product code is not "En Relais Colis®". + if ($objTNTCartModel->carrier_code !== 'JD_DROPOFFPOINT') { + // Clear carrier code and delivery point. + $objTNTCartModel->carrier_code = ''; + $objTNTCartModel->setDeliveryPoint(array()); + // Unselect carrier from cart. + $objCart->setDeliveryOption(null); + $objCart->save(); + } + $objTNTCartModel->save(); + } + + $strPostcode = trim(pSQL(Tools::getValue('tnt_postcode'))); + $strCity = trim(pSQL(Tools::getValue('tnt_city'))); + + if (!$strPostcode && !$strCity) { + $objAddress = new Address((int)$objCart->id_address_delivery); + $strPostcode = $objAddress->postcode; + $strCity = $objAddress->city; + } + + // Call API to get list of repositories + $objTNTRelayPointsHelper = TNTOfficiel_RelayPointsHelper::getInstance(); + $arrRelayPoints = $objTNTRelayPointsHelper->getRelayPoints($strPostcode, $strCity, $objShop->id); + $arrCities = TNTOfficiel_AddressHelper::getInstance()->getCitiesFromMiddleware($strPostcode, $objShop->id); + + foreach ($arrRelayPoints as $key => $item) { + $arrRelayPoints[ $key ]['schedule'] = TNTOfficiel_ShippingHelper::getInstance()->getSchedules($item); + } + + /* + if (empty($relay) && !empty($cities['cities'])) { + $city = $cities['cities'][0]; + $relay = $obRelayPointsHelper->getRelayPoints($postcode, $city, $objShop->id); + } + */ + + // Get the relay points + $this->context->smarty->assign( + array( + 'method_id' => 'relay_points', + 'method_name' => 'relay-points', + 'current_postcode' => $strPostcode, + 'current_city' => $strCity, + 'results' => $arrRelayPoints, + 'cities' => $arrCities['cities'], + ) + ); + + $this->context->smarty->display( + _PS_MODULE_DIR_.$this->module->name.'/views/templates/hook/displayCarrierList/deliveryPointsBox.tpl' + ); + + return true; + } + + /** + * Get the repositories popup via Ajax. + * J_DEPOT (Dépôt restant) : PEX + */ + public function displayAjaxBoxDropOffPoints() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objContext = $this->context; + $objCart = $objContext->cart; + $intCartID = (int)$objCart->id; + $objShop = $objContext->shop; + + // Load TNT cart info or create a new one for it's ID. + $objTNTCartModel = TNTOfficielCart::loadCartID($intCartID); + if (Validate::isLoadedObject($objTNTCartModel)) { + // If product code is not "Dépôt restant". + if ($objTNTCartModel->carrier_code !== 'J_DEPOT') { + // Clear carrier code and delivery point. + $objTNTCartModel->carrier_code = ''; + $objTNTCartModel->setDeliveryPoint(array()); + // Unselect carrier from cart. + $objCart->setDeliveryOption(null); + $objCart->save(); + } + $objTNTCartModel->save(); + } + + $strPostCode = trim(pSQL(Tools::getValue('tnt_postcode'))); + $strCity = trim(pSQL(Tools::getValue('tnt_city'))); + + if (!$strPostCode && !$strCity) { + $objAddress = new Address((int)$objCart->id_address_delivery); + $strPostCode = $objAddress->postcode; + $strCity = $objAddress->city; + } + + // Call API to get list of repositories + $objTNTRelayPointsHelper = TNTOfficiel_RelayPointsHelper::getInstance(); + $arrRepositories = $objTNTRelayPointsHelper->getRepositories($strPostCode, $objShop->id); + $arrCities = TNTOfficiel_AddressHelper::getInstance()->getCitiesFromMiddleware($strPostCode, $objShop->id); + + foreach ($arrRepositories as $key => $repository) { + $arrRepositories[ $key ]['schedule'] = TNTOfficiel_ShippingHelper::getInstance()->getSchedules($repository); + } + + $this->context->smarty->assign( + array( + 'method_id' => 'repositories', + 'method_name' => 'repositories', + 'current_postcode' => $strPostCode, + 'current_city' => $strCity, + 'results' => $arrRepositories, + 'cities' => $arrCities['cities'], + ) + ); + + $this->context->smarty->display( + _PS_MODULE_DIR_.$this->module->name.'/views/templates/hook/displayCarrierList/deliveryPointsBox.tpl' + ); + + return true; + } + + /** + * Save delivery point XETT or PEX info. + */ + public function displayAjaxSaveProductInfo() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrDeliveryPoint = (array)Tools::getValue('product'); + + // Check code exist. + if (!array_key_exists('xett', $arrDeliveryPoint) && !array_key_exists('pex', $arrDeliveryPoint)) { + return false; + } + + $objContext = $this->context; + $objCart = $objContext->cart; + $intCartID = (int)$objCart->id; + + // Load TNT cart info or create a new one for it's ID. + $objTNTCartModel = TNTOfficielCart::loadCartID($intCartID); + if (Validate::isLoadedObject($objTNTCartModel)) { + $objTNTCartModel->setDeliveryPoint($arrDeliveryPoint); + } + + $this->context->smarty->assign( + array( + 'item' => $arrDeliveryPoint, + 'method_id' => isset($arrDeliveryPoint['xett']) ? 'relay_point' : 'repository', + 'method_name' => isset($arrDeliveryPoint['xett']) ? 'relay-point' : 'repository', + ) + ); + + $this->context->smarty->display( + _PS_MODULE_DIR_.$this->module->name.'/views/templates/hook/displayCarrierList/deliveryPointSet.tpl' + ); + + return true; + } + + /** + * Save current TNT shipping address. + */ + public function displayAjaxSaveProductCode() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $strProductCode = pSQL(Tools::getValue('productCode')); + + if ($strProductCode) { + $objContext = $this->context; + $objCart = $objContext->cart; + $intCartID = (int)$objCart->id; + + // Load TNT cart info or create a new one for it's ID. + $objTNTCartModel = TNTOfficielCart::loadCartID($intCartID); + if (Validate::isLoadedObject($objTNTCartModel)) { + // Save TNT product code. + $objTNTCartModel->carrier_code = $strProductCode; + // If product code is not "Dépôt restant" or En "Relais Colis®". + if ($strProductCode !== 'JD_DROPOFFPOINT' && $strProductCode !== 'J_DEPOT') { + // Clear delivery point. + $objTNTCartModel->setDeliveryPoint(array()); + } + $objTNTCartModel->save(); + } + } + + echo Tools::jsonEncode(array( + 'success' => true + )); + + return true; + } +} diff --git a/www/modules/tntofficiel/controllers/front/tracking.php b/www/modules/tntofficiel/controllers/front/tracking.php new file mode 100644 index 00000000..61db4747 --- /dev/null +++ b/www/modules/tntofficiel/controllers/front/tracking.php @@ -0,0 +1,68 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + +class TNTOfficielTrackingModuleFrontController extends ModuleFrontController +{ + /** + * TNTOfficielTrackingModuleFrontController constructor. + * Controller always used for AJAX response. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + parent::__construct(); + + // No header/footer. + $this->ajax = true; + } + + /** + * Display the tracking popup. + */ + public function displayAjaxTracking() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $intOrderID = (int)Tools::getValue('orderId'); + try { + $arrTNTOrder = TNTOfficiel_OrderHelper::getInstance()->getOrderData($intOrderID); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + + Controller::getController('PageNotFoundController')->run(); + //$this->smartyOutputContent(_PS_THEME_DIR_.'404.tpl'); + + return false; + } + + //get parcels and for each parcel get its tracking data + $parcels = TNTOfficiel_ParcelsHelper::getInstance()->getParcels($intOrderID); + foreach ($parcels as &$parcel) { + $parcel['trackingData'] = TNTOfficiel_ParcelsHelper::getInstance()->getTrackingData($parcel); + } + + $this->context->smarty->assign( + array( + 'order' => $arrTNTOrder, + 'parcels' => $parcels, + ) + ); + + $this->context->smarty->display( + _PS_MODULE_DIR_.$this->module->name.'/views/templates/front/displayAjaxTracking.tpl' + ); + + return true; + } +} diff --git a/www/modules/tntofficiel/controllers/index.php b/www/modules/tntofficiel/controllers/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/controllers/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/index.php b/www/modules/tntofficiel/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_Address.php b/www/modules/tntofficiel/libraries/TNTOfficiel_Address.php new file mode 100644 index 00000000..d41d8cdf --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_Address.php @@ -0,0 +1,193 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Logger.php'; + +class TNTOfficiel_Address +{ + /** + * @var TNTOfficiel_Logger + */ + private $logger; + + /** + * Constructor. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->logger = new TNTOfficiel_Logger(); + } + + + /** + * Returns the default values for the extra address data fields. + * + * @param int $intArgAddressID + * @param int $intArgCustomerID + * + * @return array + */ + public static function getDefaultValues($intArgAddressID, $intArgCustomerID) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Retrieve the customer and address by its id. + $arrRowCustomer = Db::getInstance()->getRow( + 'SELECT * FROM '._DB_PREFIX_.'customer WHERE id_customer = '.(int)$intArgCustomerID + ); + $arrRowAddress = Db::getInstance()->getRow( + 'SELECT * FROM '._DB_PREFIX_.'address WHERE id_address = '.(int)$intArgAddressID + ); + + // Get values from the customer and address object according to the configuration. + return array( + 'email' => TNTOfficiel_Address::_getValue( + $arrRowAddress, + $arrRowCustomer, + 'TNT_CARRIER_ADDRESS_EMAIL' + ), + 'mobile_phone' => TNTOfficiel_Address::_getValue( + $arrRowAddress, + $arrRowCustomer, + 'TNT_CARRIER_ADDRESS_PHONE' + ), + 'building_number' => TNTOfficiel_Address::_getValue( + $arrRowAddress, + $arrRowCustomer, + 'TNT_CARRIER_ADDRESS_BUILDING' + ), + 'intercom_code' => TNTOfficiel_Address::_getValue( + $arrRowAddress, + $arrRowCustomer, + 'TNT_CARRIER_ADDRESS_INTERCOM' + ), + 'floor' => TNTOfficiel_Address::_getValue( + $arrRowAddress, + $arrRowCustomer, + 'TNT_CARRIER_ADDRESS_FLOOR' + ), + ); + } + + /** + * Gets the property from a customer or an address. + * + * @param array $arrAddress + * @param array $arrCustomer + * @param string $strArgConfigField + * + * @return mixed + */ + private static function _getValue($arrAddress, $arrCustomer, $strArgConfigField) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrConfigValue = explode('.', Configuration::get($strArgConfigField)); + $strValue = ''; + if (count($arrConfigValue) > 1) { + $objectName = $arrConfigValue[0]; + $objectProperty = $arrConfigValue[1]; + if (in_array($objectProperty, array('id_customer', 'id_address'))) { + $objectProperty = 'id'; + } + try { + $object = null; + if ($objectName == 'customer') { + $object = $arrCustomer; + } + elseif ($objectName == 'address') { + $object = $arrAddress; + } + $strValue = $object[$objectProperty]; + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + } + } + + return $strValue; + } + + /** + * Validate the extra address data form. + * + * @param $values + * + * @return bool + */ + public static function validate($values) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrFormErrors = array(); + + //check if email is set and not empty + if (!isset($values['email']) || trim($values['email']) === '') { + $arrFormErrors[] = 'Le champ \'email\' est obligatoire'; + } + + //check if the email is valid + if (!filter_var($values['email'], FILTER_VALIDATE_EMAIL)) { + $arrFormErrors[] = 'L\'email saisi n\'est pas valide'; + } + + //check if mobile phone is set and not empty + if (!isset($values['mobile_phone']) || trim($values['mobile_phone']) === '') { + $arrFormErrors[] = 'Le champ \'Téléphone portable\' est obligatoire'; + } + + //check if mobile phone is set 10 digits and start by 06 or 07 + if (!preg_match('/^((06|07){1}(\d){8})$/', $values['mobile_phone'])) { + $arrFormErrors[] = 'Le champ \'Téléphone portable\' doit être composé de 10 chiffres' + .' sans espace ni point, et commencer par un 06 ou 07'; + } + + $arrFieldList = array( + array( + 'name' => 'email', + 'label' => 'Email de contact', + 'maxlength' => 80, + ), + array( + 'name' => 'mobile_phone', + 'label' => 'Téléphone', + 'maxlength' => 15, + ), + array( + 'name' => 'building_number', + 'label' => 'N° de batiment', + 'maxlength' => 3, + ), + array( + 'name' => 'intercom_code', + 'label' => 'Code interphone', + 'maxlength' => 7, + ), + array( + 'name' => 'floor', + 'label' => 'Etage', + 'maxlength' => 2, + ), + ); + + foreach ($arrFieldList as $arrField) { + if ($values[$arrField['name']]) { + if ($arrField['maxlength'] < iconv_strlen($values[$arrField['name']])) { + $arrFormErrors[] = sprintf('Le champ "%s" doit avoir au maximum %s caractère(s)', $arrField['label'], $arrField['maxlength']); + } + } + } + + return $arrFormErrors; + } +} diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_Cache.php b/www/modules/tntofficiel/libraries/TNTOfficiel_Cache.php new file mode 100644 index 00000000..1b241879 --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_Cache.php @@ -0,0 +1,69 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +class TNTOfficiel_Cache +{ + /** + * @param $strArgKey + * @return bool + */ + public static function isStored($strArgKey) + { + $objCache = Cache::getInstance(); + + $boolExistL1 = Cache::isStored($strArgKey); + $boolExistL2 = false; + + if (_PS_CACHE_ENABLED_ && !$boolExistL1) { + $boolExistL2 = $objCache->exists($strArgKey); + } + + return $boolExistL1 || $boolExistL2; + } + + /** + * @param $strArgKey + * @param $mxdArgValue + * @param $intArgTTL + * @return bool + */ + public static function store($strArgKey, $mxdArgValue, $intArgTTL) + { + $objCache = Cache::getInstance(); + + $boolSetL1 = Cache::store($strArgKey, $mxdArgValue); + $boolSetL2 = true; + + if (_PS_CACHE_ENABLED_) { + $boolSetL2 = $objCache->set($strArgKey, $mxdArgValue, $intArgTTL); + } + + return $boolSetL1 && $boolSetL2; + } + + /** + * @param $strArgKey + * @return null + */ + public static function retrieve($strArgKey) + { + $objCache = Cache::getInstance(); + + $mxdGet = null; + + if (Cache::isStored($strArgKey)) { + $mxdGet = Cache::retrieve($strArgKey); + } + elseif (_PS_CACHE_ENABLED_ && $objCache->exists($strArgKey)) { + $mxdGet = $objCache->get($strArgKey); + } + + return $mxdGet; + } +} \ No newline at end of file diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_Carrier.php b/www/modules/tntofficiel/libraries/TNTOfficiel_Carrier.php new file mode 100644 index 00000000..f9a621c8 --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_Carrier.php @@ -0,0 +1,330 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/tntofficiel.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + +class TNTOfficiel_Carrier +{ + /** + * Configuration name. + * + * @var string + */ + private static $strConfigNameCarrierID = 'TNT_CARRIER_ID'; + + + /** + * Create a new TNT global carrier and save it as current one. + * + * @return bool + */ + public static function createGlobalCarrier() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Create new carrier. + $objCarrierNew = new Carrier(); + $objCarrierNew->active = true; + $objCarrierNew->deleted = false; + // Carrier used for module. + $objCarrierNew->is_module = true; + $objCarrierNew->external_module_name = TNTOfficiel::MODULE_NAME; + // Carrier name. + $objCarrierNew->name = 'TNT Express France'; + // Carrier delay description per language ISO code. + // Mandatory, but not used. + $objCarrierNew->delay = array( + //'fr' => 'Livraison en 1 à 3 jours en France métropolitaine (Intra et Corse)', + Configuration::get('PS_LANG_DEFAULT') => 'TNT' + ); + // Disable applying tax rules group. + $objCarrierNew->id_tax_rules_group = 0; + // Disable adding handling charges from config PS_SHIPPING_HANDLING. + $objCarrierNew->shipping_handling = false; + // Enable use of Cart getPackageShippingCost, getOrderShippingCost or getOrderShippingCostExternal + $objCarrierNew->shipping_external = true; + // Enable calculations for the ranges. + $objCarrierNew->need_range = true; + $objCarrierNew->range_behavior = 0; + + // Unable to create new carrier. + if (!$objCarrierNew->add()) { + return false; + } + + $objDB = Db::getInstance(); + + $groups = Group::getGroups(true); + foreach ($groups as $group) { + $objDB->insert( + 'carrier_group', + array( + 'id_carrier' => (int)$objCarrierNew->id, + 'id_group' => (int)$group['id_group'], + ) + ); + } + + $objRangePrice = new RangePrice(); + $objRangePrice->id_carrier = $objCarrierNew->id; + $objRangePrice->delimiter1 = '0'; + $objRangePrice->delimiter2 = '1000000'; + $objRangePrice->add(); + + $objRangeWeight = new RangeWeight(); + $objRangeWeight->id_carrier = $objCarrierNew->id; + $objRangeWeight->delimiter1 = '0'; + $objRangeWeight->delimiter2 = '1000000'; + $objRangeWeight->add(); + + // Get active zones list. + $arrZoneList = Zone::getZones(true); + foreach ($arrZoneList as $arrZone) { + $objDB->insert( + 'carrier_zone', + array( + 'id_carrier' => (int)$objCarrierNew->id, + 'id_zone' => (int)$arrZone['id_zone'] + ) + ); + $objDB->insert( + 'delivery', + array( + 'id_carrier' => (int)$objCarrierNew->id, + 'id_range_price' => (int)$objRangePrice->id, + 'id_range_weight' => null, + 'id_zone' => (int)$arrZone['id_zone'], + 'price' => '0' + ), + true, + false + ); + $objDB->insert( + 'delivery', + array( + 'id_carrier' => (int)$objCarrierNew->id, + 'id_range_price' => null, + 'id_range_weight' => (int)$objRangeWeight->id, + 'id_zone' => (int)$arrZone['id_zone'], + 'price' => '0' + ), + true, + false + ); + } + + // Save the carrier ID. + $boolResult = TNTOfficiel_Carrier::setCarrierID($objCarrierNew->id); + + return $boolResult; + } + + /** + * Create a logo for a carrier. + * + * @param string $strArgModuleDir Module absolute Path. + * @param int $intArgCarrierIDTNT + * @return bool + */ + public static function createLogo($strArgModuleDir, $intArgCarrierIDTNT) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Add carrier logo. + $boolResult = copy($strArgModuleDir.'/views/img/carriers/tntofficiel.jpg', _PS_SHIP_IMG_DIR_.(int)$intArgCarrierIDTNT.'.jpg'); + + return $boolResult; + } + + /** + * Undelete the existing current TNT global carrier by setting its flag to not deleted. + * + * @return bool + */ + public static function undeleteGlobalCarrier() + { + // Load current TNT carrier object. + $objCarrierTNT = TNTOfficiel_Carrier::loadGlobalCarrier(); + // If TNT carrier object not available. + if ($objCarrierTNT === null) { + // Unable to undelete. + return false; + } + + $objCarrierTNT->active = true; + $objCarrierTNT->deleted = false; + // Always set the right module name. + $objCarrierTNT->external_module_name = TNTOfficiel::MODULE_NAME; + $boolResult = $objCarrierTNT->save(); + + return $boolResult; + } + + /** + * Delete the existing current TNT global carrier by setting its flag to deleted. + * + * @return bool + */ + public static function deleteGlobalCarrier() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Load current TNT carrier object. + $objCarrierTNT = TNTOfficiel_Carrier::loadGlobalCarrier(); + // If TNT carrier object not available. + if ($objCarrierTNT === null) { + // Nothing to delete. + return true; + } + + $objCarrierTNT->active = false; + $objCarrierTNT->deleted = true; + $boolResult = $objCarrierTNT->save(); + + return $boolResult; + } + + /** + * Get the current TNT carrier ID. + * + * @return int|null + */ + public static function getGlobalCarrierID() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Get current TNT carrier. + $intCarrierIDTNT = Configuration::get(TNTOfficiel_Carrier::$strConfigNameCarrierID); + // Carrier ID must be an integer greater than 0. + if (empty($intCarrierIDTNT) || $intCarrierIDTNT != (int)$intCarrierIDTNT || !((int)$intCarrierIDTNT > 0) ) { + return null; + } + + return (int)$intCarrierIDTNT; + } + + /** + * Set the current TNT carrier ID. + * + * @param int $intArgCarrierID + * @return bool + */ + public static function setCarrierID($intArgCarrierID) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Carrier ID must be an integer greater than 0. + if (empty($intArgCarrierID) || $intArgCarrierID != (int)$intArgCarrierID || !((int)$intArgCarrierID > 0) ) { + return false; + } + + return Configuration::updateValue(TNTOfficiel_Carrier::$strConfigNameCarrierID, $intArgCarrierID); + } + + + /** + * Load current TNT global carrier object model. + * + * @return Carrier|null + */ + public static function loadGlobalCarrier() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Get current TNT carrier ID. + $intCarrierIDTNT = TNTOfficiel_Carrier::getGlobalCarrierID(); + // If TNT carrier ID not availaible. + if ($intCarrierIDTNT === null) { + return null; + } + + // Load TNT carrier. + $objCarrierTNT = new Carrier($intCarrierIDTNT); + + // If TNT carrier object not available. + if (!(Validate::isLoadedObject($objCarrierTNT) && (int)$objCarrierTNT->id === $intCarrierIDTNT)) { + return null; + } + + return $objCarrierTNT; + } + + /** + * Force some current carrier settings. Should be removed in the near future. + * + * @return bool + */ + public static function forceGlobalCarrierDefaultValues() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Load current TNT carrier object. + $objCarrierTNT = TNTOfficiel_Carrier::loadGlobalCarrier(); + // If TNT carrier correctly loaded. + if ($objCarrierTNT !== null) + { + // Get all users groups associated with the TNT carrier. + $arrCarrierGroups = $objCarrierTNT->getGroups(); + // If there is currently at least one users groups set. + if (is_array($arrCarrierGroups) && count($arrCarrierGroups) > 0) + { + // Current users groups set. + $arrCarrierGroupsSet = array(); + foreach ($arrCarrierGroups as $arrRowCarrierGroup) { + // DB request fail. stop here. + if (!array_key_exists( 'id_group', $arrRowCarrierGroup )) { + return false; + } + $arrCarrierGroupsSet[] = (int)$arrRowCarrierGroup['id_group']; + } + // Users groups to exclude. + $arrCarrierGroupsExclude = array( + (int)Configuration::get('PS_UNIDENTIFIED_GROUP'), + (int)Configuration::get('PS_GUEST_GROUP') + // PS_CUSTOMER_GROUP (default) preserved + // CUSTOM GROUP preserved + ); + + // Get groups previously set, minus groups to exclude. + $arrCarrierGroupsApply = array_diff($arrCarrierGroupsSet, $arrCarrierGroupsExclude); + + // If groups change. + if(count(array_diff($arrCarrierGroupsSet, $arrCarrierGroupsApply)) > 0) { + // Force carrier users groups (delete all, then set). + $objCarrierTNT->setGroups($arrCarrierGroupsApply, true); + } + } + } + + return true; + } + + /** + * Check if a carrier ID is a TNT one. + * + * @param int $intArgCarrierID + * @return boolean + */ + public static function isTNTOfficielCarrierID($intArgCarrierID) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Carrier ID must be an integer greater than 0. + if (empty($intArgCarrierID) || $intArgCarrierID != (int)$intArgCarrierID || !((int)$intArgCarrierID > 0) ) { + return false; + } + + $intCarrierID = (int)$intArgCarrierID; + + $obCarrier = new Carrier($intCarrierID); + + return $obCarrier->external_module_name === TNTOfficiel::MODULE_NAME; + } +} \ No newline at end of file diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_Cart.php b/www/modules/tntofficiel/libraries/TNTOfficiel_Cart.php new file mode 100644 index 00000000..a40d4c6d --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_Cart.php @@ -0,0 +1,121 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/tntofficiel.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + +class TNTOfficiel_Cart +{ + /** + * Is shipping free for cart, through configuration. + * + * @param $objArgCart + * @return bool + */ + public static function isCartShippingFree($objArgCart) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrConfigShipping = Configuration::getMultiple(array( + 'PS_SHIPPING_FREE_PRICE', + 'PS_SHIPPING_FREE_WEIGHT' + )); + + // Load current TNT carrier object. + $objCarrierTNT = TNTOfficiel_Carrier::loadGlobalCarrier(); + // If TNT carrier object not available. + if ($objCarrierTNT === null) { + return true; + } + + // If TNT carrier is inactive or free. + if (!$objCarrierTNT->active || $objCarrierTNT->getShippingMethod() == Carrier::SHIPPING_METHOD_FREE) { + return true; + } + + // Get cart amount to reach for free shipping. + $fltFreeFeesPrice = 0; + if (isset($arrConfigShipping['PS_SHIPPING_FREE_PRICE'])) { + $fltFreeFeesPrice = (float)Tools::convertPrice( + (float)$arrConfigShipping['PS_SHIPPING_FREE_PRICE'], + Currency::getCurrencyInstance((int)$objArgCart->id_currency) + ); + } + // Free shipping if cart amount, inc. taxes, inc. product & discount, exc. shipping > PS_SHIPPING_FREE_PRICE + if ($fltFreeFeesPrice > 0 + && $objArgCart->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING, null, null, false) >= $fltFreeFeesPrice + ) { + return true; + } + + // Free shipping if cart weight > PS_SHIPPING_FREE_WEIGHT + if (isset($arrConfigShipping['PS_SHIPPING_FREE_WEIGHT']) + && $objArgCart->getTotalWeight() >= (float)$arrConfigShipping['PS_SHIPPING_FREE_WEIGHT'] + && (float)$arrConfigShipping['PS_SHIPPING_FREE_WEIGHT'] > 0 + ) { + return true; + } + + return false; + } + + /** + * Get additional shipping cost for cart (exc. taxes). + * + * @param $objArgCart + * @return float + */ + public static function getCartExtraShippingCost($objArgCart) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $fltShippingCost = 0; + $arrProducts = $objArgCart->getProducts(); + + // If no product, no shipping extra cost. + if (!count($arrProducts)) { + return 0; + } + + // If only virtual products in cart, no extra shipping cost. + if ($objArgCart->isVirtualCart()) { + return 0; + } + + // If TNT carrier is free. + $boolIsCartShippingFree = TNTOfficiel_Cart::isCartShippingFree($objArgCart); + if ($boolIsCartShippingFree) { + return 0; + } + + // Load current TNT carrier object. + $objCarrierTNT = TNTOfficiel_Carrier::loadGlobalCarrier(); + // If TNT carrier object not available, no extra shipping cost. + if ($objCarrierTNT === null) { + return 0; + } + + // Adding handling charges. + $shipping_handling = Configuration::get('PS_SHIPPING_HANDLING'); + if (isset($shipping_handling) && $objCarrierTNT->shipping_handling) { + $fltShippingCost += (float)$shipping_handling; + } + + // Adding additional shipping cost per product. + foreach ($arrProducts as $product) { + if (!$product['is_virtual']) { + $fltShippingCost += $product['additional_shipping_cost'] * $product['cart_quantity']; + } + } + + $fltShippingCost = (float)Tools::convertPrice($fltShippingCost, Currency::getCurrencyInstance((int)$objArgCart->id_currency)); + + return $fltShippingCost; + } +} \ No newline at end of file diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_DbUtils.php b/www/modules/tntofficiel/libraries/TNTOfficiel_DbUtils.php new file mode 100644 index 00000000..7b0a15ec --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_DbUtils.php @@ -0,0 +1,33 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + +class TNTOfficiel_DbUtils +{ + /** + * Gets all the columns name for the given table + * @param string $tableName + * @return array + * @throws PrestaShopDatabaseException + */ + public static function getColumnsFromTable($tableName) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $sql = 'DESC '._DB_PREFIX_.pSQL($tableName); + $results = Db::getInstance()->executeS($sql); + $fields = array(); + foreach ($results as $field) { + $fields[] = $field['Field']; + } + return $fields; + } + +} diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_Debug.php b/www/modules/tntofficiel/libraries/TNTOfficiel_Debug.php new file mode 100644 index 00000000..055f9637 --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_Debug.php @@ -0,0 +1,604 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/tntofficiel.php'; + +class TNTOfficiel_Debug +{ + /** + * @var bool Is debugging enabled ? + */ + private static $boolEnabled = false; + /** + * @var array List of allowed client IP. No client IP means all allowed. + */ + private static $arrRemoteIPAddressAllowed = array(); + + /** + * @var bool Backtrace auto added. + */ + private static $boolBackTraceAuto = true; + /** + * @var int Backtrace maximum items. + */ + private static $intBackTraceMaxDeep = 1; //64; + /** + * @var bool Backtrace arguments detail at maximum. + */ + private static $boolBackTraceArgsDetail = false; + + /** + * @var array + */ + private static $arrPHPErrorExclude = array( + E_WARNING => array( + '/^filemtime\(\): stat failed for/ui' + ), + //E_NOTICE => array() + ); + + + + /** + * @var array PHP Errors constant name list. + */ + private static $arrPHPErrorNames = array( + 'E_ERROR', + 'E_RECOVERABLE_ERROR', + 'E_WARNING', + 'E_PARSE', + 'E_NOTICE', + 'E_STRICT', + 'E_DEPRECATED', // PHP 5.3+ + 'E_CORE_ERROR', + 'E_CORE_WARNING', + 'E_COMPILE_ERROR', + 'E_COMPILE_WARNING', + 'E_USER_ERROR', + 'E_USER_WARNING', + 'E_USER_NOTICE', + 'E_USER_DEPRECATED' // PHP 5.3+ + ); + /** + * @var array PHP Errors map + */ + private static $arrPHPErrorMap = null; + + /** + * @var array JSON Errors constant name list. PHP 5.3.0+. + */ + private static $arrJSONErrorNames = array( + 'JSON_ERROR_NONE', + 'JSON_ERROR_DEPTH', + 'JSON_ERROR_STATE_MISMATCH', + 'JSON_ERROR_CTRL_CHAR', + 'JSON_ERROR_SYNTAX', + 'JSON_ERROR_UTF8', // PHP 5.3.3+ + 'JSON_ERROR_RECURSION', // PHP 5.5.0+ + 'JSON_ERROR_INF_OR_NAN', // PHP 5.5.0+ + 'JSON_ERROR_UNSUPPORTED_TYPE', // PHP 5.5.0+ + ); + /** + * @var array JSON Errors map. PHP 5.3.0+. + */ + private static $arrJSONErrorMap = null; + + + /** + * @var bool + */ + private static $boolHandlerRegistered = false; + + /** + * @var string + */ + private static $strRoot = null; + /** + * @var string + */ + private static $strFileName = null; + + + /** + * Prevent Construct. + */ + final private function __construct() + { + trigger_error(sprintf('%s() %s is static.', __FUNCTION__, get_class($this)), E_USER_ERROR); + } + + /** + * Check if client IP address allowed to use debug. + * + * @return bool + */ + public static function isClientIPAddressAllowed() + { + $strRemoteIPAddress = array_key_exists('REMOTE_ADDR', $_SERVER) ? $_SERVER['REMOTE_ADDR'] : null; + + $boolIPAllowed = count(TNTOfficiel_Debug::$arrRemoteIPAddressAllowed) === 0 + || in_array($strRemoteIPAddress, TNTOfficiel_Debug::$arrRemoteIPAddressAllowed, true) === true; + + return $boolIPAllowed; + } + + /** + * Encode to JSON. + * @param $arrDebugInfo + * @return string + */ + public static function encJSON($arrDebugInfo) + { + $flagJSONEncode = 0; + $flagJSONEncode |= defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0; + $flagJSONEncode |= defined('JSON_UNESCAPED_UNICODE') ? JSON_UNESCAPED_UNICODE : 0; + $flagJSONEncode |= defined('JSON_UNESCAPED_SLASHES') ? JSON_UNESCAPED_SLASHES : 0; + + // PHP < 5.3 return null if second parameter is used. + return $flagJSONEncode === 0 ? json_encode($arrDebugInfo) : json_encode($arrDebugInfo, $flagJSONEncode); + } + + /** + * @param int $intArgType + * @return string + */ + public static function getPHPErrorType($intArgType) + { + // Generate constant name mapping. + if (TNTOfficiel_Debug::$arrPHPErrorMap === null) { + TNTOfficiel_Debug::$arrPHPErrorMap = array(); + foreach (TNTOfficiel_Debug::$arrPHPErrorNames as $strPHPErrorTypeName) { + if (defined($strPHPErrorTypeName)) { + $intPHPErrorType = constant($strPHPErrorTypeName); + TNTOfficiel_Debug::$arrPHPErrorMap[ $intPHPErrorType ] = $strPHPErrorTypeName; + } + } + } + + $strPHPErrorType = array_key_exists($intArgType, TNTOfficiel_Debug::$arrPHPErrorMap) ? TNTOfficiel_Debug::$arrPHPErrorMap[ $intArgType ] : (string)$intArgType; + + return $strPHPErrorType; + } + + + /** + * @param int $intArgType + * @return string + */ + public static function getJSONErrorType($intArgType) + { + // Generate constant name mapping. + if (TNTOfficiel_Debug::$arrJSONErrorMap === null) { + TNTOfficiel_Debug::$arrJSONErrorMap = array(); + foreach (TNTOfficiel_Debug::$arrJSONErrorNames as $strJSONErrorTypeName) { + if (defined($strJSONErrorTypeName)) { + $intJSONErrorType = constant($strJSONErrorTypeName); + TNTOfficiel_Debug::$arrJSONErrorMap[ $intJSONErrorType ] = $strJSONErrorTypeName; + } + } + } + + $strJSONErrorType = array_key_exists($intArgType, TNTOfficiel_Debug::$arrJSONErrorMap) ? TNTOfficiel_Debug::$arrJSONErrorMap[ $intArgType ] : (string)$intArgType; + + return $strJSONErrorType; + } + + /** + * Capture an Error. + * + * @param int $intArgType + * @param string $strArgMessage + * @param string $strArgFile + * @param int $intArgLine + * @param bool $boolArgIsLast + * @return boolean + */ + public static function captureError($intArgType, $strArgMessage, $strArgFile = null, $intArgLine = 0, $arrArgContext = array(), $boolArgIsLast = false) + { + $arrLogError = array( + 'type' => $boolArgIsLast ? 'LastError' : 'Error' + ); + + if ($strArgFile !== null) { + $arrLogError['file'] = $strArgFile; + $arrLogError['line'] = $intArgLine; + } + + if ($boolArgIsLast) { + $arrLogError['trace'] = array(); + } + + $strType = TNTOfficiel_Debug::getPHPErrorType($intArgType); + $arrLogError['msg'] = 'Type '.$strType.': '.$strArgMessage; + + if (array_key_exists($intArgType, TNTOfficiel_Debug::$arrPHPErrorExclude) && is_array(TNTOfficiel_Debug::$arrPHPErrorExclude[$intArgType])) { + if (count(TNTOfficiel_Debug::$arrPHPErrorExclude[$intArgType]) === 0) { + return false; + } + foreach (TNTOfficiel_Debug::$arrPHPErrorExclude[$intArgType] as $k => $r) { + if (preg_match($r, $strArgMessage) === 1) { + return false; + } + } + } + + TNTOfficiel_Debug::log($arrLogError); + + // Internal error handler continues (displays/log error, …) + return false; + } + + /** + * Capture last Error. + * Useful at script end for E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE, … + */ + public static function captureLastError() + { + $arrPHPLastError = error_get_last(); + + if (is_array($arrPHPLastError)) { + TNTOfficiel_Debug::captureError( + $arrPHPLastError['type'], + $arrPHPLastError['message'], + $arrPHPLastError['file'], + $arrPHPLastError['line'], + array(), + true + ); + } + + // PHP 5.3.0+ + if (function_exists('json_last_error')) { + $intTypeJSONLastError = json_last_error(); + $strJSONLastErrorType = TNTOfficiel_Debug::getJSONErrorType($intTypeJSONLastError); + // PHP 5.5.0+ + $strJSONLastErrorMessage = function_exists('json_last_error_msg') ? json_last_error_msg() : 'N/A'; + TNTOfficiel_Debug::captureError($strJSONLastErrorType, $strJSONLastErrorMessage, null, 0, array(), true); + + } + } + + /** + * Capture an Exception. + * + * @param \Exception $objArgException + */ + public static function captureException($objArgException) + { + $arrLogException = array( + 'type' => 'Exception' + ); + + if ($objArgException->getFile() !== null) { + $arrLogException['file'] = $objArgException->getFile(); + $arrLogException['line'] = $objArgException->getLine(); + } + + $arrLogException['msg'] = 'Code '.$objArgException->getCode().': '.$objArgException->getMessage(); + $arrLogException['trace'] = $objArgException->getTrace(); + + TNTOfficiel_Debug::log($arrLogException); + } + + /** + * Capture connection status. + */ + public static function captureConnectionStatus() + { + // is non normal connection status. + $intStatus = connection_status(); + // connection_aborted() + if ($intStatus & 1) { + TNTOfficiel_Debug::log(array( + 'type' => 'Shutdown', + 'msg' => sprintf('Connection was aborted by user.') + )); + } + if ($intStatus & 2) { + TNTOfficiel_Debug::log(array( + 'type' => 'Shutdown', + 'msg' => sprintf('Script exceeded maximum execution time.') + )); + } + } + + /** + * Capture output buffer status. + */ + public static function captureOutPutBufferStatus() + { + $msg = 'Output was not sent yet.'; + + // is output buffer was sent + $strOutputBufferFile = null; + $intOutputBufferLine = null; + $boolOutputBufferSent = headers_sent($strOutputBufferFile, $intOutputBufferLine); + if ($boolOutputBufferSent) { + $msg = sprintf('Output was sent in \'%s\' on line %s.', $strOutputBufferFile, $intOutputBufferLine); + } + + TNTOfficiel_Debug::log(array( + 'type' => 'Shutdown', + 'msg' => $msg, + 'headers' => headers_list(), + 'level' => ob_get_level(), + 'trace' => array() + )); + } + + /** + * Capture at shutdown. + */ + public static function captureAtShutdown() + { + TNTOfficiel_Debug::captureLastError(); + TNTOfficiel_Debug::captureConnectionStatus(); + TNTOfficiel_Debug::captureOutPutBufferStatus(); + TNTOfficiel_Debug::addLogContent(']'); + } + + + /** + * Register capture handlers once. + */ + public static function registerHandlers() + { + if (TNTOfficiel_Debug::$boolHandlerRegistered !== true) { + TNTOfficiel_Debug::$boolHandlerRegistered = true; + set_error_handler(array('TNTOfficiel_Debug', 'captureError')); + set_exception_handler(array('TNTOfficiel_Debug', 'captureException')); + register_shutdown_function(array('TNTOfficiel_Debug', 'captureAtShutdown')); + } + } + + /** + * Get the script start time. + * + * @return float + */ + public static function getStartTime() + { + return (float)(array_key_exists('REQUEST_TIME_FLOAT', $_SERVER) ? $_SERVER['REQUEST_TIME_FLOAT'] : + $_SERVER['REQUEST_TIME']); + } + + + /** + * Set log root directory. + * + * @param $strArgRoot + */ + public static function setRootDirectory($strArgRoot) + { + TNTOfficiel_Debug::$strRoot = null; + + $strRealpath = realpath($strArgRoot); + + // If not a writable directory. + if ($strRealpath === false || !is_dir($strRealpath) || !is_writable($strRealpath)) { + return false; + } + + // Add final separator. + if (mb_substr($strRealpath, -1) !== DIRECTORY_SEPARATOR) { + $strRealpath .= DIRECTORY_SEPARATOR; + } + + // Save. + TNTOfficiel_Debug::$strRoot = $strRealpath; + + return true; + + } + + /** + * Get log filename. + * + * @return string + */ + public static function getFilename() + { + // If root directory is defined, but not the filename. + if (TNTOfficiel_Debug::$strRoot !== null && TNTOfficiel_Debug::$strFileName === null) { + $floatScriptTime = TNTOfficiel_Debug::getStartTime(); + $strTimeStamp = var_export($floatScriptTime, true); + $strTimeStamp = preg_replace('/^([0-9]+(?:\.[0-9]{1,6}))[0-9]*$/ui', '$1', $strTimeStamp); + $strTimeStamp = preg_replace('/\./ui', '', $strTimeStamp); + $strTimeStamp = sprintf('%-016s',$strTimeStamp); + $strFileNameSuffix = $strTimeStamp.'_'.preg_replace('/[^a-z0-9_]+/ui', '-', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)); + TNTOfficiel_Debug::$strFileName = TNTOfficiel_Debug::$strRoot.'debug_'.$strFileNameSuffix.'.json'; + } + + return TNTOfficiel_Debug::$strFileName; + } + + /** + * Create log file if do not exist. + * Log global info at creation. + * + * @param string $strArgDebugInfo + * @return bool + */ + public static function addLogContent($strArgDebugInfo = '') + { + $strFileName = TNTOfficiel_Debug::getFilename(); + + if ($strFileName === null) { + return false; + } + + // If file don't already exist. + if (!file_exists($strFileName)) { + $arrDebugInfo = array( + 'type' => 'StartInfo', + 'uri' => array_key_exists('REQUEST_URI', $_SERVER) ? $_SERVER['REQUEST_URI'] : null, + 'referer' => array_key_exists('HTTP_REFERER', $_SERVER) ? $_SERVER['HTTP_REFERER'] : null, + 'client' => array_key_exists('REMOTE_ADDR', $_SERVER) ? $_SERVER['REMOTE_ADDR'] : null, + 'post' => $_POST, + 'get' => $_GET, + 'cookie' => $_COOKIE + ); + + $strDebugInfo = '['.TNTOfficiel_Debug::encJSON($arrDebugInfo).','; + + $strArgDebugInfo = $strDebugInfo.$strArgDebugInfo; + } + + file_put_contents($strFileName, $strArgDebugInfo, FILE_APPEND); + } + + /** + * Append log info. + * + * @param null $arrArg + */ + public static function log($arrArg = null) + { + // If not enabled or client IP not allowed. + if (TNTOfficiel_Debug::$boolEnabled !== true || TNTOfficiel_Debug::isClientIPAddressAllowed() !== true) { + return; + } + + // Set default path. + //TNTOfficiel_Debug::setRootDirectory(_PS_ROOT_DIR_.'/log/'); + TNTOfficiel_Debug::setRootDirectory(_PS_MODULE_DIR_.TNTOfficiel::MODULE_NAME.'/'.TNTOfficiel::LOG_DIR); + + // Register handlers if not. + TNTOfficiel_Debug::registerHandlers(); + + if (!is_array($arrArg)) { + $arrArg = array('raw' => $arrArg); + } + + // If message, file and line exist, then concat. + if (array_key_exists('msg', $arrArg) && array_key_exists('file', $arrArg) && array_key_exists('line', $arrArg)) { + $arrArg['msg'] .= ' \''.$arrArg['file'].'\' on line '.$arrArg['line']; + unset($arrArg['file']); + unset($arrArg['line']); + } + + // If no backtrace and auto backtrace set. + if (TNTOfficiel_Debug::$boolBackTraceAuto === true + && (!array_key_exists('trace', $arrArg) || !is_array($arrArg['trace'])) + ) { + // Get current one. + $arrArg['trace'] = debug_backtrace(); + // Remove trace from this current method. + array_shift($arrArg['trace']); + } + + // Process backtrace. + if (array_key_exists('trace', $arrArg) && is_array($arrArg['trace'])) { + + // Final backtrace. + $arrTraceStack = array(); + + // Get each trace, deeper first. + while ($arrTrace = array_shift($arrArg['trace'])) { + + $intDeepIndex = count($arrTraceStack); + // Get stack with maximum items. + if ($intDeepIndex >= TNTOfficiel_Debug::$intBackTraceMaxDeep) { + break; + } + + // function + if (array_key_exists('class', $arrTrace) && is_string($arrTrace['class'])) { + // Exclude this class. + if (in_array($arrTrace['class'], array(__CLASS__), true)) { + continue; + } + $arrTrace['function'] = $arrTrace['class'].$arrTrace['type'].$arrTrace['function']; + } + // file + if (array_key_exists('file', $arrTrace) && is_string($arrTrace['file'])) { + $arrTrace['file'] = '\''.$arrTrace['file'].'\' on line '.$arrTrace['line']; + } else { + $arrTrace['file'] = '[Internal]'; + } + + // arguments + $arrCallerArgs = array(); + if (array_key_exists('args', $arrTrace) && is_array($arrTrace['args'])) { + foreach ($arrTrace['args'] as $k => $mxdTraceArg) { + if (is_scalar($mxdTraceArg) || $mxdTraceArg === null) { + $arrCallerArgs[ $k ] = $mxdTraceArg; + } else { + $arrCallerArgs[ $k ] = '('.gettype($mxdTraceArg).')'; + if (is_object($mxdTraceArg)) { + $arrCallerArgs[ $k ] .= get_class($mxdTraceArg); + } + } + } + $arrTrace['function'] .= '('.count($arrCallerArgs).')'; + } + + unset($arrTrace['line']); + unset($arrTrace['class']); + unset($arrTrace['type']); + unset($arrTrace['object']); + + if (TNTOfficiel_Debug::$boolBackTraceArgsDetail === true) { + + // Detecting circular reference, etc ... + try { + serialize($arrTrace['args']); + } catch (Exception $e) { + $arrTrace['args'] = $arrCallerArgs; + } + + $strArgsJSON = TNTOfficiel_Debug::encJSON($arrTrace['args']); + // If unable to encode. + if (mb_strlen($strArgsJSON) == 0) { + $arrTrace['args'] = $arrCallerArgs; + } + } else { + $arrTrace['args'] = $arrCallerArgs; + } + + // If no arguments. + if (count($arrCallerArgs) === 0) { + // Remove key (no line output). + unset($arrTrace['args']); + } + + // Add trace. + $arrTraceStack[ $intDeepIndex ] = $arrTrace; + } + + // Save processed backtrace. + $arrArg['trace'] = $arrTraceStack; + + // Remove backtrace key if empty. + if (count($arrArg['trace']) === 0) { + unset($arrArg['trace']); + } + } + + // Append time and memory consumption. + $arrArg += array( + 'time' => microtime(true) - TNTOfficiel_Debug::getStartTime(), + 'mem' => memory_get_peak_usage() / 1024 / 1024, + ); + + // List of sorted selected key. + $arrKeyExistSort = array_intersect_key(array_flip( + array('time', 'mem', 'type', 'msg', 'file', 'line', 'trace', 'dump') + ), $arrArg); + // List of unsorted key left. + $arrKeyUnExistUnSort = array_diff_key($arrArg, $arrKeyExistSort); + // Append unsorted list to sorted. + $arrArg = array_merge($arrKeyExistSort, $arrArg) + $arrKeyUnExistUnSort; + + $strDebugInfo = TNTOfficiel_Debug::encJSON($arrArg).','; + $strDebugInfo = preg_replace('/}\s*,\s*{/ui', '},{', $strDebugInfo); + + TNTOfficiel_Debug::addLogContent($strDebugInfo); + } +} diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_Install.php b/www/modules/tntofficiel/libraries/TNTOfficiel_Install.php new file mode 100644 index 00000000..a65d98e2 --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_Install.php @@ -0,0 +1,578 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/tntofficiel.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Logger.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Carrier.php'; + +class TNTOfficiel_Install +{ + /** @var array */ + public static $arrHookList = array( + // Header + 'displayBackOfficeHeader', + 'actionAdminControllerSetMedia', + 'displayHeader', + // Front-Office display carrier. + 'displayBeforeCarrier', + 'displayCarrierList', + // Front-Office display Order created. + //'displayOrderConfirmation', + // Front-Office order detail. + 'displayOrderDetail', + + // Back-Office order detail. + 'displayAdminOrder', + + // Carrier updated. + 'actionCarrierUpdate', + // Order status before changed. + 'actionOrderStatusUpdate', + 'actionOrderStatusPostUpdate', + // Order created. + 'actionValidateOrder', + + // + //'actionDeliveryPriceByWeight', + //'actionDeliveryPriceByPrice', + // + //'displayPayment', + //'displayPaymentReturn', + //'actionPaymentConfirmation', + //'actionCartSave', + //'actionCarrierProcess', + // + //'actionObjectAddBefore', + //'actionObjectAddAfter', + //'actionObjectUpdateBefore', + //'actionObjectUpdateAfter', + //'actionObjectDeleteBefore', + //'actionObjectDeleteAfter', + //'actionObjectOrderAddBefore', + //'actionObjectOrderAddAfter', + //'actionObjectOrderUpdateBefore', + //'actionObjectOrderUpdateAfter', + //'actionObjectOrderDeleteBefore', + //'actionObjectOrderDeleteAfter', + ); + + /** @var array */ + public static $arrConfigUpdateDeleteList = array( + //'TNT_CARRIER_ID' Carrier ID is created on installCarrier, then preserved. + //'TNT_GOOGLE_MAP_API_KEY' Google Map API Key is created on config form submit, then preserved. + // Authentication information. + 'TNT_CARRIER_USERNAME' => '', + 'TNT_CARRIER_ACCOUNT' => '', + 'TNT_CARRIER_PASSWORD' => '', + // Is Authentication information validated. + 'TNT_CARRIER_ACTIVATED' => false, + // Show pickup number in AdminOrdersController. + 'TNT_CARRIER_PICKUP_NUMBER_SHOW' => '', + // Max weight (kg) per parcel. + 'TNT_CARRIER_MAX_PACKAGE_B2B' => '30.0', + 'TNT_CARRIER_MAX_PACKAGE_B2C' => '20.0', + // Comma separated list of item cart attributes. + 'TNT_CARRIER_ASSOCIATIONS' => '', + // MiddleWare JSON-RPC URL. + 'TNT_CARRIER_MIDDLEWARE_URL' => 'https://solutions-ecommerce.tnt.fr/api/handler', + // MiddleWare IFrame URL. + 'TNT_CARRIER_MIDDLEWARE_SHORT_URL' => 'https://solutions-ecommerce.tnt.fr/login', + 'TNT_CARRIER_SOAP_WSDL' => 'https://www.tnt.fr/service/?wsdl', + // . for ./libraries/TNTOfficiel_Address.php + // DB fields used as default values for delivery address extra data. + 'TNT_CARRIER_ADDRESS_EMAIL' => 'customer.email', + 'TNT_CARRIER_ADDRESS_PHONE' => 'address.phone_mobile', + 'TNT_CARRIER_ADDRESS_BUILDING' => '', + 'TNT_CARRIER_ADDRESS_INTERCOM' => '', + 'TNT_CARRIER_ADDRESS_FLOOR' => '' + ); + + /** @var array */ + public static $arrTemplateOverrideList = array( + array( + 'fileName' => 'view.tpl', + 'directorySrc' => 'views/templates/admin/override/controllers/admin/templates/orders/helpers/view/', + 'directoryDst' => 'controllers/admin/templates/orders/helpers/view/', + ), + ); + + /** + * Prevent Construct. + */ + final private function __construct() + { + trigger_error(sprintf('%s() %s is static.', __FUNCTION__, get_class($this)), E_USER_ERROR); + } + + /** + * Create a new directory with default index.php file. + * + * @param $arrArgDirectoryList an array of directories. + */ + public static function makeModuleDir($arrArgDirectoryList) + { + $strIndexFileContent = <</cache/'). + Media::clearCache(); + // Clear class index cache for PrestaShopAutoload ('/cache/class_index.php'). + Tools::generateIndex(); +/* + // Check cache '/cache/class_index.php' + $objPSAutoload = PrestaShopAutoload::getInstance(); + if ( + !$objPSAutoload->_include_override_path || + //!Configuration::get('PS_DISABLE_OVERRIDES') || + $objPSAutoload->getClassPath('AdminOrdersController') !== 'override/controllers/admin/AdminOrdersController.php' || + $objPSAutoload->getClassPath('Order') !== 'override/classes/order/Order.php' || + $objPSAutoload->getClassPath('OrderHistory') !== 'override/classes/order/OrderHistory.php' + ) { + // Warning !! + } +*/ + } + + /** + * Update settings fields. + * + * @return bool + */ + public static function updateSettings() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $boolUpdated = true; + + foreach (TNTOfficiel_Install::$arrConfigUpdateDeleteList as $strCfgName => $mxdValue) { + $boolUpdated = $boolUpdated && Configuration::updateValue($strCfgName, $mxdValue); + } + + return $boolUpdated; + } + + /** + * Delete settings fields. + * + * @return bool + */ + public static function deleteSettings() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $boolDeleted = true; + + foreach (TNTOfficiel_Install::$arrConfigUpdateDeleteList as $strCfgName => $mxdValue) { + $boolDeleted = $boolDeleted && Configuration::deleteByName($strCfgName); + } + + return $boolDeleted; + } + + + /** + * Creates the admin Tab. + * + * @param $arrArgTabNameLang Module name displayed. + * + * @return bool + */ + public static function createTab($arrArgTabNameLang) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Creates the parent tab + $parentTab = new Tab(); + $parentTab->class_name = 'AdminTNTOfficiel'; + $parentTab->name = $arrArgTabNameLang; + $parentTab->module = TNTOfficiel::MODULE_NAME; + $parentTab->id_parent = 0; + // TODO : AdminParentShipping as parent ? + //$parentTab->id_parent = Tab::getIdFromClassName('AdminParentShipping'); + $boolResult = (bool)($parentTab->add()); + +/* + if (version_compare(_PS_VERSION_, '1.6', '<')) { + $childrenTab = new Tab(); + $childrenTab->class_name = 'AdminTNTOfficiel'; + $childrenTab->name = $arrTabNameLang; + $childrenTab->module = $strModuleName; + $childrenTab->id_parent = Tab::getIdFromClassName('AdminTNTOfficiel'); + $boolResult15 = (bool)($childrenTab->add()); + + return $boolResult && $boolResult15; + } +*/ + return $boolResult; + } + + /** + * Delete the admin Tab. + * + * @return bool + */ + public static function deleteTab() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objTabsPSCollection = Tab::getCollectionFromModule(TNTOfficiel::MODULE_NAME)->getAll(); + foreach ($objTabsPSCollection as $tab) { + if (!$tab->delete()) { + return false; + } + } + + return true; + } + + + /** + * Update table. + * + * @return bool + */ + public static function upgradeTables_1_2_20() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $strTablePrefix = _DB_PREFIX_; + + // Test if table tnt_extra_address_data exist. + $strSQLTableExtraExist = <<execute($strSQLTableLogDropTable)) { + return false; + } + + // Update table tnt_extra_address_data if exist. + $arrDBResult = $objDB->executeS($strSQLTableExtraExist); + if(count($arrDBResult) === 1) { + if (!$objDB->execute($strSQLTableExtraAddColumns) + || !$objDB->execute($strSQLTableExtraChangeColumns) + || !$objDB->execute($strSQLTableExtraRenameTable) + ) { + return false; + } + } + + // Update tnt_order if exist. + $arrDBResult = $objDB->executeS($strSQLTableOrderExist); + if(count($arrDBResult) === 1) { + if (!$objDB->execute($strSQLTableOrderChangeColumns) + || !$objDB->execute($strSQLTableOrderRenameTable) + ) { + return false; + } + } + + // Update tnt_parcel if exist. + $arrDBResult = $objDB->executeS($strSQLTableParcelExist); + if(count($arrDBResult) === 1) { + if (!$objDB->execute($strSQLTableParcelChangeColumns) + || !$objDB->execute($strSQLTableParcelRenameTable) + ) { + return false; + } + } + + return true; + } + + /** + * Creates the tables needed by the module. + * + * @return bool + */ + public static function createTables() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Update if required. + TNTOfficiel_Install::upgradeTables_1_2_20(); + + $strTablePrefix = _DB_PREFIX_; + $strTableEngine = _MYSQL_ENGINE_; + + // Create tntofficiel_cart table. + $strSQLCreateCart = <<execute($strSQLCreateCart) + || !$objDB->execute($strSQLCreateOrder) + || !$objDB->execute($strSQLCreateParcels) + ) { + return false; + } + + return true; + } + + /** + * Create or Restore an existing TNT carrier. + * + * @return bool + */ + public static function installCarrier() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Try to undelete previously deleted carrier. + $boolResult = TNTOfficiel_Carrier::undeleteGlobalCarrier(); + // If not succeed. + if (!$boolResult) { + // Create a new one. + $boolResult = TNTOfficiel_Carrier::createGlobalCarrier(); + } + + return $boolResult; + } + + /** + * Add a template override in the override directory. + * + * @param $strArgModuleDir Module absolute Path. + * @return array + */ + public static function overrideTemplates($strArgModuleDir) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrErrors = array(); + + foreach (TNTOfficiel_Install::$arrTemplateOverrideList as $arrTemplateOverride) { + + $strPathTemplateSrc = $strArgModuleDir.$arrTemplateOverride['directorySrc']; + $strFileTemplateSrc = $strPathTemplateSrc.$arrTemplateOverride['fileName']; + $strPathTemplateDst = _PS_OVERRIDE_DIR_.$arrTemplateOverride['directoryDst']; + $strFileTemplateDst = $strPathTemplateDst.$arrTemplateOverride['fileName']; + + try { + // Create directory if unexist. + if (!is_dir($strPathTemplateDst)) { + mkdir($strPathTemplateDst, 0777, true); + } + // Copy new template file. + if (!copy($strFileTemplateSrc, $strFileTemplateDst)) { + $arrErrors[] = sprintf(Tools::displayError('Impossible d\'installer la surcharge "%s"'), $arrTemplateOverride['fileName']); + } + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + + $arrErrors[] = sprintf(Tools::displayError('Impossible d\'installer la surcharge "%s"'), $arrTemplateOverride['fileName']); + } + } + + return $arrErrors; + } + + /** + * Delete a template override in the override directory. + * + * @return array + */ + public static function unOverrideTemplates() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrErrors = array(); + + // Unoverride templates. + foreach (TNTOfficiel_Install::$arrTemplateOverrideList as $arrTemplateOverride) { + $strPathTemplateDst = _PS_OVERRIDE_DIR_.$arrTemplateOverride['directoryDst']; + $strFileTemplateDst = $strPathTemplateDst.$arrTemplateOverride['fileName']; + + try { + // Create directory if not found. + if (!is_dir($strPathTemplateDst)) { + mkdir($strPathTemplateDst, 0777, true); + } + // Delete previous template file if exist. + if (file_exists($strFileTemplateDst)) { + if(!unlink($strFileTemplateDst)) { + $arrErrors[] = sprintf(Tools::displayError('Impossible de supprimer la surcharge "%s"'), $arrTemplateOverride['fileName']); + } + } + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + + $arrErrors[] = sprintf(Tools::displayError('Impossible de supprimer la surcharge "%s"'), $arrTemplateOverride['fileName']); + } + } + + return $arrErrors; + } +} diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_JsonRPCClient.php b/www/modules/tntofficiel/libraries/TNTOfficiel_JsonRPCClient.php new file mode 100644 index 00000000..8bd9e743 --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_JsonRPCClient.php @@ -0,0 +1,410 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + +class TNTOfficiel_AccessDeniedException extends Exception {} +class TNTOfficiel_ConnectionFailureException extends Exception {} +class TNTOfficiel_ServerErrorException extends Exception {} + +/** + * JsonRPC client class + * + * @package JsonRPC + * @author Frederic Guillot + */ +class TNTOfficiel_JsonRPCClient +{ + /** + * URL of the server + * + * @access private + * @var string + */ + private $url; + /** + * If the only argument passed to a function is an array + * assume it contains named arguments + * + * @access public + * @var boolean + */ + public $named_arguments = true; + /** + * HTTP client timeout + * + * @access private + * @var integer + */ + private $timeout; + /** + * Username for authentication + * + * @access private + * @var string + */ + private $username; + /** + * Password for authentication + * + * @access private + * @var string + */ + private $password; + /** + * True for a batch request + * + * @access public + * @var boolean + */ + public $is_batch = false; + /** + * Batch payload + * + * @access public + * @var array + */ + public $batch = array(); + /** + * Enable debug output to the php error log + * + * @access public + * @var boolean + */ + public $debug = false; + /** + * Default HTTP headers to send to the server + * + * @access private + * @var array + */ + private $headers = array( + 'User-Agent: JSON-RPC PHP Client ', + 'Content-Type: application/json', + 'Accept: application/json', + 'Connection: close', + ); + /** + * SSL certificates verification + * + * @access public + * @var boolean + */ + public $ssl_verify_peer = true; + + /** + * Constructor + * + * @access public + * @param string $url Server URL + * @param integer $timeout HTTP timeout + * @param array $headers Custom HTTP headers + */ + public function __construct($url, $timeout = 3, $headers = array()) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->url = $url; + $this->timeout = $timeout; + $this->headers = array_merge($this->headers, $headers); + } + + /** + * Automatic mapping of procedures + * + * @access public + * @param string $method Procedure name + * @param array $params Procedure arguments + * @return mixed + */ + public function __call($method, array $params) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Allow to pass an array and use named arguments + if ($this->named_arguments && count($params) === 1 && is_array($params[0])) { + $params = $params[0]; + } + return $this->execute($method, $params); + } + + /** + * Set authentication parameters + * + * @access public + * @param string $username Username + * @param string $password Password + * @return Client + */ + public function authentication($username, $password) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->username = $username; + $this->password = $password; + return $this; + } + + /** + * Start a batch request + * + * @access public + * @return Client + */ + public function batch() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->is_batch = true; + $this->batch = array(); + return $this; + } + + /** + * Send a batch request + * + * @access public + * @return array + */ + public function send() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->is_batch = false; + return $this->parseResponse( + $this->doRequest($this->batch) + ); + } + + /** + * Execute a procedure + * + * @access public + * @param string $procedure Procedure name + * @param array $params Procedure arguments + * @return mixed + */ + public function execute($procedure, array $params = array()) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $params['date'] = time(); + if ($this->is_batch) { + $this->batch[] = $this->prepareRequest($procedure, $params); + return $this; + } + return $this->parseResponse( + $this->_doRequest($this->prepareRequest($procedure, $params)) + ); + } + + /** + * Prepare the payload + * + * @access public + * @param string $procedure Procedure name + * @param array $params Procedure arguments + * @return array + */ + public function prepareRequest($procedure, array $params = array()) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $payload = array( + 'jsonrpc' => '2.0', + 'method' => $procedure, + 'id' => mt_rand() + ); + if (! empty($params)) { + $payload['params'] = $params; + } + return $payload; + } + + /** + * Parse the response and return the procedure result + * + * @access public + * @param array $payload + * @return mixed + */ + public function parseResponse(array $payload) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if ($this->isBatchResponse($payload)) { + $results = array(); + foreach ($payload as $response) { + $results[] = $this->getResult($response); + } + return $results; + } + return $this->getResult($payload); + } + + /** + * Throw an exception according the RPC error + * + * @access public + * @param array $error + * @throws BadFunctionCallException + * @throws InvalidArgumentException + * @throws RuntimeException + */ + public function handleRpcErrors(array $error) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + switch ($error['code']) { + case -32601: + throw new BadFunctionCallException('Procedure not found: '. $error['message']); + case -32602: + throw new InvalidArgumentException('Invalid arguments: '. $error['message']); + default: + throw new RuntimeException('Invalid request/response: '. $error['message'], $error['code']); + } + } + + /** + * Throw an exception according the HTTP response + * + * @access public + * @param array $headers + * @throws TNTOfficiel_AccessDeniedException + * @throws TNTOfficiel_ServerErrorException + */ + public function handleHttpErrors(array $headers) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $exceptions = array( + '401' => 'TNTOfficiel_AccessDeniedException', + '403' => 'TNTOfficiel_AccessDeniedException', + '404' => 'TNTOfficiel_ConnectionFailureException', + '500' => 'TNTOfficiel_ServerErrorException', + ); + foreach ($headers as $header) { + foreach ($exceptions as $code => $exception) { + if (strpos($header, 'HTTP/1.0 '.$code) !== false || strpos($header, 'HTTP/1.1 '.$code) !== false) { + throw new $exception('Response: '.$header); + } + } + } + } + + /** + * Do the HTTP request + * + * @access private + * @param array $payload + * @return array + * @throws TNTOfficiel_ConnectionFailureException + */ + private function _doRequest(array $payload) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (extension_loaded('curl')) { + $ch = curl_init(trim($this->url)); + curl_setopt_array($ch, array( + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => $this->headers, + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => Tools::jsonEncode($payload), + CURLOPT_RETURNTRANSFER => true, + )); + + $response = Tools::jsonDecode(curl_exec($ch), true); + curl_close($ch); + if (!$response) { + throw new TNTOfficiel_ConnectionFailureException('Unable to establish a connection'); + } + } else { + $stream = @fopen(trim($this->url), 'r', false, $this->_getContext($payload)); + if (!is_resource($stream)) { + throw new TNTOfficiel_ConnectionFailureException('Unable to establish a connection'); + } + $metadata = stream_get_meta_data($stream); + $this->handleHttpErrors($metadata['wrapper_data']); + $response = Tools::jsonDecode(stream_get_contents($stream), true); + } + + if ($this->debug) { + error_log('==> Request: ' . PHP_EOL . Tools::jsonEncode($payload, JSON_PRETTY_PRINT)); + error_log('==> Response: ' . PHP_EOL . Tools::jsonEncode($response, JSON_PRETTY_PRINT)); + } + + TNTOfficiel_Debug::log(array('msg' => '<<', 'file' => __FILE__, 'line' => __LINE__, 'dump' => array('request' => $payload, 'response' => $response))); + + return is_array($response) ? $response : array(); + } + + /** + * Prepare stream context + * + * @access private + * @param array $payload + * @return resource + */ + private function getContext(array $payload) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $headers = $this->headers; + if (! empty($this->username) && ! empty($this->password)) { + $headers[] = 'Authorization: Basic '.base64_encode($this->username.':'.$this->password); + } + return stream_context_create(array( + 'http' => array( + 'method' => 'POST', + 'protocol_version' => 1.1, + 'timeout' => $this->timeout, + 'max_redirects' => 2, + 'header' => implode("\r\n", $headers), + 'content' => Tools::jsonEncode($payload), + 'ignore_errors' => true, + ), + "ssl" => array( + "verify_peer" => $this->ssl_verify_peer, + "verify_peer_name" => $this->ssl_verify_peer, + ) + )); + } + + /** + * Return true if we have a batch response + * + * @access public + * @param array $payload + * @return boolean + */ + private function isBatchResponse(array $payload) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + return array_keys($payload) === range(0, count($payload) - 1); + } + + /** + * Get a RPC call result + * + * @access private + * @param array $payload + * @return mixed + */ + private function getResult(array $payload) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (isset($payload['error']['code'])) { + $this->handleRpcErrors($payload['error']); + } + return isset($payload['result']) ? $payload['result'] : null; + } +} \ No newline at end of file diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_Logger.php b/www/modules/tntofficiel/libraries/TNTOfficiel_Logger.php new file mode 100644 index 00000000..c58d8bb4 --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_Logger.php @@ -0,0 +1,181 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/tntofficiel.php'; + +class TNTOfficiel_Logger extends AbstractLogger +{ + /** + * @param $request + * @param null $message + * @param string $format + * @param bool|false $isRequest + * @param null $status + * @param null $data + * @return bool + */ + public function logMessageTnt($request, $message = null, $format = 'JSON', $isRequest = false, $status = null, $data = null) + { + try { + $this->_createLogFolder(); + if ($isRequest) { + $formattedMessage = $this->_formatMessageRequest($status, $format, $request); + } else { + $formattedMessage = $this->_formatErrorMessage($message, $format, $request, $data); + } + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + } + + $strLogPath = _PS_MODULE_DIR_.TNTOfficiel::MODULE_NAME.'/'.TNTOfficiel::LOG_DIR; + return (bool)file_put_contents($strLogPath.$this->_getFileName($isRequest), $formattedMessage, FILE_APPEND); + } + + public function logMessage($message, $level) + { + + } + + /** + * Creates the log folder if not exist + */ + private function _createLogFolder() + { + $strLogPath = _PS_MODULE_DIR_.TNTOfficiel::MODULE_NAME.'/'.TNTOfficiel::LOG_DIR; + if (!is_dir($strLogPath)) { + mkdir($strLogPath, 0777, true); + } + } + + /** + * Return the log file name + * @param $isRequest + * @return string + */ + private function _getFileName($isRequest) + { + $dateTime = new DateTime(); + $date = $dateTime->format('Ymd'); + if ($isRequest) { + $fileName = sprintf('TNT-request-%s', $date); + } else { + $fileName = sprintf('TNT-errors-%s', $date); + } + + return $fileName.'.log'; + } + + /** + * Format the message for a request log + * @param $status + * @param $format + * @param $request + * @return string + */ + private function _formatMessageRequest($status, $format, $request) + { + $dateTime = new DateTime(); + $date = $dateTime->format('Ymd H:i:s'); + $account = Configuration::get('TNT_CARRIER_ACCOUNT'); + $formattedMessage = sprintf('%s - %s %s %s:%s %s', $date, $account, $status, $format, $request, chr(10)); + + return $formattedMessage; + } + + /** + * Format the message for an error log + * @param $message + * @param $format + * @param $request + * @param $data + * @return string + */ + private function _formatErrorMessage($message, $format, $request, $data) + { + $dateTime = new DateTime(); + $date = $dateTime->format('Ymd H:i:s'); + $account = Configuration::get('TNT_CARRIER_ACCOUNT'); + $formattedMessage = sprintf('%s - %s %s:%s Error %s || %s %s', $date, $account, $format, $request, $message, $data, chr(10)); + + return $formattedMessage; + } + + /** + * Log install and uninstall steps + * @param $message + * @return bool + */ + public function logInstall($message) + { + $dateTime = new DateTime(); + $date = $dateTime->format('Ymd H:i:s'); + $logMessage = sprintf('%s %s %s', $date, $message, chr(10)); + $filename = 'install.log'; + try { + $this->_createLogFolder(); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + } + + $strLogPath = _PS_MODULE_DIR_.TNTOfficiel::MODULE_NAME.'/'.TNTOfficiel::LOG_DIR; + return (bool)file_put_contents($strLogPath.$filename, $logMessage, FILE_APPEND); + } + + /** + * Log install and uninstall steps + * @param $message + * @return bool + */ + public function logUninstall($message) + { + $dateTime = new DateTime(); + $date = $dateTime->format('Ymd H:i:s'); + $logMessage = sprintf('%s %s %s', $date, $message, chr(10)); + $filename = 'uninstall.log'; + try { + $this->_createLogFolder(); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + } + + $strLogPath = _PS_MODULE_DIR_.TNTOfficiel::MODULE_NAME.'/'.TNTOfficiel::LOG_DIR; + return (bool)file_put_contents($strLogPath.$filename, $logMessage, FILE_APPEND); + } + + /** + * Generate an archive containing all the logs files + * + * @param $zipName + * @return ZipArchive + */ + public static function getZip($zipName) + { + $strLogPath = _PS_MODULE_DIR_.TNTOfficiel::MODULE_NAME.'/'.TNTOfficiel::LOG_DIR; + $files = scandir($strLogPath); + + $zip = new ZipArchive(); + $zip->open($zipName, ZipArchive::CREATE); + foreach ($files as $file) { + $filePath = $strLogPath.$file; + $strExt = pathinfo($file, PATHINFO_EXTENSION); + if (in_array($strExt, array('log', 'json'), true) && file_exists($filePath)) { + $zip->addFromString(basename($filePath), Tools::file_get_contents($filePath)); + } + } + $zip->close(); + return $zip; + } + +} diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_Parcel.php b/www/modules/tntofficiel/libraries/TNTOfficiel_Parcel.php new file mode 100644 index 00000000..26f1f4ac --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_Parcel.php @@ -0,0 +1,95 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + +class TNTOfficiel_Parcel +{ + /** + * @var int + */ + private $parcelId; + + /** + * @var array + */ + private $productList; + + /** + * @var float + */ + private $weight = 0; + + /** + * @var int + */ + private $lastAddedProductId; + + /** + * Constructor. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + } + + /** + * @return int + */ + public function getParcelId() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + return $this->parcelId; + } + + /** + * @param int $parcelId + */ + public function setParcelId($parcelId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->parcelId = $parcelId; + } + + /** + * @return array + */ + public function getProductList() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + return $this->productList; + } + + /** + * @return float + */ + public function getWeight() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + return $this->weight; + } + + /** + * Add a product to the product list and update the weight;. + * + * @param $product + */ + public function addProduct($product) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->productList[$product['id_product']] = $product; //add the product + $this->weight += $product['weight']; //update the parcel's weight + $this->lastAddedProductId = $product['id_product']; //save the last added product id + } +} diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_PasswordManager.php b/www/modules/tntofficiel/libraries/TNTOfficiel_PasswordManager.php new file mode 100644 index 00000000..6ebed72e --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_PasswordManager.php @@ -0,0 +1,63 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + +class TNTOfficiel_PasswordManager +{ + static $salt = '0hp6df7j46df4gc6df42nfhf6i9gfdzz'; + + /** + * Encrypt password + * @param $password + * @return string + */ + public static function encrypt($password) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $encryptedPwd = trim(base64_encode(mcrypt_encrypt( + MCRYPT_RIJNDAEL_256, TNTOfficiel_PasswordManager::$salt, $password, MCRYPT_MODE_ECB, + mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND) + ))); + + return $encryptedPwd; + } + + /** + * Decrypt password + * @param $password + * @return string + */ + public static function decrypt($password) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $decryptedPwd = trim(mcrypt_decrypt( + MCRYPT_RIJNDAEL_256, TNTOfficiel_PasswordManager::$salt, base64_decode($password), MCRYPT_MODE_ECB, + mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND) + )); + + return $decryptedPwd; + } + + /** + * get a sha1 hash of the password + * @return string + */ + public static function getHash() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $hashedPwd = sha1(TNTOfficiel_PasswordManager::decrypt(Configuration::get('TNT_CARRIER_PASSWORD'))); + + return $hashedPwd; + } + +} diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_Product.php b/www/modules/tntofficiel/libraries/TNTOfficiel_Product.php new file mode 100644 index 00000000..3f17f42b --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_Product.php @@ -0,0 +1,50 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_DbUtils.php'; + +class TNTOfficiel_Product +{ + /** + * Get the configured attributes for a product. + * + * @param int $productId + * + * @return array + */ + public static function getProductAttributes($productId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + //configured attributes + $tntCarrierAssociations = Configuration::get('TNT_CARRIER_ASSOCIATIONS'); + $attributesNames = array(); + if (!empty($tntCarrierAssociations)) { + $attributesNames = explode(',', $tntCarrierAssociations); + } + + //columns from the product table + $productColumns = TNTOfficiel_DbUtils::getColumnsFromTable('product'); + $attributes = array(); + $attribute = array(); + //product + $product = Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'product WHERE id_product = '.(int)$productId); + + foreach ($attributesNames as $attributeName) { + if (in_array($attributeName, $productColumns)) { + $attribute['code'] = $attributeName; + $attribute['value'] = $product[$attributeName]; + $attributes[] = $attribute; + } + } + + return $attributes; + } +} diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_ServiceCache.php b/www/modules/tntofficiel/libraries/TNTOfficiel_ServiceCache.php new file mode 100644 index 00000000..09f2ed58 --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_ServiceCache.php @@ -0,0 +1,30 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + + +class TNTOfficiel_ServiceCache +{ + /** + * Gets the number of seconds between the current time and next midnight + * @return int + */ + public static function getSecondsUntilMidnight() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $now = time(); + $midnight = strtotime('tomorrow midnight'); + $secondsUntilMidnight = $midnight - $now; + + return $secondsUntilMidnight; + } + +} diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_SoapClient.php b/www/modules/tntofficiel/libraries/TNTOfficiel_SoapClient.php new file mode 100644 index 00000000..94b4e8a1 --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_SoapClient.php @@ -0,0 +1,115 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_PasswordManager.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Logger.php'; + +class TNTOfficiel_SoapClient +{ + protected $_username; + protected $_password; + protected $_account; + protected $_wsdl; + private $logger; + + /** + * Constructor : Set Data + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->_username = Configuration::get('TNT_CARRIER_USERNAME'); + $this->_password = TNTOfficiel_PasswordManager::decrypt(Configuration::get('TNT_CARRIER_PASSWORD')); + $this->_account = Configuration::get('TNT_CARRIER_ACCOUNT'); + $this->_wsdl = Configuration::get('TNT_CARRIER_SOAP_WSDL'); + + $this->logger = new TNTOfficiel_Logger(); + } + + /** + * @param $reference + * @return bool|array + */ + public function trackingByConsignment($reference) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + try { + $client = $this->createClient(); + $response = $client->trackingByConsignment(array('parcelNumber' => $reference)); + $this->logger->logMessageTnt('trackingByConsignment', null, 'JSON', true, 'SUCCESS'); + } catch (Exception $objException) { + $strStatus = ($objException->getCode() == 500) ? 'FATAL' : 'ERROR'; + $strMsg = $objException->getMessage(); + $this->logger->logMessageTnt('trackingByConsignment', $strMsg, 'JSON', false, $strStatus); + return false; + } + + return $response; + } + + /** + * Return an instance of SoapHeader for WS Security + * + * @param string $login + * @param string $password + * + * @return \SoapHeader + */ + public function getSecurityHeader($login, $password) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $authHeader = sprintf( + $this->getSecurityHeaderTemplate(), htmlspecialchars($login), htmlspecialchars($password) + ); + + return $authHeader; + } + + /** + * Return template for WS Security header + * + * @return string + */ + protected function getSecurityHeaderTemplate() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + return ' + + %s + %s + + '; + } + + /** + * Return a new instance of SoapClient + * + * @return \SoapClient + */ + public function createClient() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $client = new SoapClient($this->_wsdl, array( + 'soap_version' => SOAP_1_1, + 'trace' => 1, + )); + $authvars = new SoapVar($this->getSecurityHeader($this->_username, $this->_password), XSD_ANYXML); + $soapHeaders = new SoapHeader("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security", $authvars); + $client->__setSOAPHeaders($soapHeaders); + + return $client; + } + +} diff --git a/www/modules/tntofficiel/libraries/TNTOfficiel_SysCheck.php b/www/modules/tntofficiel/libraries/TNTOfficiel_SysCheck.php new file mode 100644 index 00000000..cf000ca4 --- /dev/null +++ b/www/modules/tntofficiel/libraries/TNTOfficiel_SysCheck.php @@ -0,0 +1,256 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/tntofficiel.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_PasswordManager.php'; + +class TNTOfficiel_SysCheck +{ + public static function getPHPConfig() + { + $arrUser = posix_getpwuid(posix_geteuid()); + + $arrEnv = array( + 'http_proxy' => getenv('http_proxy'), + 'https_proxy' => getenv('https_proxy'), + 'ftp_proxy' => getenv('ftp_proxy') + ); + + $arrPHPConstants = array( + 'PHP_OS' => PHP_OS, + 'PHP_VERSION' => PHP_VERSION, + 'PHP_SAPI' => PHP_SAPI, + 'PHP_INT_SIZE (bits)' => PHP_INT_SIZE * 8 + ); + + $arrPHPExtensions = array_intersect_key(array_flip(get_loaded_extensions()), array( + 'curl' => true, + 'session' => true, + 'mcrypt' => true, + 'mhash' => true, + 'mbstring' => true, + 'iconv' => true, + 'zip' => true, + 'zlib' => true, + 'dom' => true, + 'xml' => true, + 'SimpleXML' => true, + 'Zend OPcache' => true, + 'ionCube Loader' => true + )); + + $arrPHPConfiguration = array_intersect_key(ini_get_all(null, false), array( + // php + 'magic_quotes' => 'Off', + 'magic_quotes_gpc' => 'Off', + 'max_input_vars' => '8192', + // core - file uploads + 'upload_max_filesize' => '4M', + // core - language options + 'disable_functions' => '', + 'disable_classes' => '', + // core - paths and directories + 'open_basedir' => '', + // core - data handling + 'register_globals' => 'Off', + // safe mode + 'safe_mode' => '', + 'safe_mode_gid' => '', + 'safe_mode_exec_dir' => '', + 'safe_mode_include_dir' => '', + // filesystem + 'allow_url_fopen' => 'On', + 'allow_url_include' => 'Off', + 'default_socket_timeout' => '60', + // opcache + 'opcache.enable' => 'true' + )); + + if (array_key_exists('open_basedir', $arrPHPConfiguration)) { + $arrPHPConfiguration['open_basedir'] = explode(PATH_SEPARATOR, $arrPHPConfiguration['open_basedir']); + } + + return array( + 'user' => $arrUser, + 'env' => $arrEnv, + 'constants' => $arrPHPConstants, + 'extensions' => $arrPHPExtensions, + 'configuration' => $arrPHPConfiguration + ); + } + + public static function getPSConfig() + { + //$__constants = get_defined_constants(true); + $arrPSConstant = array( + '_PS_VERSION_' => _PS_VERSION_, + '_PS_JQUERY_VERSION_' => _PS_JQUERY_VERSION_, + + '_PS_MODE_DEV_' => _PS_MODE_DEV_, + '_PS_DEBUG_PROFILING_' => _PS_DEBUG_PROFILING_, + + '_PS_MAGIC_QUOTES_GPC_' => _PS_MAGIC_QUOTES_GPC_, + '_PS_USE_SQL_SLAVE_' => _PS_USE_SQL_SLAVE_, + + '_PS_CACHE_ENABLED_' => _PS_CACHE_ENABLED_, + '_PS_CACHING_SYSTEM_' => _PS_CACHING_SYSTEM_, + + '_PS_DEFAULT_THEME_NAME_' => _PS_DEFAULT_THEME_NAME_, + '_PS_THEME_DIR_' => _PS_THEME_DIR_, + '_PS_THEME_OVERRIDE_DIR_' => _PS_THEME_OVERRIDE_DIR_, + '_PS_THEME_MOBILE_DIR_' => _PS_THEME_MOBILE_DIR_, + '_PS_THEME_MOBILE_OVERRIDE_DIR_' => _PS_THEME_MOBILE_OVERRIDE_DIR_, + '_PS_THEME_TOUCHPAD_DIR_' => _PS_THEME_MOBILE_OVERRIDE_DIR_ + ); + + $arrPSConfig = Configuration::getMultiple(array( + // TNT + 'TNT_CARRIER_ACTIVATED', + 'TNT_CARRIER_ID', + 'TNT_CARRIER_USERNAME', + 'TNT_CARRIER_ACCOUNT', + 'TNT_CARRIER_PASSWORD', + 'TNT_CARRIER_PICKUP_NUMBER_SHOW', + 'TNT_GOOGLE_MAP_API_KEY', + 'TNT_CARRIER_MAX_PACKAGE_B2B', + 'TNT_CARRIER_MAX_PACKAGE_B2C', + 'TNT_CARRIER_ASSOCIATIONS', + 'TNT_CARRIER_MIDDLEWARE_URL', + 'TNT_CARRIER_MIDDLEWARE_SHORT_URL', + 'TNT_CARRIER_SOAP_WSDL', + 'TNT_CARRIER_ADDRESS_EMAIL', + 'TNT_CARRIER_ADDRESS_PHONE', + 'TNT_CARRIER_ADDRESS_BUILDING', + 'TNT_CARRIER_ADDRESS_INTERCOM', + 'TNT_CARRIER_ADDRESS_FLOOR', + + 'PS_DISABLE_OVERRIDES', + + 'PS_MULTISHOP_FEATURE_ACTIVE', + 'PS_STOCK_MANAGEMENT', + 'PS_ADVANCED_STOCK_MANAGEMENT', + 'PS_ALLOW_MULTISHIPPING', + 'PS_ORDER_PROCESS_TYPE', + + 'PS_SSL_ENABLED', + 'PS_SSL_ENABLED_EVERYWHERE', + + 'PS_LANG_DEFAULT', + 'PS_SHOP_NAME', + 'PS_SHOP_EMAIL', + 'PS_SHOP_PHONE', + 'PS_DISTANCE_UNIT' + )); + + return array( + 'constants' => $arrPSConstant, + 'configuration' => $arrPSConfig + ); + } + + public static function getShopContext() + { + $flagShopContext = Shop::getContext(); + $arrConstShopContext = array(); + + if ($flagShopContext & Shop::CONTEXT_SHOP) { + $arrConstShopContext[] = 'Shop::CONTEXT_SHOP'; + } + if ($flagShopContext & Shop::CONTEXT_GROUP) { + $arrConstShopContext[] = 'Shop::CONTEXT_GROUP'; + } + if ($flagShopContext & Shop::CONTEXT_ALL) { + $arrConstShopContext[] = 'Shop::CONTEXT_ALL'; + } + + return array( + 'Context::getContext()->shop' => Context::getContext()->shop, + 'Shop::getContext()' => $arrConstShopContext, + 'Shop::isFeatureActive()' => Shop::isFeatureActive(), + 'Shop::getContextShopGroupID(true)' => Shop::getContextShopGroupID(true), + 'Shop::getContextShopID(true)' => Shop::getContextShopID(true) + ); + } + + public static function getModule() + { + $objModule = Module::getInstanceByName(TNTOfficiel::MODULE_NAME); + + return array( + 'Module::isInstalled()' => Module::isInstalled(TNTOfficiel::MODULE_NAME), + 'Module::isEnabled()' => Module::isEnabled(TNTOfficiel::MODULE_NAME), + 'Module::isModuleTrusted()' => Module::isModuleTrusted(TNTOfficiel::MODULE_NAME), + 'Module::getInstanceByName()' => $objModule, + '$objModule->isEnabledForShopContext()' => $objModule->isEnabledForShopContext() + //'$objModule->getPossibleHooksList()' => $objModule->getPossibleHooksList() + ); + } + + public static function getAccount() + { + return array( + 'MyTNTLogin' => (Configuration::get('TNT_CARRIER_USERNAME')), + 'TNTAccount' => (Configuration::get('TNT_CARRIER_ACCOUNT')) + //'MyTNTPassword' => TNTOfficiel_PasswordManager::decrypt(Configuration::get('TNT_CARRIER_PASSWORD')) + ); + } + + public static function cURLRequest($strURL, $arrOptions = null) + { + $arrcURL = array( + 'options' => array( + //CURLOPT_URL => $strURL, + CURLOPT_SSL_VERIFYHOST => false, + //CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_COOKIESESSION => true, + // follow redirect. + CURLOPT_FOLLOWLOCATION => true, + // max redirection. + CURLOPT_MAXREDIRS => 10, + // return response with curl_exec (no direct output). + CURLOPT_RETURNTRANSFER => true, + // include response header? + //CURLOPT_HEADER => false, + // include request header? + //CURLINFO_HEADER_OUT => false, + // timeout for connection to the server. + CURLOPT_CONNECTTIMEOUT => 3, + // timout global. + CURLOPT_TIMEOUT => 5 + ) + ); + + //CURLOPT_PROXY => $strProxy + //CURLOPT_PROXYUSERPWD => 'user:password', + //CURLOPT_PROXYAUTH => 1, + //CURLOPT_PROXYPORT => 80, + //CURLOPT_PROXYTYPE => CURLPROXY_HTTP, + + + if (is_array($arrOptions)) { + $arrcURL['options'] += $arrOptions; + } + + $hdleCURL = curl_init(); + + foreach($arrcURL['options'] as $k => $o) { + curl_setopt($hdleCURL, $k, $o); + } + curl_setopt($hdleCURL, CURLOPT_URL, $strURL); + + + $arrcURL['response'] = curl_exec($hdleCURL); + //CURLINFO_HEADER_OUT + $arrcURL['info'] = curl_getinfo($hdleCURL); + + curl_close($hdleCURL); + + return $arrcURL; + } +} diff --git a/www/modules/tntofficiel/libraries/exceptions/TNTOfficiel_MaxPackageWeightException.php b/www/modules/tntofficiel/libraries/exceptions/TNTOfficiel_MaxPackageWeightException.php new file mode 100644 index 00000000..c26a46e7 --- /dev/null +++ b/www/modules/tntofficiel/libraries/exceptions/TNTOfficiel_MaxPackageWeightException.php @@ -0,0 +1,12 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +class TNTOfficiel_MaxPackageWeightException extends Exception +{ +} diff --git a/www/modules/tntofficiel/libraries/exceptions/TNTOfficiel_OrderAlreadyShippedException.php b/www/modules/tntofficiel/libraries/exceptions/TNTOfficiel_OrderAlreadyShippedException.php new file mode 100644 index 00000000..c9411e06 --- /dev/null +++ b/www/modules/tntofficiel/libraries/exceptions/TNTOfficiel_OrderAlreadyShippedException.php @@ -0,0 +1,12 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +class TNTOfficiel_OrderAlreadyShippedException extends Exception +{ +} diff --git a/www/modules/tntofficiel/libraries/exceptions/index.php b/www/modules/tntofficiel/libraries/exceptions/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/libraries/exceptions/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/libraries/helper/TNTOfficiel_AddressHelper.php b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_AddressHelper.php new file mode 100644 index 00000000..34965e35 --- /dev/null +++ b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_AddressHelper.php @@ -0,0 +1,224 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Logger.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_ServiceCache.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_JsonRPCClient.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_PasswordManager.php'; + +class TNTOfficiel_AddressHelper +{ + /** + * @var Singleton + */ + private static $_instance = null; + + /** + * @var TNTOfficiel_Logger + */ + private $logger; + + /** + * Constructor. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->logger = new TNTOfficiel_Logger(); + } + + /** + * Creates a singleton. + * + * @param void + * + * @return TNTOfficiel_AddressHelper + */ + public static function getInstance() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (is_null(TNTOfficiel_AddressHelper::$_instance)) { + TNTOfficiel_AddressHelper::$_instance = new TNTOfficiel_AddressHelper(); + } + + return TNTOfficiel_AddressHelper::$_instance; + } + + /** + * Get cities from the middleware for the given CP + * Store the result in cache until midnight. + * + * @param string $postcode the postal code + * @param int $idShop the shop id + * + * @return array + */ + public function getCitiesFromMiddleware($postcode, $idShop) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objCache = Cache::getInstance(); + // get params without timestamp + $params = $this->_getCitiesParams($postcode, $idShop); + $cache_key = 'middleware::getCities_'.md5(serialize($params)); + //check if already in cache + if (!$objCache->exists($cache_key)) { + $client = new TNTOfficiel_JsonRPCClient(Configuration::get('TNT_CARRIER_MIDDLEWARE_URL')); + try { + $cities = $client->execute('getCities', $params); + $this->logger->logMessageTnt('getCities', null, 'JSON', true, 'SUCCESS'); + } catch (Exception $objException) { + $strStatus = ($objException->getCode() == 500) ? 'FATAL' : 'ERROR'; + $strMsg = $objException->getMessage(); + $this->logger->logMessageTnt('getCities', $strMsg, 'JSON', false, $strStatus); + return false; + } + //add in cache until midnight + $objCache->set($cache_key, Tools::jsonEncode($cities), TNTOfficiel_ServiceCache::getSecondsUntilMidnight()); + + return $cities; + } + $cities = Tools::jsonDecode($objCache->get($cache_key), true); + + return $cities; + } + + /** + * Get the data needed by the middleware. + * + * @param string $postcode the postal code + * @param int $idShop the shop id + * + * @return array + */ + private function _getCitiesParams($postcode, $idShop) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $data = array( + 'store' => $idShop, + 'merchant' => array( + 'identity' => Configuration::get('TNT_CARRIER_USERNAME'), + 'password' => TNTOfficiel_PasswordManager::getHash(), + 'merchant_number' => Configuration::get('TNT_CARRIER_ACCOUNT'), + ), + 'postcode' => $postcode, + ); + + return $data; + } + + /** + * ask the middleware to check if the city match the postcode. + * + * @param $postcode + * @param $city + * @param $idShop + * + * @return mixed + */ + public function checkPostcodeCityFromMiddleware($postcode, $city, $idShop) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objCache = Cache::getInstance(); + // get params without timestamp + $params = $this->_getTestCityParams($postcode, $city, $idShop); + $cache_key = 'middleware::testCity_'.md5(serialize($params)); + //check if already in cache + if (!$objCache->exists($cache_key)) { + $client = new TNTOfficiel_JsonRPCClient(Configuration::get('TNT_CARRIER_MIDDLEWARE_URL')); + try { + $result = $client->execute('testCity', $params); + $this->logger->logMessageTnt('testCity', null, 'JSON', true, 'SUCCESS'); + } catch (Exception $objException) { + $strStatus = ($objException->getCode() == 500) ? 'FATAL' : 'ERROR'; + $strMsg = $objException->getMessage(); + $this->logger->logMessageTnt('testCity', $strMsg, 'JSON', false, $strStatus); + return false; + } + //add in cache until midnight + $objCache->set($cache_key, Tools::jsonEncode($result), TNTOfficiel_ServiceCache::getSecondsUntilMidnight()); + + return $result; + } + $result = Tools::jsonDecode($objCache->get($cache_key), true); + + return $result; + } + + public function getAddressData($addressId, $cartId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $strSQL = ' +SELECT a.*, tc.* +FROM '._DB_PREFIX_.'orders o +INNER JOIN '._DB_PREFIX_.'address a on a.id_address = o.id_address_delivery +INNER JOIN '._DB_PREFIX_.'tntofficiel_cart tc on tc.id_cart = o.id_cart +WHERE a.id_address = '.(int)$addressId.' and tc.id_cart = '.(int)$cartId; + + $result = Db::getInstance()->getRow($strSQL, false); + if (!$result || count($result) == 0) { + throw new Exception('No address was found for the address '.$addressId.' - '.$cartId); + } + + return $result; + } + + /** + * Get the data needed by the middleware to check the city/postcode. + * + * @param $postcode + * @param $city + * @param $idShop + * + * @return array + */ + private function _getTestCityParams($postcode, $city, $idShop) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $data = $this->_getCitiesParams($postcode, $idShop); + $data['city'] = $city; + + return $data; + } + + /** + * Check the postcode/city validity for a cart. + * + * @param $cart + * + * @return bool + */ + public function checkPostCodeCityForCart($cart) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $deliveryAddress = new Address($cart->id_address_delivery); + $countryIsoCode = Country::getIsoById($deliveryAddress->id_country); + $idShop = (int) Context::getContext()->shop->id; + //do not check if the address is not in france + if ($countryIsoCode == 'FR') { + $result = $this->checkPostcodeCityFromMiddleware( + $deliveryAddress->postcode, + $deliveryAddress->city, + $idShop + ); + + return $result['response']; + } + + return true; + } +} diff --git a/www/modules/tntofficiel/libraries/helper/TNTOfficiel_CarrierHelper.php b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_CarrierHelper.php new file mode 100644 index 00000000..df1fc956 --- /dev/null +++ b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_CarrierHelper.php @@ -0,0 +1,284 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Cache.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Product.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Logger.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_JsonRPCClient.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_PasswordManager.php'; + +class TNTOfficiel_CarrierHelper +{ + /** @var Singleton */ + private static $_instance = null; + + /** @var TNTOfficiel_Logger */ + private $logger; + + /** + * Constructor. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->logger = new TNTOfficiel_Logger(); + } + + /** + * Creates a singleton. + * + * @param void + * + * @return TNTOfficiel_CarrierHelper + */ + public static function getInstance() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (is_null(TNTOfficiel_CarrierHelper::$_instance)) { + TNTOfficiel_CarrierHelper::$_instance = new TNTOfficiel_CarrierHelper(); + } + + return TNTOfficiel_CarrierHelper::$_instance; + } + + /** + * Get the carriers from the middleware or from cache. + * + * @return array + */ + public function getMDWTNTCarrierList($objArgCustomer) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objContext = Context::getContext(); + $objCart = $objContext->cart; + + $arrTNTCarrierList = array(); + + // Validated account is required. + if (!Configuration::get('TNT_CARRIER_ACTIVATED')) { + return $arrTNTCarrierList; + } + + // A shipping address is required. + if ($objCart->id_address_delivery == 0) { + return $arrTNTCarrierList; + } + + // get params without timestamp + $params = $this->_getCartData($objArgCustomer); + + $maxPackageWeightBtoB = (float)Configuration::get('TNT_CARRIER_MAX_PACKAGE_B2B'); + $maxPackageWeightBtoC = (float)Configuration::get('TNT_CARRIER_MAX_PACKAGE_B2C'); + + $onlyBtoBServices = false; + foreach ($params['quote']['items'] as $item) { + if ($item['weight'] > $maxPackageWeightBtoB) { + return; + } + if ($item['weight'] > $maxPackageWeightBtoC) { + $onlyBtoBServices = true; + } + } + + $cache_key = 'middleware::getCarrierData_'.md5(serialize($params)); + + //check if already in cache + if (!TNTOfficiel_Cache::isStored($cache_key)) { + $client = new TNTOfficiel_JsonRPCClient(Configuration::get('TNT_CARRIER_MIDDLEWARE_URL')); + $arrTNTCarrierList = null; + try { + $arrTNTCarrierList = $client->execute('getCarrierQuote', $params); + $this->logger->logMessageTnt('getCarrierQuote', null, 'JSON', true, 'SUCCESS'); + } catch (Exception $objException) { + $strStatus = ($objException->getCode() == 500) ? 'FATAL' : 'ERROR'; + $strMsg = $objException->getMessage(); + $this->logger->logMessageTnt('getCarrierQuote', $strMsg, 'JSON', false, $strStatus); + } + + if (!is_array($arrTNTCarrierList) || !array_key_exists('products', $arrTNTCarrierList)) { + return; + } + + $arrServiceEnable = array('ENTERPRISE', 'DEPOT'); + foreach ($arrTNTCarrierList['products'] as $key => $product) { + if ($onlyBtoBServices && !in_array($product['type'], $arrServiceEnable)) { + unset($arrTNTCarrierList['products'][$key]); + if (array_key_exists('relay_points', $arrTNTCarrierList)) { + unset($arrTNTCarrierList['relay_points']); + } + continue; + } + $arrTNTCarrierList['products'][$key]['id'] = $product['code'].'_'.$product['type']; + + $arrTNTCarrierList['products'][$key]['due_date'] = null; + if ($product['due_date']) { + $arrTNTCarrierList['products'][$key]['due_date'] = date('d/m/Y', strtotime($product['due_date'])); + } + } + + // add in cache for 600 seconds + TNTOfficiel_Cache::store($cache_key, Tools::jsonEncode($arrTNTCarrierList), 600); + + return $arrTNTCarrierList; + } + $arrTNTCarrierList = Tools::jsonDecode(TNTOfficiel_Cache::retrieve($cache_key), true); + + return $arrTNTCarrierList; + } + + /** + * Get all the data needed by the middleware from the cart. + * + * @return array + */ + private function _getCartData($objCustomer) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objContext = Context::getContext(); + $objCart = $objContext->cart; + + //get the checkout step if in checkout else set it to 0 + $step = 0; + if (property_exists($objContext->controller, 'step')) { + $step = $objContext->controller->step; + } + + //check if user is logged in + $loggedIn = $objContext->controller->auth; + + //shipping address + $shippingAddress = new Address((int)$objCart->id_address_delivery); + + //total discount + $totalDiscount = 0; + + //items + $items = array(); + foreach ($objCart->getProducts() as $product) { + //reduction amount + $totalDiscount += $discount = Product::getPriceStatic($product['id_product'], false, $product['id_product_attribute'], 6, null, true); + + $attributes = TNTOfficiel_Product::getProductAttributes($product['id_product']); + $items[] = array( + 'qty' => $product['cart_quantity'], + 'price' => $product['price'] + $discount, + 'row_total' => $product['price_wt'] * $product['cart_quantity'], + 'tax' => $product['cart_quantity'] * $product['price'] * $product['rate'] / 100, + 'discount' => $discount, + 'attributes' => $attributes, + 'options' => (isset($product['attributes'])) ? $this->_attributesToArray($product['attributes']) : '', + 'weight' => $product['weight'], + ); + } + + $data = array( + 'store' => $objCart->id_shop, + 'context' => ($step == 2) ? 'CHECKOUT' : 'QUOTE', + 'merchant' => array( + 'identity' => Configuration::get('TNT_CARRIER_USERNAME'), + 'password' => TNTOfficiel_PasswordManager::getHash(), + 'merchant_number' => Configuration::get('TNT_CARRIER_ACCOUNT'), + ), + 'customer' => array( + 'name' => ($loggedIn == true) ? $objCustomer->firstname.' '.$objCustomer->lastname : null, + 'email' => ($loggedIn == true) ? $objCustomer->email : '', + 'group_id' => ($loggedIn == true) ? Customer::getDefaultGroupId((int)$objCustomer->id) : null, + 'dob' => ($loggedIn == true) ? Customer::getDefaultGroupId((int)$objCustomer->birthday) : null, + 'name' => $shippingAddress->company, + ), + 'shipping' => array( + 'country_code' => Country::getIsoById($shippingAddress->id_country), + 'region_code' => Tools::substr($shippingAddress->postcode, 0, 2), + 'post_code' => $shippingAddress->postcode, + 'city' => $shippingAddress->city, + ), + 'quote' => array( + 'items' => $items, + 'subtotal' => $objCart->getOrderTotal(false, Cart::ONLY_PRODUCTS_WITHOUT_SHIPPING), + 'tax' => $objCart->getOrderTotal(true, Cart::BOTH_WITHOUT_SHIPPING) + - $objCart->getOrderTotal(false, Cart::BOTH_WITHOUT_SHIPPING), + 'discount' => -($objCart->getOrderTotal(false, Cart::BOTH_WITHOUT_SHIPPING) + - $objCart->getOrderTotal(false, Cart::ONLY_PRODUCTS_WITHOUT_SHIPPING)), + 'coupon_code' => $this->_getDiscountCodes($objCart), + 'freeshipping' => '', + ), + ); + + return $data; + } + + /** + * Transform a string containing attributes data into an array. + * + * @param string $attributes + * + * @return array + */ + private function _attributesToArray($attributes) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $attributesArray = array(); + $attributesTemp = explode(',', preg_replace('/\s+/', '', $attributes)); + foreach ($attributesTemp as $attribute) { + $temp = array(); + $attributeArray = explode(':', $attribute); + $temp['code'] = $attributeArray[0]; + $temp['value'] = $attributeArray[1]; + $attributesArray[] = $temp; + } + + return $attributesArray; + } + + /** + * Gets all the cart discount codes separated by '|'. + * Note: using Cart->getDiscounts() may cause infinite loop through Module->getOrderShippingCost(). + * Note: Cart->getOrderedCartRulesIds() unavailable in Prestashop 1.6.0.5. + * + * @param CartCore $objArgCart + * + * @return string + */ + private function _getDiscountCodes($objArgCart) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $strKeyCache = 'TNTOfficiel_CarrierHelper::_getDiscountCodes'.$objArgCart->id.'-ids'; + if (!Cache::isStored($strKeyCache)) { + $arrCartRulesIdList = Db::getInstance()->executeS(' + SELECT cr.`id_cart_rule` + FROM `'._DB_PREFIX_.'cart_cart_rule` cd + LEFT JOIN `'._DB_PREFIX_.'cart_rule` cr ON cd.`id_cart_rule` = cr.`id_cart_rule` + LEFT JOIN `'._DB_PREFIX_.'cart_rule_lang` crl ON ( + cd.`id_cart_rule` = crl.`id_cart_rule` + AND crl.id_lang = '.(int)$objArgCart->id_lang.' + ) + WHERE `id_cart` = '.(int)$objArgCart->id.' + ORDER BY cr.priority ASC + '); + Cache::store($strKeyCache, $arrCartRulesIdList); + } else { + $arrCartRulesIdList = Cache::retrieve($strKeyCache); + } + + $arrDiscountCodes = array(); + foreach ($arrCartRulesIdList as $arrCartRulesRow) { + $objCartRule = new CartRule($arrCartRulesRow['id_cart_rule']); + $arrDiscountCodes[] = $objCartRule->code; + } + + return implode('|', $arrDiscountCodes); + } +} diff --git a/www/modules/tntofficiel/libraries/helper/TNTOfficiel_OrderHelper.php b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_OrderHelper.php new file mode 100644 index 00000000..e8734ba4 --- /dev/null +++ b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_OrderHelper.php @@ -0,0 +1,195 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/tntofficiel.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_ShipmentHelper.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Logger.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/pdf/TNTOfficiel_PDFMerger.php'; + +class TNTOfficiel_OrderHelper +{ + /** @var TNTOfficiel_OrderHelper */ + private static $_instance = null; + + /** @var TNTOfficiel_Logger */ + private $logger; + + /** + * Constructor. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->logger = new TNTOfficiel_Logger(); + } + + /** + * Creates a singleton. + * + * @param void + * + * @return TNTOfficiel_OrderHelper + */ + public static function getInstance() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (is_null(TNTOfficiel_OrderHelper::$_instance)) { + TNTOfficiel_OrderHelper::$_instance = new TNTOfficiel_OrderHelper(); + } + + return TNTOfficiel_OrderHelper::$_instance; + } + + /** + * Gets the tnt product code for an order. + * + * @param $orderId + * + * @return string + * + * @throws Exception + */ + public function getOrderData($orderId, $stopOnException = true) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $sql = 'SELECT * FROM '._DB_PREFIX_.'tntofficiel_order WHERE id_order = '.(int)$orderId; + $result = Db::getInstance()->getRow($sql, false); + if (!$result && $stopOnException) { + throw new Exception('No tnt product was found for the order '.$orderId); + } + + return $result; + } + + /** + * Revert the order state to its previous state. + * + * @param $orderId + * + * @throws Exception + */ + public function revertState($orderId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrTNTOrder = $this->getOrderData($orderId); + $orderState = new OrderState($arrTNTOrder['previous_state']); + $history = new OrderHistory(); + $history->id_order = (int)$orderId; + $history->changeIdOrderState((int)$orderState, (int)$orderId); + $history->save(); + } + + /** + * Change the order state to the prestashop default shipping state. + * + * @param $orderId + */ + public function validateShippedState($orderId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $history = new OrderHistory(); + $history->id_order = (int)$orderId; + $history->changeIdOrderState((int)(Configuration::get('PS_OS_SHIPPING')), (int)$orderId); + $history->save(); + } + + /** + * Get all the tnt orders. + * + * @return array + * + * @throws PrestaShopDatabaseException + */ + public function getTntOrders() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $sql = 'SELECT * FROM '._DB_PREFIX_.'orders o '; + $sql .= 'JOIN '._DB_PREFIX_.'tntofficiel_order t ON o.id_order = t.id_order'; + $orders = Db::getInstance()->executeS($sql); + + return $orders; + } + + /** + * Concatenate all the bt for the given orders. + * + * @param $orderList + * + * @return string + * + * @throws Exception + */ + public function getBt($orderList) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $pdf = new TNTOfficiel_PDFMerger(); + $btCounter = 0; + foreach ($orderList as $orderId) { + try { + $arrTNTOrder = $this->getOrderData($orderId, false); + $strBTFilename = $arrTNTOrder['bt_filename']; + if ($strBTFilename && filesize(_PS_MODULE_DIR_.'tnt_media/media/bt/'.$strBTFilename) > 0) { + ++$btCounter; + $pdf->addPDF(_PS_MODULE_DIR_.'tnt_media/media/bt/'.$strBTFilename); + } + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + } + } + if ($btCounter > 0) { + return $pdf->merge('download', 'bt_list.pdf'); + } + } + + /** + * Create a new address and assign it to the order as the deliveray address. + * + * @param $arrProduct + * @param $orderId + */ + public static function createNewAddress($arrProduct, $orderId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $strRepoType = (array_key_exists('xett', $arrProduct) && isset($arrProduct['xett'])) ? 'xett' : 'pex'; + + $order = new Order($orderId); + $oldAddress = new Address($order->id_address_delivery); + $address = new Address(); + $address->id_country = (int)Context::getContext()->country->id; + $address->id_customer = 0; + $address->id_manufacturer = 0; + $address->id_supplier = 0; + $address->id_warehouse = 0; + $address->alias = TNTOfficiel::MODULE_NAME; + $address->lastname = $oldAddress->lastname; //lastname cannot be empty + $address->firstname = $oldAddress->firstname; //firstname cannot be empty + $address->company = sprintf('%s - %s', $arrProduct[ $strRepoType ], $arrProduct['name']); + $address->address1 = ($strRepoType === 'xett') ? $arrProduct['address'] : $arrProduct['address1']; + $address->address2 = ($strRepoType === 'xett') ? '' : $arrProduct['address2']; + $address->city = $arrProduct['city']; + $address->postcode = $arrProduct['postcode']; + $address->save(); + //assign the new delivery address to the order + $order->id_address_delivery = (int)$address->id; + $order->save(); + //Db::getInstance()->update('orders', array('id_address_delivery' => $address->id), 'id_order = '.(int) $orderId); + } + +} diff --git a/www/modules/tntofficiel/libraries/helper/TNTOfficiel_ParcelsHelper.php b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_ParcelsHelper.php new file mode 100644 index 00000000..46d084f7 --- /dev/null +++ b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_ParcelsHelper.php @@ -0,0 +1,492 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/tntofficiel.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/classes/TNTOfficielCart.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Parcel.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_SoapClient.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_OrderHelper.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/exceptions/TNTOfficiel_MaxPackageWeightException.php'; + +class TNTOfficiel_ParcelsHelper +{ + /** @var TNTOfficiel_ParcelsHelper */ + private static $_instance = null; + + /** + * Constructor. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + } + + /** + * Creates a singleton. + * + * @param void + * + * @return TNTOfficiel_ParcelsHelper + */ + public static function getInstance() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (is_null(TNTOfficiel_ParcelsHelper::$_instance)) { + TNTOfficiel_ParcelsHelper::$_instance = new TNTOfficiel_ParcelsHelper(); + } + + return TNTOfficiel_ParcelsHelper::$_instance; + } + + /** + * Creates the parcels for an order. + * + * @param $objCart + * @param $intArgOrderID + * + * @return bool + */ + public function createParcels($objCart, $intArgOrderID) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $orderedProducts = $this->_getProductsOrderedByWeight($objCart->getProducts()); + $fltMaxParcelWeight = $this->_getMaxPackageWeight($intArgOrderID); + $parcels = array(); + $parcel = new TNTOfficiel_Parcel(); + foreach ($orderedProducts as $product) { + $productQuantity = $product['quantity']; + for ($i = 0; $i < $productQuantity; ++$i) { + //check if parcel's weight exceeds the maximum parcel weight + //and remove the last added product in the parcel if it's not the only product in it + if (($parcel->getWeight() + $product['weight']) <= $fltMaxParcelWeight) { + $parcel->addProduct($product); + } else { + $parcels[] = $parcel; + $parcel = new TNTOfficiel_Parcel(); + $parcel->addProduct($product); + } + } + } + //if the parcels contains at least one product we add it to the list + if (count($parcel->getProductList())) { + $parcels[] = $parcel; + } + + //save the parcels + $this->_saveParcels($parcels, $intArgOrderID); + + return true; + } + + /** + * Order a list of products by weight. + * + * @param $products + * + * @return array + */ + private function _getProductsOrderedByWeight($products) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + usort($products, array(__CLASS__, 'compareProductByWeight')); + + return $products; + } + + /** + * Compare two products by their weight. + * + * @param $productA + * @param $productB + * + * @return int + */ + public static function compareProductByWeight($productA, $productB) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if ($productA['weight'] == $productB['weight']) { + return 0; + } + + return ($productA['weight'] < $productB['weight']) ? -1 : 1; + } + + /** + * Save the parcels in the database. + * + * @param $parcels array + * @param $orderId int + */ + private function _saveParcels($parcels, $orderId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + foreach ($parcels as $parcel) { + //insert into the parcel table + $this->addParcel($orderId, $parcel->getWeight(), true); + } + } + + /** + * Get the parcels of an order. + * + * @param $orderId int + * + * @return array + */ + public function getParcels($orderId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $sql = 'SELECT * FROM '._DB_PREFIX_.'tntofficiel_order_parcels WHERE id_order ='.(int)$orderId; + $parcels = Db::getInstance()->executeS($sql); + + return $parcels; + } + + /** + * Remove a parcel. + * + * @param $parcelId int + * + * @return bool + */ + public function removeParcel($parcelId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + return Db::getInstance()->delete('tntofficiel_order_parcels', 'id_parcel = '.(int)$parcelId); + } + + /** + * Add a parcel. + * + * @param $intArgOrderID int + * @param $fltArgWeight float + * @param $isOrderCreation + * + * @return array + * + * @throws TNTOfficiel_MaxPackageWeightException + */ + public function addParcel($intArgOrderID, $fltArgWeight, $isOrderCreation = true) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $fltMaxPackageWeight = $this->_getMaxPackageWeight($intArgOrderID); + //Does not throw an exception when this is an order creation + //the parcel can contains one product which weight exceeds the maximum weight + if ((float)$fltArgWeight > $fltMaxPackageWeight && !$isOrderCreation) { + throw new TNTOfficiel_MaxPackageWeightException('Le poids d\'un colis ne peut dépasser '.$fltMaxPackageWeight.'Kg'); + } + + Db::getInstance()->insert('tntofficiel_order_parcels', array( + 'id_order' => (int)$intArgOrderID, + 'weight' => max(round((float)$fltArgWeight, 1, PHP_ROUND_HALF_UP), 0.1), + )); + $sql = 'SELECT * FROM '._DB_PREFIX_.'tntofficiel_order_parcels WHERE id_parcel ='.Db::getInstance()->Insert_ID(); + + return Db::getInstance()->executeS($sql); + } + + /** + * Update a parcel. + * + * @param $parcelId int + * @param $weight float + * @param $intArgOrderID int + * + * @return bool + * + * @throws TNTOfficiel_MaxPackageWeightException + */ + public function updateParcel($parcelId, $weight, $intArgOrderID) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $fltMaxPackageWeight = $this->_getMaxPackageWeight($intArgOrderID); + if ((float)$weight > $fltMaxPackageWeight) { + throw new TNTOfficiel_MaxPackageWeightException('Le poids d\'un colis ne peut dépasser '.$fltMaxPackageWeight.'Kg'); + } + $weight = max(round($weight, 1, PHP_ROUND_HALF_UP), 0.1); + $result = array(); + $result['result'] = Db::getInstance()->update( + 'tntofficiel_order_parcels', + array('weight' => (float)$weight), + 'id_parcel = '.(int)$parcelId + ); + $result['weight'] = $weight; + + return $result; + } + + /** + * @param $parcel array + * + * @return array + */ + public function getTrackingData($parcel) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $response = $this->_callTntWs($parcel['parcel_number']); + + $response = (array)$response; + $returnData = ''; + if (count($response) && isset($response['Parcel'])) { + $returnData = $response['Parcel']; + } + if ($returnData) { + $this->_savePdl($returnData, $parcel['id_parcel']); + $returnData = array( + 'history' => $this->_getHistory($returnData), + 'status' => $this->_getStatus($returnData), + 'allStatus' => $this->_getAllStatus($this->_getStatus($returnData)), + ); + } + + return $returnData; + } + + /** + * Get the maximum package weight for the order. + * + * @param $intArgOrderID + * + * @return float + * + * @throws Exception + */ + private function _getMaxPackageWeight($intArgOrderID) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + try { + $arrTNTOrder = TNTOfficiel_OrderHelper::getInstance()->getOrderData($intArgOrderID); + $strCarrierCode = $arrTNTOrder['carrier_code']; + } catch (Exception $objException) { + + // TODO : Should not happen ! Why using carrier code from cart ?? + + $objContext = Context::getContext(); + $objCart = $objContext->cart; + $intCartID = (int)$objCart->id; + + // Load TNT cart info or create a new one for it's ID. + $objTNTCartModel = TNTOfficielCart::loadCartID($intCartID); + if(Validate::isLoadedObject($objTNTCartModel)) { + $strCarrierCode = $objTNTCartModel->carrier_code; + } + + // throw $objException; + + } + // If carrier code is B2B. + if (strpos($strCarrierCode, 'ENTERPRISE')) { + $fltMaxPackageWeight = (float)Configuration::get('TNT_CARRIER_MAX_PACKAGE_B2B'); + } else { + $fltMaxPackageWeight = (float)Configuration::get('TNT_CARRIER_MAX_PACKAGE_B2C'); + } + + return $fltMaxPackageWeight; + } + + /** + * Call the tnt. + * + * @param $parcelNumber + * + * @return stdClass + */ + private function _callTntWs($parcelNumber) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $client = new TNTOfficiel_SoapClient(); + $result = $client->trackingByConsignment($parcelNumber); + + return $result; + } + + /** + * Return All Status de display : depends on status -> maximum 5 status. + * + * @param $status + * + * @return array + */ + protected function _getAllStatus($status) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $statusArray = array( + 1 => TNTOfficiel_ParcelsHelper::translate('Colis chez l’expéditeur'), + 2 => TNTOfficiel_ParcelsHelper::translate('Ramassage du Colis'), + 3 => TNTOfficiel_ParcelsHelper::translate('Acheminement'), + 4 => TNTOfficiel_ParcelsHelper::translate('Livraison en cours'), + 5 => TNTOfficiel_ParcelsHelper::translate('Livré'), + ); + + switch ($status) { + case 6: + $statusArray[5] = TNTOfficiel_ParcelsHelper::translate('Incident'); + break; + case 7: + $statusArray[5] = TNTOfficiel_ParcelsHelper::translate("Retourné à l'expéditeur"); + break; + } + + return $statusArray; + } + + /** + * @param $parcel + * + * @return bool|int + */ + protected function _getStatus($parcel) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $parcel = (array)$parcel; + $statusLabel = isset($parcel['shortStatus']) ? $parcel['shortStatus'] : false; + if (!$statusLabel) { + return false; + } + + $mapping = array( + TNTOfficiel_ParcelsHelper::translate('En attente') => 1, + '--' => 2, + TNTOfficiel_ParcelsHelper::translate('En cours d\'acheminement') => 3, + TNTOfficiel_ParcelsHelper::translate('En cours de livraison') => 4, + TNTOfficiel_ParcelsHelper::translate('En agence TNT') => 4, + TNTOfficiel_ParcelsHelper::translate('Récupéré à l\'agence TNT') => 5, + TNTOfficiel_ParcelsHelper::translate('Livré') => 5, + TNTOfficiel_ParcelsHelper::translate('En attente de vos instructions') => 6, + TNTOfficiel_ParcelsHelper::translate('En attente d\'instructions') => 6, + TNTOfficiel_ParcelsHelper::translate('En attente d\'instructions') => 6, + TNTOfficiel_ParcelsHelper::translate('Incident de livraison') => 6, + TNTOfficiel_ParcelsHelper::translate('Incident intervention') => 6, + TNTOfficiel_ParcelsHelper::translate('Colis refusé par le destinataire') => 6, + TNTOfficiel_ParcelsHelper::translate('Livraison reprogrammée') => 6, + TNTOfficiel_ParcelsHelper::translate('Prise de rendez-vous en cours') => 6, + TNTOfficiel_ParcelsHelper::translate('Prise de rendez-vous en cours') => 6, + TNTOfficiel_ParcelsHelper::translate('Problème douane') => 6, + TNTOfficiel_ParcelsHelper::translate('Enlevé au dépôt') => 3, + TNTOfficiel_ParcelsHelper::translate('En dépôt restant') => 3, + TNTOfficiel_ParcelsHelper::translate('Retourné à l\'expéditeur') => 7, + ); + + return isset($mapping[$statusLabel]) ? $mapping[$statusLabel] : 1; + } + + /** + * @param $parcel + * + * @return bool + */ + protected function _getHistory($parcel) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (!$parcel->events) { + return false; + } + + $history = array(); + $states = array(1 => 'request', 2 => 'process', 3 => 'arrival', 4 => 'deliveryDeparture', 5 => 'delivery'); + $events = (array)$parcel->events; + foreach ($states as $idx => $state) { + if ((isset($events[$state.'Center']) || isset($events[$state.'Date'])) + && Tools::strlen($events[$state.'Date']) + ) { + $history[$idx] = array( + 'label' => $this->_getLabel($state), + 'date' => isset($events[$state.'Date']) ? $events[$state.'Date'] : '', + 'center' => isset($events[$state.'Center']) ? $events[$state.'Center'] : '', + ); + } + } + + return $history; + } + + protected function _getLabel($state) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $labels = array( + 'request' => TNTOfficiel_ParcelsHelper::translate('Colis chez l’expéditeur'), + 'process' => TNTOfficiel_ParcelsHelper::translate('Ramassage du colis'), + 'arrival' => TNTOfficiel_ParcelsHelper::translate('Acheminement du colis'), + 'deliveryDeparture' => TNTOfficiel_ParcelsHelper::translate('Livraison du colis en cours'), + 'delivery' => TNTOfficiel_ParcelsHelper::translate('Livraison du colis'), + ); + + return isset($labels[$state]) ? $labels[$state] : ''; + } + + /** + * Save the PDL. + * + * @param $data + * @param $parcelId + * + * @return bool + */ + protected function _savePdl($data, $parcelId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $result = false; + $pdl = $this->_getPdl($data); + if ($pdl) { + $result = Db::getInstance()->update('tntofficiel_order_parcels', array('pdl' => pSQL($pdl)), 'id_parcel = '.(int)$parcelId); + } + + return $result; + } + + /** + * Get POD Url from parcel data. + * + * @param $data + * + * @return bool|string + */ + protected function _getPdl($data) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $data = (array)$data; + + return isset($data['primaryPODUrl']) && $data['primaryPODUrl'] ? $data['primaryPODUrl'] : + (isset($data['secondaryPODUrl']) && $data['secondaryPODUrl'] ? $data['secondaryPODUrl'] : false); + } + + /** + * get translation. + * + * @param $string + * + * @return string + */ + public static function translate($string) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // TODO + return Translate::getModuleTranslation(TNTOfficiel::MODULE_NAME, $string, 'parcelshelper'); + } +} diff --git a/www/modules/tntofficiel/libraries/helper/TNTOfficiel_RelayPointsHelper.php b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_RelayPointsHelper.php new file mode 100644 index 00000000..6edbd42e --- /dev/null +++ b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_RelayPointsHelper.php @@ -0,0 +1,178 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Logger.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_JsonRPCClient.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_ServiceCache.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_PasswordManager.php'; + +final class TNTOfficiel_RelayPointsHelper +{ + /** @var Singleton */ + private static $_instance = null; + + /** @var TNTOfficiel_Logger */ + private $objLogger; + + /** + * Constructor. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->objLogger = new TNTOfficiel_Logger(); + } + + /** + * Creates a singleton. + * + * @param void + * + * @return Singleton + */ + public static function getInstance() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (is_null(TNTOfficiel_RelayPointsHelper::$_instance)) { + TNTOfficiel_RelayPointsHelper::$_instance = new TNTOfficiel_RelayPointsHelper(); + } + + return TNTOfficiel_RelayPointsHelper::$_instance; + } + + /** + * Get the relay points for the given postcode/city from the middleware or from the cache. + * + * @param $postcode + * @param $city + * @param $idShop + * + * @return array + */ + public function getRelayPoints($postcode, $city, $idShop) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objCache = Cache::getInstance(); + + // Get params without timestamp + $arrRequestData = $this->_getParams($postcode, $idShop, $city); + $strCacheKey = 'middleware::getRelayPoints_'.md5(serialize($arrRequestData)); + + // Retrieve from cache if exist. + if ($objCache->exists($strCacheKey)) { + return Tools::jsonDecode($objCache->get($strCacheKey), true); + } + + // JSON RPC Request to Middleware. + $client = new TNTOfficiel_JsonRPCClient(Configuration::get('TNT_CARRIER_MIDDLEWARE_URL')); + try { + $arrResponse = $client->execute('getRelayPoints', $arrRequestData); + $this->objLogger->logMessageTnt('getRelayPoints', null, 'JSON', true, 'SUCCESS'); + } catch (Exception $objException) { + $strStatus = ($objException->getCode() == 500) ? 'FATAL' : 'ERROR'; + $strMsg = $objException->getMessage(); + $this->objLogger->logMessageTnt('getRelayPoints', $strMsg, 'JSON', false, $strStatus); + + return array(); + } + + // If no RelayPoints + if ($arrResponse['relay_points'] === false) { + $arrResponse['relay_points'] = array(); + } + + // Store in cache until midnight. + $objCache->set($strCacheKey, Tools::jsonEncode($arrResponse['relay_points']), TNTOfficiel_ServiceCache::getSecondsUntilMidnight()); + + + return $arrResponse['relay_points']; + } + + /** + * Get the repositories for the given postcode from the middleware or from the cache. + * + * @param $postcode + * @param $idShop + * + * @return array + */ + public function getRepositories($postcode, $idShop) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objCache = Cache::getInstance(); + + // Get params without timestamp + $arrRequestData = $this->_getParams($postcode, $idShop); + $strCacheKey = 'middleware::getRepositories_'.md5(serialize($arrRequestData)); + + // Retrieve from cache if exist. + if ($objCache->exists($strCacheKey)) { + return Tools::jsonDecode($objCache->get($strCacheKey), true); + } + + // JSON RPC Request to Middleware. + $client = new TNTOfficiel_JsonRPCClient(Configuration::get('TNT_CARRIER_MIDDLEWARE_URL')); + try { + $arrResponse = $client->execute('getRepositories', $arrRequestData); + $this->objLogger->logMessageTnt('getRepositories', null, 'JSON', true, 'SUCCESS'); + } catch (Exception $objException) { + $strStatus = ($objException->getCode() == 500) ? 'FATAL' : 'ERROR'; + $strMsg = $objException->getMessage(); + $this->objLogger->logMessageTnt('getRepository', $strMsg, 'JSON', false, $strStatus); + + return array(); + } + + // If no Repositories. + if ($arrResponse['repositories'] === false) { + $arrResponse['repositories'] = array(); + } + + // Store in cache until midnight. + $objCache->set($strCacheKey, Tools::jsonEncode($arrResponse['repositories']), TNTOfficiel_ServiceCache::getSecondsUntilMidnight()); + + return $arrResponse['repositories']; + } + + /** + * Get the params needed by the middleware. + * + * @param $postcode + * @param $idShop + * @param null $city + * + * @return array + */ + private function _getParams($postcode, $idShop, $city = null) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrData = array( + 'store' => $idShop, + 'merchant' => array( + 'identity' => Configuration::get('TNT_CARRIER_USERNAME'), + 'password' => TNTOfficiel_PasswordManager::getHash(), + 'merchant_number' => Configuration::get('TNT_CARRIER_ACCOUNT'), + ), + 'postcode' => $postcode, + 'city' => $city, + ); + //add the city if not null + if ($city != null) { + $arrData['city'] = $city; + } + + return $arrData; + } +} diff --git a/www/modules/tntofficiel/libraries/helper/TNTOfficiel_ShipmentHelper.php b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_ShipmentHelper.php new file mode 100644 index 00000000..5ec95b4c --- /dev/null +++ b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_ShipmentHelper.php @@ -0,0 +1,440 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Logger.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_JsonRPCClient.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_PasswordManager.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_OrderHelper.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_AddressHelper.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_ParcelsHelper.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/exceptions/TNTOfficiel_OrderAlreadyShippedException.php'; + +class TNTOfficiel_ShipmentHelper +{ + /** + * The directory where the BT are stored. + */ + const BT_DIR = 'tnt_media/media/bt'; + + /** @var Singleton */ + private static $_instance = null; + + /** @var TNTOfficiel_Logger */ + private $logger; + + /** + * Constructor. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->logger = new TNTOfficiel_Logger(); + } + + /** + * Creates a singleton. + * + * @param void + * + * @return TNTOfficiel_ShipmentHelper + */ + public static function getInstance() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (is_null(TNTOfficiel_ShipmentHelper::$_instance)) { + TNTOfficiel_ShipmentHelper::$_instance = new TNTOfficiel_ShipmentHelper(); + } + + return TNTOfficiel_ShipmentHelper::$_instance; + } + + /** + * Send a shipment request to the middleware. + * + * @param $cart + * @param $orderId + * + * @return bool + * + * @throws Exception + */ + public function saveShipment($cart, $orderId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $order = new Order($orderId); + try { + $arrTNTOrder = TNTOfficiel_OrderHelper::getInstance()->getOrderData($orderId); + if ($arrTNTOrder['is_shipped']) { + throw new TNTOfficiel_OrderAlreadyShippedException('The shipment has already been created for the order ' + $orderId); + } + $arrTNTAddress = TNTOfficiel_AddressHelper::getInstance()->getAddressData($order->id_address_delivery, $order->id_cart); + $parcels = TNTOfficiel_ParcelsHelper::getInstance()->getParcels($orderId); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + throw $objException; + } + + //call the middleware + $arrParams = $this->_getParams( + $cart->id_shop, + $arrTNTOrder, + $arrTNTAddress, + $this->_getParcelsData($parcels, $order->reference), + $arrTNTOrder['shipping_date'] + ); + $response = $this->_callMiddleware($arrParams); + if (is_string($response)) { + throw new PrestaShopException($response); + } + + //save the BT + if ($response) { + $this->_saveBT($response['bt'], $order); + $this->_saveTrackingUrls($response['parcels'], $orderId); + $this->_savePickupNumber($response['pickUpNumber'], $orderId); + } + + return true; + } + + /** + * Check if a shipment was successfully done for an order. + * + * @param $orderId + * + * @return bool + */ + public function isShipmentSaved($orderId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $sql = 'SELECT * FROM '._DB_PREFIX_.'tntofficiel_order WHERE id_order = '.(int)$orderId; + $arrOrder = Db::getInstance()->getRow($sql, false); + + return (bool)$arrOrder['is_shipped']; + } + + /** + * Get the params. + * + * @param $intArgShopID + * @param $arrArgTNTOrder + * @param $arrArgTNTAddress + * @param $parcelsData + * + * @return array + */ + private function _getParams($intArgShopID, $arrArgTNTOrder, $arrArgTNTAddress, $parcelsData, $shippingDate = false) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $productCode = $arrArgTNTOrder['carrier_code']; + + $typeId = (empty($arrArgTNTOrder['carrier_xett'])) ? $arrArgTNTOrder['carrier_pex'] : $arrArgTNTOrder['carrier_xett']; + $arrParams = array( + 'store' => $intArgShopID, + 'merchant' => array( + 'identity' => Configuration::get('TNT_CARRIER_USERNAME'), + 'password' => TNTOfficiel_PasswordManager::getHash(), + 'merchant_number' => Configuration::get('TNT_CARRIER_ACCOUNT'), + ), + 'product' => $productCode, + 'recipient' => array( + 'xett' => $arrArgTNTOrder['carrier_xett'], + 'pex' => $arrArgTNTOrder['carrier_pex'], + 'firstname' => $arrArgTNTAddress['firstname'], + 'lastname' => $arrArgTNTAddress['lastname'], + 'address1' => Tools::substr($arrArgTNTAddress['address1'], 0, 32), + 'address2' => Tools::substr($arrArgTNTAddress['address2'], 0, 32), + 'post_code' => $arrArgTNTAddress['postcode'], + 'city' => $arrArgTNTAddress['city'], + 'email' => $arrArgTNTAddress['customer_email'], + 'phone' => $arrArgTNTAddress['customer_mobile'], + 'access_code' => $arrArgTNTAddress['address_accesscode'], + 'floor' => $arrArgTNTAddress['address_floor'], + 'building' => $arrArgTNTAddress['address_building'], + 'name' => $arrArgTNTAddress['company'], + 'typeId' => $typeId, + ), + 'parcels' => $parcelsData, + ); + + if ($shippingDate) { + $arrParams['shipping_date'] = $shippingDate; + } + + return $arrParams; + } + + /** + * Get parcels data. + * + * @param $parcels array + * + * @return array + */ + private function _getParcelsData($parcels, $orderReference) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $parcelsData = array(); + foreach ($parcels as $parcel) { + $parcelsData[] = array( + 'reference' => $orderReference, + 'weight' => $parcel['weight'], + ); + } + + return $parcelsData; + } + + /** + * Call the middleware to save the shipment. + * + * @param $params + * + * @return mixed + * + * @throws Exception + */ + private function _callMiddleware($params) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $client = new TNTOfficiel_JsonRPCClient(Configuration::get('TNT_CARRIER_MIDDLEWARE_URL')); + try { + $result = $client->execute('saveShipment', $params); + $this->logger->logMessageTnt('saveShipment', null, 'JSON', true, 'SUCCESS'); + } catch (Exception $objException) { + $strStatus = ($objException->getCode() == 500) ? 'FATAL' : 'ERROR'; + $strMsg = $objException->getMessage(); + $this->logger->logMessageTnt('saveShipment', $strMsg, 'JSON', false, $strStatus); + throw $objException; + } + + return $result; + } + + /** + * Call the middleware to save the shipment. + * + * @param $params + * + * @return mixed + * + * @throws Exception + */ + private function _callMiddlewareWithService($params, $service) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $client = new TNTOfficiel_JsonRPCClient(Configuration::get('TNT_CARRIER_MIDDLEWARE_URL')); + try { + $result = $client->execute($service, $params); + $this->logger->logMessageTnt($service, null, 'JSON', true, 'SUCCESS'); + } catch (Exception $objException) { + $strStatus = ($objException->getCode() == 500) ? 'FATAL' : 'ERROR'; + $strMsg = $objException->getMessage(); + $this->logger->logMessageTnt($service, $strMsg, 'JSON', false, $strStatus); + throw $objException; + } + + return $result; + } + + /** + * Saves the BT in the file system. + * + * @param $strBTContent + * @param $order + * + * @throws Exception + */ + private function _saveBT($strBTContent, $order) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + //creates the directory if not exists + if (!is_dir(_PS_MODULE_DIR_.TNTOfficiel_ShipmentHelper::BT_DIR)) { + mkdir(_PS_MODULE_DIR_.TNTOfficiel_ShipmentHelper::BT_DIR, 0777, true); + } + $date = date('Y-m-d_H-i-s'); + $strBTFilename = sprintf('BT_%s_%s.pdf', $order->reference, $date); + //create the file + try { + file_put_contents(_PS_MODULE_DIR_.TNTOfficiel_ShipmentHelper::BT_DIR.'/'.$strBTFilename, utf8_decode($strBTContent)); + Db::getInstance()->update( + 'tntofficiel_order', + array('bt_filename' => pSQL($strBTFilename), 'is_shipped' => true, 'previous_state' => (int)$order->current_state), + 'id_order = '.(int)$order->id + ); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + throw $objException; + } + } + + /** + * Saves the tracking url for each parcel. + * + * @param $tntParcels + * @param $orderId + * + * @throws Exception + */ + private function _saveTrackingUrls($tntParcels, $orderId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $sql = 'SELECT * FROM '._DB_PREFIX_.'tntofficiel_order_parcels where id_order = '.(int)$orderId; + $parcels = Db::getInstance()->executeS($sql); + $i = 0; + foreach ($tntParcels as $tntParcel) { + try { + Db::getInstance()->update( + 'tntofficiel_order_parcels', + array( + 'tracking_url' => pSQL($tntParcel['tracking_url']), + 'parcel_number' => pSQL($tntParcel['number']), + ), + 'id_parcel = '.pSQL($parcels[$i]['id_parcel']) + ); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + throw $objException; + } + ++$i; + } + } + + private function _savePickupNumber($pickupNumber, $orderId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $sql = 'SELECT * FROM '._DB_PREFIX_.'tntofficiel_order where id_order = '.(int)$orderId; + $orders = Db::getInstance()->executeS($sql); + foreach ($orders as $order) { + Db::getInstance()->update( + 'tntofficiel_order', + array('pickup_number' => pSQL($pickupNumber)), + 'id_tntofficiel_order = '.(int)$order['id_tntofficiel_order'] + ); + } + } + + /** + * Get the first available shipping date. + * + * @param $cart + * @param $intArgOrderID + * + * @return string|bool + * + * @throws Exception + */ + public function getShippingDate($intArgOrderID) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objOrder = new Order($intArgOrderID); + try { + $arrTNTOrder = TNTOfficiel_OrderHelper::getInstance()->getOrderData($intArgOrderID); + if ($arrTNTOrder['is_shipped']) { + throw new TNTOfficiel_OrderAlreadyShippedException('The shipment has already been created for the order ' + $intArgOrderID); + } + $arrTNTAddress = TNTOfficiel_AddressHelper::getInstance()->getAddressData($objOrder->id_address_delivery, $objOrder->id_cart); + $parcels = TNTOfficiel_ParcelsHelper::getInstance()->getParcels($intArgOrderID); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + throw $objException; + } + + //call the middleware + $arrParams = $this->_getParams( + $objOrder->id_shop, + $arrTNTOrder, + $arrTNTAddress, + $this->_getParcelsData($parcels, $objOrder->reference) + ); + $arrMDWResponse = $this->_callMiddlewareWithService($arrParams, 'getShippingDate'); + if (is_string($arrMDWResponse)) { + throw new PrestaShopException($arrMDWResponse); + } + + return $arrMDWResponse; + } + + /** + * Get the first available shipping date. + * + * @param $cart + * @param $orderId + * + * @return string|bool + * + * @throws Exception + */ + public function checkSaveShipmentDate($orderId, $shippingDate) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $order = new Order($orderId); + try { + $arrTNTOrder = TNTOfficiel_OrderHelper::getInstance()->getOrderData($orderId); + $arrTNTAddress = TNTOfficiel_AddressHelper::getInstance()->getAddressData($order->id_address_delivery, $order->id_cart); + $parcels = TNTOfficiel_ParcelsHelper::getInstance()->getParcels($orderId); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + throw $objException; + } + + //call the middleware + $arrParams = $this->_getParams( + $order->id_shop, + $arrTNTOrder, + $arrTNTAddress, + $this->_getParcelsData($parcels, $order->reference), + $shippingDate + ); + $arrMDWResponse = $this->_callMiddlewareWithService($arrParams, 'checkSaveShipment'); + + return $arrMDWResponse; + } + + public function getNewShippingDate($intArgOrderID) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrMDWShippingDate = TNTOfficiel_ShipmentHelper::getInstance()->getShippingDate($intArgOrderID); + //$shippingDatePrepa = $response['shippingDatePrepa']; + $shippingDatePrepa = $arrMDWShippingDate['shippingDate']; + + $arrMDWShippingDate = TNTOfficiel_ShipmentHelper::getInstance()->checkSaveShipmentDate($intArgOrderID, $shippingDatePrepa); + + if (!array_key_exists('shippingDate', $arrMDWShippingDate)) { + return false; + } + + return $arrMDWShippingDate; + } +} diff --git a/www/modules/tntofficiel/libraries/helper/TNTOfficiel_ShippingHelper.php b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_ShippingHelper.php new file mode 100644 index 00000000..f8a76076 --- /dev/null +++ b/www/modules/tntofficiel/libraries/helper/TNTOfficiel_ShippingHelper.php @@ -0,0 +1,119 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + +/** + * Class TNTOfficiel_ShippingHelper. + */ +class TNTOfficiel_ShippingHelper +{ + /** + * @var Singleton + */ + private static $_instance = null; + + /** + * Constructor. + */ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + } + + /** + * Creates a singleton. + * + * @param void + * + * @return TNTOfficiel_ShippingHelper + */ + public static function getInstance() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (is_null(TNTOfficiel_ShippingHelper::$_instance)) { + TNTOfficiel_ShippingHelper::$_instance = new TNTOfficiel_ShippingHelper(); + } + + return TNTOfficiel_ShippingHelper::$_instance; + } + + /** + * @var array + */ + protected $_days = array( + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + 'Sunday', + ); + + /** + * Returns an array with schedules for each days. + * + * @param array $params Parameters of the function + * + * @return array + */ + public function getSchedules(array $params = array()) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $schedules = array(); + + if ($hours = $params['hours']) { + $index = 0; + // Position corresponds to the number of the day + $position = 0; + // Current day + $day = null; + // Part of the day + $part = null; + + foreach ($hours as $hour) { + $hour = trim($hour); + $day = $this->_days[$position]; + + if (($index % 2 === 0) && ($index % 4 === 0)) { + $part = 'AM'; + } elseif (($index % 2 === 0) && ($index % 4 === 2)) { + $part = 'PM'; + } + + // Prepare the current Day + if (!isset($schedules[$day])) { + $schedules[$day] = array(); + } + + // Prepare the current period of the current dya + if (!isset($schedules[$day][$part]) && $hour) { + $schedules[$day][$part] = array(); + } + + // If hours different from 0 + if ($hour) { + // Add hour + $schedules[$day][$part][] = $hour; + } + + ++$index; + + if ($index % 4 == 0) { + ++$position; + } + } + } + + return $schedules; + } +} diff --git a/www/modules/tntofficiel/libraries/helper/index.php b/www/modules/tntofficiel/libraries/helper/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/libraries/helper/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/libraries/index.php b/www/modules/tntofficiel/libraries/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/libraries/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/libraries/pdf/TNTOfficiel_PDFMerger.php b/www/modules/tntofficiel/libraries/pdf/TNTOfficiel_PDFMerger.php new file mode 100644 index 00000000..047c042f --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/TNTOfficiel_PDFMerger.php @@ -0,0 +1,202 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +/** + * PDFMerger created by Jarrod Nettles December 2009 + * jarrod@squarecrow.com + * + * v1.0 + * + * Class for easily merging PDFs (or specific pages of PDFs) together into one. Output to a file, browser, download, or return as a string. + * Unfortunately, this class does not preserve many of the enhancements your original PDF might contain. It treats + * your PDF page as an image and then concatenates them all together. + * + * Note that your PDFs are merged in the order that you provide them using the addPDF function, same as the pages. + * If you put pages 12-14 before 1-5 then 12-15 will be placed first in the output. + * + * + * Uses FPDI 1.3.1 from Setasign + * Uses FPDF 1.6 by Olivier Plathey with FPDF_TPL extension 1.1.3 by Setasign + * + * Both of these packages are free and open source software, bundled with this class for ease of use. + * They are not modified in any way. PDFMerger has all the limitations of the FPDI package - essentially, it cannot import dynamic content + * such as form fields, links or page annotations (anything not a part of the page content stream). + * + */ +class TNTOfficiel_PDFMerger +{ + private $_files; //['form.pdf'] ["1,2,4, 5-19"] + private $_fpdi; + + /** + * Merge PDFs. + * @return void + */ + public function __construct() + { + require_once('fpdf/TNTOfficiel_FPDF.php'); + require_once('fpdi/TNTOfficiel_FPDI.php'); + } + + /** + * Add a PDF for inclusion in the merge with a valid file path. Pages should be formatted: 1,3,6, 12-16. + * @param $filepath + * @param $pages + * @return void + */ + public function addPDF($filepath, $pages = 'all') + { + if(file_exists($filepath)) + { + if(strtolower($pages) != 'all') + { + $pages = $this->_rewritepages($pages); + } + + $this->_files[] = array($filepath, $pages); + } + else + { + throw new exception("Could not locate PDF on '$filepath'"); + } + + return $this; + } + + /** + * Merges your provided PDFs and outputs to specified location. + * @param $outputmode + * @param $outputname + * @return PDF + */ + public function merge($outputmode = 'browser', $outputpath = 'newfile.pdf') + { + if(!isset($this->_files) || !is_array($this->_files)): throw new exception("No PDFs to merge."); endif; + + $fpdi = new TNTOfficiel_FPDI; + + //merger operations + foreach($this->_files as $file) + { + $filename = $file[0]; + $filepages = $file[1]; + + $count = $fpdi->setSourceFile($filename); + + //add the pages + if($filepages == 'all') + { + for($i=1; $i<=$count; $i++) + { + $template = $fpdi->importPage($i); + $size = $fpdi->getTemplateSize($template); + $orientation = ($size['h'] > $size['w']) ? 'P' : 'L'; + + $fpdi->AddPage($orientation, array($size['w'], $size['h'])); + $fpdi->useTemplate($template); + } + } + else + { + foreach($filepages as $page) + { + if(!$template = $fpdi->importPage($page)): throw new exception("Could not load page '$page' in PDF '$filename'. Check that the page exists."); endif; + $size = $fpdi->getTemplateSize($template); + $orientation = ($size['h'] > $size['w']) ? 'P' : 'L'; + + $fpdi->AddPage($orientation, array($size['w'], $size['h'])); + $fpdi->useTemplate($template); + } + } + } + + //output operations + $mode = $this->_switchmode($outputmode); + + if($mode == 'S') + { + return $fpdi->Output($outputpath, 'S'); + } + else + { + if($fpdi->Output($outputpath, $mode) == '') + { + return true; + } + else + { + throw new exception("Error outputting PDF to '$outputmode'."); + return false; + } + } + + + } + + /** + * FPDI uses single characters for specifying the output location. Change our more descriptive string into proper format. + * @param $mode + * @return Character + */ + private function _switchmode($mode) + { + switch(strtolower($mode)) + { + case 'download': + return 'D'; + break; + case 'browser': + return 'I'; + break; + case 'file': + return 'F'; + break; + case 'string': + return 'S'; + break; + default: + return 'I'; + break; + } + } + + /** + * Takes our provided pages in the form of 1,3,4,16-50 and creates an array of all pages + * @param $pages + * @return unknown_type + */ + private function _rewritepages($pages) + { + $pages = str_replace(' ', '', $pages); + $part = explode(',', $pages); + + //parse hyphens + foreach($part as $i) + { + $ind = explode('-', $i); + + if(count($ind) == 2) + { + $x = $ind[0]; //start page + $y = $ind[1]; //end page + + if($x > $y): throw new exception("Starting page, '$x' is greater than ending page '$y'."); return false; endif; + + //add middle pages + while($x <= $y): $newpages[] = (int) $x; $x++; endwhile; + } + else + { + $newpages[] = (int) $ind[0]; + } + } + + return $newpages; + } +} diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/TNTOfficiel_FPDF.php b/www/modules/tntofficiel/libraries/pdf/fpdf/TNTOfficiel_FPDF.php new file mode 100644 index 00000000..d2bab1ce --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/TNTOfficiel_FPDF.php @@ -0,0 +1,1641 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +/******************************************************************************* + * FPDF * + * * + * Version: 1.6 * + * Date: 2008-08-03 * + * Author: Olivier PLATHEY * + *******************************************************************************/ + +define('TNTOFFICIEL_FPDF_VERSION', '1.6'); + +class TNTOfficiel_FPDF +{ + var $page; // current page number + var $n; // current object number + var $offsets; // array of object offsets + var $buffer; // buffer holding in-memory PDF + var $pages; // array containing pages + var $state; // current document state + var $compress; // compression flag + var $k; // scale factor (number of points in user unit) + var $DefOrientation; // default orientation + var $CurOrientation; // current orientation + var $PageFormats; // available page formats + var $DefPageFormat; // default page format + var $CurPageFormat; // current page format + var $PageSizes; // array storing non-default page sizes + var $wPt, $hPt; // dimensions of current page in points + var $w, $h; // dimensions of current page in user unit + var $lMargin; // left margin + var $tMargin; // top margin + var $rMargin; // right margin + var $bMargin; // page break margin + var $cMargin; // cell margin + var $x, $y; // current position in user unit + var $lasth; // height of last printed cell + var $LineWidth; // line width in user unit + var $CoreFonts; // array of standard font names + var $fonts; // array of used fonts + var $FontFiles; // array of font files + var $diffs; // array of encoding differences + var $FontFamily; // current font family + var $FontStyle; // current font style + var $underline; // underlining flag + var $CurrentFont; // current font info + var $FontSizePt; // current font size in points + var $FontSize; // current font size in user unit + var $DrawColor; // commands for drawing color + var $FillColor; // commands for filling color + var $TextColor; // commands for text color + var $ColorFlag; // indicates whether fill and text colors are different + var $ws; // word spacing + var $images; // array of used images + var $PageLinks; // array of links in pages + var $links; // array of internal links + var $AutoPageBreak; // automatic page breaking + var $PageBreakTrigger; // threshold used to trigger page breaks + var $InHeader; // flag set when processing header + var $InFooter; // flag set when processing footer + var $ZoomMode; // zoom display mode + var $LayoutMode; // layout display mode + var $title; // title + var $subject; // subject + var $author; // author + var $keywords; // keywords + var $creator; // creator + var $AliasNbPages; // alias for total number of pages + var $PDFVersion; // PDF version number + + /******************************************************************************* + * * + * Public methods * + * * + *******************************************************************************/ + public function TNTOfficiel_FPDF($orientation = 'P', $unit = 'mm', $format = 'A4') + { + // Some checks + $this->_dochecks(); + // Initialization of properties + $this->page = 0; + $this->n = 2; + $this->buffer = ''; + $this->pages = array(); + $this->PageSizes = array(); + $this->state = 0; + $this->fonts = array(); + $this->FontFiles = array(); + $this->diffs = array(); + $this->images = array(); + $this->links = array(); + $this->InHeader = false; + $this->InFooter = false; + $this->lasth = 0; + $this->FontFamily = ''; + $this->FontStyle = ''; + $this->FontSizePt = 12; + $this->underline = false; + $this->DrawColor = '0 G'; + $this->FillColor = '0 g'; + $this->TextColor = '0 g'; + $this->ColorFlag = false; + $this->ws = 0; + // Standard fonts + $this->CoreFonts = array( + 'courier' => 'Courier', 'courierB' => 'Courier-Bold', 'courierI' => 'Courier-Oblique', 'courierBI' => 'Courier-BoldOblique', + 'helvetica' => 'Helvetica', 'helveticaB' => 'Helvetica-Bold', 'helveticaI' => 'Helvetica-Oblique', 'helveticaBI' => 'Helvetica-BoldOblique', + 'times' => 'Times-Roman', 'timesB' => 'Times-Bold', 'timesI' => 'Times-Italic', 'timesBI' => 'Times-BoldItalic', + 'symbol' => 'Symbol', 'zapfdingbats' => 'ZapfDingbats' + ); + // Scale factor + if ($unit == 'pt') + $this->k = 1; + elseif ($unit == 'mm') + $this->k = 72 / 25.4; + elseif ($unit == 'cm') + $this->k = 72 / 2.54; + elseif ($unit == 'in') + $this->k = 72; + else + $this->Error('Incorrect unit: '.$unit); + // Page format + $this->PageFormats = array( + 'a3' => array(841.89, 1190.55), 'a4' => array(595.28, 841.89), 'a5' => array(420.94, 595.28), + 'letter' => array(612, 792), 'legal' => array(612, 1008) + ); + if (is_string($format)) + $format = $this->_getpageformat($format); + $this->DefPageFormat = $format; + $this->CurPageFormat = $format; + // Page orientation + $orientation = strtolower($orientation); + if ($orientation == 'p' || $orientation == 'portrait') { + $this->DefOrientation = 'P'; + $this->w = $this->DefPageFormat[0]; + $this->h = $this->DefPageFormat[1]; + } elseif ($orientation == 'l' || $orientation == 'landscape') { + $this->DefOrientation = 'L'; + $this->w = $this->DefPageFormat[1]; + $this->h = $this->DefPageFormat[0]; + } else + $this->Error('Incorrect orientation: '.$orientation); + $this->CurOrientation = $this->DefOrientation; + $this->wPt = $this->w * $this->k; + $this->hPt = $this->h * $this->k; + // Page margins (1 cm) + $margin = 28.35 / $this->k; + $this->SetMargins($margin, $margin); + // Interior cell margin (1 mm) + $this->cMargin = $margin / 10; + // Line width (0.2 mm) + $this->LineWidth = .567 / $this->k; + // Automatic page break + $this->SetAutoPageBreak(true, 2 * $margin); + // Full width display mode + $this->SetDisplayMode('fullwidth'); + // Enable compression + $this->SetCompression(true); + // Set default PDF version number + $this->PDFVersion = '1.3'; + } + + public function SetMargins($left, $top, $right = null) + { + // Set left, top and right margins + $this->lMargin = $left; + $this->tMargin = $top; + if ($right === null) + $right = $left; + $this->rMargin = $right; + } + + public function SetLeftMargin($margin) + { + // Set left margin + $this->lMargin = $margin; + if ($this->page > 0 && $this->x < $margin) + $this->x = $margin; + } + + public function SetTopMargin($margin) + { + // Set top margin + $this->tMargin = $margin; + } + + public function SetRightMargin($margin) + { + // Set right margin + $this->rMargin = $margin; + } + + public function SetAutoPageBreak($auto, $margin = 0) + { + // Set auto page break mode and triggering margin + $this->AutoPageBreak = $auto; + $this->bMargin = $margin; + $this->PageBreakTrigger = $this->h - $margin; + } + + public function SetDisplayMode($zoom, $layout = 'continuous') + { + // Set display mode in viewer + if ($zoom == 'fullpage' || $zoom == 'fullwidth' || $zoom == 'real' || $zoom == 'default' || !is_string($zoom)) + $this->ZoomMode = $zoom; + else + $this->Error('Incorrect zoom display mode: '.$zoom); + if ($layout == 'single' || $layout == 'continuous' || $layout == 'two' || $layout == 'default') + $this->LayoutMode = $layout; + else + $this->Error('Incorrect layout display mode: '.$layout); + } + + public function SetCompression($compress) + { + // Set page compression + if (function_exists('gzcompress')) + $this->compress = $compress; + else + $this->compress = false; + } + + public function SetTitle($title, $isUTF8 = false) + { + // Title of document + if ($isUTF8) + $title = $this->_UTF8toUTF16($title); + $this->title = $title; + } + + public function SetSubject($subject, $isUTF8 = false) + { + // Subject of document + if ($isUTF8) + $subject = $this->_UTF8toUTF16($subject); + $this->subject = $subject; + } + + public function SetAuthor($author, $isUTF8 = false) + { + // Author of document + if ($isUTF8) + $author = $this->_UTF8toUTF16($author); + $this->author = $author; + } + + public function SetKeywords($keywords, $isUTF8 = false) + { + // Keywords of document + if ($isUTF8) + $keywords = $this->_UTF8toUTF16($keywords); + $this->keywords = $keywords; + } + + public function SetCreator($creator, $isUTF8 = false) + { + // Creator of document + if ($isUTF8) + $creator = $this->_UTF8toUTF16($creator); + $this->creator = $creator; + } + + public function AliasNbPages($alias = '{nb}') + { + // Define an alias for total number of pages + $this->AliasNbPages = $alias; + } + + public function Error($msg) + { + // Fatal error + die('TNTOfficiel_FPDF error: '.$msg); + } + + public function Open() + { + // Begin document + $this->state = 1; + } + + public function Close() + { + // Terminate document + if ($this->state == 3) + return; + if ($this->page == 0) + $this->AddPage(); + // Page footer + $this->InFooter = true; + $this->Footer(); + $this->InFooter = false; + // Close page + $this->_endpage(); + // Close document + $this->_enddoc(); + } + + public function AddPage($orientation = '', $format = '') + { + // Start a new page + if ($this->state == 0) + $this->Open(); + $family = $this->FontFamily; + $style = $this->FontStyle.($this->underline ? 'U' : ''); + $size = $this->FontSizePt; + $lw = $this->LineWidth; + $dc = $this->DrawColor; + $fc = $this->FillColor; + $tc = $this->TextColor; + $cf = $this->ColorFlag; + if ($this->page > 0) { + // Page footer + $this->InFooter = true; + $this->Footer(); + $this->InFooter = false; + // Close page + $this->_endpage(); + } + // Start new page + $this->_beginpage($orientation, $format); + // Set line cap style to square + $this->_out('2 J'); + // Set line width + $this->LineWidth = $lw; + $this->_out(sprintf('%.2F w', $lw * $this->k)); + // Set font + if ($family) + $this->SetFont($family, $style, $size); + // Set colors + $this->DrawColor = $dc; + if ($dc != '0 G') + $this->_out($dc); + $this->FillColor = $fc; + if ($fc != '0 g') + $this->_out($fc); + $this->TextColor = $tc; + $this->ColorFlag = $cf; + // Page header + $this->InHeader = true; + $this->Header(); + $this->InHeader = false; + // Restore line width + if ($this->LineWidth != $lw) { + $this->LineWidth = $lw; + $this->_out(sprintf('%.2F w', $lw * $this->k)); + } + // Restore font + if ($family) + $this->SetFont($family, $style, $size); + // Restore colors + if ($this->DrawColor != $dc) { + $this->DrawColor = $dc; + $this->_out($dc); + } + if ($this->FillColor != $fc) { + $this->FillColor = $fc; + $this->_out($fc); + } + $this->TextColor = $tc; + $this->ColorFlag = $cf; + } + + public function Header() + { + // To be implemented in your own inherited class + } + + public function Footer() + { + // To be implemented in your own inherited class + } + + public function PageNo() + { + // Get current page number + return $this->page; + } + + public function SetDrawColor($r, $g = null, $b = null) + { + // Set color for all stroking operations + if (($r == 0 && $g == 0 && $b == 0) || $g === null) + $this->DrawColor = sprintf('%.3F G', $r / 255); + else + $this->DrawColor = sprintf('%.3F %.3F %.3F RG', $r / 255, $g / 255, $b / 255); + if ($this->page > 0) + $this->_out($this->DrawColor); + } + + public function SetFillColor($r, $g = null, $b = null) + { + // Set color for all filling operations + if (($r == 0 && $g == 0 && $b == 0) || $g === null) + $this->FillColor = sprintf('%.3F g', $r / 255); + else + $this->FillColor = sprintf('%.3F %.3F %.3F rg', $r / 255, $g / 255, $b / 255); + $this->ColorFlag = ($this->FillColor != $this->TextColor); + if ($this->page > 0) + $this->_out($this->FillColor); + } + + public function SetTextColor($r, $g = null, $b = null) + { + // Set color for text + if (($r == 0 && $g == 0 && $b == 0) || $g === null) + $this->TextColor = sprintf('%.3F g', $r / 255); + else + $this->TextColor = sprintf('%.3F %.3F %.3F rg', $r / 255, $g / 255, $b / 255); + $this->ColorFlag = ($this->FillColor != $this->TextColor); + } + + public function GetStringWidth($s) + { + // Get width of a string in the current font + $s = (string)$s; + $cw =& $this->CurrentFont['cw']; + $w = 0; + $l = strlen($s); + for ($i = 0; $i < $l; $i++) + $w += $cw[ $s[ $i ] ]; + + return $w * $this->FontSize / 1000; + } + + public function SetLineWidth($width) + { + // Set line width + $this->LineWidth = $width; + if ($this->page > 0) + $this->_out(sprintf('%.2F w', $width * $this->k)); + } + + public function Line($x1, $y1, $x2, $y2) + { + // Draw a line + $this->_out(sprintf('%.2F %.2F m %.2F %.2F l S', $x1 * $this->k, ($this->h - $y1) * $this->k, $x2 * $this->k, ($this->h - $y2) * $this->k)); + } + + public function Rect($x, $y, $w, $h, $style = '') + { + // Draw a rectangle + if ($style == 'F') + $op = 'f'; + elseif ($style == 'FD' || $style == 'DF') + $op = 'B'; + else + $op = 'S'; + $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s', $x * $this->k, ($this->h - $y) * $this->k, $w * $this->k, -$h * $this->k, $op)); + } + + public function AddFont($family, $style = '', $file = '') + { + // Add a TrueType or Type1 font + $family = strtolower($family); + if ($file == '') + $file = str_replace(' ', '', $family).strtolower($style).'.php'; + if ($family == 'arial') + $family = 'helvetica'; + $style = strtoupper($style); + if ($style == 'IB') + $style = 'BI'; + $fontkey = $family.$style; + if (isset($this->fonts[ $fontkey ])) + return; + include($this->_getfontpath().$file); + if (!isset($name)) + $this->Error('Could not include font definition file'); + $i = count($this->fonts) + 1; + $this->fonts[ $fontkey ] = array('i' => $i, 'type' => $type, 'name' => $name, 'desc' => $desc, 'up' => $up, 'ut' => $ut, 'cw' => $cw, 'enc' => $enc, 'file' => $file); + if ($diff) { + // Search existing encodings + $d = 0; + $nb = count($this->diffs); + for ($i = 1; $i <= $nb; $i++) { + if ($this->diffs[ $i ] == $diff) { + $d = $i; + break; + } + } + if ($d == 0) { + $d = $nb + 1; + $this->diffs[ $d ] = $diff; + } + $this->fonts[ $fontkey ]['diff'] = $d; + } + if ($file) { + if ($type == 'TrueType') + $this->FontFiles[ $file ] = array('length1' => $originalsize); + else + $this->FontFiles[ $file ] = array('length1' => $size1, 'length2' => $size2); + } + } + + public function SetFont($family, $style = '', $size = 0) + { + // Select a font; size given in points + global $tntofficiel_fpdf_charwidths; + + $family = strtolower($family); + if ($family == '') + $family = $this->FontFamily; + if ($family == 'arial') + $family = 'helvetica'; + elseif ($family == 'symbol' || $family == 'zapfdingbats') + $style = ''; + $style = strtoupper($style); + if (strpos($style, 'U') !== false) { + $this->underline = true; + $style = str_replace('U', '', $style); + } else + $this->underline = false; + if ($style == 'IB') + $style = 'BI'; + if ($size == 0) + $size = $this->FontSizePt; + // Test if font is already selected + if ($this->FontFamily == $family && $this->FontStyle == $style && $this->FontSizePt == $size) + return; + // Test if used for the first time + $fontkey = $family.$style; + if (!isset($this->fonts[ $fontkey ])) { + // Check if one of the standard fonts + if (isset($this->CoreFonts[ $fontkey ])) { + if (!isset($tntofficiel_fpdf_charwidths[ $fontkey ])) { + // Load metric file + $file = $family; + if ($family == 'times' || $family == 'helvetica') + $file .= strtolower($style); + include($this->_getfontpath().$file.'.php'); + if (!isset($tntofficiel_fpdf_charwidths[ $fontkey ])) + $this->Error('Could not include font metric file'); + } + $i = count($this->fonts) + 1; + $name = $this->CoreFonts[ $fontkey ]; + $cw = $tntofficiel_fpdf_charwidths[ $fontkey ]; + $this->fonts[ $fontkey ] = array('i' => $i, 'type' => 'core', 'name' => $name, 'up' => -100, 'ut' => 50, 'cw' => $cw); + } else + $this->Error('Undefined font: '.$family.' '.$style); + } + // Select it + $this->FontFamily = $family; + $this->FontStyle = $style; + $this->FontSizePt = $size; + $this->FontSize = $size / $this->k; + $this->CurrentFont =& $this->fonts[ $fontkey ]; + if ($this->page > 0) + $this->_out(sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + } + + public function SetFontSize($size) + { + // Set font size in points + if ($this->FontSizePt == $size) + return; + $this->FontSizePt = $size; + $this->FontSize = $size / $this->k; + if ($this->page > 0) + $this->_out(sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + } + + public function AddLink() + { + // Create a new internal link + $n = count($this->links) + 1; + $this->links[ $n ] = array(0, 0); + + return $n; + } + + public function SetLink($link, $y = 0, $page = -1) + { + // Set destination of internal link + if ($y == -1) + $y = $this->y; + if ($page == -1) + $page = $this->page; + $this->links[ $link ] = array($page, $y); + } + + public function Link($x, $y, $w, $h, $link) + { + // Put a link on the page + $this->PageLinks[ $this->page ][] = array($x * $this->k, $this->hPt - $y * $this->k, $w * $this->k, $h * $this->k, $link); + } + + public function Text($x, $y, $txt) + { + // Output a string + $s = sprintf('BT %.2F %.2F Td (%s) Tj ET', $x * $this->k, ($this->h - $y) * $this->k, $this->_escape($txt)); + if ($this->underline && $txt != '') + $s .= ' '.$this->_dounderline($x, $y, $txt); + if ($this->ColorFlag) + $s = 'q '.$this->TextColor.' '.$s.' Q'; + $this->_out($s); + } + + public function AcceptPageBreak() + { + // Accept automatic page break or not + return $this->AutoPageBreak; + } + + public function Cell($w, $h = 0, $txt = '', $border = 0, $ln = 0, $align = '', $fill = false, $link = '') + { + // Output a cell + $k = $this->k; + if ($this->y + $h > $this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) { + // Automatic page break + $x = $this->x; + $ws = $this->ws; + if ($ws > 0) { + $this->ws = 0; + $this->_out('0 Tw'); + } + $this->AddPage($this->CurOrientation, $this->CurPageFormat); + $this->x = $x; + if ($ws > 0) { + $this->ws = $ws; + $this->_out(sprintf('%.3F Tw', $ws * $k)); + } + } + if ($w == 0) + $w = $this->w - $this->rMargin - $this->x; + $s = ''; + if ($fill || $border == 1) { + if ($fill) + $op = ($border == 1) ? 'B' : 'f'; + else + $op = 'S'; + $s = sprintf('%.2F %.2F %.2F %.2F re %s ', $this->x * $k, ($this->h - $this->y) * $k, $w * $k, -$h * $k, $op); + } + if (is_string($border)) { + $x = $this->x; + $y = $this->y; + if (strpos($border, 'L') !== false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ', $x * $k, ($this->h - $y) * $k, $x * $k, ($this->h - ($y + $h)) * $k); + if (strpos($border, 'T') !== false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ', $x * $k, ($this->h - $y) * $k, ($x + $w) * $k, ($this->h - $y) * $k); + if (strpos($border, 'R') !== false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ', ($x + $w) * $k, ($this->h - $y) * $k, ($x + $w) * $k, ($this->h - ($y + $h)) * $k); + if (strpos($border, 'B') !== false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ', $x * $k, ($this->h - ($y + $h)) * $k, ($x + $w) * $k, ($this->h - ($y + $h)) * $k); + } + if ($txt !== '') { + if ($align == 'R') + $dx = $w - $this->cMargin - $this->GetStringWidth($txt); + elseif ($align == 'C') + $dx = ($w - $this->GetStringWidth($txt)) / 2; + else + $dx = $this->cMargin; + if ($this->ColorFlag) + $s .= 'q '.$this->TextColor.' '; + $txt2 = str_replace(')', '\\)', str_replace('(', '\\(', str_replace('\\', '\\\\', $txt))); + $s .= sprintf('BT %.2F %.2F Td (%s) Tj ET', ($this->x + $dx) * $k, ($this->h - ($this->y + .5 * $h + .3 * $this->FontSize)) * $k, $txt2); + if ($this->underline) + $s .= ' '.$this->_dounderline($this->x + $dx, $this->y + .5 * $h + .3 * $this->FontSize, $txt); + if ($this->ColorFlag) + $s .= ' Q'; + if ($link) + $this->Link($this->x + $dx, $this->y + .5 * $h - .5 * $this->FontSize, $this->GetStringWidth($txt), $this->FontSize, $link); + } + if ($s) + $this->_out($s); + $this->lasth = $h; + if ($ln > 0) { + // Go to next line + $this->y += $h; + if ($ln == 1) + $this->x = $this->lMargin; + } else + $this->x += $w; + } + + public function MultiCell($w, $h, $txt, $border = 0, $align = 'J', $fill = false) + { + // Output text with automatic or explicit line breaks + $cw =& $this->CurrentFont['cw']; + if ($w == 0) + $w = $this->w - $this->rMargin - $this->x; + $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize; + $s = str_replace("\r", '', $txt); + $nb = strlen($s); + if ($nb > 0 && $s[ $nb - 1 ] == "\n") + $nb--; + $b = 0; + if ($border) { + if ($border == 1) { + $border = 'LTRB'; + $b = 'LRT'; + $b2 = 'LR'; + } else { + $b2 = ''; + if (strpos($border, 'L') !== false) + $b2 .= 'L'; + if (strpos($border, 'R') !== false) + $b2 .= 'R'; + $b = (strpos($border, 'T') !== false) ? $b2.'T' : $b2; + } + } + $sep = -1; + $i = 0; + $j = 0; + $l = 0; + $ns = 0; + $nl = 1; + while ($i < $nb) { + // Get next character + $c = $s[ $i ]; + if ($c == "\n") { + // Explicit line break + if ($this->ws > 0) { + $this->ws = 0; + $this->_out('0 Tw'); + } + $this->Cell($w, $h, substr($s, $j, $i - $j), $b, 2, $align, $fill); + $i++; + $sep = -1; + $j = $i; + $l = 0; + $ns = 0; + $nl++; + if ($border && $nl == 2) + $b = $b2; + continue; + } + if ($c == ' ') { + $sep = $i; + $ls = $l; + $ns++; + } + $l += $cw[ $c ]; + if ($l > $wmax) { + // Automatic line break + if ($sep == -1) { + if ($i == $j) + $i++; + if ($this->ws > 0) { + $this->ws = 0; + $this->_out('0 Tw'); + } + $this->Cell($w, $h, substr($s, $j, $i - $j), $b, 2, $align, $fill); + } else { + if ($align == 'J') { + $this->ws = ($ns > 1) ? ($wmax - $ls) / 1000 * $this->FontSize / ($ns - 1) : 0; + $this->_out(sprintf('%.3F Tw', $this->ws * $this->k)); + } + $this->Cell($w, $h, substr($s, $j, $sep - $j), $b, 2, $align, $fill); + $i = $sep + 1; + } + $sep = -1; + $j = $i; + $l = 0; + $ns = 0; + $nl++; + if ($border && $nl == 2) + $b = $b2; + } else + $i++; + } + // Last chunk + if ($this->ws > 0) { + $this->ws = 0; + $this->_out('0 Tw'); + } + if ($border && strpos($border, 'B') !== false) + $b .= 'B'; + $this->Cell($w, $h, substr($s, $j, $i - $j), $b, 2, $align, $fill); + $this->x = $this->lMargin; + } + + public function Write($h, $txt, $link = '') + { + // Output text in flowing mode + $cw =& $this->CurrentFont['cw']; + $w = $this->w - $this->rMargin - $this->x; + $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize; + $s = str_replace("\r", '', $txt); + $nb = strlen($s); + $sep = -1; + $i = 0; + $j = 0; + $l = 0; + $nl = 1; + while ($i < $nb) { + // Get next character + $c = $s[ $i ]; + if ($c == "\n") { + // Explicit line break + $this->Cell($w, $h, substr($s, $j, $i - $j), 0, 2, '', 0, $link); + $i++; + $sep = -1; + $j = $i; + $l = 0; + if ($nl == 1) { + $this->x = $this->lMargin; + $w = $this->w - $this->rMargin - $this->x; + $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize; + } + $nl++; + continue; + } + if ($c == ' ') + $sep = $i; + $l += $cw[ $c ]; + if ($l > $wmax) { + // Automatic line break + if ($sep == -1) { + if ($this->x > $this->lMargin) { + // Move to next line + $this->x = $this->lMargin; + $this->y += $h; + $w = $this->w - $this->rMargin - $this->x; + $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize; + $i++; + $nl++; + continue; + } + if ($i == $j) + $i++; + $this->Cell($w, $h, substr($s, $j, $i - $j), 0, 2, '', 0, $link); + } else { + $this->Cell($w, $h, substr($s, $j, $sep - $j), 0, 2, '', 0, $link); + $i = $sep + 1; + } + $sep = -1; + $j = $i; + $l = 0; + if ($nl == 1) { + $this->x = $this->lMargin; + $w = $this->w - $this->rMargin - $this->x; + $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize; + } + $nl++; + } else + $i++; + } + // Last chunk + if ($i != $j) + $this->Cell($l / 1000 * $this->FontSize, $h, substr($s, $j), 0, 0, '', 0, $link); + } + + public function Ln($h = null) + { + // Line feed; default value is last cell height + $this->x = $this->lMargin; + if ($h === null) + $this->y += $this->lasth; + else + $this->y += $h; + } + + public function Image($file, $x = null, $y = null, $w = 0, $h = 0, $type = '', $link = '') + { + // Put an image on the page + if (!isset($this->images[ $file ])) { + // First use of this image, get info + if ($type == '') { + $pos = strrpos($file, '.'); + if (!$pos) + $this->Error('Image file has no extension and no type was specified: '.$file); + $type = substr($file, $pos + 1); + } + $type = strtolower($type); + if ($type == 'jpeg') + $type = 'jpg'; + $mtd = '_parse'.$type; + if (!method_exists($this, $mtd)) + $this->Error('Unsupported image type: '.$type); + $info = $this->$mtd($file); + $info['i'] = count($this->images) + 1; + $this->images[ $file ] = $info; + } else + $info = $this->images[ $file ]; + // Automatic width and height calculation if needed + if ($w == 0 && $h == 0) { + // Put image at 72 dpi + $w = $info['w'] / $this->k; + $h = $info['h'] / $this->k; + } elseif ($w == 0) + $w = $h * $info['w'] / $info['h']; + elseif ($h == 0) + $h = $w * $info['h'] / $info['w']; + // Flowing mode + if ($y === null) { + if ($this->y + $h > $this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) { + // Automatic page break + $x2 = $this->x; + $this->AddPage($this->CurOrientation, $this->CurPageFormat); + $this->x = $x2; + } + $y = $this->y; + $this->y += $h; + } + if ($x === null) + $x = $this->x; + $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q', $w * $this->k, $h * $this->k, $x * $this->k, ($this->h - ($y + $h)) * $this->k, $info['i'])); + if ($link) + $this->Link($x, $y, $w, $h, $link); + } + + public function GetX() + { + // Get x position + return $this->x; + } + + public function SetX($x) + { + // Set x position + if ($x >= 0) + $this->x = $x; + else + $this->x = $this->w + $x; + } + + public function GetY() + { + // Get y position + return $this->y; + } + + public function SetY($y) + { + // Set y position and reset x + $this->x = $this->lMargin; + if ($y >= 0) + $this->y = $y; + else + $this->y = $this->h + $y; + } + + public function SetXY($x, $y) + { + // Set x and y positions + $this->SetY($y); + $this->SetX($x); + } + + public function Output($name = '', $dest = '') + { + // Output PDF to some destination + if ($this->state < 3) + $this->Close(); + $dest = strtoupper($dest); + if ($dest == '') { + if ($name == '') { + $name = 'doc.pdf'; + $dest = 'I'; + } else + $dest = 'F'; + } + switch ($dest) { + case 'I': + // Send to standard output + if (ob_get_length()) + $this->Error('Some data has already been output, can\'t send PDF file'); + if (php_sapi_name() != 'cli') { + // We send to a browser + header('Content-Type: application/pdf'); + if (headers_sent()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Length: '.strlen($this->buffer)); + header('Content-Disposition: inline; filename="'.$name.'"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + ini_set('zlib.output_compression', '0'); + } + echo $this->buffer; + break; + case 'D': + // Download file + if (ob_get_length()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Type: application/x-download'); + if (headers_sent()) + $this->Error('Some data has already been output, can\'t send PDF file'); + header('Content-Length: '.strlen($this->buffer)); + header('Content-Disposition: attachment; filename="'.$name.'"'); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + ini_set('zlib.output_compression', '0'); + echo $this->buffer; + break; + case 'F': + // Save to local file + $f = fopen($name, 'wb'); + if (!$f) + $this->Error('Unable to create output file: '.$name); + fwrite($f, $this->buffer, strlen($this->buffer)); + fclose($f); + break; + case 'S': + // Return as a string + return $this->buffer; + default: + $this->Error('Incorrect output destination: '.$dest); + } + + return ''; + } + + /******************************************************************************* + * * + * Protected methods * + * * + *******************************************************************************/ + public function _dochecks() + { + // Check availability of %F + if (sprintf('%.1F', 1.0) != '1.0') + $this->Error('This version of PHP is not supported'); + // Check mbstring overloading + if (ini_get('mbstring.func_overload') & 2) + $this->Error('mbstring overloading must be disabled'); + } + + public function _getpageformat($format) + { + $format = strtolower($format); + if (!isset($this->PageFormats[ $format ])) + $this->Error('Unknown page format: '.$format); + $a = $this->PageFormats[ $format ]; + + return array($a[0] / $this->k, $a[1] / $this->k); + } + + public function _getfontpath() + { + if (!defined('TNTOFFICIEL_FPDF_FONTPATH') && is_dir(dirname(__FILE__).'/font')) + define('TNTOFFICIEL_FPDF_FONTPATH', dirname(__FILE__).'/font/'); + + return defined('TNTOFFICIEL_FPDF_FONTPATH') ? TNTOFFICIEL_FPDF_FONTPATH : ''; + } + + public function _beginpage($orientation, $format) + { + $this->page++; + $this->pages[ $this->page ] = ''; + $this->state = 2; + $this->x = $this->lMargin; + $this->y = $this->tMargin; + $this->FontFamily = ''; + // Check page size + if ($orientation == '') + $orientation = $this->DefOrientation; + else + $orientation = strtoupper($orientation[0]); + if ($format == '') + $format = $this->DefPageFormat; + else { + if (is_string($format)) + $format = $this->_getpageformat($format); + } + if ($orientation != $this->CurOrientation || $format[0] != $this->CurPageFormat[0] || $format[1] != $this->CurPageFormat[1]) { + // New size + if ($orientation == 'P') { + $this->w = $format[0]; + $this->h = $format[1]; + } else { + $this->w = $format[1]; + $this->h = $format[0]; + } + $this->wPt = $this->w * $this->k; + $this->hPt = $this->h * $this->k; + $this->PageBreakTrigger = $this->h - $this->bMargin; + $this->CurOrientation = $orientation; + $this->CurPageFormat = $format; + } + if ($orientation != $this->DefOrientation || $format[0] != $this->DefPageFormat[0] || $format[1] != $this->DefPageFormat[1]) + $this->PageSizes[ $this->page ] = array($this->wPt, $this->hPt); + } + + public function _endpage() + { + $this->state = 1; + } + + public function _escape($s) + { + // Escape special characters in strings + $s = str_replace('\\', '\\\\', $s); + $s = str_replace('(', '\\(', $s); + $s = str_replace(')', '\\)', $s); + $s = str_replace("\r", '\\r', $s); + + return $s; + } + + public function _textstring($s) + { + // Format a text string + return '('.$this->_escape($s).')'; + } + + public function _UTF8toUTF16($s) + { + // Convert UTF-8 to UTF-16BE with BOM + $res = "\xFE\xFF"; + $nb = strlen($s); + $i = 0; + while ($i < $nb) { + $c1 = ord($s[ $i++ ]); + if ($c1 >= 224) { + // 3-byte character + $c2 = ord($s[ $i++ ]); + $c3 = ord($s[ $i++ ]); + $res .= chr((($c1 & 0x0F) << 4) + (($c2 & 0x3C) >> 2)); + $res .= chr((($c2 & 0x03) << 6) + ($c3 & 0x3F)); + } elseif ($c1 >= 192) { + // 2-byte character + $c2 = ord($s[ $i++ ]); + $res .= chr(($c1 & 0x1C) >> 2); + $res .= chr((($c1 & 0x03) << 6) + ($c2 & 0x3F)); + } else { + // Single-byte character + $res .= "\0".chr($c1); + } + } + + return $res; + } + + public function _dounderline($x, $y, $txt) + { + // Underline text + $up = $this->CurrentFont['up']; + $ut = $this->CurrentFont['ut']; + $w = $this->GetStringWidth($txt) + $this->ws * substr_count($txt, ' '); + + return sprintf('%.2F %.2F %.2F %.2F re f', $x * $this->k, ($this->h - ($y - $up / 1000 * $this->FontSize)) * $this->k, $w * $this->k, -$ut / 1000 * $this->FontSizePt); + } + + public function _parsejpg($file) + { + // Extract info from a JPEG file + $a = GetImageSize($file); + if (!$a) + $this->Error('Missing or incorrect image file: '.$file); + if ($a[2] != 2) + $this->Error('Not a JPEG file: '.$file); + if (!isset($a['channels']) || $a['channels'] == 3) + $colspace = 'DeviceRGB'; + elseif ($a['channels'] == 4) + $colspace = 'DeviceCMYK'; + else + $colspace = 'DeviceGray'; + $bpc = isset($a['bits']) ? $a['bits'] : 8; + // Read whole file + $f = fopen($file, 'rb'); + $data = ''; + while (!feof($f)) + $data .= fread($f, 8192); + fclose($f); + + return array('w' => $a[0], 'h' => $a[1], 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'DCTDecode', 'data' => $data); + } + + public function _parsepng($file) + { + // Extract info from a PNG file + $f = fopen($file, 'rb'); + if (!$f) + $this->Error('Can\'t open image file: '.$file); + // Check signature + if ($this->_readstream($f, 8) != chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) + $this->Error('Not a PNG file: '.$file); + // Read header chunk + $this->_readstream($f, 4); + if ($this->_readstream($f, 4) != 'IHDR') + $this->Error('Incorrect PNG file: '.$file); + $w = $this->_readint($f); + $h = $this->_readint($f); + $bpc = ord($this->_readstream($f, 1)); + if ($bpc > 8) + $this->Error('16-bit depth not supported: '.$file); + $ct = ord($this->_readstream($f, 1)); + if ($ct == 0) + $colspace = 'DeviceGray'; + elseif ($ct == 2) + $colspace = 'DeviceRGB'; + elseif ($ct == 3) + $colspace = 'Indexed'; + else + $this->Error('Alpha channel not supported: '.$file); + if (ord($this->_readstream($f, 1)) != 0) + $this->Error('Unknown compression method: '.$file); + if (ord($this->_readstream($f, 1)) != 0) + $this->Error('Unknown filter method: '.$file); + if (ord($this->_readstream($f, 1)) != 0) + $this->Error('Interlacing not supported: '.$file); + $this->_readstream($f, 4); + $parms = '/DecodeParms <>'; + // Scan chunks looking for palette, transparency and image data + $pal = ''; + $trns = ''; + $data = ''; + do { + $n = $this->_readint($f); + $type = $this->_readstream($f, 4); + if ($type == 'PLTE') { + // Read palette + $pal = $this->_readstream($f, $n); + $this->_readstream($f, 4); + } elseif ($type == 'tRNS') { + // Read transparency info + $t = $this->_readstream($f, $n); + if ($ct == 0) + $trns = array(ord(substr($t, 1, 1))); + elseif ($ct == 2) + $trns = array(ord(substr($t, 1, 1)), ord(substr($t, 3, 1)), ord(substr($t, 5, 1))); + else { + $pos = strpos($t, chr(0)); + if ($pos !== false) + $trns = array($pos); + } + $this->_readstream($f, 4); + } elseif ($type == 'IDAT') { + // Read image data block + $data .= $this->_readstream($f, $n); + $this->_readstream($f, 4); + } elseif ($type == 'IEND') + break; + else + $this->_readstream($f, $n + 4); + } while ($n); + if ($colspace == 'Indexed' && empty($pal)) + $this->Error('Missing palette in '.$file); + fclose($f); + + return array('w' => $w, 'h' => $h, 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'FlateDecode', 'parms' => $parms, 'pal' => $pal, 'trns' => $trns, 'data' => $data); + } + + public function _readstream($f, $n) + { + // Read n bytes from stream + $res = ''; + while ($n > 0 && !feof($f)) { + $s = fread($f, $n); + if ($s === false) + $this->Error('Error while reading stream'); + $n -= strlen($s); + $res .= $s; + } + if ($n > 0) + $this->Error('Unexpected end of stream'); + + return $res; + } + + public function _readint($f) + { + // Read a 4-byte integer from stream + $a = unpack('Ni', $this->_readstream($f, 4)); + + return $a['i']; + } + + public function _parsegif($file) + { + // Extract info from a GIF file (via PNG conversion) + if (!function_exists('imagepng')) + $this->Error('GD extension is required for GIF support'); + if (!function_exists('imagecreatefromgif')) + $this->Error('GD has no GIF read support'); + $im = imagecreatefromgif($file); + if (!$im) + $this->Error('Missing or incorrect image file: '.$file); + imageinterlace($im, 0); + $tmp = tempnam('.', 'gif'); + if (!$tmp) + $this->Error('Unable to create a temporary file'); + if (!imagepng($im, $tmp)) + $this->Error('Error while saving to temporary file'); + imagedestroy($im); + $info = $this->_parsepng($tmp); + unlink($tmp); + + return $info; + } + + public function _newobj() + { + // Begin a new object + $this->n++; + $this->offsets[ $this->n ] = strlen($this->buffer); + $this->_out($this->n.' 0 obj'); + } + + public function _putstream($s) + { + $this->_out('stream'); + $this->_out($s); + $this->_out('endstream'); + } + + public function _out($s) + { + // Add a line to the document + if ($this->state == 2) + $this->pages[ $this->page ] .= $s."\n"; + else + $this->buffer .= $s."\n"; + } + + public function _putpages() + { + $nb = $this->page; + if (!empty($this->AliasNbPages)) { + // Replace number of pages + for ($n = 1; $n <= $nb; $n++) + $this->pages[ $n ] = str_replace($this->AliasNbPages, $nb, $this->pages[ $n ]); + } + if ($this->DefOrientation == 'P') { + $wPt = $this->DefPageFormat[0] * $this->k; + $hPt = $this->DefPageFormat[1] * $this->k; + } else { + $wPt = $this->DefPageFormat[1] * $this->k; + $hPt = $this->DefPageFormat[0] * $this->k; + } + $filter = ($this->compress) ? '/Filter /FlateDecode ' : ''; + for ($n = 1; $n <= $nb; $n++) { + // Page + $this->_newobj(); + $this->_out('<_out('/Parent 1 0 R'); + if (isset($this->PageSizes[ $n ])) + $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]', $this->PageSizes[ $n ][0], $this->PageSizes[ $n ][1])); + $this->_out('/Resources 2 0 R'); + if (isset($this->PageLinks[ $n ])) { + // Links + $annots = '/Annots ['; + foreach ($this->PageLinks[ $n ] as $pl) { + $rect = sprintf('%.2F %.2F %.2F %.2F', $pl[0], $pl[1], $pl[0] + $pl[2], $pl[1] - $pl[3]); + $annots .= '<_textstring($pl[4]).'>>>>'; + else { + $l = $this->links[ $pl[4] ]; + $h = isset($this->PageSizes[ $l[0] ]) ? $this->PageSizes[ $l[0] ][1] : $hPt; + $annots .= sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>', 1 + 2 * $l[0], $h - $l[1] * $this->k); + } + } + $this->_out($annots.']'); + } + $this->_out('/Contents '.($this->n + 1).' 0 R>>'); + $this->_out('endobj'); + // Page content + $p = ($this->compress) ? gzcompress($this->pages[ $n ]) : $this->pages[ $n ]; + $this->_newobj(); + $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); + $this->_putstream($p); + $this->_out('endobj'); + } + // Pages root + $this->offsets[1] = strlen($this->buffer); + $this->_out('1 0 obj'); + $this->_out('<_out($kids.']'); + $this->_out('/Count '.$nb); + $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]', $wPt, $hPt)); + $this->_out('>>'); + $this->_out('endobj'); + } + + public function _putfonts() + { + $nf = $this->n; + foreach ($this->diffs as $diff) { + // Encodings + $this->_newobj(); + $this->_out('<>'); + $this->_out('endobj'); + } + foreach ($this->FontFiles as $file => $info) { + // Font file embedding + $this->_newobj(); + $this->FontFiles[ $file ]['n'] = $this->n; + $font = ''; + $f = fopen($this->_getfontpath().$file, 'rb', 1); + if (!$f) + $this->Error('Font file not found'); + while (!feof($f)) + $font .= fread($f, 8192); + fclose($f); + $compressed = (substr($file, -2) == '.z'); + if (!$compressed && isset($info['length2'])) { + $header = (ord($font[0]) == 128); + if ($header) { + // Strip first binary header + $font = substr($font, 6); + } + if ($header && ord($font[ $info['length1'] ]) == 128) { + // Strip second binary header + $font = substr($font, 0, $info['length1']).substr($font, $info['length1'] + 6); + } + } + $this->_out('<_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$info['length1']); + if (isset($info['length2'])) + $this->_out('/Length2 '.$info['length2'].' /Length3 0'); + $this->_out('>>'); + $this->_putstream($font); + $this->_out('endobj'); + } + foreach ($this->fonts as $k => $font) { + // Font objects + $this->fonts[ $k ]['n'] = $this->n + 1; + $type = $font['type']; + $name = $font['name']; + if ($type == 'core') { + // Standard font + $this->_newobj(); + $this->_out('<_out('/BaseFont /'.$name); + $this->_out('/Subtype /Type1'); + if ($name != 'Symbol' && $name != 'ZapfDingbats') + $this->_out('/Encoding /WinAnsiEncoding'); + $this->_out('>>'); + $this->_out('endobj'); + } elseif ($type == 'Type1' || $type == 'TrueType') { + // Additional Type1 or TrueType font + $this->_newobj(); + $this->_out('<_out('/BaseFont /'.$name); + $this->_out('/Subtype /'.$type); + $this->_out('/FirstChar 32 /LastChar 255'); + $this->_out('/Widths '.($this->n + 1).' 0 R'); + $this->_out('/FontDescriptor '.($this->n + 2).' 0 R'); + if ($font['enc']) { + if (isset($font['diff'])) + $this->_out('/Encoding '.($nf + $font['diff']).' 0 R'); + else + $this->_out('/Encoding /WinAnsiEncoding'); + } + $this->_out('>>'); + $this->_out('endobj'); + // Widths + $this->_newobj(); + $cw =& $font['cw']; + $s = '['; + for ($i = 32; $i <= 255; $i++) + $s .= $cw[ chr($i) ].' '; + $this->_out($s.']'); + $this->_out('endobj'); + // Descriptor + $this->_newobj(); + $s = '< $v) + $s .= ' /'.$k.' '.$v; + $file = $font['file']; + if ($file) + $s .= ' /FontFile'.($type == 'Type1' ? '' : '2').' '.$this->FontFiles[ $file ]['n'].' 0 R'; + $this->_out($s.'>>'); + $this->_out('endobj'); + } else { + // Allow for additional types + $mtd = '_put'.strtolower($type); + if (!method_exists($this, $mtd)) + $this->Error('Unsupported font type: '.$type); + $this->$mtd($font); + } + } + } + + public function _putimages() + { + $filter = ($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->images); + while (list($file, $info) = each($this->images)) { + $this->_newobj(); + $this->images[ $file ]['n'] = $this->n; + $this->_out('<_out('/Subtype /Image'); + $this->_out('/Width '.$info['w']); + $this->_out('/Height '.$info['h']); + if ($info['cs'] == 'Indexed') + $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal']) / 3 - 1).' '.($this->n + 1).' 0 R]'); + else { + $this->_out('/ColorSpace /'.$info['cs']); + if ($info['cs'] == 'DeviceCMYK') + $this->_out('/Decode [1 0 1 0 1 0 1 0]'); + } + $this->_out('/BitsPerComponent '.$info['bpc']); + if (isset($info['f'])) + $this->_out('/Filter /'.$info['f']); + if (isset($info['parms'])) + $this->_out($info['parms']); + if (isset($info['trns']) && is_array($info['trns'])) { + $trns = ''; + for ($i = 0; $i < count($info['trns']); $i++) + $trns .= $info['trns'][ $i ].' '.$info['trns'][ $i ].' '; + $this->_out('/Mask ['.$trns.']'); + } + $this->_out('/Length '.strlen($info['data']).'>>'); + $this->_putstream($info['data']); + unset($this->images[ $file ]['data']); + $this->_out('endobj'); + // Palette + if ($info['cs'] == 'Indexed') { + $this->_newobj(); + $pal = ($this->compress) ? gzcompress($info['pal']) : $info['pal']; + $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); + $this->_putstream($pal); + $this->_out('endobj'); + } + } + } + + public function _putxobjectdict() + { + foreach ($this->images as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); + } + + public function _putresourcedict() + { + $this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + $this->_out('/Font <<'); + foreach ($this->fonts as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + $this->_out('/XObject <<'); + $this->_putxobjectdict(); + $this->_out('>>'); + } + + public function _putresources() + { + $this->_putfonts(); + $this->_putimages(); + // Resource dictionary + $this->offsets[2] = strlen($this->buffer); + $this->_out('2 0 obj'); + $this->_out('<<'); + $this->_putresourcedict(); + $this->_out('>>'); + $this->_out('endobj'); + } + + public function _putinfo() + { + $this->_out('/Producer '.$this->_textstring('FPDF '.TNTOFFICIEL_FPDF_VERSION)); + if (!empty($this->title)) + $this->_out('/Title '.$this->_textstring($this->title)); + if (!empty($this->subject)) + $this->_out('/Subject '.$this->_textstring($this->subject)); + if (!empty($this->author)) + $this->_out('/Author '.$this->_textstring($this->author)); + if (!empty($this->keywords)) + $this->_out('/Keywords '.$this->_textstring($this->keywords)); + if (!empty($this->creator)) + $this->_out('/Creator '.$this->_textstring($this->creator)); + $this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis'))); + } + + public function _putcatalog() + { + $this->_out('/Type /Catalog'); + $this->_out('/Pages 1 0 R'); + if ($this->ZoomMode == 'fullpage') + $this->_out('/OpenAction [3 0 R /Fit]'); + elseif ($this->ZoomMode == 'fullwidth') + $this->_out('/OpenAction [3 0 R /FitH null]'); + elseif ($this->ZoomMode == 'real') + $this->_out('/OpenAction [3 0 R /XYZ null null 1]'); + elseif (!is_string($this->ZoomMode)) + $this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode / 100).']'); + if ($this->LayoutMode == 'single') + $this->_out('/PageLayout /SinglePage'); + elseif ($this->LayoutMode == 'continuous') + $this->_out('/PageLayout /OneColumn'); + elseif ($this->LayoutMode == 'two') + $this->_out('/PageLayout /TwoColumnLeft'); + } + + public function _putheader() + { + $this->_out('%PDF-'.$this->PDFVersion); + } + + public function _puttrailer() + { + $this->_out('/Size '.($this->n + 1)); + $this->_out('/Root '.$this->n.' 0 R'); + $this->_out('/Info '.($this->n - 1).' 0 R'); + } + + public function _enddoc() + { + $this->_putheader(); + $this->_putpages(); + $this->_putresources(); + // Info + $this->_newobj(); + $this->_out('<<'); + $this->_putinfo(); + $this->_out('>>'); + $this->_out('endobj'); + // Catalog + $this->_newobj(); + $this->_out('<<'); + $this->_putcatalog(); + $this->_out('>>'); + $this->_out('endobj'); + // Cross-ref + $o = strlen($this->buffer); + $this->_out('xref'); + $this->_out('0 '.($this->n + 1)); + $this->_out('0000000000 65535 f '); + for ($i = 1; $i <= $this->n; $i++) + $this->_out(sprintf('%010d 00000 n ', $this->offsets[ $i ])); + // Trailer + $this->_out('trailer'); + $this->_out('<<'); + $this->_puttrailer(); + $this->_out('>>'); + $this->_out('startxref'); + $this->_out($o); + $this->_out('%%EOF'); + $this->state = 3; + } +// End of class +} + +// Handle special IE contype request +if (isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT'] == 'contype') { + header('Content-Type: application/pdf'); + exit; +} diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/courier.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/courier.php new file mode 100644 index 00000000..b57fad7c --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/courier.php @@ -0,0 +1,15 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +for ($i=0;$i<=255;$i++) { + $tntofficiel_fpdf_charwidths['courier'][chr($i)]=600; +} +$tntofficiel_fpdf_charwidths['courierB']=$tntofficiel_fpdf_charwidths['courier']; +$tntofficiel_fpdf_charwidths['courierI']=$tntofficiel_fpdf_charwidths['courier']; +$tntofficiel_fpdf_charwidths['courierBI']=$tntofficiel_fpdf_charwidths['courier']; diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/helvetica.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/helvetica.php new file mode 100644 index 00000000..a1649e45 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/helvetica.php @@ -0,0 +1,43 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$tntofficiel_fpdf_charwidths['helvetica'] = array( + chr(0) => 278, chr(1) => 278, chr(2) => 278, chr(3) => 278, chr(4) => 278, chr(5) => 278, chr(6) => 278, chr(7) => 278, + chr(8) => 278, chr(9) => 278, chr(10) => 278, chr(11) => 278, chr(12) => 278, chr(13) => 278, chr(14) => 278, chr(15) => 278, + chr(16) => 278, chr(17) => 278, chr(18) => 278, chr(19) => 278, chr(20) => 278, chr(21) => 278, chr(22) => 278, chr(23) => 278, + chr(24) => 278, chr(25) => 278, chr(26) => 278, chr(27) => 278, chr(28) => 278, chr(29) => 278, chr(30) => 278, chr(31) => 278, + ' ' => 278, '!' => 278, '"' => 355, '#' => 556, '$' => 556, '%' => 889, '&' => 667, '\'' => 191, + '(' => 333, ')' => 333, '*' => 389, '+' => 584, ',' => 278, '-' => 333, '.' => 278, '/' => 278, + '0' => 556, '1' => 556, '2' => 556, '3' => 556, '4' => 556, '5' => 556, '6' => 556, '7' => 556, + '8' => 556, '9' => 556, ':' => 278, ';' => 278, '<' => 584, '=' => 584, '>' => 584, '?' => 556, + '@' => 1015, 'A' => 667, 'B' => 667, 'C' => 722, 'D' => 722, 'E' => 667, 'F' => 611, 'G' => 778, + 'H' => 722, 'I' => 278, 'J' => 500, 'K' => 667, 'L' => 556, 'M' => 833, 'N' => 722, 'O' => 778, + 'P' => 667, 'Q' => 778, 'R' => 722, 'S' => 667, 'T' => 611, 'U' => 722, 'V' => 667, 'W' => 944, + 'X' => 667, 'Y' => 667, 'Z' => 611, '[' => 278, '\\' => 278, ']' => 278, '^' => 469, '_' => 556, + '`' => 333, 'a' => 556, 'b' => 556, 'c' => 500, 'd' => 556, 'e' => 556, 'f' => 278, 'g' => 556, + 'h' => 556, 'i' => 222, 'j' => 222, 'k' => 500, 'l' => 222, 'm' => 833, 'n' => 556, 'o' => 556, + 'p' => 556, 'q' => 556, 'r' => 333, 's' => 500, 't' => 278, 'u' => 556, 'v' => 500, 'w' => 722, + 'x' => 500, 'y' => 500, 'z' => 500, '{' => 334, '|' => 260, '}' => 334, '~' => 584, chr(127) => 350, + chr(128) => 556, chr(129) => 350, chr(130) => 222, chr(131) => 556, chr(132) => 333, chr(133) => 1000, chr(134) => 556, chr(135) => 556, + chr(136) => 333, chr(137) => 1000, chr(138) => 667, chr(139) => 333, chr(140) => 1000, chr(141) => 350, chr(142) => 611, chr(143) => 350, + chr(144) => 350, chr(145) => 222, chr(146) => 222, chr(147) => 333, chr(148) => 333, chr(149) => 350, chr(150) => 556, chr(151) => 1000, + chr(152) => 333, chr(153) => 1000, chr(154) => 500, chr(155) => 333, chr(156) => 944, chr(157) => 350, chr(158) => 500, chr(159) => 667, + chr(160) => 278, chr(161) => 333, chr(162) => 556, chr(163) => 556, chr(164) => 556, chr(165) => 556, chr(166) => 260, chr(167) => 556, + chr(168) => 333, chr(169) => 737, chr(170) => 370, chr(171) => 556, chr(172) => 584, chr(173) => 333, chr(174) => 737, chr(175) => 333, + chr(176) => 400, chr(177) => 584, chr(178) => 333, chr(179) => 333, chr(180) => 333, chr(181) => 556, chr(182) => 537, chr(183) => 278, + chr(184) => 333, chr(185) => 333, chr(186) => 365, chr(187) => 556, chr(188) => 834, chr(189) => 834, chr(190) => 834, chr(191) => 611, + chr(192) => 667, chr(193) => 667, chr(194) => 667, chr(195) => 667, chr(196) => 667, chr(197) => 667, chr(198) => 1000, chr(199) => 722, + chr(200) => 667, chr(201) => 667, chr(202) => 667, chr(203) => 667, chr(204) => 278, chr(205) => 278, chr(206) => 278, chr(207) => 278, + chr(208) => 722, chr(209) => 722, chr(210) => 778, chr(211) => 778, chr(212) => 778, chr(213) => 778, chr(214) => 778, chr(215) => 584, + chr(216) => 778, chr(217) => 722, chr(218) => 722, chr(219) => 722, chr(220) => 722, chr(221) => 667, chr(222) => 667, chr(223) => 611, + chr(224) => 556, chr(225) => 556, chr(226) => 556, chr(227) => 556, chr(228) => 556, chr(229) => 556, chr(230) => 889, chr(231) => 500, + chr(232) => 556, chr(233) => 556, chr(234) => 556, chr(235) => 556, chr(236) => 278, chr(237) => 278, chr(238) => 278, chr(239) => 278, + chr(240) => 556, chr(241) => 556, chr(242) => 556, chr(243) => 556, chr(244) => 556, chr(245) => 556, chr(246) => 556, chr(247) => 584, + chr(248) => 611, chr(249) => 556, chr(250) => 556, chr(251) => 556, chr(252) => 556, chr(253) => 500, chr(254) => 556, chr(255) => 500 +); diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/helveticab.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/helveticab.php new file mode 100644 index 00000000..d5b30412 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/helveticab.php @@ -0,0 +1,23 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$tntofficiel_fpdf_charwidths['helveticaB']=array( + chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556 +); diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/helveticabi.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/helveticabi.php new file mode 100644 index 00000000..3c8737eb --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/helveticabi.php @@ -0,0 +1,23 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$tntofficiel_fpdf_charwidths['helveticaBI']=array( + chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556 +); diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/helveticai.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/helveticai.php new file mode 100644 index 00000000..fa7f3713 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/helveticai.php @@ -0,0 +1,23 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$tntofficiel_fpdf_charwidths['helveticaI']=array( + chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500 +); diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/index.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1250.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1250.map new file mode 100644 index 00000000..33a555ee --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1250.map @@ -0,0 +1,251 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+015A Sacute +!8D U+0164 Tcaron +!8E U+017D Zcaron +!8F U+0179 Zacute +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+015B sacute +!9D U+0165 tcaron +!9E U+017E zcaron +!9F U+017A zacute +!A0 U+00A0 space +!A1 U+02C7 caron +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+0104 Aogonek +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+015E Scedilla +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+0105 aogonek +!BA U+015F scedilla +!BB U+00BB guillemotright +!BC U+013D Lcaron +!BD U+02DD hungarumlaut +!BE U+013E lcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcommaaccent +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcommaaccent +!FF U+02D9 dotaccent diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1251.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1251.map new file mode 100644 index 00000000..b5960fe4 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1251.map @@ -0,0 +1,255 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0402 afii10051 +!81 U+0403 afii10052 +!82 U+201A quotesinglbase +!83 U+0453 afii10100 +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+20AC Euro +!89 U+2030 perthousand +!8A U+0409 afii10058 +!8B U+2039 guilsinglleft +!8C U+040A afii10059 +!8D U+040C afii10061 +!8E U+040B afii10060 +!8F U+040F afii10145 +!90 U+0452 afii10099 +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0459 afii10106 +!9B U+203A guilsinglright +!9C U+045A afii10107 +!9D U+045C afii10109 +!9E U+045B afii10108 +!9F U+045F afii10193 +!A0 U+00A0 space +!A1 U+040E afii10062 +!A2 U+045E afii10110 +!A3 U+0408 afii10057 +!A4 U+00A4 currency +!A5 U+0490 afii10050 +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+0401 afii10023 +!A9 U+00A9 copyright +!AA U+0404 afii10053 +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+0407 afii10056 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+0406 afii10055 +!B3 U+0456 afii10103 +!B4 U+0491 afii10098 +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0451 afii10071 +!B9 U+2116 afii61352 +!BA U+0454 afii10101 +!BB U+00BB guillemotright +!BC U+0458 afii10105 +!BD U+0405 afii10054 +!BE U+0455 afii10102 +!BF U+0457 afii10104 +!C0 U+0410 afii10017 +!C1 U+0411 afii10018 +!C2 U+0412 afii10019 +!C3 U+0413 afii10020 +!C4 U+0414 afii10021 +!C5 U+0415 afii10022 +!C6 U+0416 afii10024 +!C7 U+0417 afii10025 +!C8 U+0418 afii10026 +!C9 U+0419 afii10027 +!CA U+041A afii10028 +!CB U+041B afii10029 +!CC U+041C afii10030 +!CD U+041D afii10031 +!CE U+041E afii10032 +!CF U+041F afii10033 +!D0 U+0420 afii10034 +!D1 U+0421 afii10035 +!D2 U+0422 afii10036 +!D3 U+0423 afii10037 +!D4 U+0424 afii10038 +!D5 U+0425 afii10039 +!D6 U+0426 afii10040 +!D7 U+0427 afii10041 +!D8 U+0428 afii10042 +!D9 U+0429 afii10043 +!DA U+042A afii10044 +!DB U+042B afii10045 +!DC U+042C afii10046 +!DD U+042D afii10047 +!DE U+042E afii10048 +!DF U+042F afii10049 +!E0 U+0430 afii10065 +!E1 U+0431 afii10066 +!E2 U+0432 afii10067 +!E3 U+0433 afii10068 +!E4 U+0434 afii10069 +!E5 U+0435 afii10070 +!E6 U+0436 afii10072 +!E7 U+0437 afii10073 +!E8 U+0438 afii10074 +!E9 U+0439 afii10075 +!EA U+043A afii10076 +!EB U+043B afii10077 +!EC U+043C afii10078 +!ED U+043D afii10079 +!EE U+043E afii10080 +!EF U+043F afii10081 +!F0 U+0440 afii10082 +!F1 U+0441 afii10083 +!F2 U+0442 afii10084 +!F3 U+0443 afii10085 +!F4 U+0444 afii10086 +!F5 U+0445 afii10087 +!F6 U+0446 afii10088 +!F7 U+0447 afii10089 +!F8 U+0448 afii10090 +!F9 U+0449 afii10091 +!FA U+044A afii10092 +!FB U+044B afii10093 +!FC U+044C afii10094 +!FD U+044D afii10095 +!FE U+044E afii10096 +!FF U+044F afii10097 diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1252.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1252.map new file mode 100644 index 00000000..b79015c3 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1252.map @@ -0,0 +1,251 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!8E U+017D Zcaron +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9E U+017E zcaron +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1253.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1253.map new file mode 100644 index 00000000..b5d843c1 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1253.map @@ -0,0 +1,239 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+0385 dieresistonos +!A2 U+0386 Alphatonos +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1254.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1254.map new file mode 100644 index 00000000..3cc8c789 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1254.map @@ -0,0 +1,249 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1255.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1255.map new file mode 100644 index 00000000..fa135306 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1255.map @@ -0,0 +1,233 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AA afii57636 +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00D7 multiply +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD sfthyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 middot +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00F7 divide +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+05B0 afii57799 +!C1 U+05B1 afii57801 +!C2 U+05B2 afii57800 +!C3 U+05B3 afii57802 +!C4 U+05B4 afii57793 +!C5 U+05B5 afii57794 +!C6 U+05B6 afii57795 +!C7 U+05B7 afii57798 +!C8 U+05B8 afii57797 +!C9 U+05B9 afii57806 +!CB U+05BB afii57796 +!CC U+05BC afii57807 +!CD U+05BD afii57839 +!CE U+05BE afii57645 +!CF U+05BF afii57841 +!D0 U+05C0 afii57842 +!D1 U+05C1 afii57804 +!D2 U+05C2 afii57803 +!D3 U+05C3 afii57658 +!D4 U+05F0 afii57716 +!D5 U+05F1 afii57717 +!D6 U+05F2 afii57718 +!D7 U+05F3 gereshhebrew +!D8 U+05F4 gershayimhebrew +!E0 U+05D0 afii57664 +!E1 U+05D1 afii57665 +!E2 U+05D2 afii57666 +!E3 U+05D3 afii57667 +!E4 U+05D4 afii57668 +!E5 U+05D5 afii57669 +!E6 U+05D6 afii57670 +!E7 U+05D7 afii57671 +!E8 U+05D8 afii57672 +!E9 U+05D9 afii57673 +!EA U+05DA afii57674 +!EB U+05DB afii57675 +!EC U+05DC afii57676 +!ED U+05DD afii57677 +!EE U+05DE afii57678 +!EF U+05DF afii57679 +!F0 U+05E0 afii57680 +!F1 U+05E1 afii57681 +!F2 U+05E2 afii57682 +!F3 U+05E3 afii57683 +!F4 U+05E4 afii57684 +!F5 U+05E5 afii57685 +!F6 U+05E6 afii57686 +!F7 U+05E7 afii57687 +!F8 U+05E8 afii57688 +!F9 U+05E9 afii57689 +!FA U+05EA afii57690 +!FD U+200E afii299 +!FE U+200F afii300 diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1257.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1257.map new file mode 100644 index 00000000..077fdc34 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1257.map @@ -0,0 +1,244 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8D U+00A8 dieresis +!8E U+02C7 caron +!8F U+00B8 cedilla +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!9D U+00AF macron +!9E U+02DB ogonek +!A0 U+00A0 space +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00D8 Oslash +!A9 U+00A9 copyright +!AA U+0156 Rcommaaccent +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00C6 AE +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00F8 oslash +!B9 U+00B9 onesuperior +!BA U+0157 rcommaaccent +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00E6 ae +!C0 U+0104 Aogonek +!C1 U+012E Iogonek +!C2 U+0100 Amacron +!C3 U+0106 Cacute +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+0118 Eogonek +!C7 U+0112 Emacron +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0179 Zacute +!CB U+0116 Edotaccent +!CC U+0122 Gcommaaccent +!CD U+0136 Kcommaaccent +!CE U+012A Imacron +!CF U+013B Lcommaaccent +!D0 U+0160 Scaron +!D1 U+0143 Nacute +!D2 U+0145 Ncommaaccent +!D3 U+00D3 Oacute +!D4 U+014C Omacron +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0172 Uogonek +!D9 U+0141 Lslash +!DA U+015A Sacute +!DB U+016A Umacron +!DC U+00DC Udieresis +!DD U+017B Zdotaccent +!DE U+017D Zcaron +!DF U+00DF germandbls +!E0 U+0105 aogonek +!E1 U+012F iogonek +!E2 U+0101 amacron +!E3 U+0107 cacute +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+0119 eogonek +!E7 U+0113 emacron +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+017A zacute +!EB U+0117 edotaccent +!EC U+0123 gcommaaccent +!ED U+0137 kcommaaccent +!EE U+012B imacron +!EF U+013C lcommaaccent +!F0 U+0161 scaron +!F1 U+0144 nacute +!F2 U+0146 ncommaaccent +!F3 U+00F3 oacute +!F4 U+014D omacron +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0173 uogonek +!F9 U+0142 lslash +!FA U+015B sacute +!FB U+016B umacron +!FC U+00FC udieresis +!FD U+017C zdotaccent +!FE U+017E zcaron +!FF U+02D9 dotaccent diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1258.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1258.map new file mode 100644 index 00000000..7032c35d --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp1258.map @@ -0,0 +1,247 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+0300 gravecomb +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+00D1 Ntilde +!D2 U+0309 hookabovecomb +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+01A0 Ohorn +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+01AF Uhorn +!DE U+0303 tildecomb +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+0301 acutecomb +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+00F1 ntilde +!F2 U+0323 dotbelowcomb +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+01A1 ohorn +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+01B0 uhorn +!FE U+20AB dong +!FF U+00FF ydieresis diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp874.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp874.map new file mode 100644 index 00000000..16330d04 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/cp874.map @@ -0,0 +1,225 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!85 U+2026 ellipsis +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/index.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-1.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-1.map new file mode 100644 index 00000000..74fb2fe5 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-1.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-11.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-11.map new file mode 100644 index 00000000..8cf66731 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-11.map @@ -0,0 +1,248 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-15.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-15.map new file mode 100644 index 00000000..2689703d --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-15.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AC Euro +!A5 U+00A5 yen +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+017D Zcaron +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-16.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-16.map new file mode 100644 index 00000000..89b802a7 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-16.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0105 aogonek +!A3 U+0141 Lslash +!A4 U+20AC Euro +!A5 U+201E quotedblbase +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+0218 Scommaaccent +!AB U+00AB guillemotleft +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017A zacute +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+010C Ccaron +!B3 U+0142 lslash +!B4 U+017D Zcaron +!B5 U+201D quotedblright +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+010D ccaron +!BA U+0219 scommaaccent +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+017C zdotaccent +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0106 Cacute +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+015A Sacute +!D8 U+0170 Uhungarumlaut +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0118 Eogonek +!DE U+021A Tcommaaccent +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+0107 cacute +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+015B sacute +!F8 U+0171 uhungarumlaut +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0119 eogonek +!FE U+021B tcommaaccent +!FF U+00FF ydieresis diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-2.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-2.map new file mode 100644 index 00000000..af9588d0 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-2.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+013D Lcaron +!A6 U+015A Sacute +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+015E Scedilla +!AB U+0164 Tcaron +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+013E lcaron +!B6 U+015B sacute +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+015F scedilla +!BB U+0165 tcaron +!BC U+017A zacute +!BD U+02DD hungarumlaut +!BE U+017E zcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcommaaccent +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcommaaccent +!FF U+02D9 dotaccent diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-4.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-4.map new file mode 100644 index 00000000..e81dd7f3 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-4.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0138 kgreenlandic +!A3 U+0156 Rcommaaccent +!A4 U+00A4 currency +!A5 U+0128 Itilde +!A6 U+013B Lcommaaccent +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+0112 Emacron +!AB U+0122 Gcommaaccent +!AC U+0166 Tbar +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0157 rcommaaccent +!B4 U+00B4 acute +!B5 U+0129 itilde +!B6 U+013C lcommaaccent +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+0113 emacron +!BB U+0123 gcommaaccent +!BC U+0167 tbar +!BD U+014A Eng +!BE U+017E zcaron +!BF U+014B eng +!C0 U+0100 Amacron +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+012E Iogonek +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+0116 Edotaccent +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+012A Imacron +!D0 U+0110 Dcroat +!D1 U+0145 Ncommaaccent +!D2 U+014C Omacron +!D3 U+0136 Kcommaaccent +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+0172 Uogonek +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0168 Utilde +!DE U+016A Umacron +!DF U+00DF germandbls +!E0 U+0101 amacron +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+012F iogonek +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+0117 edotaccent +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+012B imacron +!F0 U+0111 dcroat +!F1 U+0146 ncommaaccent +!F2 U+014D omacron +!F3 U+0137 kcommaaccent +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+0173 uogonek +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0169 utilde +!FE U+016B umacron +!FF U+02D9 dotaccent diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-5.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-5.map new file mode 100644 index 00000000..8030fd54 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-5.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0401 afii10023 +!A2 U+0402 afii10051 +!A3 U+0403 afii10052 +!A4 U+0404 afii10053 +!A5 U+0405 afii10054 +!A6 U+0406 afii10055 +!A7 U+0407 afii10056 +!A8 U+0408 afii10057 +!A9 U+0409 afii10058 +!AA U+040A afii10059 +!AB U+040B afii10060 +!AC U+040C afii10061 +!AD U+00AD hyphen +!AE U+040E afii10062 +!AF U+040F afii10145 +!B0 U+0410 afii10017 +!B1 U+0411 afii10018 +!B2 U+0412 afii10019 +!B3 U+0413 afii10020 +!B4 U+0414 afii10021 +!B5 U+0415 afii10022 +!B6 U+0416 afii10024 +!B7 U+0417 afii10025 +!B8 U+0418 afii10026 +!B9 U+0419 afii10027 +!BA U+041A afii10028 +!BB U+041B afii10029 +!BC U+041C afii10030 +!BD U+041D afii10031 +!BE U+041E afii10032 +!BF U+041F afii10033 +!C0 U+0420 afii10034 +!C1 U+0421 afii10035 +!C2 U+0422 afii10036 +!C3 U+0423 afii10037 +!C4 U+0424 afii10038 +!C5 U+0425 afii10039 +!C6 U+0426 afii10040 +!C7 U+0427 afii10041 +!C8 U+0428 afii10042 +!C9 U+0429 afii10043 +!CA U+042A afii10044 +!CB U+042B afii10045 +!CC U+042C afii10046 +!CD U+042D afii10047 +!CE U+042E afii10048 +!CF U+042F afii10049 +!D0 U+0430 afii10065 +!D1 U+0431 afii10066 +!D2 U+0432 afii10067 +!D3 U+0433 afii10068 +!D4 U+0434 afii10069 +!D5 U+0435 afii10070 +!D6 U+0436 afii10072 +!D7 U+0437 afii10073 +!D8 U+0438 afii10074 +!D9 U+0439 afii10075 +!DA U+043A afii10076 +!DB U+043B afii10077 +!DC U+043C afii10078 +!DD U+043D afii10079 +!DE U+043E afii10080 +!DF U+043F afii10081 +!E0 U+0440 afii10082 +!E1 U+0441 afii10083 +!E2 U+0442 afii10084 +!E3 U+0443 afii10085 +!E4 U+0444 afii10086 +!E5 U+0445 afii10087 +!E6 U+0446 afii10088 +!E7 U+0447 afii10089 +!E8 U+0448 afii10090 +!E9 U+0449 afii10091 +!EA U+044A afii10092 +!EB U+044B afii10093 +!EC U+044C afii10094 +!ED U+044D afii10095 +!EE U+044E afii10096 +!EF U+044F afii10097 +!F0 U+2116 afii61352 +!F1 U+0451 afii10071 +!F2 U+0452 afii10099 +!F3 U+0453 afii10100 +!F4 U+0454 afii10101 +!F5 U+0455 afii10102 +!F6 U+0456 afii10103 +!F7 U+0457 afii10104 +!F8 U+0458 afii10105 +!F9 U+0459 afii10106 +!FA U+045A afii10107 +!FB U+045B afii10108 +!FC U+045C afii10109 +!FD U+00A7 section +!FE U+045E afii10110 +!FF U+045F afii10193 diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-7.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-7.map new file mode 100644 index 00000000..be8698af --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-7.map @@ -0,0 +1,250 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+2018 quoteleft +!A2 U+2019 quoteright +!A3 U+00A3 sterling +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+0385 dieresistonos +!B6 U+0386 Alphatonos +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-9.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-9.map new file mode 100644 index 00000000..a60bb19d --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/iso-8859-9.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/koi8-r.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/koi8-r.map new file mode 100644 index 00000000..026880d6 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/koi8-r.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2219 periodcentered +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+2553 SF520000 +!A5 U+2554 SF390000 +!A6 U+2555 SF220000 +!A7 U+2556 SF210000 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+255C SF270000 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+2562 SF200000 +!B5 U+2563 SF230000 +!B6 U+2564 SF470000 +!B7 U+2565 SF480000 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+256B SF530000 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/koi8-u.map b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/koi8-u.map new file mode 100644 index 00000000..97d9d031 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/koi8-u.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2022 bullet +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+0454 afii10101 +!A5 U+2554 SF390000 +!A6 U+0456 afii10103 +!A7 U+0457 afii10104 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+0491 afii10098 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+0404 afii10053 +!B5 U+2563 SF230000 +!B6 U+0406 afii10055 +!B7 U+0407 afii10056 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+0490 afii10050 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/makefont.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/makefont.php new file mode 100644 index 00000000..4dac6187 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/makefont/makefont.php @@ -0,0 +1,397 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +/******************************************************************************* + * Utility to generate font definition files * + * * + * Version: 1.14 * + * Date: 2008-08-03 * + * Author: Olivier PLATHEY * + *******************************************************************************/ + +function ReadMap($enc) +{ + //Read a map file + $file = dirname(__FILE__).'/'.strtolower($enc).'.map'; + $a = file($file); + if (empty($a)) + die('Error: encoding not found: '.$enc); + $cc2gn = array(); + foreach ($a as $l) { + if ($l[0] == '!') { + $e = preg_split('/[ \\t]+/', rtrim($l)); + $cc = hexdec(substr($e[0], 1)); + $gn = $e[2]; + $cc2gn[ $cc ] = $gn; + } + } + for ($i = 0; $i <= 255; $i++) { + if (!isset($cc2gn[ $i ])) + $cc2gn[ $i ] = '.notdef'; + } + + return $cc2gn; +} + +function ReadAFM($file, &$map) +{ + //Read a font metric file + $a = file($file); + if (empty($a)) + die('File not found'); + $widths = array(); + $fm = array(); + $fix = array( + 'Edot' => 'Edotaccent', 'edot' => 'edotaccent', 'Idot' => 'Idotaccent', 'Zdot' => 'Zdotaccent', 'zdot' => 'zdotaccent', + 'Odblacute' => 'Ohungarumlaut', 'odblacute' => 'ohungarumlaut', 'Udblacute' => 'Uhungarumlaut', 'udblacute' => 'uhungarumlaut', + 'Gcedilla' => 'Gcommaaccent', 'gcedilla' => 'gcommaaccent', 'Kcedilla' => 'Kcommaaccent', 'kcedilla' => 'kcommaaccent', + 'Lcedilla' => 'Lcommaaccent', 'lcedilla' => 'lcommaaccent', 'Ncedilla' => 'Ncommaaccent', 'ncedilla' => 'ncommaaccent', + 'Rcedilla' => 'Rcommaaccent', 'rcedilla' => 'rcommaaccent', 'Scedilla' => 'Scommaaccent', 'scedilla' => 'scommaaccent', + 'Tcedilla' => 'Tcommaaccent', 'tcedilla' => 'tcommaaccent', 'Dslash' => 'Dcroat', 'dslash' => 'dcroat', 'Dmacron' => 'Dcroat', 'dmacron' => 'dcroat', + 'combininggraveaccent' => 'gravecomb', 'combininghookabove' => 'hookabovecomb', 'combiningtildeaccent' => 'tildecomb', + 'combiningacuteaccent' => 'acutecomb', 'combiningdotbelow' => 'dotbelowcomb', 'dongsign' => 'dong' + ); + foreach ($a as $l) { + $e = explode(' ', rtrim($l)); + if (count($e) < 2) + continue; + $code = $e[0]; + $param = $e[1]; + if ($code == 'C') { + //Character metrics + $cc = (int)$e[1]; + $w = $e[4]; + $gn = $e[7]; + if (substr($gn, -4) == '20AC') + $gn = 'Euro'; + if (isset($fix[ $gn ])) { + //Fix incorrect glyph name + foreach ($map as $c => $n) { + if ($n == $fix[ $gn ]) + $map[ $c ] = $gn; + } + } + if (empty($map)) { + //Symbolic font: use built-in encoding + $widths[ $cc ] = $w; + } else { + $widths[ $gn ] = $w; + if ($gn == 'X') + $fm['CapXHeight'] = $e[13]; + } + if ($gn == '.notdef') + $fm['MissingWidth'] = $w; + } elseif ($code == 'FontName') + $fm['FontName'] = $param; + elseif ($code == 'Weight') + $fm['Weight'] = $param; + elseif ($code == 'ItalicAngle') + $fm['ItalicAngle'] = (double)$param; + elseif ($code == 'Ascender') + $fm['Ascender'] = (int)$param; + elseif ($code == 'Descender') + $fm['Descender'] = (int)$param; + elseif ($code == 'UnderlineThickness') + $fm['UnderlineThickness'] = (int)$param; + elseif ($code == 'UnderlinePosition') + $fm['UnderlinePosition'] = (int)$param; + elseif ($code == 'IsFixedPitch') + $fm['IsFixedPitch'] = ($param == 'true'); + elseif ($code == 'FontBBox') + $fm['FontBBox'] = array($e[1], $e[2], $e[3], $e[4]); + elseif ($code == 'CapHeight') + $fm['CapHeight'] = (int)$param; + elseif ($code == 'StdVW') + $fm['StdVW'] = (int)$param; + } + if (!isset($fm['FontName'])) + die('FontName not found'); + if (!empty($map)) { + if (!isset($widths['.notdef'])) + $widths['.notdef'] = 600; + if (!isset($widths['Delta']) && isset($widths['increment'])) + $widths['Delta'] = $widths['increment']; + //Order widths according to map + for ($i = 0; $i <= 255; $i++) { + if (!isset($widths[ $map[ $i ] ])) { + echo 'Warning: character '.$map[ $i ].' is missing
'; + $widths[ $i ] = $widths['.notdef']; + } else + $widths[ $i ] = $widths[ $map[ $i ] ]; + } + } + $fm['Widths'] = $widths; + + return $fm; +} + +function MakeFontDescriptor($fm, $symbolic) +{ + //Ascent + $asc = (isset($fm['Ascender']) ? $fm['Ascender'] : 1000); + $fd = "array('Ascent'=>".$asc; + //Descent + $desc = (isset($fm['Descender']) ? $fm['Descender'] : -200); + $fd .= ",'Descent'=>".$desc; + //CapHeight + if (isset($fm['CapHeight'])) + $ch = $fm['CapHeight']; + elseif (isset($fm['CapXHeight'])) + $ch = $fm['CapXHeight']; + else + $ch = $asc; + $fd .= ",'CapHeight'=>".$ch; + //Flags + $flags = 0; + if (isset($fm['IsFixedPitch']) && $fm['IsFixedPitch']) + $flags += 1 << 0; + if ($symbolic) + $flags += 1 << 2; + if (!$symbolic) + $flags += 1 << 5; + if (isset($fm['ItalicAngle']) && $fm['ItalicAngle'] != 0) + $flags += 1 << 6; + $fd .= ",'Flags'=>".$flags; + //FontBBox + if (isset($fm['FontBBox'])) + $fbb = $fm['FontBBox']; + else + $fbb = array(0, $desc - 100, 1000, $asc + 100); + $fd .= ",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'"; + //ItalicAngle + $ia = (isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0); + $fd .= ",'ItalicAngle'=>".$ia; + //StemV + if (isset($fm['StdVW'])) + $stemv = $fm['StdVW']; + elseif (isset($fm['Weight']) && preg_match('/bold|black/i', $fm['Weight'])) + $stemv = 120; + else + $stemv = 70; + $fd .= ",'StemV'=>".$stemv; + //MissingWidth + if (isset($fm['MissingWidth'])) + $fd .= ",'MissingWidth'=>".$fm['MissingWidth']; + $fd .= ')'; + + return $fd; +} + +function MakeWidthArray($fm) +{ + //Make character width array + $s = "array(\n\t"; + $cw = $fm['Widths']; + for ($i = 0; $i <= 255; $i++) { + if (chr($i) == "'") + $s .= "'\\''"; + elseif (chr($i) == "\\") + $s .= "'\\\\'"; + elseif ($i >= 32 && $i <= 126) + $s .= "'".chr($i)."'"; + else + $s .= "chr($i)"; + $s .= '=>'.$fm['Widths'][ $i ]; + if ($i < 255) + $s .= ','; + if (($i + 1) % 22 == 0) + $s .= "\n\t"; + } + $s .= ')'; + + return $s; +} + +function MakeFontEncoding($map) +{ + //Build differences from reference encoding + $ref = ReadMap('cp1252'); + $s = ''; + $last = 0; + for ($i = 32; $i <= 255; $i++) { + if ($map[ $i ] != $ref[ $i ]) { + if ($i != $last + 1) + $s .= $i.' '; + $last = $i; + $s .= '/'.$map[ $i ].' '; + } + } + + return rtrim($s); +} + +function SaveToFile($file, $s, $mode) +{ + $f = fopen($file, 'w'.$mode); + if (!$f) + die('Can\'t write to file '.$file); + fwrite($f, $s, strlen($s)); + fclose($f); +} + +function ReadShort($f) +{ + $a = unpack('n1n', fread($f, 2)); + + return $a['n']; +} + +function ReadLong($f) +{ + $a = unpack('N1N', fread($f, 4)); + + return $a['N']; +} + +function CheckTTF($file) +{ + //Check if font license allows embedding + $f = fopen($file, 'rb'); + if (!$f) + die('Error: Can\'t open '.$file); + //Extract number of tables + fseek($f, 4, SEEK_CUR); + $nb = ReadShort($f); + fseek($f, 6, SEEK_CUR); + //Seek OS/2 table + $found = false; + for ($i = 0; $i < $nb; $i++) { + if (fread($f, 4) == 'OS/2') { + $found = true; + break; + } + fseek($f, 12, SEEK_CUR); + } + if (!$found) { + fclose($f); + + return; + } + fseek($f, 4, SEEK_CUR); + $offset = ReadLong($f); + fseek($f, $offset, SEEK_SET); + //Extract fsType flags + fseek($f, 8, SEEK_CUR); + $fsType = ReadShort($f); + $rl = ($fsType & 0x02) != 0; + $pp = ($fsType & 0x04) != 0; + $e = ($fsType & 0x08) != 0; + fclose($f); + if ($rl && !$pp && !$e) + echo 'Warning: font license does not allow embedding'; +} + +/******************************************************************************* + * fontfile: path to TTF file (or empty string if not to be embedded) * + * afmfile: path to AFM file * + * enc: font encoding (or empty string for symbolic fonts) * + * patch: optional patch for encoding * + * type: font type if fontfile is empty * + *******************************************************************************/ +function MakeFont($fontfile, $afmfile, $enc = 'cp1252', $patch = array(), $type = 'TrueType') +{ + //Generate a font definition file + ini_set('auto_detect_line_endings', '1'); + if ($enc) { + $map = ReadMap($enc); + foreach ($patch as $cc => $gn) + $map[ $cc ] = $gn; + } else + $map = array(); + if (!file_exists($afmfile)) + die('Error: AFM file not found: '.$afmfile); + $fm = ReadAFM($afmfile, $map); + if ($enc) + $diff = MakeFontEncoding($map); + else + $diff = ''; + $fd = MakeFontDescriptor($fm, empty($map)); + //Find font type + if ($fontfile) { + $ext = strtolower(substr($fontfile, -3)); + if ($ext == 'ttf') + $type = 'TrueType'; + elseif ($ext == 'pfb') + $type = 'Type1'; + else + die('Error: unrecognized font file extension: '.$ext); + } else { + if ($type != 'TrueType' && $type != 'Type1') + die('Error: incorrect font type: '.$type); + } + //Start generation + $s = 'Error: font file not found: '.$fontfile); + if ($type == 'TrueType') + CheckTTF($fontfile); + $f = fopen($fontfile, 'rb'); + if (!$f) + die('Error: Can\'t open '.$fontfile); + $file = fread($f, filesize($fontfile)); + fclose($f); + if ($type == 'Type1') { + //Find first two sections and discard third one + $header = (ord($file[0]) == 128); + if ($header) { + //Strip first binary header + $file = substr($file, 6); + } + $pos = strpos($file, 'eexec'); + if (!$pos) + die('Error: font file does not seem to be valid Type1'); + $size1 = $pos + 6; + if ($header && ord($file[ $size1 ]) == 128) { + //Strip second binary header + $file = substr($file, 0, $size1).substr($file, $size1 + 6); + } + $pos = strpos($file, '00000000'); + if (!$pos) + die('Error: font file does not seem to be valid Type1'); + $size2 = $pos - $size1; + $file = substr($file, 0, $size1 + $size2); + } + if (function_exists('gzcompress')) { + $cmp = $basename.'.z'; + SaveToFile($cmp, gzcompress($file), 'b'); + $s .= '$file=\''.$cmp."';\n"; + echo 'Font file compressed ('.$cmp.')
'; + } else { + $s .= '$file=\''.basename($fontfile)."';\n"; + echo 'Notice: font file could not be compressed (zlib extension not available)
'; + } + if ($type == 'Type1') { + $s .= '$size1='.$size1.";\n"; + $s .= '$size2='.$size2.";\n"; + } else + $s .= '$originalsize='.filesize($fontfile).";\n"; + } else { + //Not embedded font + $s .= '$file='."'';\n"; + } + $s .= "?>\n"; + SaveToFile($basename.'.php', $s, 't'); + echo 'Font definition file generated ('.$basename.'.php'.')
'; +} diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/symbol.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/symbol.php new file mode 100644 index 00000000..24b3b469 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/symbol.php @@ -0,0 +1,23 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$tntofficiel_fpdf_charwidths['symbol']=array( + chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549, + ','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722, + 'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768, + 'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576, + 'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0, + chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603, + chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768, + chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042, + chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329, + chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0 +); diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/times.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/times.php new file mode 100644 index 00000000..8c2a3cc9 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/times.php @@ -0,0 +1,23 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$tntofficiel_fpdf_charwidths['times']=array( + chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722, + 'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944, + 'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500 +); diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/timesb.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/timesb.php new file mode 100644 index 00000000..6c564fba --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/timesb.php @@ -0,0 +1,23 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$tntofficiel_fpdf_charwidths['timesB']=array( + chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000, + 'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833, + 'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500 +); diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/timesbi.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/timesbi.php new file mode 100644 index 00000000..694220bd --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/timesbi.php @@ -0,0 +1,23 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$tntofficiel_fpdf_charwidths['timesBI']=array( + chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667, + 'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889, + 'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444 +); diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/timesi.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/timesi.php new file mode 100644 index 00000000..74a61cdf --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/timesi.php @@ -0,0 +1,23 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$tntofficiel_fpdf_charwidths['timesI']=array( + chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611, + 'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833, + 'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444 +); diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/font/zapfdingbats.php b/www/modules/tntofficiel/libraries/pdf/fpdf/font/zapfdingbats.php new file mode 100644 index 00000000..90b6f413 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/font/zapfdingbats.php @@ -0,0 +1,23 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$tntofficiel_fpdf_charwidths['zapfdingbats']=array( + chr(0)=>0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0, + chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939, + ','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692, + 'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776, + 'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873, + 'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317, + chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788, + chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788, + chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918, + chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874, + chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0 +); diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/fpdf.css b/www/modules/tntofficiel/libraries/pdf/fpdf/fpdf.css new file mode 100644 index 00000000..dd2c5400 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/fpdf.css @@ -0,0 +1,21 @@ +body {font-family:"Times New Roman",serif} +h1 {font:bold 135% Arial,sans-serif; color:#4000A0; margin-bottom:0.9em} +h2 {font:bold 95% Arial,sans-serif; color:#900000; margin-top:1.5em; margin-bottom:1em} +dl.param dt {text-decoration:underline} +dl.param dd {margin-top:1em; margin-bottom:1em} +dl.param ul {margin-top:1em; margin-bottom:1em} +tt, code, kbd {font-family:"Courier New",Courier,monospace; font-size:82%} +div.source {margin-top:1.4em; margin-bottom:1.3em} +div.source pre {display:table; border:1px solid #24246A; width:100%; margin:0em; font-family:inherit; font-size:100%} +div.source code {display:block; border:1px solid #C5C5EC; background-color:#F0F5FF; padding:6px; color:#000000} +div.doc-source {margin-top:1.4em; margin-bottom:1.3em} +div.doc-source pre {display:table; width:100%; margin:0em; font-family:inherit; font-size:100%} +div.doc-source code {display:block; background-color:#E0E0E0; padding:4px} +.kw {color:#000080; font-weight:bold} +.str {color:#CC0000} +.cmt {color:#008000} +p.demo {text-align:center; margin-top:-0.9em} +a.demo {text-decoration:none; font-weight:bold; color:#0000CC} +a.demo:link {text-decoration:none; font-weight:bold; color:#0000CC} +a.demo:hover {text-decoration:none; font-weight:bold; color:#0000FF} +a.demo:active {text-decoration:none; font-weight:bold; color:#0000FF} diff --git a/www/modules/tntofficiel/libraries/pdf/fpdf/index.php b/www/modules/tntofficiel/libraries/pdf/fpdf/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdf/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_FPDF2.php b/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_FPDF2.php new file mode 100644 index 00000000..768684d7 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_FPDF2.php @@ -0,0 +1,184 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +// +// FPDI - Version 1.3.1 +// +// Copyright 2004-2009 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * This class is used as a bridge between TCPDF and FPDI + * and will create the possibility to use both FPDF and TCPDF + * via one FPDI version. + * + * We'll simply remap TCPDF to FPDF again. + * + * It'll be loaded and extended by FPDF_TPL. + */ +class TNTOfficiel_FPDF2 extends TNTOfficiel_TCPDF { + + public function __get($name) { + switch ($name) { + case 'PDFVersion': + return $this->PDFVersion; + case 'k': + return $this->k; + default: + // Error handling + $this->Error('Cannot access protected property '.get_class($this).':$'.$name.' / Undefined property: '.get_class($this).'::$'.$name); + } + } + + public function __set($name, $value) + { + switch ($name) { + case 'PDFVersion': + $this->PDFVersion = $value; + break; + default: + // Error handling + $this->Error('Cannot access protected property '.get_class($this).':$'.$name.' / Undefined property: '.get_class($this).'::$'.$name); + } + } + + /** + * Encryption of imported data by FPDI + * + * @param array $value + */ + public function pdf_write_value(&$value) + { + switch ($value[0]) { + case PDF_TYPE_STRING : + if ($this->encrypted) { + $value[1] = $this->_unescape($value[1]); + $value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]); + $value[1] = $this->_escape($value[1]); + } + break; + + case PDF_TYPE_STREAM : + if ($this->encrypted) { + $value[2][1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[2][1]); + } + break; + + case PDF_TYPE_HEX : + if ($this->encrypted) { + $value[1] = $this->hex2str($value[1]); + $value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]); + + // remake hexstring of encrypted string + $value[1] = $this->str2hex($value[1]); + } + break; + } + } + + /** + * Unescapes a PDF string + * + * @param string $s + * @return string + */ + public function _unescape($s) + { + $out = ''; + for ($count = 0, $n = strlen($s); $count < $n; $count++) { + if ($s[$count] != '\\' || $count == $n-1) { + $out .= $s[$count]; + } else { + switch ($s[++$count]) { + case ')': + case '(': + case '\\': + $out .= $s[$count]; + break; + case 'f': + $out .= chr(0x0C); + break; + case 'b': + $out .= chr(0x08); + break; + case 't': + $out .= chr(0x09); + break; + case 'r': + $out .= chr(0x0D); + break; + case 'n': + $out .= chr(0x0A); + break; + case "\r": + if ($count != $n-1 && $s[$count+1] == "\n") + $count++; + break; + case "\n": + break; + default: + // Octal-Values + if (ord($s[$count]) >= ord('0') && + ord($s[$count]) <= ord('9')) { + $oct = ''. $s[$count]; + + if (ord($s[$count+1]) >= ord('0') && + ord($s[$count+1]) <= ord('9')) { + $oct .= $s[++$count]; + + if (ord($s[$count+1]) >= ord('0') && + ord($s[$count+1]) <= ord('9')) { + $oct .= $s[++$count]; + } + } + + $out .= chr(octdec($oct)); + } else { + $out .= $s[$count]; + } + } + } + } + return $out; + } + + /** + * Hexadecimal to string + * + * @param string $hex + * @return string + */ + public function hex2str($hex) + { + return pack('H*', str_replace(array("\r", "\n", ' '), '', $hex)); + } + + /** + * String to hexadecimal + * + * @param string $str + * @return string + */ + public function str2hex($str) + { + return current(unpack('H*', $str)); + } +} \ No newline at end of file diff --git a/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_FPDF_TPL.php b/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_FPDF_TPL.php new file mode 100644 index 00000000..3bb09402 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_FPDF_TPL.php @@ -0,0 +1,431 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +// +// FPDF_TPL - Version 1.1.3 +// +// Copyright 2004-2009 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +class TNTOfficiel_FPDF_TPL extends TNTOfficiel_FPDF { + /** + * Array of Tpl-Data + * @var array + */ + var $tpls = array(); + + /** + * Current Template-ID + * @var int + */ + var $tpl = 0; + + /** + * "In Template"-Flag + * @var boolean + */ + var $_intpl = false; + + /** + * Nameprefix of Templates used in Resources-Dictonary + * @var string A String defining the Prefix used as Template-Object-Names. Have to beginn with an / + */ + var $tplprefix = "/TPL"; + + /** + * Resources used By Templates and Pages + * @var array + */ + var $_res = array(); + + /** + * Last used Template data + * + * @var array + */ + var $lastUsedTemplateData = array(); + + /** + * Start a Template + * + * This method starts a template. You can give own coordinates to build an own sized + * Template. Pay attention, that the margins are adapted to the new templatesize. + * If you want to write outside the template, for example to build a clipped Template, + * you have to set the Margins and "Cursor"-Position manual after beginTemplate-Call. + * + * If no parameter is given, the template uses the current page-size. + * The Method returns an ID of the current Template. This ID is used later for using this template. + * Warning: A created Template is used in PDF at all events. Still if you don't use it after creation! + * + * @param int $x The x-coordinate given in user-unit + * @param int $y The y-coordinate given in user-unit + * @param int $w The width given in user-unit + * @param int $h The height given in user-unit + * @return int The ID of new created Template + */ + public function beginTemplate($x=null, $y=null, $w=null, $h=null) + { + if ($this->page <= 0) + $this->error("You have to add a page to fpdf first!"); + + if ($x == null) + $x = 0; + if ($y == null) + $y = 0; + if ($w == null) + $w = $this->w; + if ($h == null) + $h = $this->h; + + // Save settings + $this->tpl++; + $tpl =& $this->tpls[$this->tpl]; + $tpl = array( + 'o_x' => $this->x, + 'o_y' => $this->y, + 'o_AutoPageBreak' => $this->AutoPageBreak, + 'o_bMargin' => $this->bMargin, + 'o_tMargin' => $this->tMargin, + 'o_lMargin' => $this->lMargin, + 'o_rMargin' => $this->rMargin, + 'o_h' => $this->h, + 'o_w' => $this->w, + 'buffer' => '', + 'x' => $x, + 'y' => $y, + 'w' => $w, + 'h' => $h + ); + + $this->SetAutoPageBreak(false); + + // Define own high and width to calculate possitions correct + $this->h = $h; + $this->w = $w; + + $this->_intpl = true; + $this->SetXY($x+$this->lMargin, $y+$this->tMargin); + $this->SetRightMargin($this->w-$w+$this->rMargin); + + return $this->tpl; + } + + /** + * End Template + * + * This method ends a template and reset initiated variables on beginTemplate. + * + * @return mixed If a template is opened, the ID is returned. If not a false is returned. + */ + public function endTemplate() + { + if ($this->_intpl) { + $this->_intpl = false; + $tpl =& $this->tpls[$this->tpl]; + $this->SetXY($tpl['o_x'], $tpl['o_y']); + $this->tMargin = $tpl['o_tMargin']; + $this->lMargin = $tpl['o_lMargin']; + $this->rMargin = $tpl['o_rMargin']; + $this->h = $tpl['o_h']; + $this->w = $tpl['o_w']; + $this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']); + + return $this->tpl; + } else { + return false; + } + } + + /** + * Use a Template in current Page or other Template + * + * You can use a template in a page or in another template. + * You can give the used template a new size like you use the Image()-method. + * All parameters are optional. The width or height is calculated automaticaly + * if one is given. If no parameter is given the origin size as defined in + * beginTemplate() is used. + * The calculated or used width and height are returned as an array. + * + * @param int $tplidx A valid template-Id + * @param int $_x The x-position + * @param int $_y The y-position + * @param int $_w The new width of the template + * @param int $_h The new height of the template + * @retrun array The height and width of the template + */ + public function useTemplate($tplidx, $_x=null, $_y=null, $_w=0, $_h=0) + { + if ($this->page <= 0) + $this->error("You have to add a page to fpdf first!"); + + if (!isset($this->tpls[$tplidx])) + $this->error("Template does not exist!"); + + if ($this->_intpl) { + $this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx]; + } + + $tpl =& $this->tpls[$tplidx]; + $w = $tpl['w']; + $h = $tpl['h']; + + if ($_x == null) + $_x = 0; + if ($_y == null) + $_y = 0; + + $_x += $tpl['x']; + $_y += $tpl['y']; + + $wh = $this->getTemplateSize($tplidx, $_w, $_h); + $_w = $wh['w']; + $_h = $wh['h']; + + $tData = array( + 'x' => $this->x, + 'y' => $this->y, + 'w' => $_w, + 'h' => $_h, + 'scaleX' => ($_w/$w), + 'scaleY' => ($_h/$h), + 'tx' => $_x, + 'ty' => ($this->h-$_y-$_h), + 'lty' => ($this->h-$_y-$_h) - ($this->h-$h) * ($_h/$h) + ); + + $this->_out(sprintf("q %.4F 0 0 %.4F %.4F %.4F cm", $tData['scaleX'], $tData['scaleY'], $tData['tx']*$this->k, $tData['ty']*$this->k)); // Translate + $this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx)); + + $this->lastUsedTemplateData = $tData; + + return array("w" => $_w, "h" => $_h); + } + + /** + * Get The calculated Size of a Template + * + * If one size is given, this method calculates the other one. + * + * @param int $tplidx A valid template-Id + * @param int $_w The width of the template + * @param int $_h The height of the template + * @return array The height and width of the template + */ + public function getTemplateSize($tplidx, $_w=0, $_h=0) + { + if (!$this->tpls[$tplidx]) + return false; + + $tpl =& $this->tpls[$tplidx]; + $w = $tpl['w']; + $h = $tpl['h']; + + if ($_w == 0 and $_h == 0) { + $_w = $w; + $_h = $h; + } + + if($_w==0) + $_w = $_h*$w/$h; + if($_h==0) + $_h = $_w*$h/$w; + + return array("w" => $_w, "h" => $_h); + } + + /** + * See FPDF/TCPDF-Documentation ;-) + */ + public function SetFont($family, $style='', $size=0, $fontfile='') + { + if (!is_subclass_of($this, 'TNTOfficiel_TCPDF') && func_num_args() > 3) { + $this->Error('More than 3 arguments for the SetFont method are only available in TNTOfficiel_TCPDF.'); + } + /** + * force the resetting of font changes in a template + */ + if ($this->_intpl) + $this->FontFamily = ''; + + parent::SetFont($family, $style, $size, $fontfile); + + $fontkey = $this->FontFamily.$this->FontStyle; + + if ($this->_intpl) { + $this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey]; + } else { + $this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey]; + } + } + + /** + * See FPDF/TCPDF-Documentation ;-) + */ + public function Image($file, $x = NULL, $y = NULL, $w=0, $h=0, $type='', $link='', $align='', $resize=false, $dpi=300, $palign='', $ismask=false, $imgmask=false, $border=0) + { + if (!is_subclass_of($this, 'TNTOfficiel_TCPDF') && func_num_args() > 7) { + $this->Error('More than 7 arguments for the Image method are only available in TNTOfficiel_TCPDF.'); + } + + parent::Image($file, $x, $y, $w, $h, $type, $link, $align, $resize, $dpi, $palign, $ismask, $imgmask, $border); + if ($this->_intpl) { + $this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file]; + } else { + $this->_res['page'][$this->page]['images'][$file] =& $this->images[$file]; + } + } + + /** + * See FPDF-Documentation ;-) + * + * AddPage is not available when you're "in" a template. + */ + public function AddPage($orientation='', $format='') + { + if ($this->_intpl) + $this->Error('Adding pages in templates isn\'t possible!'); + parent::AddPage($orientation, $format); + } + + /** + * Preserve adding Links in Templates ...won't work + */ + public function Link($x, $y, $w, $h, $link, $spaces=0) + { + if (!is_subclass_of($this, 'TNTOfficiel_TCPDF') && func_num_args() > 5) { + $this->Error('More than 7 arguments for the Image method are only available in TNTOfficiel_TCPDF.'); + } + + if ($this->_intpl) + $this->Error('Using links in templates aren\'t possible!'); + parent::Link($x, $y, $w, $h, $link, $spaces); + } + + public function AddLink() + { + if ($this->_intpl) + $this->Error('Adding links in templates aren\'t possible!'); + return parent::AddLink(); + } + + public function SetLink($link, $y=0, $page=-1) + { + if ($this->_intpl) + $this->Error('Setting links in templates aren\'t possible!'); + parent::SetLink($link, $y, $page); + } + + /** + * Private Method that writes the form xobjects + */ + public function _putformxobjects() + { + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->tpls); + foreach($this->tpls AS $tplidx => $tpl) { + + $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; + $this->_newobj(); + $this->tpls[$tplidx]['n'] = $this->n; + $this->_out('<<'.$filter.'/Type /XObject'); + $this->_out('/Subtype /Form'); + $this->_out('/FormType 1'); + $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', + // llx + $tpl['x'], + // lly + -$tpl['y'], + // urx + ($tpl['w']+$tpl['x'])*$this->k, + // ury + ($tpl['h']-$tpl['y'])*$this->k + )); + + if ($tpl['x'] != 0 || $tpl['y'] != 0) { + $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]', + -$tpl['x']*$this->k*2, $tpl['y']*$this->k*2 + )); + } + + $this->_out('/Resources '); + + $this->_out('<_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { + $this->_out('/Font <<'); + foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + } + if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || + isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) + { + $this->_out('/XObject <<'); + if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { + foreach($this->_res['tpl'][$tplidx]['images'] as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); + } + if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { + foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl) + $this->_out($this->tplprefix.$i.' '.$tpl['n'].' 0 R'); + } + $this->_out('>>'); + } + $this->_out('>>'); + + $this->_out('/Length '.strlen($p).' >>'); + $this->_putstream($p); + $this->_out('endobj'); + } + } + + /** + * Overwritten to add _putformxobjects() after _putimages() + * + */ + public function _putimages() + { + parent::_putimages(); + $this->_putformxobjects(); + } + + public function _putxobjectdict() + { + parent::_putxobjectdict(); + + if (count($this->tpls)) { + foreach($this->tpls as $tplidx => $tpl) { + $this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n'])); + } + } + } + + /** + * Private Method + */ + public function _out($s) + { + if ($this->state==2 && $this->_intpl) { + $this->tpls[$this->tpl]['buffer'] .= $s."\n"; + } else { + parent::_out($s); + } + } +} diff --git a/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_FPDI.php b/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_FPDI.php new file mode 100644 index 00000000..774bafb2 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_FPDI.php @@ -0,0 +1,522 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +// +// FPDI - Version 1.3.1 +// +// Copyright 2004-2009 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +define('TNTOFFICIEL_FPDI_VERSION','1.3.1'); + +// Check for TCPDF and remap TCPDF to FPDF +if (class_exists('TNTOfficiel_TCPDF')) { + require_once('TNTOfficiel_FPDF2.php'); +} + +require_once('TNTOfficiel_FPDF_TPL.php'); +require_once('TNTOfficiel_fpdi_pdf_parser.php'); + + +class TNTOfficiel_FPDI extends TNTOfficiel_FPDF_TPL { + /** + * Actual filename + * @var string + */ + var $current_filename; + + /** + * Parser-Objects + * @var array + */ + var $parsers; + + /** + * Current parser + * @var object + */ + var $current_parser; + + /** + * object stack + * @var array + */ + var $_obj_stack; + + /** + * done object stack + * @var array + */ + var $_don_obj_stack; + + /** + * Current Object Id. + * @var integer + */ + var $_current_obj_id; + + /** + * The name of the last imported page box + * @var string + */ + var $lastUsedPageBox; + + var $_importedPages = array(); + + + /** + * Set a source-file + * + * @param string $filename a valid filename + * @return int number of available pages + */ + public function setSourceFile($filename) + { + $this->current_filename = $filename; + $fn =& $this->current_filename; + + if (!isset($this->parsers[$fn])) + $this->parsers[$fn] = new TNTOfficiel_fpdi_pdf_parser($fn, $this); + $this->current_parser = $this->parsers[$fn]; + + return $this->parsers[$fn]->getPageCount(); + } + + /** + * Import a page + * + * @param int $pageno pagenumber + * @return int Index of imported page - to use with fpdf_tpl::useTemplate() + */ + public function importPage($pageno, $boxName='/CropBox') + { + if ($this->_intpl) { + return $this->error('Please import the desired pages before creating a new template.'); + } + + $fn =& $this->current_filename; + + // check if page already imported + $pageKey = $fn.((int)$pageno).$boxName; + if (isset($this->_importedPages[$pageKey])) + return $this->_importedPages[$pageKey]; + + $parser =& $this->parsers[$fn]; + $parser->setPageno($pageno); + + $this->tpl++; + $this->tpls[$this->tpl] = array(); + $tpl =& $this->tpls[$this->tpl]; + $tpl['parser'] =& $parser; + $tpl['resources'] = $parser->getPageResources(); + $tpl['buffer'] = $parser->getContent(); + + if (!in_array($boxName, $parser->availableBoxes)) + return $this->Error(sprintf('Unknown box: %s', $boxName)); + $pageboxes = $parser->getPageBoxes($pageno); + + /** + * MediaBox + * CropBox: Default -> MediaBox + * BleedBox: Default -> CropBox + * TrimBox: Default -> CropBox + * ArtBox: Default -> CropBox + */ + if (!isset($pageboxes[$boxName]) && ($boxName == '/BleedBox' || $boxName == '/TrimBox' || $boxName == '/ArtBox')) + $boxName = '/CropBox'; + if (!isset($pageboxes[$boxName]) && $boxName == '/CropBox') + $boxName = '/MediaBox'; + + if (!isset($pageboxes[$boxName])) + return false; + $this->lastUsedPageBox = $boxName; + + $box = $pageboxes[$boxName]; + $tpl['box'] = $box; + + // To build an array that can be used by PDF_TPL::useTemplate() + $this->tpls[$this->tpl] = array_merge($this->tpls[$this->tpl],$box); + + // An imported page will start at 0,0 everytime. Translation will be set in _putformxobjects() + $tpl['x'] = 0; + $tpl['y'] = 0; + + $page =& $parser->pages[$parser->pageno]; + + // handle rotated pages + $rotation = $parser->getPageRotation($pageno); + $tpl['_rotationAngle'] = 0; + if (isset($rotation[1]) && ($angle = $rotation[1] % 360) != 0) { + $steps = $angle / 90; + + $_w = $tpl['w']; + $_h = $tpl['h']; + $tpl['w'] = $steps % 2 == 0 ? $_w : $_h; + $tpl['h'] = $steps % 2 == 0 ? $_h : $_w; + + $tpl['_rotationAngle'] = $angle*-1; + } + + $this->_importedPages[$pageKey] = $this->tpl; + + return $this->tpl; + } + + public function getLastUsedPageBox() + { + return $this->lastUsedPageBox; + } + + public function useTemplate($tplidx, $_x=null, $_y=null, $_w=0, $_h=0, $adjustPageSize=false) + { + if ($adjustPageSize == true && is_null($_x) && is_null($_y)) { + $size = $this->getTemplateSize($tplidx, $_w, $_h); + $format = array($size['w'], $size['h']); + if ($format[0]!=$this->CurPageFormat[0] || $format[1]!=$this->CurPageFormat[1]) { + $this->w=$format[0]; + $this->h=$format[1]; + $this->wPt=$this->w*$this->k; + $this->hPt=$this->h*$this->k; + $this->PageBreakTrigger=$this->h-$this->bMargin; + $this->CurPageFormat=$format; + $this->PageSizes[$this->page]=array($this->wPt, $this->hPt); + } + } + + $this->_out('q 0 J 1 w 0 j 0 G 0 g'); // reset standard values + $s = parent::useTemplate($tplidx, $_x, $_y, $_w, $_h); + $this->_out('Q'); + return $s; + } + + /** + * Private method, that rebuilds all needed objects of source files + */ + public function _putimportedobjects() + { + if (is_array($this->parsers) && count($this->parsers) > 0) { + foreach($this->parsers AS $filename => $p) { + $this->current_parser =& $this->parsers[$filename]; + if (isset($this->_obj_stack[$filename]) && is_array($this->_obj_stack[$filename])) { + while(($n = key($this->_obj_stack[$filename])) !== null) { + $nObj = $this->current_parser->pdf_resolve_object($this->current_parser->c,$this->_obj_stack[$filename][$n][1]); + + $this->_newobj($this->_obj_stack[$filename][$n][0]); + + if ($nObj[0] == PDF_TYPE_STREAM) { + $this->pdf_write_value ($nObj); + } else { + $this->pdf_write_value ($nObj[1]); + } + + $this->_out('endobj'); + $this->_obj_stack[$filename][$n] = null; // free memory + unset($this->_obj_stack[$filename][$n]); + reset($this->_obj_stack[$filename]); + } + } + } + } + } + + + /** + * Private Method that writes the form xobjects + */ + public function _putformxobjects() + { + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->tpls); + foreach($this->tpls AS $tplidx => $tpl) { + $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; + $this->_newobj(); + $cN = $this->n; // TCPDF/Protection: rem current "n" + + $this->tpls[$tplidx]['n'] = $this->n; + $this->_out('<<'.$filter.'/Type /XObject'); + $this->_out('/Subtype /Form'); + $this->_out('/FormType 1'); + + $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', + (isset($tpl['box']['llx']) ? $tpl['box']['llx'] : $tpl['x'])*$this->k, + (isset($tpl['box']['lly']) ? $tpl['box']['lly'] : -$tpl['y'])*$this->k, + (isset($tpl['box']['urx']) ? $tpl['box']['urx'] : $tpl['w'] + $tpl['x'])*$this->k, + (isset($tpl['box']['ury']) ? $tpl['box']['ury'] : $tpl['h']-$tpl['y'])*$this->k + )); + + $c = 1; + $s = 0; + $tx = 0; + $ty = 0; + + if (isset($tpl['box'])) { + $tx = -$tpl['box']['llx']; + $ty = -$tpl['box']['lly']; + + if ($tpl['_rotationAngle'] <> 0) { + $angle = $tpl['_rotationAngle'] * M_PI/180; + $c=cos($angle); + $s=sin($angle); + + switch($tpl['_rotationAngle']) { + case -90: + $tx = -$tpl['box']['lly']; + $ty = $tpl['box']['urx']; + break; + case -180: + $tx = $tpl['box']['urx']; + $ty = $tpl['box']['ury']; + break; + case -270: + $tx = $tpl['box']['ury']; + $ty = 0; + break; + } + } + } elseif ($tpl['x'] != 0 || $tpl['y'] != 0) { + $tx = -$tpl['x']*2; + $ty = $tpl['y']*2; + } + + $tx *= $this->k; + $ty *= $this->k; + + if ($c != 1 || $s != 0 || $tx != 0 || $ty != 0) { + $this->_out(sprintf('/Matrix [%.5F %.5F %.5F %.5F %.5F %.5F]', + $c, $s, -$s, $c, $tx, $ty + )); + } + + $this->_out('/Resources '); + + if (isset($tpl['resources'])) { + $this->current_parser =& $tpl['parser']; + $this->pdf_write_value($tpl['resources']); // "n" will be changed + } else { + $this->_out('<_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { + $this->_out('/Font <<'); + foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + } + if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || + isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) + { + $this->_out('/XObject <<'); + if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { + foreach($this->_res['tpl'][$tplidx]['images'] as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); + } + if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { + foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl) + $this->_out($this->tplprefix.$i.' '.$tpl['n'].' 0 R'); + } + $this->_out('>>'); + } + $this->_out('>>'); + } + + $nN = $this->n; // TCPDF: rem new "n" + $this->n = $cN; // TCPDF: reset to current "n" + $this->_out('/Length '.strlen($p).' >>'); + $this->_putstream($p); + $this->_out('endobj'); + $this->n = $nN; // TCPDF: reset to new "n" + } + + $this->_putimportedobjects(); + } + + /** + * Rewritten to handle existing own defined objects + */ + public function _newobj($obj_id=false,$onlynewobj=false) + { + if (!$obj_id) { + $obj_id = ++$this->n; + } + + //Begin a new object + if (!$onlynewobj) { + $this->offsets[$obj_id] = is_subclass_of($this, 'TNTOfficiel_TCPDF') ? $this->bufferlen : strlen($this->buffer); + $this->_out($obj_id.' 0 obj'); + $this->_current_obj_id = $obj_id; // for later use with encryption + } + return $obj_id; + } + + /** + * Writes a value + * Needed to rebuild the source document + * + * @param mixed $value A PDF-Value. Structure of values see cases in this method + */ + public function pdf_write_value(&$value) + { + if (is_subclass_of($this, 'TNTOfficiel_TCPDF')) { + parent::pdf_write_value($value); + } + + switch ($value[0]) { + + case PDF_TYPE_TOKEN : + $this->_straightOut($value[1] . ' '); + break; + case PDF_TYPE_NUMERIC : + case PDF_TYPE_REAL : + if (is_float($value[1]) && $value[1] != 0) { + $this->_straightOut(rtrim(rtrim(sprintf('%F', $value[1]), '0'), '.') .' '); + } else { + $this->_straightOut($value[1] . ' '); + } + break; + + case PDF_TYPE_ARRAY : + + // An array. Output the proper + // structure and move on. + + $this->_straightOut('['); + for ($i = 0; $i < count($value[1]); $i++) { + $this->pdf_write_value($value[1][$i]); + } + + $this->_out(']'); + break; + + case PDF_TYPE_DICTIONARY : + + // A dictionary. + $this->_straightOut('<<'); + + reset ($value[1]); + + while (list($k, $v) = each($value[1])) { + $this->_straightOut($k . ' '); + $this->pdf_write_value($v); + } + + $this->_straightOut('>>'); + break; + + case PDF_TYPE_OBJREF : + + // An indirect object reference + // Fill the object stack if needed + $cpfn =& $this->current_parser->filename; + + if (!isset($this->_don_obj_stack[$cpfn][$value[1]])) { + $this->_newobj(false,true); + $this->_obj_stack[$cpfn][$value[1]] = array($this->n, $value); + $this->_don_obj_stack[$cpfn][$value[1]] = array($this->n, $value); // Value is maybee obsolete!!! + } + $objid = $this->_don_obj_stack[$cpfn][$value[1]][0]; + + $this->_out($objid.' 0 R'); + break; + + case PDF_TYPE_STRING : + + // A string. + $this->_straightOut('('.$value[1].')'); + + break; + + case PDF_TYPE_STREAM : + + // A stream. First, output the + // stream dictionary, then the + // stream data itself. + $this->pdf_write_value($value[1]); + $this->_out('stream'); + $this->_out($value[2][1]); + $this->_out('endstream'); + break; + case PDF_TYPE_HEX : + $this->_straightOut('<'.$value[1].'>'); + break; + + case PDF_TYPE_BOOLEAN : + $this->_straightOut($value[1] ? 'true ' : 'false '); + break; + + case PDF_TYPE_NULL : + // The null object. + + $this->_straightOut('null '); + break; + } + } + + + /** + * Modified so not each call will add a newline to the output. + */ + public function _straightOut($s) + { + if (!is_subclass_of($this, 'TNTOfficiel_TCPDF')) { + if($this->state==2) + $this->pages[$this->page] .= $s; + else + $this->buffer .= $s; + } else { + if ($this->state == 2) { + if (isset($this->footerlen[$this->page]) AND ($this->footerlen[$this->page] > 0)) { + // puts data before page footer + $page = substr($this->getPageBuffer($this->page), 0, -$this->footerlen[$this->page]); + $footer = substr($this->getPageBuffer($this->page), -$this->footerlen[$this->page]); + $this->setPageBuffer($this->page, $page.' '.$s."\n".$footer); + } else { + $this->setPageBuffer($this->page, $s, true); + } + } else { + $this->setBuffer($s); + } + } + } + + /** + * rewritten to close opened parsers + * + */ + public function _enddoc() + { + parent::_enddoc(); + $this->_closeParsers(); + } + + /** + * close all files opened by parsers + */ + public function _closeParsers() + { + if ($this->state > 2 && count($this->parsers) > 0) { + foreach ($this->parsers as $k => $_){ + $this->parsers[$k]->closeFile(); + $this->parsers[$k] = null; + unset($this->parsers[$k]); + } + return true; + } + return false; + } +} diff --git a/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_fpdi_pdf_parser.php b/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_fpdi_pdf_parser.php new file mode 100644 index 00000000..5a02552e --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_fpdi_pdf_parser.php @@ -0,0 +1,408 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +// +// FPDI - Version 1.3.1 +// +// Copyright 2004-2009 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +require_once('TNTOfficiel_pdf_parser.php'); + +class TNTOfficiel_fpdi_pdf_parser extends TNTOfficiel_pdf_parser { + + /** + * Pages + * Index beginns at 0 + * + * @var array + */ + var $pages; + + /** + * Page count + * @var integer + */ + var $page_count; + + /** + * actual page number + * @var integer + */ + var $pageno; + + /** + * PDF Version of imported Document + * @var string + */ + var $pdfVersion; + + /** + * FPDI Reference + * @var object + */ + var $fpdi; + + /** + * Available BoxTypes + * + * @var array + */ + var $availableBoxes = array('/MediaBox', '/CropBox', '/BleedBox', '/TrimBox', '/ArtBox'); + + /** + * Constructor + * + * @param string $filename Source-Filename + * @param object $fpdi Object of type fpdi + */ + public function TNTOfficiel_fpdi_pdf_parser($filename, &$fpdi) + { + $this->fpdi =& $fpdi; + + parent::TNTOfficiel_pdf_parser($filename); + + // resolve Pages-Dictonary + $pages = $this->pdf_resolve_object($this->c, $this->root[1][1]['/Pages']); + + // Read pages + $this->read_pages($this->c, $pages, $this->pages); + + // count pages; + $this->page_count = count($this->pages); + } + + /** + * Overwrite parent::error() + * + * @param string $msg Error-Message + */ + public function error($msg) + { + $this->fpdi->error($msg); + } + + /** + * Get pagecount from sourcefile + * + * @return int + */ + public function getPageCount() + { + return $this->page_count; + } + + + /** + * Set pageno + * + * @param int $pageno Pagenumber to use + */ + public function setPageno($pageno) + { + $pageno = ((int) $pageno) - 1; + + if ($pageno < 0 || $pageno >= $this->getPageCount()) { + $this->fpdi->error('Pagenumber is wrong!'); + } + + $this->pageno = $pageno; + } + + /** + * Get page-resources from current page + * + * @return array + */ + public function getPageResources() + { + return $this->_getPageResources($this->pages[$this->pageno]); + } + + /** + * Get page-resources from /Page + * + * @param array $obj Array of pdf-data + */ + public function _getPageResources ($obj) + { // $obj = /Page + $obj = $this->pdf_resolve_object($this->c, $obj); + + // If the current object has a resources + // dictionary associated with it, we use + // it. Otherwise, we move back to its + // parent object. + if (isset ($obj[1][1]['/Resources'])) { + $res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Resources']); + if ($res[0] == PDF_TYPE_OBJECT) + return $res[1]; + return $res; + } else { + if (!isset ($obj[1][1]['/Parent'])) { + return false; + } else { + $res = $this->_getPageResources($obj[1][1]['/Parent']); + if ($res[0] == PDF_TYPE_OBJECT) + return $res[1]; + return $res; + } + } + } + + + /** + * Get content of current page + * + * If more /Contents is an array, the streams are concated + * + * @return string + */ + public function getContent() + { + $buffer = ''; + + if (isset($this->pages[$this->pageno][1][1]['/Contents'])) { + $contents = $this->_getPageContent($this->pages[$this->pageno][1][1]['/Contents']); + foreach($contents AS $tmp_content) { + $buffer .= $this->_rebuildContentStream($tmp_content).' '; + } + } + + return $buffer; + } + + + /** + * Resolve all content-objects + * + * @param array $content_ref + * @return array + */ + public function _getPageContent($content_ref) + { + $contents = array(); + + if ($content_ref[0] == PDF_TYPE_OBJREF) { + $content = $this->pdf_resolve_object($this->c, $content_ref); + if ($content[1][0] == PDF_TYPE_ARRAY) { + $contents = $this->_getPageContent($content[1]); + } else { + $contents[] = $content; + } + } elseif ($content_ref[0] == PDF_TYPE_ARRAY) { + foreach ($content_ref[1] AS $tmp_content_ref) { + $contents = array_merge($contents,$this->_getPageContent($tmp_content_ref)); + } + } + + return $contents; + } + + + /** + * Rebuild content-streams + * + * @param array $obj + * @return string + */ + public function _rebuildContentStream($obj) + { + $filters = array(); + + if (isset($obj[1][1]['/Filter'])) { + $_filter = $obj[1][1]['/Filter']; + + if ($_filter[0] == PDF_TYPE_TOKEN) { + $filters[] = $_filter; + } elseif ($_filter[0] == PDF_TYPE_ARRAY) { + $filters = $_filter[1]; + } + } + + $stream = $obj[2][1]; + + foreach ($filters AS $_filter) { + switch ($_filter[1]) { + case '/FlateDecode': + if (function_exists('gzuncompress')) { + $stream = (strlen($stream) > 0) ? @gzuncompress($stream) : ''; + } else { + $this->error(sprintf('To handle %s filter, please compile php with zlib support.',$_filter[1])); + } + if ($stream === false) { + $this->error('Error while decompressing stream.'); + } + break; + case '/LZWDecode': + include_once('filters/TNTOfficiel_FilterLZW_FPDI.php'); + $decoder = new TNTOfficiel_FilterLZW_FPDI($this->fpdi); + $stream = $decoder->decode($stream); + break; + case '/ASCII85Decode': + include_once('filters/TNTOfficiel_FilterASCII85_FPDI.php'); + $decoder = new TNTOfficiel_FilterASCII85_FPDI($this->fpdi); + $stream = $decoder->decode($stream); + break; + case null: + $stream = $stream; + break; + default: + $this->error(sprintf('Unsupported Filter: %s',$_filter[1])); + } + } + + return $stream; + } + + + /** + * Get a Box from a page + * Arrayformat is same as used by fpdf_tpl + * + * @param array $page a /Page + * @param string $box_index Type of Box @see $availableBoxes + * @return array + */ + public function getPageBox($page, $box_index) + { + $page = $this->pdf_resolve_object($this->c,$page); + $box = null; + if (isset($page[1][1][$box_index])) + $box =& $page[1][1][$box_index]; + + if (!is_null($box) && $box[0] == PDF_TYPE_OBJREF) { + $tmp_box = $this->pdf_resolve_object($this->c,$box); + $box = $tmp_box[1]; + } + + if (!is_null($box) && $box[0] == PDF_TYPE_ARRAY) { + $b =& $box[1]; + return array('x' => $b[0][1]/$this->fpdi->k, + 'y' => $b[1][1]/$this->fpdi->k, + 'w' => abs($b[0][1]-$b[2][1])/$this->fpdi->k, + 'h' => abs($b[1][1]-$b[3][1])/$this->fpdi->k, + 'llx' => min($b[0][1], $b[2][1])/$this->fpdi->k, + 'lly' => min($b[1][1], $b[3][1])/$this->fpdi->k, + 'urx' => max($b[0][1], $b[2][1])/$this->fpdi->k, + 'ury' => max($b[1][1], $b[3][1])/$this->fpdi->k, + ); + } elseif (!isset ($page[1][1]['/Parent'])) { + return false; + } else { + return $this->getPageBox($this->pdf_resolve_object($this->c, $page[1][1]['/Parent']), $box_index); + } + } + + public function getPageBoxes($pageno) + { + return $this->_getPageBoxes($this->pages[$pageno-1]); + } + + /** + * Get all Boxes from /Page + * + * @param array a /Page + * @return array + */ + public function _getPageBoxes($page) + { + $boxes = array(); + + foreach($this->availableBoxes AS $box) { + if ($_box = $this->getPageBox($page,$box)) { + $boxes[$box] = $_box; + } + } + + return $boxes; + } + + /** + * Get the page rotation by pageno + * + * @param integer $pageno + * @return array + */ + public function getPageRotation($pageno) + { + return $this->_getPageRotation($this->pages[$pageno-1]); + } + + public function _getPageRotation ($obj) + { // $obj = /Page + $obj = $this->pdf_resolve_object($this->c, $obj); + if (isset ($obj[1][1]['/Rotate'])) { + $res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Rotate']); + if ($res[0] == PDF_TYPE_OBJECT) + return $res[1]; + return $res; + } else { + if (!isset ($obj[1][1]['/Parent'])) { + return false; + } else { + $res = $this->_getPageRotation($obj[1][1]['/Parent']); + if ($res[0] == PDF_TYPE_OBJECT) + return $res[1]; + return $res; + } + } + } + + /** + * Read all /Page(es) + * + * @param object TNTOfficiel_pdf_context + * @param array /Pages + * @param array the result-array + */ + public function read_pages (&$c, &$pages, &$result) + { + // Get the kids dictionary + $kids = $this->pdf_resolve_object ($c, $pages[1][1]['/Kids']); + + if (!is_array($kids)) + $this->error('Cannot find /Kids in current /Page-Dictionary'); + foreach ($kids[1] as $v) { + $pg = $this->pdf_resolve_object ($c, $v); + if ($pg[1][1]['/Type'][1] === '/Pages') { + // If one of the kids is an embedded + // /Pages array, resolve it as well. + $this->read_pages ($c, $pg, $result); + } else { + $result[] = $pg; + } + } + } + + + + /** + * Get PDF-Version + * + * And reset the PDF Version used in FPDI if needed + */ + public function getPDFVersion() + { + parent::getPDFVersion(); + $this->fpdi->PDFVersion = max($this->fpdi->PDFVersion, $this->pdfVersion); + } + +} \ No newline at end of file diff --git a/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_pdf_context.php b/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_pdf_context.php new file mode 100644 index 00000000..4c6b8871 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_pdf_context.php @@ -0,0 +1,105 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +// +// FPDI - Version 1.3.1 +// +// Copyright 2004-2009 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +class TNTOfficiel_pdf_context { + + /** + * Modi + * + * @var integer 0 = file | 1 = string + */ + var $_mode = 0; + + var $file; + var $buffer; + var $offset; + var $length; + + var $stack; + + // Constructor + + public function TNTOfficiel_pdf_context(&$f) { + $this->file =& $f; + if (is_string($this->file)) + $this->_mode = 1; + $this->reset(); + } + + // Optionally move the file + // pointer to a new location + // and reset the buffered data + + public function reset($pos = null, $l = 100) { + if ($this->_mode == 0) { + if (!is_null ($pos)) { + fseek ($this->file, $pos); + } + + $this->buffer = $l > 0 ? fread($this->file, $l) : ''; + $this->length = strlen($this->buffer); + if ($this->length < $l) + $this->increase_length($l - $this->length); + } else { + $this->buffer = $this->file; + $this->length = strlen($this->buffer); + } + $this->offset = 0; + $this->stack = array(); + } + + // Make sure that there is at least one + // character beyond the current offset in + // the buffer to prevent the tokenizer + // from attempting to access data that does + // not exist + + public function ensure_content() { + if ($this->offset >= $this->length - 1) { + return $this->increase_length(); + } else { + return true; + } + } + + // Forcefully read more data into the buffer + + public function increase_length($l=100) { + if ($this->_mode == 0 && feof($this->file)) { + return false; + } elseif ($this->_mode == 0) { + $totalLength = $this->length + $l; + do { + $this->buffer .= fread($this->file, $totalLength-$this->length); + } while ((($this->length = strlen($this->buffer)) != $totalLength) && !feof($this->file)); + + return true; + } else { + return false; + } + } +} diff --git a/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_pdf_parser.php b/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_pdf_parser.php new file mode 100644 index 00000000..3cb5e7c3 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdi/TNTOfficiel_pdf_parser.php @@ -0,0 +1,725 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +// +// FPDI - Version 1.3.1 +// +// Copyright 2004-2009 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +if (!defined('PDF_TYPE_NULL')) + define('PDF_TYPE_NULL', 0); +if (!defined('PDF_TYPE_NUMERIC')) + define('PDF_TYPE_NUMERIC', 1); +if (!defined('PDF_TYPE_TOKEN')) + define('PDF_TYPE_TOKEN', 2); +if (!defined('PDF_TYPE_HEX')) + define('PDF_TYPE_HEX', 3); +if (!defined('PDF_TYPE_STRING')) + define('PDF_TYPE_STRING', 4); +if (!defined('PDF_TYPE_DICTIONARY')) + define('PDF_TYPE_DICTIONARY', 5); +if (!defined('PDF_TYPE_ARRAY')) + define('PDF_TYPE_ARRAY', 6); +if (!defined('PDF_TYPE_OBJDEC')) + define('PDF_TYPE_OBJDEC', 7); +if (!defined('PDF_TYPE_OBJREF')) + define('PDF_TYPE_OBJREF', 8); +if (!defined('PDF_TYPE_OBJECT')) + define('PDF_TYPE_OBJECT', 9); +if (!defined('PDF_TYPE_STREAM')) + define('PDF_TYPE_STREAM', 10); +if (!defined('PDF_TYPE_BOOLEAN')) + define('PDF_TYPE_BOOLEAN', 11); +if (!defined('PDF_TYPE_REAL')) + define('PDF_TYPE_REAL', 12); + +require_once('TNTOfficiel_pdf_context.php'); + +if (!class_exists('TNTOfficiel_pdf_parser')) { + + class TNTOfficiel_pdf_parser { + + /** + * Filename + * @var string + */ + var $filename; + + /** + * File resource + * @var resource + */ + var $f; + + /** + * PDF Context + * @var object TNTOfficiel_pdf_context-Instance + */ + var $c; + + /** + * xref-Data + * @var array + */ + var $xref; + + /** + * root-Object + * @var array + */ + var $root; + + /** + * PDF version of the loaded document + * @var string + */ + var $pdfVersion; + + /** + * Constructor + * + * @param string $filename Source-Filename + */ + public function TNTOfficiel_pdf_parser($filename) + { + $this->filename = $filename; + + $this->f = @fopen($this->filename, 'rb'); + + if (!$this->f) + $this->error(sprintf('Cannot open %s !', $filename)); + + $this->getPDFVersion(); + + $this->c = new TNTOfficiel_pdf_context($this->f); + + // Read xref-Data + $this->xref = array(); + $this->pdf_read_xref($this->xref, $this->pdf_find_xref()); + + // Check for Encryption + $this->getEncryption(); + + // Read root + $this->pdf_read_root(); + } + + /** + * Close the opened file + */ + public function closeFile() + { + if (isset($this->f) && is_resource($this->f)) { + fclose($this->f); + unset($this->f); + } + } + + /** + * Print Error and die + * + * @param string $msg Error-Message + */ + public function error($msg) + { + die('PDF-Parser Error: '.$msg); + } + + /** + * Check Trailer for Encryption + */ + public function getEncryption() + { + if (isset($this->xref['trailer'][1]['/Encrypt'])) { + $this->error('File is encrypted!'); + } + } + + /** + * Find/Return /Root + * + * @return array + */ + public function pdf_find_root() + { + if ($this->xref['trailer'][1]['/Root'][0] != PDF_TYPE_OBJREF) { + $this->error('Wrong Type of Root-Element! Must be an indirect reference'); + } + + return $this->xref['trailer'][1]['/Root']; + } + + /** + * Read the /Root + */ + public function pdf_read_root() + { + // read root + $this->root = $this->pdf_resolve_object($this->c, $this->pdf_find_root()); + } + + /** + * Get PDF-Version + * + * And reset the PDF Version used in FPDI if needed + */ + public function getPDFVersion() + { + fseek($this->f, 0); + preg_match('/\d\.\d/',fread($this->f,16),$m); + if (isset($m[0])) + $this->pdfVersion = $m[0]; + return $this->pdfVersion; + } + + /** + * Find the xref-Table + */ + public function pdf_find_xref() + { + $toRead = 1500; + + $stat = fseek ($this->f, -$toRead, SEEK_END); + if ($stat === -1) { + fseek ($this->f, 0); + } + $data = fread($this->f, $toRead); + + $pos = strlen($data) - strpos(strrev($data), strrev('startxref')); + $data = substr($data, $pos); + + if (!preg_match('/\s*(\d+).*$/s', $data, $matches)) { + $this->error('Unable to find pointer to xref table'); + } + + return (int) $matches[1]; + } + + /** + * Read xref-table + * + * @param array $result Array of xref-table + * @param integer $offset of xref-table + */ + public function pdf_read_xref(&$result, $offset) + { + + fseek($this->f, $o_pos = $offset-20); // set some bytes backwards to fetch errorious docs + + $data = fread($this->f, 100); + + $xrefPos = strrpos($data, 'xref'); + + if ($xrefPos === false) { + fseek($this->f, $offset); + $c = new TNTOfficiel_pdf_context($this->f); + $xrefStreamObjDec = $this->pdf_read_value($c); + + if (is_array($xrefStreamObjDec) && isset($xrefStreamObjDec[0]) && $xrefStreamObjDec[0] == PDF_TYPE_OBJDEC) { + $this->error(sprintf('This document (%s) probably uses a compression technique which is not supported by the free parser shipped with FPDI.', $this->filename)); + } else { + $this->error('Unable to find xref table.'); + } + } + + if (!isset($result['xref_location'])) { + $result['xref_location'] = $o_pos+$xrefPos; + $result['max_object'] = 0; + } + + $cylces = -1; + $bytesPerCycle = 100; + + fseek($this->f, $o_pos = $o_pos+$xrefPos+4); // set the handle directly after the "xref"-keyword + $data = fread($this->f, $bytesPerCycle); + + while (($trailerPos = strpos($data, 'trailer', max($bytesPerCycle*$cylces++, 0))) === false && !feof($this->f)) { + $data .= fread($this->f, $bytesPerCycle); + } + + if ($trailerPos === false) { + $this->error('Trailer keyword not found after xref table'); + } + + $data = substr($data, 0, $trailerPos); + + // get Line-Ending + preg_match_all("/(\r\n|\n|\r)/", substr($data, 0, 100), $m); // check the first 100 bytes for linebreaks + + $differentLineEndings = count(array_unique($m[0])); + if ($differentLineEndings > 1) { + $lines = preg_split("/(\r\n|\n|\r)/", $data, -1, PREG_SPLIT_NO_EMPTY); + } else { + $lines = explode($m[0][1], $data); + } + + $data = $differentLineEndings = $m = null; + unset($data, $differentLineEndings, $m); + + $linesCount = count($lines); + + $start = 1; + + for ($i = 0; $i < $linesCount; $i++) { + $line = trim($lines[$i]); + if ($line) { + $pieces = explode(' ', $line); + $c = count($pieces); + switch($c) { + case 2: + $start = (int)$pieces[0]; + $end = $start+(int)$pieces[1]; + if ($end > $result['max_object']) + $result['max_object'] = $end; + break; + case 3: + if (!isset($result['xref'][$start])) + $result['xref'][$start] = array(); + + if (!array_key_exists($gen = (int) $pieces[1], $result['xref'][$start])) { + $result['xref'][$start][$gen] = $pieces[2] == 'n' ? (int) $pieces[0] : null; + } + $start++; + break; + default: + $this->error('Unexpected data in xref table'); + } + } + } + + $lines = $pieces = $line = $start = $end = $gen = null; + unset($lines, $pieces, $line, $start, $end, $gen); + + fseek($this->f, $o_pos+$trailerPos+7); + + $c = new TNTOfficiel_pdf_context($this->f); + $trailer = $this->pdf_read_value($c); + + $c = null; + unset($c); + + if (!isset($result['trailer'])) { + $result['trailer'] = $trailer; + } + + if (isset($trailer[1]['/Prev'])) { + $this->pdf_read_xref($result, $trailer[1]['/Prev'][1]); + } + + $trailer = null; + unset($trailer); + + return true; + } + + /** + * Reads an Value + * + * @param object $c TNTOfficiel_pdf_context + * @param string $token a Token + * @return mixed + */ + public function pdf_read_value(&$c, $token = null) + { + if (is_null($token)) { + $token = $this->pdf_read_token($c); + } + + if ($token === false) { + return false; + } + + switch ($token) { + case '<': + // This is a hex string. + // Read the value, then the terminator + + $pos = $c->offset; + + while(1) { + + $match = strpos ($c->buffer, '>', $pos); + + // If you can't find it, try + // reading more data from the stream + + if ($match === false) { + if (!$c->increase_length()) { + return false; + } else { + continue; + } + } + + $result = substr ($c->buffer, $c->offset, $match - $c->offset); + $c->offset = $match + 1; + + return array (PDF_TYPE_HEX, $result); + } + + break; + case '<<': + // This is a dictionary. + + $result = array(); + + // Recurse into this function until we reach + // the end of the dictionary. + while (($key = $this->pdf_read_token($c)) !== '>>') { + if ($key === false) { + return false; + } + + if (($value = $this->pdf_read_value($c)) === false) { + return false; + } + + // Catch missing value + if ($value[0] == PDF_TYPE_TOKEN && $value[1] == '>>') { + $result[$key] = array(PDF_TYPE_NULL); + break; + } + + $result[$key] = $value; + } + + return array (PDF_TYPE_DICTIONARY, $result); + + case '[': + // This is an array. + + $result = array(); + + // Recurse into this function until we reach + // the end of the array. + while (($token = $this->pdf_read_token($c)) !== ']') { + if ($token === false) { + return false; + } + + if (($value = $this->pdf_read_value($c, $token)) === false) { + return false; + } + + $result[] = $value; + } + + return array (PDF_TYPE_ARRAY, $result); + + case '(': + // This is a string + $pos = $c->offset; + + $openBrackets = 1; + do { + for (; $openBrackets != 0 && $pos < $c->length; $pos++) { + switch (ord($c->buffer[$pos])) { + case 0x28: // '(' + $openBrackets++; + break; + case 0x29: // ')' + $openBrackets--; + break; + case 0x5C: // backslash + $pos++; + } + } + } while($openBrackets != 0 && $c->increase_length()); + + $result = substr($c->buffer, $c->offset, $pos - $c->offset - 1); + $c->offset = $pos; + + return array (PDF_TYPE_STRING, $result); + + case 'stream': + $o_pos = ftell($c->file)-strlen($c->buffer); + $o_offset = $c->offset; + + $c->reset($startpos = $o_pos + $o_offset); + + $e = 0; // ensure line breaks in front of the stream + if ($c->buffer[0] == chr(10) || $c->buffer[0] == chr(13)) + $e++; + if ($c->buffer[1] == chr(10) && $c->buffer[0] != chr(10)) + $e++; + + if ($this->actual_obj[1][1]['/Length'][0] == PDF_TYPE_OBJREF) { + $tmp_c = new TNTOfficiel_pdf_context($this->f); + $tmp_length = $this->pdf_resolve_object($tmp_c,$this->actual_obj[1][1]['/Length']); + $length = $tmp_length[1][1]; + } else { + $length = $this->actual_obj[1][1]['/Length'][1]; + } + + if ($length > 0) { + $c->reset($startpos+$e,$length); + $v = $c->buffer; + } else { + $v = ''; + } + $c->reset($startpos+$e+$length+9); // 9 = strlen("endstream") + + return array(PDF_TYPE_STREAM, $v); + + default: + if (is_numeric ($token)) { + // A numeric token. Make sure that + // it is not part of something else. + if (($tok2 = $this->pdf_read_token ($c)) !== false) { + if (is_numeric ($tok2)) { + + // Two numeric tokens in a row. + // In this case, we're probably in + // front of either an object reference + // or an object specification. + // Determine the case and return the data + if (($tok3 = $this->pdf_read_token ($c)) !== false) { + switch ($tok3) { + case 'obj': + return array (PDF_TYPE_OBJDEC, (int) $token, (int) $tok2); + case 'R': + return array (PDF_TYPE_OBJREF, (int) $token, (int) $tok2); + } + // If we get to this point, that numeric value up + // there was just a numeric value. Push the extra + // tokens back into the stack and return the value. + array_push ($c->stack, $tok3); + } + } + + array_push ($c->stack, $tok2); + } + + if ($token === (string)((int)$token)) + return array (PDF_TYPE_NUMERIC, (int)$token); + else + return array (PDF_TYPE_REAL, (float)$token); + } elseif ($token == 'true' || $token == 'false') { + return array (PDF_TYPE_BOOLEAN, $token == 'true'); + } elseif ($token == 'null') { + return array (PDF_TYPE_NULL); + } else { + // Just a token. Return it. + return array (PDF_TYPE_TOKEN, $token); + } + } + } + + /** + * Resolve an object + * + * @param object $c TNTOfficiel_pdf_context + * @param array $obj_spec The object-data + * @param boolean $encapsulate Must set to true, cause the parsing and fpdi use this method only without this para + */ + public function pdf_resolve_object(&$c, $obj_spec, $encapsulate = true) + { + // Exit if we get invalid data + if (!is_array($obj_spec)) { + $ret = false; + return $ret; + } + + if ($obj_spec[0] == PDF_TYPE_OBJREF) { + + // This is a reference, resolve it + if (isset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]])) { + + // Save current file position + // This is needed if you want to resolve + // references while you're reading another object + // (e.g.: if you need to determine the length + // of a stream) + + $old_pos = ftell($c->file); + + // Reposition the file pointer and + // load the object header. + + $c->reset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]]); + + $header = $this->pdf_read_value($c); + + if ($header[0] != PDF_TYPE_OBJDEC || $header[1] != $obj_spec[1] || $header[2] != $obj_spec[2]) { + $this->error("Unable to find object ({$obj_spec[1]}, {$obj_spec[2]}) at expected location"); + } + + // If we're being asked to store all the information + // about the object, we add the object ID and generation + // number for later use + $result = array(); + $this->actual_obj =& $result; + if ($encapsulate) { + $result = array ( + PDF_TYPE_OBJECT, + 'obj' => $obj_spec[1], + 'gen' => $obj_spec[2] + ); + } + + // Now simply read the object data until + // we encounter an end-of-object marker + while(1) { + $value = $this->pdf_read_value($c); + if ($value === false || count($result) > 4) { + // in this case the parser coudn't find an endobj so we break here + break; + } + + if ($value[0] == PDF_TYPE_TOKEN && $value[1] === 'endobj') { + break; + } + + $result[] = $value; + } + + $c->reset($old_pos); + + if (isset($result[2][0]) && $result[2][0] == PDF_TYPE_STREAM) { + $result[0] = PDF_TYPE_STREAM; + } + + return $result; + } + } else { + return $obj_spec; + } + } + + + + /** + * Reads a token from the file + * + * @param object $c TNTOfficiel_pdf_context + * @return mixed + */ + public function pdf_read_token(&$c) + { + // If there is a token available + // on the stack, pop it out and + // return it. + + if (count($c->stack)) { + return array_pop($c->stack); + } + + // Strip away any whitespace + + do { + if (!$c->ensure_content()) { + return false; + } + $c->offset += strspn($c->buffer, " \n\r\t", $c->offset); + } while ($c->offset >= $c->length - 1); + + // Get the first character in the stream + + $char = $c->buffer[$c->offset++]; + + switch ($char) { + + case '[': + case ']': + case '(': + case ')': + + // This is either an array or literal string + // delimiter, Return it + + return $char; + + case '<': + case '>': + + // This could either be a hex string or + // dictionary delimiter. Determine the + // appropriate case and return the token + + if ($c->buffer[$c->offset] == $char) { + if (!$c->ensure_content()) { + return false; + } + $c->offset++; + return $char . $char; + } else { + return $char; + } + + case '%': + + // This is a comment - jump over it! + + $pos = $c->offset; + while(1) { + $match = preg_match("/(\r\n|\r|\n)/", $c->buffer, $m, PREG_OFFSET_CAPTURE, $pos); + if ($match === 0) { + if (!$c->increase_length()) { + return false; + } else { + continue; + } + } + + $c->offset = $m[0][1]+strlen($m[0][0]); + + return $this->pdf_read_token($c); + } + + default: + + // This is "another" type of token (probably + // a dictionary entry or a numeric value) + // Find the end and return it. + + if (!$c->ensure_content()) { + return false; + } + + while(1) { + + // Determine the length of the token + + $pos = strcspn($c->buffer, " %[]<>()\r\n\t/", $c->offset); + + if ($c->offset + $pos <= $c->length - 1) { + break; + } else { + // If the script reaches this point, + // the token may span beyond the end + // of the current buffer. Therefore, + // we increase the size of the buffer + // and try again--just to be safe. + + $c->increase_length(); + } + } + + $result = substr($c->buffer, $c->offset - 1, $pos + 1); + + $c->offset += $pos; + return $result; + } + } + } + +} \ No newline at end of file diff --git a/www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterASCII85.php b/www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterASCII85.php new file mode 100644 index 00000000..401b4404 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterASCII85.php @@ -0,0 +1,110 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +// +// FPDI - Version 1.3.1 +// +// Copyright 2004-2009 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +if (!defined('ORD_z')) { + define('ORD_z', ord('z')); +} +if (!defined('ORD_exclmark')) { + define('ORD_exclmark', ord('!')); +} +if (!defined('ORD_u')) { + define('ORD_u', ord('u')); +} +if (!defined('ORD_tilde')) { + define('ORD_tilde', ord('~')); +} + +class TNTOfficiel_FilterASCII85 { + + public function error($msg) { + die($msg); + } + + public function decode($in) { + $out = ''; + $state = 0; + $chn = null; + + $l = strlen($in); + + for ($k = 0; $k < $l; ++$k) { + $ch = ord($in[$k]) & 0xff; + + if ($ch == ORD_tilde) { + break; + } + if (preg_match('/^\s$/',chr($ch))) { + continue; + } + if ($ch == ORD_z && $state == 0) { + $out .= chr(0).chr(0).chr(0).chr(0); + continue; + } + if ($ch < ORD_exclmark || $ch > ORD_u) { + $this->error('Illegal character in ASCII85Decode.'); + } + + $chn[$state++] = $ch - ORD_exclmark; + + if ($state == 5) { + $state = 0; + $r = 0; + for ($j = 0; $j < 5; ++$j) + $r = $r * 85 + $chn[$j]; + $out .= chr($r >> 24); + $out .= chr($r >> 16); + $out .= chr($r >> 8); + $out .= chr($r); + } + } + $r = 0; + + if ($state == 1) + $this->error('Illegal length in ASCII85Decode.'); + if ($state == 2) { + $r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1]+1) * 85 * 85 * 85; + $out .= chr($r >> 24); + } + elseif ($state == 3) { + $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + ($chn[2]+1) * 85 * 85; + $out .= chr($r >> 24); + $out .= chr($r >> 16); + } + elseif ($state == 4) { + $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + $chn[2] * 85 * 85 + ($chn[3]+1) * 85 ; + $out .= chr($r >> 24); + $out .= chr($r >> 16); + $out .= chr($r >> 8); + } + + return $out; + } + + public function encode($in) { + $this->error("ASCII85 encoding not implemented."); + } +} \ No newline at end of file diff --git a/www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterASCII85_FPDI.php b/www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterASCII85_FPDI.php new file mode 100644 index 00000000..349d726a --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterASCII85_FPDI.php @@ -0,0 +1,41 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +// +// FPDI - Version 1.3.1 +// +// Copyright 2004-2009 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +require_once('TNTOfficiel_FilterASCII85.php'); + +class TNTOfficiel_FilterASCII85_FPDI extends TNTOfficiel_FilterASCII85 { + + var $fpdi; + + public function TNTOfficiel_FilterASCII85_FPDI(&$fpdi) { + $this->fpdi =& $fpdi; + } + + public function error($msg) { + $this->fpdi->error($msg); + } +} \ No newline at end of file diff --git a/www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterLZW.php b/www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterLZW.php new file mode 100644 index 00000000..5216177d --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterLZW.php @@ -0,0 +1,162 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +// +// FPDI - Version 1.3.1 +// +// Copyright 2004-2009 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +class TNTOfficiel_FilterLZW { + + var $sTable = array(); + var $data = null; + var $dataLength = 0; + var $tIdx; + var $bitsToGet = 9; + var $bytePointer; + var $bitPointer; + var $nextData = 0; + var $nextBits = 0; + var $andTable = array(511, 1023, 2047, 4095); + + public function error($msg) { + die($msg); + } + + /** + * Method to decode LZW compressed data. + * + * @param string data The compressed data. + */ + public function decode($data) { + + if($data[0] == 0x00 && $data[1] == 0x01) { + $this->error('LZW flavour not supported.'); + } + + $this->initsTable(); + + $this->data = $data; + $this->dataLength = strlen($data); + + // Initialize pointers + $this->bytePointer = 0; + $this->bitPointer = 0; + + $this->nextData = 0; + $this->nextBits = 0; + + $oldCode = 0; + + $string = ''; + $uncompData = ''; + + while (($code = $this->getNextCode()) != 257) { + if ($code == 256) { + $this->initsTable(); + $code = $this->getNextCode(); + + if ($code == 257) { + break; + } + + $uncompData .= $this->sTable[$code]; + $oldCode = $code; + + } else { + + if ($code < $this->tIdx) { + $string = $this->sTable[$code]; + $uncompData .= $string; + + $this->addStringToTable($this->sTable[$oldCode], $string[0]); + $oldCode = $code; + } else { + $string = $this->sTable[$oldCode]; + $string = $string.$string[0]; + $uncompData .= $string; + + $this->addStringToTable($string); + $oldCode = $code; + } + } + } + + return $uncompData; + } + + + /** + * Initialize the string table. + */ + public function initsTable() { + $this->sTable = array(); + + for ($i = 0; $i < 256; $i++) + $this->sTable[$i] = chr($i); + + $this->tIdx = 258; + $this->bitsToGet = 9; + } + + /** + * Add a new string to the string table. + */ + public function addStringToTable ($oldString, $newString='') { + $string = $oldString.$newString; + + // Add this new String to the table + $this->sTable[$this->tIdx++] = $string; + + if ($this->tIdx == 511) { + $this->bitsToGet = 10; + } elseif ($this->tIdx == 1023) { + $this->bitsToGet = 11; + } elseif ($this->tIdx == 2047) { + $this->bitsToGet = 12; + } + } + + // Returns the next 9, 10, 11 or 12 bits + public function getNextCode() { + if ($this->bytePointer == $this->dataLength) { + return 257; + } + + $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff); + $this->nextBits += 8; + + if ($this->nextBits < $this->bitsToGet) { + $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff); + $this->nextBits += 8; + } + + $code = ($this->nextData >> ($this->nextBits - $this->bitsToGet)) & $this->andTable[$this->bitsToGet-9]; + $this->nextBits -= $this->bitsToGet; + + return $code; + } + + public function encode($in) { + $this->error("LZW encoding not implemented."); + } +} \ No newline at end of file diff --git a/www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterLZW_FPDI.php b/www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterLZW_FPDI.php new file mode 100644 index 00000000..9b4d8d62 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdi/filters/TNTOfficiel_FilterLZW_FPDI.php @@ -0,0 +1,41 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +// +// FPDI - Version 1.3.1 +// +// Copyright 2004-2009 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +require_once('TNTOfficiel_FilterLZW.php'); + +class TNTOfficiel_FilterLZW_FPDI extends TNTOfficiel_FilterLZW { + + var $fpdi; + + function TNTOfficiel_FilterLZW_FPDI(&$fpdi) { + $this->fpdi =& $fpdi; + } + + function error($msg) { + $this->fpdi->error($msg); + } +} \ No newline at end of file diff --git a/www/modules/tntofficiel/libraries/pdf/fpdi/filters/index.php b/www/modules/tntofficiel/libraries/pdf/fpdi/filters/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdi/filters/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/libraries/pdf/fpdi/index.php b/www/modules/tntofficiel/libraries/pdf/fpdi/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/fpdi/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/libraries/pdf/index.php b/www/modules/tntofficiel/libraries/pdf/index.php new file mode 100644 index 00000000..f16b36c6 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/libraries/pdf/manifest/HTMLTemplateTNTOfficielManifest.php b/www/modules/tntofficiel/libraries/pdf/manifest/HTMLTemplateTNTOfficielManifest.php new file mode 100644 index 00000000..477b692d --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/manifest/HTMLTemplateTNTOfficielManifest.php @@ -0,0 +1,90 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + +// HTMLTemplate. +class HTMLTemplateTNTOfficielManifest extends HTMLTemplate +{ + public $custom_model; + + public function __construct($custom_object, $smarty) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->custom_model = $custom_object; + $this->smarty = $smarty; + + // header informations + $id_lang = Context::getContext()->language->id; + $this->title = HTMLTemplateTNTOfficielManifest::l('Titre Test'); + // footer informations + $this->shop = new Shop(Context::getContext()->shop->id); + } + + /** + * Returns the template's HTML content + * @return string HTML content + */ + public function getContent() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->smarty->assign(array( + 'manifestData' => $this->custom_model, + )); + + return $this->smarty->fetch(_PS_MODULE_DIR_.'tntofficiel/views/templates/admin/manifest/custom_template_content.tpl'); + } + + public function getHeader() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->smarty->assign(array( + 'manifestData' => $this->custom_model, + )); + + return $this->smarty->fetch(_PS_MODULE_DIR_.'tntofficiel/views/templates/admin/manifest/custom_template_header.tpl'); + } + + /** + * Returns the template filename + * @return string filename + */ + public function getFooter() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + return $this->smarty->fetch(_PS_MODULE_DIR_.'tntofficiel/views/templates/admin/manifest/custom_template_footer.tpl'); + } + + /** + * Returns the template filename + * @return string filename + */ + public function getFilename() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + return 'Manifeste.pdf'; + } + + /** + * Returns the template filename when using bulk rendering + * @return string filename + */ + public function getBulkFilename() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + return 'Manifeste.pdf'; + } + +} diff --git a/www/modules/tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDF.php b/www/modules/tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDF.php new file mode 100644 index 00000000..b55468f0 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDF.php @@ -0,0 +1,34 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once(_PS_MODULE_DIR_.'tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFGenerator.php'); + +class TNTOfficiel_ManifestPDF extends PDF +{ + /** + * Constructor + * @param $objects + * @param $template + * @param $smarty + * @param string $orientation + */ + public function __construct($objects, $template, $smarty, $orientation = 'P') + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->pdf_renderer = new TNTOfficiel_ManifestPDFGenerator((bool)Configuration::get('PS_PDF_USE_CACHE'), $orientation); + $this->template = $template; + $this->smarty = $smarty; + $this->objects = $objects; + if (!($objects instanceof Iterator) && !is_array($objects)) + $this->objects = array($objects); + } + +} diff --git a/www/modules/tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFCreator.php b/www/modules/tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFCreator.php new file mode 100644 index 00000000..61246ef1 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFCreator.php @@ -0,0 +1,105 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Carrier.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDF.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFGenerator.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/pdf/manifest/HTMLTemplateTNTOfficielManifest.php'; + +class TNTOfficiel_ManifestPDFCreator +{ + public function __construct() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + } + + /** + * @param $orderList array + * @throws Exception + */ + public function createManifest($orderList) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $parcelsData = array(); + foreach ($orderList as $intOrderID) { + $intOrderID = (int)$intOrderID; + $objOrder = new Order($intOrderID); + if (!TNTOfficiel_Carrier::isTNTOfficielCarrierID($objOrder->id_carrier)) { + continue; + } + $arrTNTOrder = TNTOfficiel_OrderHelper::getInstance()->getOrderData($intOrderID, false); + $onjAddress = new Address($objOrder->id_address_delivery); + $parcels = TNTOfficiel_ParcelsHelper::getInstance()->getParcels($intOrderID); + foreach ($parcels as $p) { + $parcel = $p; + $parcel['address'] = $onjAddress; + $parcel['tntData'] = $arrTNTOrder; + $parcelsData[] = $parcel; + } + } + $carrierAccount = Configuration::get('TNT_CARRIER_ACCOUNT'); + $carrierName = Configuration::get('TNT_CARRIER_USERNAME'); + + $pdf = new TNTOfficiel_ManifestPDF( + array( + 'manifestData' => array( + 'parcelsData' => $parcelsData, + 'carrierAccount' => $carrierAccount, + 'carrierName' => $carrierName, + 'address' => $this->_getMerchantAddress(), + 'totalWeight' => $this->_getTotalWeight($parcelsData), + 'parcelsNumber' => count($parcelsData) + ) + ), + 'TNTOfficielManifest', + Context::getContext()->smarty + ); + $pdf->render(); + } + + /** + * Returns the shop address + * @return array + */ + private function _getMerchantAddress() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $address = array( + 'name' => Configuration::get('PS_SHOP_NAME'), + 'address1' => Configuration::get('PS_SHOP_ADDR1'), + 'address2' => Configuration::get('PS_SHOP_ADDR2'), + 'postcode' => Configuration::get('PS_SHOP_CODE'), + 'city' => Configuration::get('PS_SHOP_CITY'), + 'country' => Configuration::get('PS_SHOP_COUNTRY'), + ); + + return $address; + } + + /** + * Return the total weight for the given parcels + * @param $parcels + * @return float + */ + private function _getTotalWeight($parcels) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $totalWeight = (float)0; + foreach ($parcels as $parcel) { + $totalWeight += $parcel['weight']; + } + + return $totalWeight; + } + +} diff --git a/www/modules/tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFGenerator.php b/www/modules/tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFGenerator.php new file mode 100644 index 00000000..6f499ee0 --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFGenerator.php @@ -0,0 +1,23 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + +class TNTOfficiel_ManifestPDFGenerator extends PDFGenerator +{ + public function Header() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $this->writeHTML($this->header); + + $this->writeHTML('
Page : '.$this->getAliasNumPage().' de '.$this->getAliasNbPages().'
'); + } + +} diff --git a/www/modules/tntofficiel/libraries/pdf/manifest/index.php b/www/modules/tntofficiel/libraries/pdf/manifest/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/libraries/pdf/manifest/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/libraries/smarty/TNTOfficiel_OrderSmartyFunction.php b/www/modules/tntofficiel/libraries/smarty/TNTOfficiel_OrderSmartyFunction.php new file mode 100644 index 00000000..28b0e64f --- /dev/null +++ b/www/modules/tntofficiel/libraries/smarty/TNTOfficiel_OrderSmartyFunction.php @@ -0,0 +1,36 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_OrderHelper.php'; + +class TNTOfficiel_OrderSmartyFunction +{ + /** + * @param $data array + * @param $smarty + * + * @return bool|string + */ + public function getTntOrder($data, $smarty) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + try { + $arrTNTOrder = TNTOfficiel_OrderHelper::getInstance()->getOrderData($data['orderId']); + $smarty->assign('tntOrderData', $arrTNTOrder); + + return (is_string($arrTNTOrder)) ? $arrTNTOrder : null; + } catch (Exception $objException) { + $smarty->assign('tntOrderData', false); + + return false; + } + } +} diff --git a/www/modules/tntofficiel/libraries/smarty/TNTOfficiel_ShippingMethodSmartyFunction.php b/www/modules/tntofficiel/libraries/smarty/TNTOfficiel_ShippingMethodSmartyFunction.php new file mode 100644 index 00000000..499574a3 --- /dev/null +++ b/www/modules/tntofficiel/libraries/smarty/TNTOfficiel_ShippingMethodSmartyFunction.php @@ -0,0 +1,98 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + +/** + * Class TNTOfficiel_ShippingMethodSmartyFunction. + */ +class TNTOfficiel_ShippingMethodSmartyFunction +{ + /** + * @var array + */ + protected $_days = array( + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + 'Sunday', + ); + + /** + * Returns an array with schedules for each days. + * + * @param array $params Parameters of the function + * @param $smarty Smarty engine + * + * @return array + */ + public function getSchedules(array $params, $smarty) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + // Deafult value + if (is_null($params)) { + $params = array(); + } + + $schedules = array(); + + if ($hours = $params['hours']) { + $index = 0; + // Position corresponds to the number of the day + $position = 0; + // Current day + $day = null; + // Part of the day + $part = null; + + foreach ($hours as $hour) { + $hour = trim($hour); + $day = $this->_days[$position]; + + if (($index % 2 === 0) && ($index % 4 === 0)) { + $part = 'AM'; + } elseif (($index % 2 === 0) && ($index % 4 === 2)) { + $part = 'PM'; + } + + // Prepare the current Day + if (!isset($schedules[$day])) { + $schedules[$day] = array(); + } + + // Prepare the current period of the current dya + if (!isset($schedules[$day][$part]) && $hour) { + $schedules[$day][$part] = array(); + } + + // If hours different from 0 + if ($hour) { + // Add hour + $schedules[$day][$part][] = $hour; + } + + ++$index; + + if ($index % 4 == 0) { + ++$position; + } + } + } + + if ($assign = $params['assign']) { + $smarty->assign(array( + $assign => $schedules, + )); + } + } +} diff --git a/www/modules/tntofficiel/libraries/smarty/index.php b/www/modules/tntofficiel/libraries/smarty/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/libraries/smarty/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/log/TNT-request-20170911.log b/www/modules/tntofficiel/log/TNT-request-20170911.log new file mode 100644 index 00000000..7c4dd555 --- /dev/null +++ b/www/modules/tntofficiel/log/TNT-request-20170911.log @@ -0,0 +1,706 @@ +20170911 15:01:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:02:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:02:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:05:07 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:05:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:05:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:08:38 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:08:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:09:04 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:09:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:10:07 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:10:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:11:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:13:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:13:53 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:14:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:14:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:14:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:14:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:14:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:15:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:15:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:17:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:17:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:17:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:17:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:19:15 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:19:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:19:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:19:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:19:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:21:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:21:57 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:22:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:22:07 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:22:25 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:22:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:23:09 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:23:15 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:25:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:25:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:26:53 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:27:33 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:28:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:28:37 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:28:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:28:42 - 08949425 SUCCESS JSON:testCity +20170911 15:28:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:28:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:29:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:29:44 - 08949425 SUCCESS JSON:testCity +20170911 15:29:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:32:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:32:58 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:33:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:33:17 - 08949425 SUCCESS JSON:testCity +20170911 15:33:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:35:25 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:35:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:35:43 - 08949425 SUCCESS JSON:testCity +20170911 15:35:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:35:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:35:52 - 08949425 SUCCESS JSON:testCity +20170911 15:35:53 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:36:03 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:36:03 - 08949425 SUCCESS JSON:testCity +20170911 15:36:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:36:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:36:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:37:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:37:14 - 08949425 SUCCESS JSON:testCity +20170911 15:37:15 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:37:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:37:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:38:58 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:38:58 - 08949425 SUCCESS JSON:testCity +20170911 15:39:00 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:39:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:39:12 - 08949425 SUCCESS JSON:testCity +20170911 15:39:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:39:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:39:42 - 08949425 SUCCESS JSON:testCity +20170911 15:39:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:40:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:40:42 - 08949425 SUCCESS JSON:testCity +20170911 15:40:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:40:53 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:40:53 - 08949425 SUCCESS JSON:testCity +20170911 15:40:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:41:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:41:45 - 08949425 SUCCESS JSON:testCity +20170911 15:41:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:41:54 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:41:55 - 08949425 SUCCESS JSON:testCity +20170911 15:41:57 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:42:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:42:25 - 08949425 SUCCESS JSON:testCity +20170911 15:42:27 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:42:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:42:50 - 08949425 SUCCESS JSON:testCity +20170911 15:42:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:43:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:43:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:43:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:43:23 - 08949425 SUCCESS JSON:testCity +20170911 15:43:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:43:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:43:27 - 08949425 SUCCESS JSON:testCity +20170911 15:43:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:43:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:44:25 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:44:25 - 08949425 SUCCESS JSON:testCity +20170911 15:44:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:44:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:44:32 - 08949425 SUCCESS JSON:getRelayPoints +20170911 15:44:32 - 08949425 SUCCESS JSON:getCities +20170911 15:44:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:45:00 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:45:00 - 08949425 SUCCESS JSON:testCity +20170911 15:45:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:46:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:46:51 - 08949425 SUCCESS JSON:testCity +20170911 15:46:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:49:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:49:26 - 08949425 SUCCESS JSON:testCity +20170911 15:49:27 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:49:33 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:49:33 - 08949425 SUCCESS JSON:getRelayPoints +20170911 15:49:34 - 08949425 SUCCESS JSON:getCities +20170911 15:49:38 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:49:38 - 08949425 SUCCESS JSON:testCity +20170911 15:49:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:49:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:50:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:50:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:50:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:50:19 - 08949425 SUCCESS JSON:testCity +20170911 15:50:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:50:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:51:57 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:52:04 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:52:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:52:17 - 08949425 SUCCESS JSON:testCity +20170911 15:52:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:52:25 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:52:25 - 08949425 SUCCESS JSON:testCity +20170911 15:52:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:52:37 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:52:37 - 08949425 SUCCESS JSON:testCity +20170911 15:52:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:53:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:53:47 - 08949425 SUCCESS JSON:testCity +20170911 15:53:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:54:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:54:18 - 08949425 SUCCESS JSON:testCity +20170911 15:54:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:54:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:54:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:56:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:56:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:56:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:56:56 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:56:56 - 08949425 SUCCESS JSON:testCity +20170911 15:56:57 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:57:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:57:46 - 08949425 SUCCESS JSON:testCity +20170911 15:57:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:58:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:58:41 - 08949425 SUCCESS JSON:testCity +20170911 15:58:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:59:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 15:59:21 - 08949425 SUCCESS JSON:testCity +20170911 15:59:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:00:25 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:00:26 - 08949425 SUCCESS JSON:testCity +20170911 16:00:27 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:00:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:00:31 - 08949425 SUCCESS JSON:getRelayPoints +20170911 16:00:31 - 08949425 SUCCESS JSON:getCities +20170911 16:01:04 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:01:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:01:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:01:18 - 08949425 SUCCESS JSON:testCity +20170911 16:01:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:02:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:02:25 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:02:54 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:03:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:05:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:06:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:07:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:07:53 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:08:00 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:08:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:08:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:08:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:08:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:08:56 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:09:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:09:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:09:38 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:09:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:11:04 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:11:15 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:11:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:11:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:12:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:12:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:12:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:13:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:13:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:13:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:14:27 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:14:37 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:14:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:14:53 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:15:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:15:15 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:15:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:15:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:15:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:16:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:17:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:17:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:17:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:17:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:17:54 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:18:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:18:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:18:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:18:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:19:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:19:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:19:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:20:37 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:21:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:21:57 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:22:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:22:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:23:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:23:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:23:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:23:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:24:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:24:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:24:37 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:25:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:25:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:25:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:25:37 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:25:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:25:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:26:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:26:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:26:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:27:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:28:06 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:28:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:28:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:28:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:29:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:29:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:32:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:33:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:35:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:37:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:37:31 - 08949425 SUCCESS JSON:testCity +20170911 16:37:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:37:38 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:37:38 - 08949425 SUCCESS JSON:testCity +20170911 16:37:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:37:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:37:59 - 08949425 SUCCESS JSON:testCity +20170911 16:38:00 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:38:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:38:13 - 08949425 SUCCESS JSON:getRelayPoints +20170911 16:38:13 - 08949425 SUCCESS JSON:getCities +20170911 16:38:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:38:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:38:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:39:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:39:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:44:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:44:06 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:44:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:44:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:45:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:45:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:45:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:46:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:46:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:47:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:47:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:48:09 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:48:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:48:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:50:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:50:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:50:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:50:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:50:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:50:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:52:03 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:52:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:55:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:55:57 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:56:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:57:33 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:58:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:59:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:59:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:59:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 16:59:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:00:00 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:00:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:00:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:00:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:01:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:01:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:02:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:04:09 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:04:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:05:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:05:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:05:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:06:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:06:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:07:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:07:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:07:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:08:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:08:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:11:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:12:01 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:13:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:14:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:14:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:15:06 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:16:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:20:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:21:03 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:21:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:21:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:22:25 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:22:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:22:32 - 08949425 SUCCESS JSON:testCity +20170911 17:22:33 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:24:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:24:33 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:24:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:25:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:25:33 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:27:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:28:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:28:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:28:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:28:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:29:03 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:30:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:30:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:30:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:30:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:30:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:30:56 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:31:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:32:01 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:32:06 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:33:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:33:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:33:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:33:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:34:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:34:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:36:09 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:36:58 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:36:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:37:09 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:37:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:37:37 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:38:01 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:38:03 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:38:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:39:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:39:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:41:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:41:25 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:41:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:41:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:41:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:41:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:41:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:41:54 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:41:54 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:42:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:43:09 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:43:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:44:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:44:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:44:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:44:53 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:45:00 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:46:15 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:46:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:46:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:47:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:47:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:47:38 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:48:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:48:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:51:15 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:51:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:51:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:52:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:54:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:55:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:55:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:55:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:55:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:56:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:57:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:57:56 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:58:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 17:59:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:00:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:00:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:00:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:00:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:01:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:01:38 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:01:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:01:53 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:02:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:02:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:03:09 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:03:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:03:37 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:03:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:03:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:03:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:05:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:05:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:05:53 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:05:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:05:59 - 08949425 SUCCESS JSON:testCity +20170911 18:06:00 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:06:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:06:33 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:07:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:08:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:08:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:09:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:09:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:09:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:09:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:16:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:16:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:16:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:16:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:21:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:21:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:27:07 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:32:25 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:32:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:32:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:33:03 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:42:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:42:38 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:44:01 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:44:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:44:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:48:07 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:48:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:48:12 - 08949425 SUCCESS JSON:testCity +20170911 18:48:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:48:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:48:19 - 08949425 SUCCESS JSON:getRelayPoints +20170911 18:48:20 - 08949425 SUCCESS JSON:getCities +20170911 18:49:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:49:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:49:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:49:41 - 08949425 SUCCESS JSON:testCity +20170911 18:49:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:49:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:50:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:50:59 - 08949425 SUCCESS JSON:testCity +20170911 18:51:00 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:51:04 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:51:05 - 08949425 SUCCESS JSON:getRelayPoints +20170911 18:51:05 - 08949425 SUCCESS JSON:getCities +20170911 18:51:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:54:33 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:54:33 - 08949425 SUCCESS JSON:testCity +20170911 18:54:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:54:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:55:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 18:55:13 - 08949425 SUCCESS JSON:testCity +20170911 18:55:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 20:46:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 20:46:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 20:46:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 20:46:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 20:48:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 20:48:56 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 20:49:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 20:51:06 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:10:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:11:03 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:11:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:11:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:14:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:14:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:14:58 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:16:56 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:17:01 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:17:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:19:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:19:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:20:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:21:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:21:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:23:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:25:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:29:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:33:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:34:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:43:27 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:43:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:43:56 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:44:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:44:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:44:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:45:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:47:06 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:47:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:47:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:54:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:54:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:55:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:55:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:56:04 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:56:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:56:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:56:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:56:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:56:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:56:56 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:57:09 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:57:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:57:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:57:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:57:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:57:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:57:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:58:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:58:27 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:58:37 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:58:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:58:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:58:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:58:58 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:58:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:59:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:59:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:59:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:59:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:59:27 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 21:59:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:01:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:01:54 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:01:58 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:05:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:05:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:07:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:08:01 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:08:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:08:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:08:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:09:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:09:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:09:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:09:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:10:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:10:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:11:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:12:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:13:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:17:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:28:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:29:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:29:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:30:07 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:30:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:30:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:30:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:30:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:30:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:32:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:45:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:50:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:50:38 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:56:15 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:56:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:56:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:56:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:56:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 22:56:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:03:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:03:53 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:04:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:04:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:04:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:04:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:04:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:13:27 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:14:01 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:14:03 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:14:15 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:14:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:14:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:14:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:18:09 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:18:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:18:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:22:01 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:24:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:24:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:24:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:24:57 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:29:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:29:09 - 08949425 SUCCESS JSON:testCity +20170911 23:29:09 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:29:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:29:56 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:29:56 - 08949425 SUCCESS JSON:testCity +20170911 23:29:57 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:30:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:30:13 - 08949425 SUCCESS JSON:getRelayPoints +20170911 23:30:13 - 08949425 SUCCESS JSON:getCities +20170911 23:31:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:31:11 - 08949425 SUCCESS JSON:testCity +20170911 23:31:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:31:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:33:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:33:39 - 08949425 SUCCESS JSON:testCity +20170911 23:33:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:33:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:33:43 - 08949425 SUCCESS JSON:getRelayPoints +20170911 23:33:43 - 08949425 SUCCESS JSON:getCities +20170911 23:33:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:33:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:35:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:35:12 - 08949425 SUCCESS JSON:testCity +20170911 23:35:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:35:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:35:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:35:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:35:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:35:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:35:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:36:03 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:36:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:36:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:36:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:38:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:39:00 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:39:01 - 08949425 SUCCESS JSON:testCity +20170911 23:39:01 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:39:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:40:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:40:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:40:54 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:41:01 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:45:15 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:45:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:45:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:46:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:46:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:47:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:47:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:47:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:48:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:48:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:48:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:49:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:49:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:49:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:52:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:53:56 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:54:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:54:57 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:55:04 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:55:53 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:56:09 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:56:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:56:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:58:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:58:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:59:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:59:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:59:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:59:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:59:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:59:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:59:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:59:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170911 23:59:56 - 08949425 SUCCESS JSON:getCarrierQuote diff --git a/www/modules/tntofficiel/log/TNT-request-20170912.log b/www/modules/tntofficiel/log/TNT-request-20170912.log new file mode 100644 index 00000000..c6cb9298 --- /dev/null +++ b/www/modules/tntofficiel/log/TNT-request-20170912.log @@ -0,0 +1,214 @@ +20170912 00:04:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:04:08 - 08949425 SUCCESS JSON:testCity +20170912 00:04:09 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:04:14 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:04:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:04:34 - 08949425 SUCCESS JSON:testCity +20170912 00:04:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:04:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:04:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:05:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:05:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:07:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:10:07 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:12:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:12:38 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:14:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:14:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:15:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:15:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:15:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:15:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:15:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:15:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:15:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:16:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:16:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:16:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:16:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:16:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:16:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:17:00 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:17:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:17:38 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:17:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:17:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:17:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:17:54 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:17:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:18:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:18:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:18:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:19:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:19:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:19:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:19:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:19:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:20:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:20:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:20:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:20:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:01 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:33 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:21:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:22:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:22:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:22:04 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:22:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:22:15 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:22:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:23:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:23:07 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:23:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:23:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:23:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:23:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:23:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:23:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:23:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:23:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:23:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:24:01 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:24:58 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:25:04 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:25:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:26:00 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:26:03 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:26:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:26:13 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:26:27 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:26:58 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:27:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:27:04 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:27:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:27:38 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:27:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:27:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:28:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:28:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:28:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:31:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:31:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:32:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:32:03 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:33:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:33:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:33:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:33:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:34:17 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:34:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:34:19 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:34:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:34:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:34:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:34:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:35:07 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:35:11 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:35:38 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:35:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:36:00 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:36:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:36:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:36:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:36:27 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:36:27 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:39:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:42:07 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:42:37 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 00:42:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:29:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:30:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:30:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:31:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:31:08 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:31:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:31:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:32:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:33:39 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:33:58 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:34:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:35:03 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:40:48 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:41:18 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:41:32 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:44:31 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:46:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:47:16 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:53:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:55:04 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:58:58 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 09:59:51 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:00:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:00:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:00:43 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:01:33 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:01:59 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:02:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:07:12 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:07:25 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:07:26 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:07:34 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:07:47 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:07:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:07:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:08:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:08:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:09:52 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:10:40 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:11:56 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:16:49 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:20:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:23:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:23:37 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:24:02 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:25:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:25:10 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:25:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:27:07 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:30:58 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:31:30 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:31:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:31:35 - 08949425 SUCCESS JSON:testCity +20170912 10:31:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:33:54 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:33:55 - 08949425 SUCCESS JSON:testCity +20170912 10:33:56 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:34:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:34:29 - 08949425 SUCCESS JSON:testCity +20170912 10:34:29 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:34:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:34:37 - 08949425 SUCCESS JSON:getRelayPoints +20170912 10:34:37 - 08949425 SUCCESS JSON:getCities +20170912 10:34:41 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:34:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:35:23 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:35:28 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:35:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:39:36 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:39:42 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:39:44 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:43:21 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:43:23 - 08949425 SUCCESS JSON:testCity +20170912 10:43:24 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:43:35 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:44:46 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:44:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:44:55 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:45:22 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:45:45 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:45:50 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:45:54 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:46:15 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:46:20 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:47:05 - 08949425 SUCCESS JSON:getCarrierQuote +20170912 10:47:09 - 08949425 SUCCESS JSON:getCarrierQuote diff --git a/www/modules/tntofficiel/logo.gif b/www/modules/tntofficiel/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..faff73d5c125106c9827b66af510e275ea424c5a GIT binary patch literal 1969 zcmc&!dt6Lu7(UT$6LJfY&YUD&X3or+M$Ji7Gn2xEbW+$|)68K;&73iF(liJY846K$ ztz}i4JBwUG?u$ikxvV=WtaS^qg!S%BEB23V|K0D8?|k2P-sgFr_xqmTJ18zDOswD{ zp2&R!f!Z^mK_Cl(ax+*1U;+Y-ui(W4Fd$$?;OQNBb`L7&LGfrfy9wUBgw-_EoP>9c zaIg^S&O(kiA^OG`a|^zVZNuYE%)} zD3P2m*Gp)%Cf01AN1EdkmF6_1ScMH7fc7_$CaqpevkKItP1hMoQv{|^F{w0ZTicIu z3~dTw(;~1a`w!HfQ^FW%RKyc;m3%^ghKhLtktj5j2u2CMAOzW!ptyYL?ZLIG&lA$;%Y-7{dfyAQp>pK7kVi*A~GwX6aakiK{dE zHZw?Rqtc+!vl>Q++8Gt8Oa>c)*_8fWf>!^DR%hfjmBUjqTHK`2;{qPvUQ%jso zTJ5K3Bbz{f*88u-#>6Z=jVI7XCc~hlZQ;K5RC-ckpcO1*NMxAw=35-DW?06kX7s2; z(sXNRU%5i5(b*3Jnox2%8K*O{3Z0UUlSW`R9-c;{B1NGDAq*49L{dT|5XeHJLimy> zkyJv&^y5o}(Sl~Ilu>4AX&u{)Rei?Bw1~AELaVoBmeK~zWLgztV6nHg^`->gvAMl?UHvG(uDo8kvEBlz zx0grfT<0D_N=Sw}P?V=z4uMq!ga=e$M2?$hg+nO0RoKHh$Jvo`b$79}@7agq2Pbu} z5c_kIIR4^_?n%LXs!z}M78iF{%JFPcTdGS;u1^rv&3wxBV4cT8L}(tjw!AinXj0SAI=L5+=%Qty6t4g zAXIm$SRsqthlM*OmyD?MbPXC}zSU}+Otz$J`1<52wFeJzo!hY~C+0;LR0qZ_c8eZC z&q1BqJ??hnp<8|Ab)=u0-0xzkTc>SQQR2)5*}5ehYP83-lvM@u5!0)r5^`<*?NX}L zkr(W`wKgi>+vWH~?YUb~Du>pwhARG;iejcid1c-B_zQ(DPMe6%!Wr24A|k`9@;SNz z55$uBv4abJEM&Q30O8spDAKEJ?9~KIv5$PUdufVas{zwawP|eKx1fgO@47BHU9FBf zGB>GIzF{)=`cB>L#13b|?kyiFBOh&Vi0|KU(Ksx7%kk(u?k+3sgzrau-35&INEuOe oyf&Xxm}rP|iB3O%!oMUx)#|aPtbB0LqKoRf`C<31N)!qI3yp;FrvLx| literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/logo.png b/www/modules/tntofficiel/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7611ca703666d6a7c4f6a33605298b067d197a3d GIT binary patch literal 909 zcmWlY|2xwO0LMR#r{qvQwH$qUR{G*`UCnu-+9|8img;fhYS&Yuj3%?rw`XXv^<`sq zZk$I;Yc4kO<;*6go@#ESO%9dZQhB<*P;OF+67TfG`}O(*Ue8+^vU97mqq`$P5Y8+n zBXr7?uXC`QBBLa`g&?L`L$-$nfU01!+r=wiM|e$XJGqznvAXyLT21seh{t-F;$k_)2&8;vqt%f)p$uIJ%KK5qPhn*}fyqUjt= zMKE1Jvl7i0(W1hwV%+)@t(S1S6lOKd8d%C;DMx!1I<)AlMW+s3dfctUy?Wehzb}bnP!-L~4a1%(?a_rxtGwqN3iC}YsAGCa!dLb!Zr(pVD!H}1Ey}^Q-=fv)^-9}6 z#yxwZy4H588YR;2t6e=g?A|72yXu+0pG8jZ=34FNKQd^YHpDv#5~IgBBYU>hu;<^Y z^WpThU8JSDY#}-V+}5Z_DG4ePZ4u=Gdp6S~@#a5on#W8hkr`Awau3%yj}c5QOA8<; z`Bd1E+o;j4=RJ)61YszvgP#R`;=8{Y&9Y!~uiF(_W0ug%$)503x< literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/override/classes/index.php b/www/modules/tntofficiel/override/classes/index.php new file mode 100644 index 00000000..f16b36c6 --- /dev/null +++ b/www/modules/tntofficiel/override/classes/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/override/classes/order/Order.php b/www/modules/tntofficiel/override/classes/order/Order.php new file mode 100644 index 00000000..a7d37962 --- /dev/null +++ b/www/modules/tntofficiel/override/classes/order/Order.php @@ -0,0 +1,63 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +class Order extends OrderCore +{ + /** + * Order constructor. + * @param null $id + * @param null $id_lang + */ + public function __construct($id = null, $id_lang = null) + { + // Warning : Dependencies on construct implies to do not create static method using TNTOfficiel class ! + require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + parent::__construct($id, $id_lang); + } + + public function getShipping() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + return Db::getInstance()->executeS( + 'SELECT DISTINCT oc.`id_order_invoice`, + oc.`weight`, + oc.`shipping_cost_tax_excl`, + oc.`shipping_cost_tax_incl`, + c.`url`, oc.`id_carrier`, + IF((tnt.`carrier_label` IS NULL OR tnt.`carrier_label` = ""), + c.`name`, + CONCAT(c.`name` ,\' (\', tnt.`carrier_label`,\')\')) as `carrier_name`, + oc.`date_add`, + "Delivery" as `type`, + "true" as `can_edit`, + oc.`tracking_number`, + oc.`id_order_carrier`, + osl.`name` as order_state_name, + c.`name` as state_name + FROM `'._DB_PREFIX_.'orders` o + LEFT JOIN `'._DB_PREFIX_.'order_history` oh + ON (o.`id_order` = oh.`id_order`) + LEFT JOIN `'._DB_PREFIX_.'order_carrier` oc + ON (o.`id_order` = oc.`id_order`) + LEFT JOIN `'._DB_PREFIX_.'carrier` c + ON (oc.`id_carrier` = c.`id_carrier`) + LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl + ON (oh.`id_order_state` = osl.`id_order_state` + AND osl.`id_lang` = '.((int) Context::getContext()->language->id).') + LEFT JOIN `'._DB_PREFIX_.'tntofficiel_order` tnt + ON (o.`id_order` = tnt.`id_order`) + WHERE o.`id_order` = '.(int) $this->id.' + GROUP BY c.id_carrier' + ); + } +} diff --git a/www/modules/tntofficiel/override/classes/order/OrderHistory.php b/www/modules/tntofficiel/override/classes/order/OrderHistory.php new file mode 100644 index 00000000..67445eb9 --- /dev/null +++ b/www/modules/tntofficiel/override/classes/order/OrderHistory.php @@ -0,0 +1,360 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +class OrderHistory extends OrderHistoryCore +{ + /** + * OrderHistory constructor. + * + * @param null $id + * @param null $id_lang + * @param null $id_shop + */ + public function __construct($id = null, $id_lang = null, $id_shop = null) + { + // Warning : Dependencies on construct implies to do not create static method using TNTOfficiel class ! + require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + parent::__construct($id, $id_lang, $id_shop); + } + + /** + * Sets the new state of the given order. + * + * @param int $new_order_state + * @param int/object $id_order + * @param bool $use_existing_payment + */ + public function changeIdOrderState($new_order_state, $id_order, $use_existing_payment = false) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (!$new_order_state || !$id_order) { + return; + } + + if (!is_object($id_order) && is_numeric($id_order)) { + $order = new Order((int)$id_order); + } elseif (is_object($id_order)) { + $order = new Order($id_order->id); + } else { + return; + } + + ShopUrl::cacheMainDomainForShop($order->id_shop); + + $new_os = new OrderState((int)$new_order_state, $order->id_lang); + $old_os = $order->getCurrentOrderState(); + + if (in_array($new_os->id, array(Configuration::get('PS_OS_PAYMENT'), Configuration::get('PS_OS_WS_PAYMENT')))) { + Hook::exec( + 'actionPaymentConfirmation', + array('id_order' => (int)$order->id), + null, + false, + true, + false, + $order->id_shop + ); + } + + Hook::exec( + 'actionOrderStatusUpdate', + array('newOrderStatus' => $new_os, 'id_order' => (int)$order->id), + null, + false, + true, + false, + $order->id_shop + ); + + if (Validate::isLoadedObject($order) && ($new_os instanceof OrderState)) { + $virtual_products = $order->getVirtualProducts(); + if ($virtual_products && (!$old_os || !$old_os->logable) && $new_os && $new_os->logable) { + Context::getContext(); + $assign = array(); + foreach ($virtual_products as $key => $virtual_product) { + $id_product_download = ProductDownload::getIdFromIdProduct($virtual_product['product_id']); + $product_download = new ProductDownload($id_product_download); + if ($product_download->display_filename != '') { + $assign[$key]['name'] = $product_download->display_filename; + $dl_link = $product_download->getTextLink(false, $virtual_product['download_hash']) + .'&id_order='.(int)$order->id.'&secure_key='.$order->secure_key; + $assign[$key]['link'] = $dl_link; + if (isset($virtual_product['download_deadline']) + && $virtual_product['download_deadline'] != '0000-00-00 00:00:00' + ) { + $assign[$key]['deadline'] = Tools::displayDate($virtual_product['download_deadline']); + } + if ($product_download->nb_downloadable != 0) { + $assign[$key]['downloadable'] = (int)$product_download->nb_downloadable; + } + } + } + + $customer = new Customer((int)$order->id_customer); + + $links = '

'; + $data = array( + '{lastname}' => $customer->lastname, + '{firstname}' => $customer->firstname, + '{id_order}' => (int)$order->id, + '{order_name}' => $order->getUniqReference(), + '{nbProducts}' => count($virtual_products), + '{virtualProducts}' => $links, + ); + if (!empty($assign)) { + Mail::Send( + (int)$order->id_lang, + 'download_product', + Mail::l('The virtual product that you bought is available for download', $order->id_lang), + $data, + $customer->email, + $customer->firstname.' '.$customer->lastname, + null, + null, + null, + null, + _PS_MAIL_DIR_, + false, + (int)$order->id_shop + ); + } + } + + $manager = null; + if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) { + $manager = StockManagerFactory::getManager(); + } + + $errorOrCanceledStatuses = array(Configuration::get('PS_OS_ERROR'), Configuration::get('PS_OS_CANCELED')); + + if (Validate::isLoadedObject($old_os)) { + foreach ($order->getProductsDetail() as $product) { + if ($new_os->logable && !$old_os->logable) { + ProductSale::addProductSale($product['product_id'], $product['product_quantity']); + if (!Pack::isPack($product['product_id']) && + in_array($old_os->id, $errorOrCanceledStatuses) && + !StockAvailable::dependsOnStock($product['id_product'], (int)$order->id_shop) + ) { + StockAvailable::updateQuantity( + $product['product_id'], + $product['product_attribute_id'], + -(int)$product['product_quantity'], + $order->id_shop + ); + } + } elseif (!$new_os->logable && $old_os->logable) { + ProductSale::removeProductSale($product['product_id'], $product['product_quantity']); + + if (!Pack::isPack($product['product_id']) && + in_array($new_os->id, $errorOrCanceledStatuses) && + !StockAvailable::dependsOnStock($product['id_product']) + ) { + StockAvailable::updateQuantity( + $product['product_id'], + $product['product_attribute_id'], + (int)$product['product_quantity'], + $order->id_shop + ); + } + } elseif (!$new_os->logable && !$old_os->logable && + in_array($new_os->id, $errorOrCanceledStatuses) && + !in_array($old_os->id, $errorOrCanceledStatuses) && + !StockAvailable::dependsOnStock($product['id_product']) + ) { + StockAvailable::updateQuantity( + $product['product_id'], + $product['product_attribute_id'], + (int)$product['product_quantity'], + $order->id_shop + ); + } + + if ((int)$this->id_employee) { + $employee = new Employee((int)$this->id_employee); + $this->id_employee = Validate::isLoadedObject($employee) ? $this->id_employee : 0; + } + + if ($new_os->shipped == 1 && $old_os->shipped == 0 && + Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT') && + Warehouse::exists($product['id_warehouse']) && + $manager != null && + (int)$product['advanced_stock_management'] == 1) { + $warehouse = new Warehouse($product['id_warehouse']); + + $manager->removeProduct( + $product['product_id'], + $product['product_attribute_id'], + $warehouse, + $product['product_quantity'], + Configuration::get('PS_STOCK_CUSTOMER_ORDER_REASON'), + true, + (int)$order->id, + 0, + (int)$this->id_employee + ); + } elseif ($new_os->shipped == 0 && $old_os->shipped == 1 && + Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT') && + Warehouse::exists($product['id_warehouse']) && + $manager != null && + (int)$product['advanced_stock_management'] == 1 + ) { + if (Pack::isPack($product['product_id'])) { + $pack_products = Pack::getItems( + $product['product_id'], + Configuration::get('PS_LANG_DEFAULT', null, null, $order->id_shop) + ); + foreach ($pack_products as $pack_product) { + if ($pack_product->advanced_stock_management == 1) { + $mvts = StockMvt::getNegativeStockMvts( + $order->id, + $pack_product->id, + 0, + $pack_product->pack_quantity * $product['product_quantity'] + ); + foreach ($mvts as $mvt) { + $manager->addProduct( + $pack_product->id, + 0, + new Warehouse($mvt['id_warehouse']), + $mvt['physical_quantity'], + null, + $mvt['price_te'], + true, + (int)$this->id_employee + ); + } + if (!StockAvailable::dependsOnStock($product['id_product'])) { + StockAvailable::updateQuantity( + $pack_product->id, + 0, + (int)$pack_product->pack_quantity * $product['product_quantity'], + $order->id_shop + ); + } + } + } + } else { + $mvts = StockMvt::getNegativeStockMvts( + $order->id, + $product['product_id'], + $product['product_attribute_id'], + $product['product_quantity'] + ); + foreach ($mvts as $mvt) { + $manager->addProduct( + $product['product_id'], + $product['product_attribute_id'], + new Warehouse($mvt['id_warehouse']), + $mvt['physical_quantity'], + null, + $mvt['price_te'], + true + ); + } + } + } + } + } + } + + $this->id_order_state = (int)$new_order_state; + + if (!Validate::isLoadedObject($new_os) || !Validate::isLoadedObject($order)) { + die(Tools::displayError('Invalid new order status')); + } + + $order->current_state = $this->id_order_state; + $order->valid = $new_os->logable; + $order->update(); + + if ($new_os->invoice && !$order->invoice_number) { + $order->setInvoice($use_existing_payment); + } elseif ($new_os->delivery && !$order->delivery_number) { + // TODO : Method setDeliverySlip() not available in PS1.6.0.5. + $order->setDeliverySlip(); + } + + if ($new_os->paid == 1) { + $invoices = $order->getInvoicesCollection(); + if ($order->total_paid != 0) { + $payment_method = Module::getInstanceByName($order->module); + } + + foreach ($invoices as $invoice) { + $rest_paid = $invoice->getRestPaid(); + if ($rest_paid > 0) { + $payment = new OrderPayment(); + $payment->order_reference = Tools::substr($order->reference, 0, 9); + $payment->id_currency = $order->id_currency; + $payment->amount = $rest_paid; + + if ($order->total_paid != 0) { + $payment->payment_method = $payment_method->displayName; + } else { + $payment->payment_method = null; + } + + if ($payment->id_currency == $order->id_currency) { + $order->total_paid_real += $payment->amount; + } else { + $order->total_paid_real += Tools::ps_round( + Tools::convertPrice($payment->amount, $payment->id_currency, false), + 2 + ); + } + $order->save(); + + $payment->conversion_rate = 1; + $payment->save(); + Db::getInstance()->execute( + 'INSERT INTO `'._DB_PREFIX_.'order_invoice_payment`' + .' (`id_order_invoice`, `id_order_payment`, `id_order`) + VALUES('.(int)$invoice->id.', '.(int)$payment->id.', '.(int)$order->id.')' + ); + } + } + } + + if ($new_os->delivery) { + $order->setDelivery(); + } + + Hook::exec( + 'actionOrderStatusPostUpdate', + array('newOrderStatus' => $new_os, 'id_order' => (int)$order->id), + null, + false, + true, + false, + $order->id_shop + ); + + ShopUrl::resetMainDomainCache(); + } +} diff --git a/www/modules/tntofficiel/override/classes/order/index.php b/www/modules/tntofficiel/override/classes/order/index.php new file mode 100644 index 00000000..f16b36c6 --- /dev/null +++ b/www/modules/tntofficiel/override/classes/order/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/override/controllers/admin/AdminOrdersController.php b/www/modules/tntofficiel/override/controllers/admin/AdminOrdersController.php new file mode 100644 index 00000000..c4f56250 --- /dev/null +++ b/www/modules/tntofficiel/override/controllers/admin/AdminOrdersController.php @@ -0,0 +1,498 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +class AdminOrdersController extends AdminOrdersControllerCore +{ + private $carriers_array = array(); + + public function __construct() + { + // Warning : Dependencies on construct implies to do not create static method using TNTOfficiel class ! + require_once _PS_MODULE_DIR_.'tntofficiel/tntofficiel.php'; + require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Debug.php'; + require_once _PS_MODULE_DIR_.'tntofficiel/libraries/TNTOfficiel_Carrier.php'; + require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_OrderHelper.php'; + require_once _PS_MODULE_DIR_.'tntofficiel/libraries/helper/TNTOfficiel_ShipmentHelper.php'; + require_once _PS_MODULE_DIR_.'tntofficiel/libraries/pdf/manifest/TNTOfficiel_ManifestPDFCreator.php'; + + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + parent::__construct(); + $this->bootstrap = true; + $this->table = 'order'; + $this->className = 'Order'; + $this->lang = false; + $this->addRowAction('view'); + $this->explicitSelect = true; + $this->allow_export = true; + $this->deleted = false; + $this->context = Context::getContext(); + + $this->_select = ' + a.id_currency, + a.id_order AS id_pdf, + CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) AS `customer`, + osl.`name` AS `osname`, + os.`color`, + `to`.`bt_filename` AS `BT`, + `to`.`id_order` as `tntofficiel_id_order`, + `to`.`pickup_number` as `tntofficiel_pickup_number`, + IF((`to`.`carrier_label` IS NULL OR `to`.`carrier_label` = ""), + c1.`name`, + CONCAT(c1.`name` ,\' (\', `to`.`carrier_label`,\')\')) AS `carrier`, + c1.`id_carrier` as id_carrier, + IF((SELECT so.id_order + FROM `'._DB_PREFIX_.'orders` so + WHERE so.id_customer = a.id_customer AND so.id_order < a.id_order LIMIT 1) > 0, + 0, + 1) as new, + country_lang.name as cname, + IF(a.valid, 1, 0) badge_success'; + + $this->_join = ' + LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`id_customer`) + LEFT JOIN `'._DB_PREFIX_.'tntofficiel_order` `to` ON (a.`id_order` = `to`.`id_order`) + INNER JOIN `'._DB_PREFIX_.'carrier` c1 ON (a.`id_carrier` = c1.`id_carrier`) + INNER JOIN `'._DB_PREFIX_.'address` address ON address.id_address = a.id_address_delivery + INNER JOIN `'._DB_PREFIX_.'country` country ON address.id_country = country.id_country + INNER JOIN `'._DB_PREFIX_.'country_lang` country_lang + ON (country.`id_country` = country_lang.`id_country` + AND country_lang.`id_lang` = '.(int)$this->context->language->id.') + LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = a.`current_state`) + LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl + ON (os.`id_order_state` = osl.`id_order_state` + AND osl.`id_lang` = '.(int)$this->context->language->id.')'; + $this->_orderBy = 'id_order'; + $this->_orderWay = 'DESC'; + + $statuses = OrderState::getOrderStates((int)$this->context->language->id); + foreach ($statuses as $status) { + $this->statuses_array[$status['id_order_state']] = $status['name']; + } + + $carriers = Carrier::getCarriers( + (int)$this->context->language->id, + false, + false, + false, + null, + Carrier::ALL_CARRIERS + ); + foreach ($carriers as $carrier) { + $this->carriers_array[$carrier['id_carrier']] = $carrier['name']; + } + + $this->fields_list = array( + 'id_order' => array( + 'title' => $this->l('ID'), + 'align' => 'text-center', + 'class' => 'fixed-width-xs', + ), + 'reference' => array( + 'title' => $this->l('Reference'), + ), + 'new' => array( + 'title' => $this->l('New client'), + 'align' => 'text-center', + 'type' => 'bool', + 'tmpTableFilter' => true, + 'orderby' => false, + 'callback' => 'printNewCustomer', + ), + 'customer' => array( + 'title' => $this->l('Customer'), + 'havingFilter' => true, + ), + 'carrier' => array( + 'title' => $this->l('Carrier'), + 'filter_key' => 'c1!id_carrier', + 'filter_type' => 'int', + 'order_key' => 'carrier', + 'havingFilter' => true, + 'type' => 'select', + 'list' => $this->carriers_array, + ), + ); + + if (Configuration::get('PS_B2B_ENABLE')) { + $this->fields_list = array_merge( + $this->fields_list, + array( + 'company' => array( + 'title' => $this->l('Company'), + 'filter_key' => 'c!company', + ), + ) + ); + } + + $this->fields_list = array_merge( + $this->fields_list, + array( + 'total_paid_tax_incl' => array( + 'title' => $this->l('Total'), + 'align' => 'text-right', + 'type' => 'price', + 'currency' => true, + 'callback' => 'setOrderCurrency', + 'badge_success' => true, + ), + 'payment' => array( + 'title' => $this->l('Payment'), + ), + 'osname' => array( + 'title' => $this->l('Status'), + 'type' => 'select', + 'color' => 'color', + 'list' => $this->statuses_array, + 'filter_key' => 'os!id_order_state', + 'filter_type' => 'int', + 'order_key' => 'osname', + ), + 'date_add' => array( + 'title' => $this->l('Date'), + 'align' => 'text-right', + 'type' => 'datetime', + 'filter_key' => 'a!date_add', + ), + 'id_pdf' => array( + 'title' => $this->l('PDF'), + 'align' => 'text-center', + 'callback' => 'printPDFIcons', + 'orderby' => false, + 'search' => false, + 'remove_onclick' => true, + ), + 'tntofficiel_id_order' => array( + 'title' => $this->l('TNT'), + 'align' => 'text-right', + 'orderby' => false, + 'search' => false, + 'callback' => 'printBtIcon', + 'remove_onclick' => true, + ) + ) + ); + + if (Configuration::get('TNT_CARRIER_PICKUP_NUMBER_SHOW')) { + $this->fields_list = array_merge( + $this->fields_list, + array( + 'tntofficiel_pickup_number' => array( + 'title' => $this->l('N° de Ramassage'), + 'align' => 'text-right', + 'orderby' => false, + 'search' => false, + ), + ) + ); + } + + if (Country::isCurrentlyUsed('country', true)) { + $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' + SELECT DISTINCT c.id_country, cl.`name` + FROM `'._DB_PREFIX_.'orders` o + '.Shop::addSqlAssociation('orders', 'o').' + INNER JOIN `'._DB_PREFIX_.'address` a ON a.id_address = o.id_address_delivery + INNER JOIN `'._DB_PREFIX_.'country` c ON a.id_country = c.id_country + INNER JOIN `'._DB_PREFIX_.'country_lang` cl + ON (c.`id_country` = cl.`id_country` + AND cl.`id_lang` = '.(int)$this->context->language->id.') + ORDER BY cl.name ASC'); + + $country_array = array(); + foreach ($result as $row) { + $country_array[$row['id_country']] = $row['name']; + } + + $part1 = array_slice($this->fields_list, 0, 3); + $part2 = array_slice($this->fields_list, 3); + $part1['cname'] = array( + 'title' => $this->l('Delivery'), + 'type' => 'select', + 'list' => $country_array, + 'filter_key' => 'country!id_country', + 'filter_type' => 'int', + 'order_key' => 'cname', + ); + $this->fields_list = array_merge($part1, $part2); + } + + $this->shopLinkType = 'shop'; + $this->shopShareDatas = Shop::SHARE_ORDER; + + if (Tools::isSubmit('id_order')) { + $intOrderID = (int)Tools::getValue('id_order'); + $objOrder = new Order($intOrderID); + $this->context->cart = new Cart($objOrder->id_cart); + $this->context->customer = new Customer($objOrder->id_customer); + } + + $this->bulk_actions = array( + 'updateOrderStatus' => array( + 'text' => $this->l('Change Order Status'), + 'icon' => 'icon-refresh', + ), + 'getBT' => array( + 'text' => $this->l('Bon de transport de TNT'), + 'icon' => 'icon-AdminTNTOfficiel', + ), + 'getManifest' => array( + 'text' => $this->l('Manifeste TNT'), + 'icon' => 'icon-file-text', + ), + ); + } + + /** + * @param $orderId + * + * @return mixed + */ + public function printBtIcon($orderId) + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrTNTOrder = TNTOfficiel_OrderHelper::getInstance()->getOrderData($orderId); + $this->context->smarty->assign(array( + 'bt_filename' => $arrTNTOrder['bt_filename'], + 'getManifestUrl' => $this->context->link->getAdminLink('AdminTNTOfficiel').'&action=getManifest', + )); + + return $this->context->smarty->fetch(_PS_MODULE_DIR_.'tntofficiel/views/templates/admin/_print_bt_icon.tpl'); + } + + /** + * Return all the BT for the selected orders. + */ + public function processBulkGetBT() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + if (Module::isInstalled(TNTOfficiel::MODULE_NAME)) { + $arrOrderID = (array)Tools::getValue('orderBox'); + $orderList = array(); + foreach ($arrOrderID as $strOrderID) { + $intOrderID = (int)$strOrderID; + $objOrder = new Order($intOrderID); + // Check if it's a tnt order. + if (TNTOfficiel_Carrier::isTNTOfficielCarrierID($objOrder->id_carrier)) { + $orderList[] = $intOrderID; + } + } + TNTOfficiel_OrderHelper::getInstance()->getBt($orderList); + } + } + + /** + * Return all the BT for the selected orders. + */ + public function processBulkGetManifest() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $arrOrderIDList = array(); + + if (!Tools::getIsset('orderBox')) { + return; + } + + $arrOrderID = (array)Tools::getValue('orderBox'); + foreach ($arrOrderID as $strOrderID) { + $intOrderID = (int)$strOrderID; + $arrOrderIDList[] = $intOrderID; + } + $manifest = new TNTOfficiel_ManifestPDFCreator(); + $manifest->createManifest($arrOrderIDList); + } + + public function processBulkUpdateOrderStatus() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $intOrderState = (int)Tools::getValue('id_order_state'); + + if (Tools::isSubmit('submitUpdateOrderStatus') && $intOrderState) { + if ($this->tabAccess['edit'] !== '1') { + $this->errors[] = Tools::displayError('You do not have permission to edit this.'); + } else { + $objOrderState = new OrderState($intOrderState); + + if (!Validate::isLoadedObject($objOrderState)) { + $this->errors[] = sprintf(Tools::displayError('Order status #%d cannot be loaded'), $intOrderState); + } else { + $arrOrderID = (array)Tools::getValue('orderBox'); + foreach ($arrOrderID as $strOrderID) { + $intOrderID = (int)$strOrderID; + $objOrder = new Order($intOrderID); + if (!Validate::isLoadedObject($objOrder)) { + $this->errors[] = sprintf(Tools::displayError('Order #%d cannot be loaded'), $intOrderID); + } else { + /* Override start */ + if (TNTOfficiel_Carrier::isTNTOfficielCarrierID($objOrder->id_carrier) + && $objOrderState->id == Configuration::get('PS_OS_SHIPPING') + ) { + $arrTNTOrder = TNTOfficiel_OrderHelper::getInstance()->getOrderData($objOrder->id); + if ($arrTNTOrder['shipping_date'] && !$arrTNTOrder['is_shipped']) { + $objTNTShipmentHelper = TNTOfficiel_ShipmentHelper::getInstance(); + $arrMDWShippingDate = $objTNTShipmentHelper->checkSaveShipmentDate( + $objOrder->id, + $arrTNTOrder['shipping_date'] + ); + if (array_key_exists('error', $arrMDWShippingDate) + && $arrMDWShippingDate['error'] == 1 + ) { + $arrMDWShippingDate = $objTNTShipmentHelper->getNewShippingDate($objOrder->id); + if (!$arrMDWShippingDate) { + $this->errors[] = sprintf( + Tools::displayError('Cannot change status for order #%d.'), + $intOrderID + ); + continue; + } + $tempDate = new DateTime('today'); + $startDate = $tempDate->format('Y-m-d'); + Db::getInstance()->update( + 'tntofficiel_order', + array( + 'shipping_date' => pSQL($arrMDWShippingDate['shippingDate']), + 'due_date' => pSQL($arrMDWShippingDate['dueDate']), + 'start_date' => pSQL($startDate), + ), + 'id_tntofficiel_order = '.(int)$arrTNTOrder['id_tntofficiel_order'] + ); + } + } elseif (!$arrTNTOrder['shipping_date'] && !$arrTNTOrder['is_shipped']) { + $this->errors[] = sprintf( + Tools::displayError('Cannot change status for order #%d.'), + $intOrderID + ); + continue; + } + } + /* Override end */ + + $current_order_state = $objOrder->getCurrentOrderState(); + if ($current_order_state->id == $objOrderState->id) { + $this->errors[] = $this->displayWarning( + sprintf('Order #%d has already been assigned this status.', $intOrderID) + ); + } else { + $history = new OrderHistory(); + $history->id_order = $objOrder->id; + $history->id_employee = (int)$this->context->employee->id; + + $use_existings_payment = !$objOrder->hasInvoice(); + $history->changeIdOrderState( + (int)$objOrderState->id, + $objOrder, + $use_existings_payment + ); + + $carrier = new Carrier($objOrder->id_carrier, $objOrder->id_lang); + $templateVars = array(); + if ($history->id_order_state == Configuration::get('PS_OS_SHIPPING') + && $objOrder->shipping_number + ) { + $templateVars = array( + '{followup}' => str_replace('@', $objOrder->shipping_number, $carrier->url) + ); + } + + if ($history->addWithemail(true, $templateVars)) { + if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) { + foreach ($objOrder->getProducts() as $product) { + if (StockAvailable::dependsOnStock($product['product_id'])) { + StockAvailable::synchronize( + $product['product_id'], + (int)$product['id_shop'] + ); + } + } + } + } else { + $this->errors[] = sprintf( + Tools::displayError('Cannot change status for order #%d.'), + $intOrderID + ); + } + } + } + } + } + } + if (!count($this->errors)) { + Tools::redirectAdmin(self::$currentIndex.'&conf=4&token='.$this->token); + } + } + } + + /* public function printNewCustomer($tr) + { + return ($tr['new'] ? $this->l('Yes') : $this->l('No')); + } */ + public function postProcess() + { + TNTOfficiel_Debug::log(array('msg' => '>>', 'file' => __FILE__, 'line' => __LINE__)); + + $objContext = Context::getContext(); + // See hookActionOrderStatusUpdate. + $objCookie = $objContext->cookie; + + $isTntInstalled = false; + if (Module::isInstalled(TNTOfficiel::MODULE_NAME)) { + $isTntInstalled = true; + $module = Module::getInstanceByName(TNTOfficiel::MODULE_NAME); + } + + if (Tools::isSubmit('id_order')) { + $intOrderID = (int)Tools::getValue('id_order'); + if ($intOrderID > 0) { + $objOrder = new Order($intOrderID); + if (!Validate::isLoadedObject($objOrder)) { + $this->errors[] = Tools::displayError('The order cannot be found within your database.'); + } + ShopUrl::cacheMainDomainForShop((int)$objOrder->id_shop); + + if (!Tools::isSubmit('submitState') && $isTntInstalled) { + if ($module->updateShippingDate($objOrder) === false) { + $objCookie->saveShippingError = $this->l('Impossible de récupérer une date de ramassage'); + } + } + } + } + + if (Tools::isSubmit('submitState') && isset($objOrder) && $isTntInstalled) { + if (TNTOfficiel_Carrier::isTNTOfficielCarrierID($objOrder->id_carrier)) { + $arrTNTOrder = TNTOfficiel_OrderHelper::getInstance()->getOrderData($objOrder->id); + if ($arrTNTOrder['shipping_date'] && !$arrTNTOrder['is_shipped']) { + $objTNTShipmentHelper = TNTOfficiel_ShipmentHelper::getInstance(); + $arrMDWShippingDate = $objTNTShipmentHelper->checkSaveShipmentDate( + $objOrder->id, + $arrTNTOrder['shipping_date'] + ); + if (array_key_exists('error', $arrMDWShippingDate)) { + if ($arrMDWShippingDate['error'] == 1) { + $objCookie->saveShippingError = $this->l('Erreur : '.$arrMDWShippingDate['message']); + + return; + } + $objCookie->saveShippingError = $this->l('Attention : '.$arrMDWShippingDate['message']); + } + } elseif (!$arrTNTOrder['shipping_date'] && !$arrTNTOrder['is_shipped']) { + $objCookie->saveShippingError = $this->l('Erreur : Choisir une date de ramassage'); + + return; + } + } + } + + parent::postProcess(); + } +} diff --git a/www/modules/tntofficiel/override/controllers/admin/index.php b/www/modules/tntofficiel/override/controllers/admin/index.php new file mode 100644 index 00000000..f16b36c6 --- /dev/null +++ b/www/modules/tntofficiel/override/controllers/admin/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/override/controllers/index.php b/www/modules/tntofficiel/override/controllers/index.php new file mode 100644 index 00000000..f16b36c6 --- /dev/null +++ b/www/modules/tntofficiel/override/controllers/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/override/index.php b/www/modules/tntofficiel/override/index.php new file mode 100644 index 00000000..f16b36c6 --- /dev/null +++ b/www/modules/tntofficiel/override/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/translations/fr.php b/www/modules/tntofficiel/translations/fr.php new file mode 100644 index 00000000..90002ab8 --- /dev/null +++ b/www/modules/tntofficiel/translations/fr.php @@ -0,0 +1,381 @@ +tntofficiel_53ac215797e00f595f14c7ad53e7aa1a'] = 'TNT Express France'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_9b7637001f5d2bcb42efb4ab6b3e93da'] = 'La livraison express 24h partout en France avant 13h'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_3ed8d415ab1bbac628429a85851e53b6'] = 'TNT'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_c888438d14855d7d96a2724ee9c306bd'] = 'Paramètres mis à jour'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_eaccd6522158b8d67b706ffc5e3a93f9'] = 'Données d\'authentification incorrectes'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_e81d9f25acf7fa457ab32527a882ed50'] = 'TNT Express'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_1ac2ea936f12116ef4e1bcb8c75fb417'] = 'Exporter les logs'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_c9cc8cce247e49bae79f15173ce97354'] = 'Sauvegarder'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_630f6dc397fe74e52d5189e2c80f282b'] = 'Retour à la liste'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_14c4b06b824ec593239362517f538b29'] = 'Utilisateur'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_e268443e43d93dab7ebef303bbe9642f'] = 'Compte'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_5f4dcc3b5aa765d61d8327deb882cf99'] = 'Mot de passe'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_a43b0d7b1bdddcd9650598df155c4ef6'] = 'Afficher le numéro de ramassage'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_f9ae539a015bd1b6c974c17ed1bd3a0f'] = 'Google Maps API'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_34df815e78180dfe3de4498717befae3'] = 'Le nom d\'utilisateur est obligatoire'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_4b944d27d010a334b7a7ac925d58fc2a'] = 'Le numéro de compte est obligatoire'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_b34731c53c709e721b0f11e567759f38'] = 'Le mot de passe est obligatoire'; +$_MODULE['<{tntofficiel}prestashop>tntofficiel_b5c2f36d66da368ec60fae8ea9ff7b76'] = 'Une erreur est survenue lors de la création de la livraison'; +$_MODULE['<{tntofficiel}prestashop>_print_bt_icon_277b18808bb6fba9845a813795fe8baa'] = 'BT'; +$_MODULE['<{tntofficiel}prestashop>_print_bt_icon_76c3e002d3c052bd6a909366a8dc3845'] = 'Manifeste'; +$_MODULE['<{tntofficiel}prestashop>displayajaxtracking_cc97a74bb428ffc130b1b39eabc141f5'] = 'Détail de la livraison'; +$_MODULE['<{tntofficiel}prestashop>displayajaxtracking_d3d2e617335f08df83599665eef8a418'] = 'Fermer'; +$_MODULE['<{tntofficiel}prestashop>displayajaxtracking_b6026301f6eccf9afcf19458173e63e8'] = 'Numéro de suivi'; +$_MODULE['<{tntofficiel}prestashop>displayajaxtracking_50b613e90b9579184a11f56ab19ea5be'] = 'Suivre mon colis'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_5c0a951f54c0c7bf4c66dd2e6d0fe2de'] = 'Date de ramassage'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_2e79cbc13bbc903d989eab943a2e394f'] = 'Date de livraison'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_0bfc9d7a908999118a95316e5b2cd3ca'] = 'La date n\'est pas valide'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_3e6548fbd02839544c5a6ce445116b03'] = 'La date est valide'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_96f26ad4b9f1ed9c512d5944dc40d558'] = 'Colis'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_83a71abc738492fd7d9d536c5c2a7231'] = 'Numéro de ramassage : '; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_392235852a55ba6cba1db9df1b4695f0'] = 'Poids total : '; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_2ce124d87604bed00f310d4585d26ea7'] = 'Kg'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_faca76e418e6a6bf8ca1815c9586bf7c'] = 'Numéro de colis'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_7edabf994b76a00cbc60c95af337db8f'] = 'Poids'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_418c5509e2171d55b0aee5c2ea4442b5'] = 'Action'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_4e0799443cae591e21badb40f9a20754'] = 'PDL'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_151648106e4bf98297882ea2ea1c4b0e'] = 'Mise à jour réussie'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_06933067aafd48425d67bcb01bba5cb6'] = 'Mise à jour'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_f2a6c498fb90ee345d997f888fce3b18'] = 'Supprimer'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_1e8e42b87a65326b98ced7d3af717a72'] = 'Voir'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_34ec78fcc91ffb1e54cd85e4a0924332'] = 'Ajouter'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_ae30ab8690d876020e4f8dec7332f3a7'] = 'Ajouter un colis'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_09d2c2cea0ca2c48cc357e7fa996db87'] = 'Poids du colis'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_43781db5c40ecc39fd718685594f0956'] = 'Sauver'; +$_MODULE['<{tntofficiel}prestashop>displayadminorder_d41f0f868a0dbe1e9f25fe8c125f7fdd'] = 'Une commande doit contenir au moins un colis'; +$_MODULE['<{tntofficiel}prestashop>displaycarrierlist_c945f0cc434c21e830eb9bd8d45b2845'] = 'La commande ne peut pas être achetée'; +$_MODULE['<{tntofficiel}prestashop>displaycarrierlist_0c0a7d8a27886268bf0f5ec9727288df'] = 'La ville saisie est inconnue pour le code postal %s'; +$_MODULE['<{tntofficiel}prestashop>displaycarrierlist_eacc8a7970c5a823d0f383f15591c8b0'] = 'Informations complémentaires transporteur'; +$_MODULE['<{tntofficiel}prestashop>displaycarrierlist_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'Email'; +$_MODULE['<{tntofficiel}prestashop>displaycarrierlist_4e186c431f7c016c761c722debb9768e'] = 'Téléphone portable'; +$_MODULE['<{tntofficiel}prestashop>displaycarrierlist_070c051179746c6932db988f0a52b282'] = 'Numéro du bâtiment (3 caractères maximum)'; +$_MODULE['<{tntofficiel}prestashop>displaycarrierlist_dc4a632c5933c9c81274bedc8dd797f7'] = 'Code d\'accès au bâtiment (7 caractères maximum)'; +$_MODULE['<{tntofficiel}prestashop>displaycarrierlist_f3f6d0343d56ce88ce7958170ed05cb3'] = 'Etage (2 caractères maximum)'; +$_MODULE['<{tntofficiel}prestashop>displaycarrierlist_70397c4b252a5168c5ec003931cea215'] = 'Champs obligatoires'; +$_MODULE['<{tntofficiel}prestashop>displaycarrierlist_6971dd4c515c58b6122410c8bd1ed6fe'] = 'Le champ \'Téléphone portable\' doit être composé de 10 chiffres sans espace ni point, et commencer par un 06 ou 07'; +$_MODULE['<{tntofficiel}prestashop>displaycarrierlist_8144eaaa3a1db5748161ec93fa3b5f1c'] = 'Une erreur s\'est produite'; +$_MODULE['<{tntofficiel}prestashop>displayorderdetail_a7dd12b1dab17d25467b0b0a4c8d4a92'] = 'Voir'; +$_MODULE['<{tntofficiel}prestashop>displayorderdetail_ef7eea8df7e16831217a3b25c58bf508'] = 'Suivre mes colis'; +$_MODULE['<{tntofficiel}prestashop>deliverypointsbox_60c1249f2568c852f5fa352e609d1741'] = 'Choisissez votre Relais Colis®'; +$_MODULE['<{tntofficiel}prestashop>deliverypointsbox_775721e7246431e9e3fa4c9ea932db0d'] = 'Choisissez votre Dépôt restant'; +$_MODULE['<{tntofficiel}prestashop>deliverypointset_ccdb7bf9d93e5652b57cabcc8c41e061'] = 'Horaires'; +$_MODULE['<{tntofficiel}prestashop>deliverypointset_6f8522e0610541f1ef215a22ffa66ff6'] = 'Lundi'; +$_MODULE['<{tntofficiel}prestashop>deliverypointset_5792315f09a5d54fb7e3d066672b507f'] = 'Mardi'; +$_MODULE['<{tntofficiel}prestashop>deliverypointset_796c163589f295373e171842f37265d5'] = 'Mercredi'; +$_MODULE['<{tntofficiel}prestashop>deliverypointset_78ae6f0cd191d25147e252dc54768238'] = 'Jeudi'; +$_MODULE['<{tntofficiel}prestashop>deliverypointset_c33b138a163847cdb6caeeb7c9a126b4'] = 'Vendredi'; +$_MODULE['<{tntofficiel}prestashop>deliverypointset_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Samedi'; +$_MODULE['<{tntofficiel}prestashop>deliverypointset_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Dimanche'; +$_MODULE['<{tntofficiel}prestashop>deliverypointset_be5d5d37542d75f93a87094459f76678'] = 'et'; +$_MODULE['<{tntofficiel}prestashop>deliverypointset_03f4a47830f97377a35321051685071e'] = 'Fermé'; +$_MODULE['<{tntofficiel}prestashop>deliverypointset_f4ec5f57bd4d31b803312d873be40da9'] = 'Modifier'; +$_MODULE['<{tntofficiel}prestashop>form_48974cc3df177e6b565c39aa155458cd'] = 'Adresse de livraison'; +$_MODULE['<{tntofficiel}prestashop>form_8bcdc441379cbf584638b0589a3f9adb'] = 'Code postal'; +$_MODULE['<{tntofficiel}prestashop>form_57d056ed0984166336b7879c2af3657f'] = 'Ville'; +$_MODULE['<{tntofficiel}prestashop>form_36936b078805af8a6e283161721f99e1'] = '-- Sélectionner une ville --'; +$_MODULE['<{tntofficiel}prestashop>form_647552b29642ed538b23b5bc3d28864f'] = 'Aucune ville disponible'; +$_MODULE['<{tntofficiel}prestashop>form_f4ec5f57bd4d31b803312d873be40da9'] = 'Modifier'; +$_MODULE['<{tntofficiel}prestashop>list_ccdb7bf9d93e5652b57cabcc8c41e061'] = 'Horaires'; +$_MODULE['<{tntofficiel}prestashop>list_6f8522e0610541f1ef215a22ffa66ff6'] = 'Lundi'; +$_MODULE['<{tntofficiel}prestashop>list_5792315f09a5d54fb7e3d066672b507f'] = 'Mardi'; +$_MODULE['<{tntofficiel}prestashop>list_796c163589f295373e171842f37265d5'] = 'Mercredi'; +$_MODULE['<{tntofficiel}prestashop>list_78ae6f0cd191d25147e252dc54768238'] = 'Jeudi'; +$_MODULE['<{tntofficiel}prestashop>list_c33b138a163847cdb6caeeb7c9a126b4'] = 'Vendredi'; +$_MODULE['<{tntofficiel}prestashop>list_8b7051187b9191cdcdae6ed5a10e5adc'] = 'Samedi'; +$_MODULE['<{tntofficiel}prestashop>list_9d1a0949c39e66a0cd65240bc0ac9177'] = 'Dimanche'; +$_MODULE['<{tntofficiel}prestashop>list_be5d5d37542d75f93a87094459f76678'] = 'et'; +$_MODULE['<{tntofficiel}prestashop>list_03f4a47830f97377a35321051685071e'] = 'Fermé'; +$_MODULE['<{tntofficiel}prestashop>list_961f2247a2070bedff9f9cd8d64e2650'] = 'Choisir'; +$_MODULE['<{tntofficiel}prestashop>list_5a07832bfc91847bdde742703f7a7d71'] = 'Aucune ville correspondante pour le code postal demandé.'; +$_MODULE['<{tntofficiel}prestashop>list_671f3468c84b318bbcd174a4a546765e'] = 'Vérifier le code postal et cliquez sur'; +$_MODULE['<{tntofficiel}prestashop>list_f4ec5f57bd4d31b803312d873be40da9'] = 'Modifier'; +$_MODULE['<{tntofficiel}prestashop>list_fdfeefba19d7a7f570a372d1cf8b20fb'] = 'Sélectionnez une ville dans la liste et cliquez sur'; +$_MODULE['<{tntofficiel}prestashop>list_e0db4c0842a1cc908c6c97e621bd8481'] = 'Aucun point de livraison n\'est disponible pour cette ville.'; +$_MODULE['<{tntofficiel}prestashop>view_010cd82f1f972dc6b720536adb555533'] = 'Commandes liées'; +$_MODULE['<{tntofficiel}prestashop>view_01abfc750a0c942167651c40d088531d'] = 'n°'; +$_MODULE['<{tntofficiel}prestashop>view_0262a3dc4fae9adc8cb46e788806ccbf'] = 'Créer une commande'; +$_MODULE['<{tntofficiel}prestashop>view_034d2690db87b737dd810afccbe41b7a'] = 'Créer une commande'; +$_MODULE['<{tntofficiel}prestashop>view_03ab340b3f99e03cff9e84314ead38c0'] = 'Quantité'; +$_MODULE['<{tntofficiel}prestashop>view_03c2e7e41ffc181a4e84080b4710e81e'] = 'Nouveau'; +$_MODULE['<{tntofficiel}prestashop>view_065ab3a28ca4f16f55f103adc7d0226f'] = 'Livraison'; +$_MODULE['<{tntofficiel}prestashop>view_068f80c7519d0528fb08e82137a72131'] = 'Produits'; +$_MODULE['<{tntofficiel}prestashop>view_06933067aafd48425d67bcb01bba5cb6'] = 'Mettre à jour'; +$_MODULE['<{tntofficiel}prestashop>view_0945359809dad1fbf3dea1c95a0da951'] = 'Document'; +$_MODULE['<{tntofficiel}prestashop>view_0aed4e816d2ab18361bbfe990b4fdcde'] = 'Utiliser ce panier'; +$_MODULE['<{tntofficiel}prestashop>view_0c458988127eb2150776881e2ef3f0c4'] = 'Adresse de livraison'; +$_MODULE['<{tntofficiel}prestashop>view_0d4d1c76cbf823ecde73e6a2e17672bd'] = 'Commande n°%1$d (%2$s) - %3$s %4$s'; +$_MODULE['<{tntofficiel}prestashop>view_0d9175fe89fb80d815e7d03698b6e83a'] = 'Cadeau'; +$_MODULE['<{tntofficiel}prestashop>view_0da6a00e3eb2132d5cf97463a099c49f'] = 'Commander n°'; +$_MODULE['<{tntofficiel}prestashop>view_0eaadb4fcb48a0a0ed7bc9868be9fbaa'] = 'Attention'; +$_MODULE['<{tntofficiel}prestashop>view_0ec8109e3ffa61bcc147c89d9a396cd7'] = '%s HT'; +$_MODULE['<{tntofficiel}prestashop>view_0fe067d5d05655a4c80602c1d6e7d0c5'] = 'Message de l\'emballage cadeau'; +$_MODULE['<{tntofficiel}prestashop>view_1067f7778added234b6064bc8aa0765d'] = 'Remettre les produits en stock'; +$_MODULE['<{tntofficiel}prestashop>view_107ca6f108ab1c0c66015df0f61845a9'] = 'Emballage recyclé'; +$_MODULE['<{tntofficiel}prestashop>view_10ea517069300c23c17f113a3d084c57'] = 'Changer l\'état de la commande'; +$_MODULE['<{tntofficiel}prestashop>view_11599f38f7ac080ae579f1bf32f08561'] = 'Ajouter un bon d\'achat'; +$_MODULE['<{tntofficiel}prestashop>view_14c7a12fdbf437a0545aed3365ce3f84'] = 'Aucune marchandise n\'a été retournée pour le moment'; +$_MODULE['<{tntofficiel}prestashop>view_153c7809e6b00b6cbfa01b8aa9db43e3'] = 'payé au lieu de'; +$_MODULE['<{tntofficiel}prestashop>view_197101c4a1b1fc503dcd6ebee127aa10'] = 'Prix unitaire'; +$_MODULE['<{tntofficiel}prestashop>view_19dfe063714422004b75043eaf74c9b8'] = 'Mode de livraison'; +$_MODULE['<{tntofficiel}prestashop>view_1a747e98fba823d6be62189cbac46dcb'] = 'Emballage recyclé'; +$_MODULE['<{tntofficiel}prestashop>view_1c481aa99d081c32182011a758f73d33'] = '%s'; +$_MODULE['<{tntofficiel}prestashop>view_1c76cbfe21c6f44c1d1e59d54f3e4420'] = 'Société'; +$_MODULE['<{tntofficiel}prestashop>view_1cbe7897dd334369ef17e185ee455c46'] = 'Erreur : Choisir une date de ramassage'; +$_MODULE['<{tntofficiel}prestashop>view_1dd1c5fb7f25cd41b291d43a89e3aefd'] = 'Aujourd\'hui'; +$_MODULE['<{tntofficiel}prestashop>view_1e1cc9bdeb2f29f5480106aec7e9bc48'] = 'Maintenant'; +$_MODULE['<{tntofficiel}prestashop>view_1e504df905c966d01e09188c5ebd451f'] = 'Cacher les paniers et commandes pour ce client.'; +$_MODULE['<{tntofficiel}prestashop>view_1f065062cdb50b501c5cb5160cf21ab0'] = 'Marge nette par visiteur'; +$_MODULE['<{tntofficiel}prestashop>view_200e62e510bab9b03c912e10a5363a7a'] = 'Créer une nouvelle facture'; +$_MODULE['<{tntofficiel}prestashop>view_257630448a4acd9cfc1ce6c7a5ce05f3'] = 'Ajouter un nouveau client'; +$_MODULE['<{tntofficiel}prestashop>view_267806034cfac4481cabe7b81c81f91d'] = 'Commande depuis le back-office'; +$_MODULE['<{tntofficiel}prestashop>view_284b47b0bb63ae2df3b29f0e691d6fcf'] = 'Adresses'; +$_MODULE['<{tntofficiel}prestashop>view_28a996f23ec7c4f6cf75da6bf30670bd'] = 'Rechercher un client en tapant les premières lettres de son nom.'; +$_MODULE['<{tntofficiel}prestashop>view_290612199861c31d1036b185b4e69b75'] = 'Récapitulatif'; +$_MODULE['<{tntofficiel}prestashop>view_2992ddfe54874870b55a608156745a84'] = 'Bon de Transport de TNT'; +$_MODULE['<{tntofficiel}prestashop>view_29aa46cc3d2677c7e0f216910df600ff'] = 'Frais de port offerts'; +$_MODULE['<{tntofficiel}prestashop>view_29c14e1df15d10b73ec9605fd146b9fe'] = 'Aucun transporteur ne peut être appliqué à cette commande'; +$_MODULE['<{tntofficiel}prestashop>view_2ab74fb771ac34b95b1657895282d5d9'] = 'Choisissez un message prédéfini'; +$_MODULE['<{tntofficiel}prestashop>view_2d0f6b8300be19cf35e89e66f0677f95'] = 'Ajouter au panier'; +$_MODULE['<{tntofficiel}prestashop>view_2ef876508663171dedb532b4ecdb19a1'] = 'Marque de la carte'; +$_MODULE['<{tntofficiel}prestashop>view_3247bceed27afd513688fe6de93224a1'] = 'N° de Ramassage'; +$_MODULE['<{tntofficiel}prestashop>view_341216368d7ecd01ce32b8b9892293cf'] = 'toutes taxes comprises.'; +$_MODULE['<{tntofficiel}prestashop>view_341ee6bf57abde84135c32f55a607de2'] = 'Souhaitez-vous envoyer ce message au client ?'; +$_MODULE['<{tntofficiel}prestashop>view_34623cd7893be21da4239d08f79aec9a'] = 'Prix du produit, diminué du montant du bon de réduction initial'; +$_MODULE['<{tntofficiel}prestashop>view_3601146c4e948c32b6424d2c0a7f0118'] = 'Prix'; +$_MODULE['<{tntofficiel}prestashop>view_386c339d37e737a436499d423a77df0c'] = 'Devise'; +$_MODULE['<{tntofficiel}prestashop>view_3964fd83339fec5014c831822005653a'] = 'Choisir l\'heure'; +$_MODULE['<{tntofficiel}prestashop>view_3a2d5fe857d8f9541136a124c2edec6c'] = 'Ou'; +$_MODULE['<{tntofficiel}prestashop>view_3aed2ba8458a0f4099f520c58e9f2f5d'] = 'Si vous ne sélectionnez pas \"Transporteur offert\", le coût normal du transporteur sera appliqué'; +$_MODULE['<{tntofficiel}prestashop>view_3b0649c72650c313a357338dcdfb64ec'] = 'Commentaire'; +$_MODULE['<{tntofficiel}prestashop>view_3d0d1f906e27800531e054a3b6787b7c'] = 'Quantité'; +$_MODULE['<{tntofficiel}prestashop>view_3d4d2d9627d3f1b1c0d22b9e85c687d1'] = 'Le panier doit avoir un client'; +$_MODULE['<{tntofficiel}prestashop>view_3ec365dd533ddb7ef3d1c111186ce872'] = 'Détails'; +$_MODULE['<{tntofficiel}prestashop>view_3ed8d415ab1bbac628429a85851e53b6'] = 'TNT'; +$_MODULE['<{tntofficiel}prestashop>view_400264c3cd8f2e65b9f19375230b59b8'] = 'Générer un bon de réduction'; +$_MODULE['<{tntofficiel}prestashop>view_4174f012bc63b679f092acd1a933bf5c'] = 'L\'e-mail a été envoyé au client.'; +$_MODULE['<{tntofficiel}prestashop>view_41953cbf836297b3c96b137a2b789ccb'] = 'Appliquer à toutes les factures'; +$_MODULE['<{tntofficiel}prestashop>view_41de6d6cfb8953c021bbe4ba0701c8a1'] = 'Messages'; +$_MODULE['<{tntofficiel}prestashop>view_4320b10eab24c2b8ee337355e7deb4c6'] = 'Ajouter une réduction'; +$_MODULE['<{tntofficiel}prestashop>view_43c2b5547b84d3fe632a8297c27ed20e'] = 'Vous devez ajouter au moins une adresse pour passer la commande.'; +$_MODULE['<{tntofficiel}prestashop>view_44749712dbec183e983dcd78a7736c41'] = 'Date'; +$_MODULE['<{tntofficiel}prestashop>view_448e9885f58aad30823ddde9996114d6'] = 'Choisir un état de commande'; +$_MODULE['<{tntofficiel}prestashop>view_449fae749af1f675c63510eecb0b88c4'] = 'Afficher ce panier'; +$_MODULE['<{tntofficiel}prestashop>view_44f36e0e113ab5d842c47691364f6eb4'] = 'Impossible de retourner ce produit'; +$_MODULE['<{tntofficiel}prestashop>view_4523758f4415c5b7afe9c6bd6b4917b3'] = 'Texte n°%s'; +$_MODULE['<{tntofficiel}prestashop>view_453c92894f48764318534163c2bb2830'] = 'Les prix sont Hors Taxe'; +$_MODULE['<{tntofficiel}prestashop>view_465d60b936c982d7b57674f30ba022d0'] = 'Produit'; +$_MODULE['<{tntofficiel}prestashop>view_466eadd40b3c10580e3ab4e8061161ce'] = 'Facture'; +$_MODULE['<{tntofficiel}prestashop>view_47ac923d219501859fb68fed8c8db77b'] = 'Déclinaison'; +$_MODULE['<{tntofficiel}prestashop>view_47f9082fc380ca62d531096aa1d110f1'] = 'Privé'; +$_MODULE['<{tntofficiel}prestashop>view_4800d00deaa0a28a18151d76feb858cb'] = 'Nouveau détail de facture'; +$_MODULE['<{tntofficiel}prestashop>view_484f5a79672cebe198ebdde45a1d672f'] = 'Paquet cadeau'; +$_MODULE['<{tntofficiel}prestashop>view_4994a8ffeba4ac3140beb89e8d41f174'] = 'Langue'; +$_MODULE['<{tntofficiel}prestashop>view_49ee3087348e8d44e1feda1917443987'] = 'Nom'; +$_MODULE['<{tntofficiel}prestashop>view_4ad439b4f7069964e258259e049fa90c'] = 'Remboursement standard'; +$_MODULE['<{tntofficiel}prestashop>view_4b6c6cda10a23d1bdc920f2e47e5f46f'] = 'Ajouter un produit'; +$_MODULE['<{tntofficiel}prestashop>view_4b8def9be8f45a8d6baea36b26868965'] = 'Annuler les produits'; +$_MODULE['<{tntofficiel}prestashop>view_4c15f9bb0c76e90180c701b2d39994d8'] = 'Frais de port (TTC)'; +$_MODULE['<{tntofficiel}prestashop>view_4c2a8fe7eaf24721cc7a9f0175115bd4'] = 'Message'; +$_MODULE['<{tntofficiel}prestashop>view_4ce1f4aa76f0f9eaadaff8de2fe0860a'] = 'Impossible de récupérer une date de ramassage'; +$_MODULE['<{tntofficiel}prestashop>view_4d734cc32a5cac86597621969696baa8'] = 'Cette valeur doit être taxes incluses.'; +$_MODULE['<{tntofficiel}prestashop>view_5068c162a60b5859f973f701333f45c5'] = 'Numéro de suivi'; +$_MODULE['<{tntofficiel}prestashop>view_50cd1871f950375eef4e2efce35366c6'] = 'Ajouter une note'; +$_MODULE['<{tntofficiel}prestashop>view_52aeead61e400c8faeb3c1dcb355e7a5'] = 'Date d\'expiration de la carte'; +$_MODULE['<{tntofficiel}prestashop>view_54e85d70ea67acdcc86963b14d6223a8'] = 'Paniers abandonnés'; +$_MODULE['<{tntofficiel}prestashop>view_552a0d8c17d95d5dbdc0c28217024f5a'] = 'Frais d\'expédition'; +$_MODULE['<{tntofficiel}prestashop>view_57297718fdb439175177cf6b196172d1'] = 'État de la commande'; +$_MODULE['<{tntofficiel}prestashop>view_576e650084068ed747fb3b22196dcd70'] = 'Si vous décidez de créer cette remise pour toutes les factures, une seule remise sera créée pour chaque facture de commande.'; +$_MODULE['<{tntofficiel}prestashop>view_585bc67adbb73dcca638b897fb73a900'] = 'Voir le document'; +$_MODULE['<{tntofficiel}prestashop>view_58a13b9a4e13f53cf70a60bf583321e1'] = 'Total bons de réduction (HT)'; +$_MODULE['<{tntofficiel}prestashop>view_5d9fe8726be08b6e26a0c05319590b01'] = 'Plus de détails...'; +$_MODULE['<{tntofficiel}prestashop>view_5da618e8e4b89c66fe86e32cdafde142'] = 'Du'; +$_MODULE['<{tntofficiel}prestashop>view_5db361171166373b9694fc4aeb0932b5'] = 'Il n\'y a pas de document disponible'; +$_MODULE['<{tntofficiel}prestashop>view_5e1ce9eb796081fea13e0d0dd3c3d76f'] = 'Numéro de référence'; +$_MODULE['<{tntofficiel}prestashop>view_5f9a97c1e1ac934b2eb46a9888c3bc8c'] = 'hors taxe.'; +$_MODULE['<{tntofficiel}prestashop>view_601d8c4b9f72fc1862013c19b677a499'] = 'Adresse de facturation'; +$_MODULE['<{tntofficiel}prestashop>view_60adc330494a66981dec101c81e27f03'] = 'Siret'; +$_MODULE['<{tntofficiel}prestashop>view_614103b76fd0d9de068d69034fb6f987'] = '(%s)'; +$_MODULE['<{tntofficiel}prestashop>view_6188ffe19286d3bf694160609cf15e82'] = 'Inclure le montant du bon de réduction initial'; +$_MODULE['<{tntofficiel}prestashop>view_62902641c38f3a4a8eb3212454360e24'] = 'Minute'; +$_MODULE['<{tntofficiel}prestashop>view_63d5049791d9d79d86e9a108b0a999ca'] = 'Référence'; +$_MODULE['<{tntofficiel}prestashop>view_6416e8cb5fc0a208d94fa7f5a300dbc4'] = 'Entrepôt'; +$_MODULE['<{tntofficiel}prestashop>view_643b37e767ef12dd6aa58c77dfcb9bda'] = 'Pour ce groupe de clients, les prix sont affichés : [1]%s[/1]'; +$_MODULE['<{tntofficiel}prestashop>view_65247263c6ea1d91027b28a41db8cb4b'] = 'Editing this product line will remove the reduction and base price.'; +$_MODULE['<{tntofficiel}prestashop>view_6564612f96de4b8015ded38cd2c9c443'] = 'Manifeste TNT'; +$_MODULE['<{tntofficiel}prestashop>view_66dc0eb61ab4157d6170494e6841a77a'] = 'Commentaire privé'; +$_MODULE['<{tntofficiel}prestashop>view_6702a6e3bc2dce95c3e3b61fe578f29c'] = 'Montant'; +$_MODULE['<{tntofficiel}prestashop>view_689202409e48743b914713f96d93947c'] = 'Valeur'; +$_MODULE['<{tntofficiel}prestashop>view_694e8d1f2ee056f98ee488bdc4982d73'] = 'Quantité'; +$_MODULE['<{tntofficiel}prestashop>view_6a5efd211a422296eab4adc476c98f0e'] = 'Retourner les produits'; +$_MODULE['<{tntofficiel}prestashop>view_6a7bac4a86e299a2718b9d2c7c8aaea9'] = 'Compte créé'; +$_MODULE['<{tntofficiel}prestashop>view_6a94d8492279c2bfd3e81f3158658980'] = '[Génération] Règle panier pour livraison offerte'; +$_MODULE['<{tntofficiel}prestashop>view_6c957f72dc8cdacc75762f2cbdcdfaf2'] = 'Prix unitaire'; +$_MODULE['<{tntofficiel}prestashop>view_6fe50cb3c0bf60f28ac9049ae6cb8c26'] = 'Cette commande a été passée par un compte invité.'; +$_MODULE['<{tntofficiel}prestashop>view_711cb64729ed5b666cf97c01691f5806'] = 'Inclure frais de port'; +$_MODULE['<{tntofficiel}prestashop>view_7137dec9b59978006f8b0ec036099346'] = 'Cet avertissement concerne aussi la commande'; +$_MODULE['<{tntofficiel}prestashop>view_719fec04166d6fa75f89cd29ad61fa8c'] = 'Taxes'; +$_MODULE['<{tntofficiel}prestashop>view_71e2851d86b252a44c658b896c486921'] = 'Modifier une note'; +$_MODULE['<{tntofficiel}prestashop>view_729a51874fe901b092899e9e8b31c97a'] = 'Êtes-vous sûr ?'; +$_MODULE['<{tntofficiel}prestashop>view_730224c4825ae2c174f4cdaff321520e'] = 'Transformer en compte client'; +$_MODULE['<{tntofficiel}prestashop>view_7315d80cbbbb36fdcd92ba46a6384eff'] = 'Montrer les paniers et commandes pour ce client.'; +$_MODULE['<{tntofficiel}prestashop>view_73af90a8372beea9f81a3c3ca77a4aa8'] = 'Envoyer un e-mail au client contenant le lien pour effectuer le paiement.'; +$_MODULE['<{tntofficiel}prestashop>view_7442e29d7d53e549b78d93c46b8cdcfc'] = 'Commandes'; +$_MODULE['<{tntofficiel}prestashop>view_747c6a3564774149c989884e0c581d53'] = 'Envoyer le message'; +$_MODULE['<{tntofficiel}prestashop>view_74c06eb18eeb118d7b3c623d0c717290'] = 'Rembourser les produits'; +$_MODULE['<{tntofficiel}prestashop>view_76f0ed934de85cc7131910b32ede7714'] = 'Rembourser'; +$_MODULE['<{tntofficiel}prestashop>view_7731388b0fae4c0d7214f6a1f6f1771f'] = 'Montant de votre choix'; +$_MODULE['<{tntofficiel}prestashop>view_773b660773e6106c248814fa87b480f7'] = 'Erreur durant l\'envoi de l\'e-mail au client.'; +$_MODULE['<{tntofficiel}prestashop>view_77fd2b4393b379bedd30efcd5df02090'] = 'Remboursement partiel'; +$_MODULE['<{tntofficiel}prestashop>view_782678f4ba02feb3e9ecd51e902cd16b'] = 'Historique des remboursements'; +$_MODULE['<{tntofficiel}prestashop>view_7bb36e0f484d91aeba5d83fe2af63d28'] = 'Rechercher un produit'; +$_MODULE['<{tntofficiel}prestashop>view_7bf753e0cbb2d38818ba2a3ee3b36f4d'] = 'Total des taxes'; +$_MODULE['<{tntofficiel}prestashop>view_7dce122004969d56ae2e0245cb754d35'] = 'Modifier'; +$_MODULE['<{tntofficiel}prestashop>view_7fb46048bafd1294fab5c1675ef4f849'] = 'Saisir un paiement'; +$_MODULE['<{tntofficiel}prestashop>view_7fc63f077cf04742cf02e7c589b428e9'] = '(Max %s %s)'; +$_MODULE['<{tntofficiel}prestashop>view_80cb34a90bc2178e9219ccc4ab106867'] = 'Générer la facture'; +$_MODULE['<{tntofficiel}prestashop>view_85fb93a8ee9440499692da24a1621769'] = 'APE'; +$_MODULE['<{tntofficiel}prestashop>view_867343577fa1f33caa632a19543bd252'] = 'Mots clés'; +$_MODULE['<{tntofficiel}prestashop>view_883370e6a8360f9ffe2e658db153fd74'] = 'Cette fonctionnalité va générer un mot de passe aléatoire et envoyer un e-mail au client.'; +$_MODULE['<{tntofficiel}prestashop>view_88427ec035734b45aae9f7d8859a5008'] = 'ID de la transaction'; +$_MODULE['<{tntofficiel}prestashop>view_887ee91702c962a70b87cbef07bbcaec'] = 'HT'; +$_MODULE['<{tntofficiel}prestashop>view_894fdeeda7d3575fd6775732d026992c'] = 'Erreur : le prix du produit doit être établi'; +$_MODULE['<{tntofficiel}prestashop>view_8a8ece2eaecf6b5771d66434212e060d'] = 'Total payé depuis la création du compte'; +$_MODULE['<{tntofficiel}prestashop>view_8b3e7bc0ed634c2bc8ac54a4cc2e781f'] = 'Mise en place d\'un formulaire de paiement'; +$_MODULE['<{tntofficiel}prestashop>view_8c489d0946f66d17d73f26366a4bf620'] = 'Poids'; +$_MODULE['<{tntofficiel}prestashop>view_8d4ac0e8c6f5900930ddfccd45d10abf'] = 'payés en trop'; +$_MODULE['<{tntofficiel}prestashop>view_8e0398b929d533c18fff7f5e21e8fcbd'] = 'Prix du produit'; +$_MODULE['<{tntofficiel}prestashop>view_90bf4568676d012fc21b3556fbd0303b'] = 'Dupliquer cette commande'; +$_MODULE['<{tntofficiel}prestashop>view_914419aa32f04011357d3b604a86d7eb'] = 'Transporteur'; +$_MODULE['<{tntofficiel}prestashop>view_931d3a3ad177dd96a28c9642fec11b01'] = 'Numéro de carte'; +$_MODULE['<{tntofficiel}prestashop>view_93cba07454f06a4a960172bbd6e2a435'] = 'Oui'; +$_MODULE['<{tntofficiel}prestashop>view_94003250a2187a9f51b227b490e5ab6b'] = 'Nouveau client'; +$_MODULE['<{tntofficiel}prestashop>view_947d8520f04473da621f2718138f3bc6'] = '30 jours'; +$_MODULE['<{tntofficiel}prestashop>view_961f2247a2070bedff9f9cd8d64e2650'] = 'Choisissez'; +$_MODULE['<{tntofficiel}prestashop>view_96a1d1c198d05a84d447899f9ee1bef0'] = 'Commande %1$s de %2$s %3$s'; +$_MODULE['<{tntofficiel}prestashop>view_96a2d6388d5c73e22a1edbe506f86b17'] = 'Total frais de port (HT)'; +$_MODULE['<{tntofficiel}prestashop>view_96b0141273eabab320119c467cdcaf17'] = 'Total'; +$_MODULE['<{tntofficiel}prestashop>view_979640f579db842e61902ca061153965'] = 'Retours produits'; +$_MODULE['<{tntofficiel}prestashop>view_988fd738de9c6d177440c5dcf69e73ce'] = 'Retour'; +$_MODULE['<{tntofficiel}prestashop>view_99e1953076f2095e40cecd83ecda351c'] = 'Suivi TNT'; +$_MODULE['<{tntofficiel}prestashop>view_9d5bf15117441a1b52eb1f0808e4aad3'] = 'Réductions'; +$_MODULE['<{tntofficiel}prestashop>view_9f38710d8e9ee2338dafa9ae484b0d85'] = 'Aller sur la page de paiement pour procéder au paiement.'; +$_MODULE['<{tntofficiel}prestashop>view_a1fa27779242b4902f7ae3bdd5c6d508'] = 'Type'; +$_MODULE['<{tntofficiel}prestashop>view_a240fa27925a635b08dc28c9e4f9216d'] = 'Commande'; +$_MODULE['<{tntofficiel}prestashop>view_a2eda4e1c4dfc9bade7150b878c57a46'] = 'Voir tous les messages'; +$_MODULE['<{tntofficiel}prestashop>view_a59dfa688b2182563bfc189928a66965'] = '%1s - %2s'; +$_MODULE['<{tntofficiel}prestashop>view_a5e35abc0c9e2d2784d0ef619b36448b'] = 'Frais d\'expédition'; +$_MODULE['<{tntofficiel}prestashop>view_a6105c0a611b41b08f1209506350279e'] = 'oui'; +$_MODULE['<{tntofficiel}prestashop>view_a6181ae0a3e0370de94efa64782a6e79'] = 'Pas de bon de livraison'; +$_MODULE['<{tntofficiel}prestashop>view_a6ecff447ea8327b43f5d16a924fb6be'] = 'Voir la facture'; +$_MODULE['<{tntofficiel}prestashop>view_a76d4ef5f3f6a672bbfab2865563e530'] = 'Heure'; +$_MODULE['<{tntofficiel}prestashop>view_a76e7775f5454953c7152f5160e75182'] = 'Configurer les messages prédéfinis'; +$_MODULE['<{tntofficiel}prestashop>view_a82868319826fb092b73968e661b5b38'] = 'Bons de réduction'; +$_MODULE['<{tntofficiel}prestashop>view_a85eba4c6c699122b2bb1387ea4813ad'] = 'Panier'; +$_MODULE['<{tntofficiel}prestashop>view_a9971a36ea6236b1577b27dba46775ed'] = 'Référence fournisseur'; +$_MODULE['<{tntofficiel}prestashop>view_aa52110dbfce51cc1ec8a163264151e2'] = 'Existant'; +$_MODULE['<{tntofficiel}prestashop>view_accfc34fe6c65228a926b524870161ab'] = 'Ce panier n\'existe pas'; +$_MODULE['<{tntofficiel}prestashop>view_ad8783089f828b927473fb61d51940ec'] = 'Utiliser'; +$_MODULE['<{tntofficiel}prestashop>view_adaaee4b22041c27198d410c68d952c9'] = 'Pourcentage'; +$_MODULE['<{tntofficiel}prestashop>view_aea807cc550550acd7b8d9a7bc469f6a'] = 'Vous devez choisir une boutique pour créer de nouvelles commandes'; +$_MODULE['<{tntofficiel}prestashop>view_aeddc664f1e95691c69ea44a5c1c18f5'] = 'Ce produit est en rupture de stock'; +$_MODULE['<{tntofficiel}prestashop>view_afdbd71037839ec5a581febacab7bad7'] = 'Aucun client trouvé'; +$_MODULE['<{tntofficiel}prestashop>view_b15e1100a6196acba01ef7aaa5b2a9e5'] = 'Ajouter une nouvelle adresse'; +$_MODULE['<{tntofficiel}prestashop>view_b2ee912b91d69b435159c7c3f6df7f5f'] = 'Numéro'; +$_MODULE['<{tntofficiel}prestashop>view_b2f40690858b404ed10e62bdf422c704'] = 'Montant'; +$_MODULE['<{tntofficiel}prestashop>view_b52b44c9d23e141b067d7e83b44bb556'] = 'Produits'; +$_MODULE['<{tntofficiel}prestashop>view_b55e509c697e4cca0e1d160a7806698f'] = 'Heure'; +$_MODULE['<{tntofficiel}prestashop>view_b5a7adde1af5c87d7fd797b6245c2a39'] = 'Description'; +$_MODULE['<{tntofficiel}prestashop>view_b718adec73e04ce3ec720dd11a06a308'] = 'ID'; +$_MODULE['<{tntofficiel}prestashop>view_b7623e931f082f027293f27dbfe7a8ea'] = 'Montrer au client'; +$_MODULE['<{tntofficiel}prestashop>view_b8d649752e2493d7d761b05cc255c3fd'] = 'La quantité à retourner est supérieure à la quantité disponible'; +$_MODULE['<{tntofficiel}prestashop>view_b9208b03bcc9eb4a336258dcdcb66207'] = 'Déclinaisons'; +$_MODULE['<{tntofficiel}prestashop>view_b9313ee2094019f4ee5212f784f45d65'] = 'Exclure le montant du bon de réduction initial'; +$_MODULE['<{tntofficiel}prestashop>view_b94cb106eaa958b2ab473da305e57977'] = 'Total (HT)'; +$_MODULE['<{tntofficiel}prestashop>view_b9af8635591dc44009ccd8e5389722ec'] = 'Aucun produit trouvé'; +$_MODULE['<{tntofficiel}prestashop>view_b9e6daaef804c01f3847f1da8b053dd1'] = 'Image n°'; +$_MODULE['<{tntofficiel}prestashop>view_ba794350deb07c0c96fe73bd12239059'] = 'Emballage'; +$_MODULE['<{tntofficiel}prestashop>view_bafd7322c6e97d25b6299b5d6fe8920b'] = 'Non'; +$_MODULE['<{tntofficiel}prestashop>view_bbee72681d2c075d95355d3d9ccefb4e'] = 'Avoir concernant la commande n°%d'; +$_MODULE['<{tntofficiel}prestashop>view_bcab2ed7cab19f8e119317a7e59d316a'] = 'Erreur : aucun produit sélectionné'; +$_MODULE['<{tntofficiel}prestashop>view_bcd1b68617759b1dfcff0403a6b5a8d1'] = 'PDF'; +$_MODULE['<{tntofficiel}prestashop>view_be4254ec37a7bf0d2babdf04bce774cf'] = 'Imprimer la commande'; +$_MODULE['<{tntofficiel}prestashop>view_be73df859979ad499dd484eeb187be60'] = 'Historique des retours'; +$_MODULE['<{tntofficiel}prestashop>view_c04e4a193365ce28bcc3e5b210dd3065'] = '%1s - %2s - %3s'; +$_MODULE['<{tntofficiel}prestashop>view_c112bd7d596888979be02bd780e6a94f'] = 'Afficher cette commande'; +$_MODULE['<{tntofficiel}prestashop>view_c12a553ab6ad810580afa3f07aa9f51f'] = 'non payés'; +$_MODULE['<{tntofficiel}prestashop>view_c20497ad97022701fa9b5d3c34c0c474'] = 'Propriétaire de la carte'; +$_MODULE['<{tntofficiel}prestashop>view_c2808546f3e14d267d798f4e0e6f102e'] = 'Personnalisé'; +$_MODULE['<{tntofficiel}prestashop>view_c453a4b8e8d98e82f35b67f433e3b4da'] = 'Paiement'; +$_MODULE['<{tntofficiel}prestashop>view_c4832c266d52c6cef340a9c656ddda26'] = 'Erreur. Vous ne pouvez pas rembourser un montant négatif.'; +$_MODULE['<{tntofficiel}prestashop>view_c4b689eeebf8e942907a1cc1d086dba6'] = 'Procéder à un remboursement partiel'; +$_MODULE['<{tntofficiel}prestashop>view_c6ba3f7beac8724d025d570d002b1579'] = 'Aucun bon trouvé'; +$_MODULE['<{tntofficiel}prestashop>view_c78ba40a94a132dc170cba2f8c66f310'] = 'Rechercher un produit en saisissant les premières lettres de son nom.'; +$_MODULE['<{tntofficiel}prestashop>view_c89db248919294ef0291a6586f6e9a5b'] = 'Rechercher un bon d\'achat'; +$_MODULE['<{tntofficiel}prestashop>view_c990c4027126c39a93fcaaafb68732b3'] = 'Supprimer la réduction'; +$_MODULE['<{tntofficiel}prestashop>view_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; +$_MODULE['<{tntofficiel}prestashop>view_cb1766c2f66e428afb3b74a67c045370'] = 'Marquer ce message comme \'lu\''; +$_MODULE['<{tntofficiel}prestashop>view_cc61945cbbf46721a053467c395c666f'] = 'Remboursé'; +$_MODULE['<{tntofficiel}prestashop>view_cd5cb1c932fc6f41a4fb3f6ec2f0c2da'] = 'Erreur : la quantité doit être établie'; +$_MODULE['<{tntofficiel}prestashop>view_ce26601dac0dea138b7295f02b7620a7'] = 'Client'; +$_MODULE['<{tntofficiel}prestashop>view_ce5bf551379459c1c61d2a204061c455'] = 'Emplacement'; +$_MODULE['<{tntofficiel}prestashop>view_ce8ae9da5b7cd6c3df2929543a9af92d'] = 'E-mail'; +$_MODULE['<{tntofficiel}prestashop>view_cf439751556c68503540b036d35b1c78'] = '%s (%s remboursé)'; +$_MODULE['<{tntofficiel}prestashop>view_d201284604b35aa9392cb9c1acc434a6'] = 'Avoir concernant la commande n°%d'; +$_MODULE['<{tntofficiel}prestashop>view_d53b54a2bdbf970c70b7de7de4f6021f'] = 'Commandes validées'; +$_MODULE['<{tntofficiel}prestashop>view_d68a1671669f7e55d73dd78c22d52dfa'] = 'Cette commande a été payée en partie par bon de réduction. Choisissez le montant que vous souhaitez rembourser'; +$_MODULE['<{tntofficiel}prestashop>view_d694c11f096d5d666dde9ab8f9d9ba29'] = 'Changer la devise'; +$_MODULE['<{tntofficiel}prestashop>view_d71940f24ee38ee09f6e06b908480bcf'] = 'Renvoyer l\'e-mail'; +$_MODULE['<{tntofficiel}prestashop>view_da22c93ccb398c72070f4000cc7b59a1'] = 'Personnalisation'; +$_MODULE['<{tntofficiel}prestashop>view_db205f01b4fd580fb5daa9072d96849d'] = 'Total produits'; +$_MODULE['<{tntofficiel}prestashop>view_dc8d1b4e8c9bdf1eed97eb9ed5877a43'] = 'Voulez-vous écraser le message actuel ?'; +$_MODULE['<{tntofficiel}prestashop>view_ddd167afc1441dcab03a9546c8ef8b51'] = 'Voir le bon de livraison'; +$_MODULE['<{tntofficiel}prestashop>view_de78da3154b793d64d302db27e65baec'] = 'Aucun moyen de paiement disponible'; +$_MODULE['<{tntofficiel}prestashop>view_deb10517653c255364175796ace3553f'] = 'Produit'; +$_MODULE['<{tntofficiel}prestashop>view_e0a1695cc8d58eae2745b55059687db6'] = 'Boutique : %s'; +$_MODULE['<{tntofficiel}prestashop>view_e12167aa0a7698e6ebc92b4ce3909b53'] = 'Au'; +$_MODULE['<{tntofficiel}prestashop>view_e13004b81566bfc42daa48372c15111b'] = 'Changer l\'état de la commande'; +$_MODULE['<{tntofficiel}prestashop>view_e1b638a956fae226de3740f63a4e7d48'] = 'Vous souhaitez ajouter plus de produit qu\'il n\'y a de stock, êtes-vous sûr de vouloir ajouter cette quantité ?'; +$_MODULE['<{tntofficiel}prestashop>view_e2103a9e878a2280b3163e5ee098cbdf'] = 'Êtes-vous sûr de vouloir créer une nouvelle facture ?'; +$_MODULE['<{tntofficiel}prestashop>view_e2e79605fc9450ec17957cf0e910f5c6'] = 'TTC'; +$_MODULE['<{tntofficiel}prestashop>view_e413f403aa8d5253b487d09fc84e47a0'] = 'Générer un avoir'; +$_MODULE['<{tntofficiel}prestashop>view_e49701f123af735cf327227e8ab09bac'] = 'Commande manuelle - Employé'; +$_MODULE['<{tntofficiel}prestashop>view_e4c3da18c66c0147144767efeb59198f'] = 'Taux de transformation'; +$_MODULE['<{tntofficiel}prestashop>view_e5bd639f4d74cf2c52afada77086f788'] = 'Procéder à un remboursement'; +$_MODULE['<{tntofficiel}prestashop>view_e5d61db40a917c78a9d8e821dd0dd8de'] = 'Ajouter une commande'; +$_MODULE['<{tntofficiel}prestashop>view_ea067eb37801c5aab1a1c685eb97d601'] = 'Total payé'; +$_MODULE['<{tntofficiel}prestashop>view_ea4788705e6873b424c65e91c2846b19'] = 'Annuler'; +$_MODULE['<{tntofficiel}prestashop>view_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Livraison'; +$_MODULE['<{tntofficiel}prestashop>view_eb1b764a2636ba00ae66e6946ba4ee99'] = 'Bon de transport de TNT'; +$_MODULE['<{tntofficiel}prestashop>view_ec211f7c20af43e742bf2570c3cb84f9'] = 'Ajouter'; +$_MODULE['<{tntofficiel}prestashop>view_ec53a8c4f07baed5d8825072c89799be'] = 'État'; +$_MODULE['<{tntofficiel}prestashop>view_ecd2046a1d4a6e46c11914c04b9559e4'] = 'Un compte client utilisant cette adresse e-mail existe déjà'; +$_MODULE['<{tntofficiel}prestashop>view_ee7197503a8a3820850df76fb406c224'] = 'Bon de livraison'; +$_MODULE['<{tntofficiel}prestashop>view_eed1808b8206c5a62cc6407f85cf95bc'] = 'Total (TTC)'; +$_MODULE['<{tntofficiel}prestashop>view_eeddc7284795f5c71b12156c06e9e821'] = 'Rechercher un client'; +$_MODULE['<{tntofficiel}prestashop>view_ef5f330df17f8c955005c26466c2463c'] = 'Les retours produits sont désactivés'; +$_MODULE['<{tntofficiel}prestashop>view_f0aaaae189e9c7711931a65ffcd22543'] = 'Moyen de paiement'; +$_MODULE['<{tntofficiel}prestashop>view_f13673c7e261fd8d00915c9cb768ad95'] = 'Message de la commande'; +$_MODULE['<{tntofficiel}prestashop>view_f14b582c1b0eab88ed5904fb781568c0'] = 'Nom de la réduction'; +$_MODULE['<{tntofficiel}prestashop>view_f28128b38efbc6134dc40751ee21fd29'] = 'Documents'; +$_MODULE['<{tntofficiel}prestashop>view_f2a6c498fb90ee345d997f888fce3b18'] = 'Supprimer'; +$_MODULE['<{tntofficiel}prestashop>view_f38c718d5cc5ea7331d8acf533f9bf0d'] = 'Cette avertissement concerne aussi les commandes suivantes'; +$_MODULE['<{tntofficiel}prestashop>view_f4ec5f57bd4d31b803312d873be40da9'] = 'Modifier'; +$_MODULE['<{tntofficiel}prestashop>view_f5359d1dd07def542aa9b0577fb27068'] = 'Mettre à jour l\'état'; +$_MODULE['<{tntofficiel}prestashop>view_f53e8d0e97c47ce70ca9c5eaa08a00d0'] = 'Avoir'; +$_MODULE['<{tntofficiel}prestashop>view_f741fe9d353085c596e3c3610101e245'] = 'Renvoyer cet e-mail au client'; +$_MODULE['<{tntofficiel}prestashop>view_f8246f1c2cfd9a81a376223428bd09d7'] = 'Pas de facture'; +$_MODULE['<{tntofficiel}prestashop>view_f8a09f634b7b3ede2da34607da2aaebe'] = 'Quantités disponibles'; +$_MODULE['<{tntofficiel}prestashop>view_f8b1369a8e9d90da0cae0b11049309af'] = 'Non défini'; +$_MODULE['<{tntofficiel}prestashop>view_f92965e2c8a7afb3c1b9a5c09a263636'] = 'Valider'; +$_MODULE['<{tntofficiel}prestashop>view_f9a5775d7def0b6c57393fc86bb7a730'] = 'N\'oubliez pas de mettre à jour vos taux de change avant d\'effectuer cette modification.'; +$_MODULE['<{tntofficiel}prestashop>view_fb61758d0f0fda4ba867c3d5a46c16a7'] = 'Sources'; +$_MODULE['<{tntofficiel}prestashop>view_fc24bca31a0e2f75c9979c18760a4960'] = 'Voir la commande'; +$_MODULE['<{tntofficiel}prestashop>view_fc26e55e0993a75e892175deb02aae15'] = 'Paniers'; +$_MODULE['<{tntofficiel}prestashop>view_fcebe56087b9373f15514831184fa572'] = 'En Stock'; +$_MODULE['<{tntofficiel}prestashop>view_fdfac28b5ad628f25649d9c2eb4fc62e'] = 'Retourné'; +$_MODULE['<{tntofficiel}prestashop>view_ffbb5322a3702b0d8d9c7f506209c540'] = 'Panier moyen'; \ No newline at end of file diff --git a/www/modules/tntofficiel/translations/index.php b/www/modules/tntofficiel/translations/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/translations/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/upgrade/index.php b/www/modules/tntofficiel/upgrade/index.php new file mode 100644 index 00000000..f16b36c6 --- /dev/null +++ b/www/modules/tntofficiel/upgrade/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/upgrade/install-1.2.10.php b/www/modules/tntofficiel/upgrade/install-1.2.10.php new file mode 100644 index 00000000..64b73b50 --- /dev/null +++ b/www/modules/tntofficiel/upgrade/install-1.2.10.php @@ -0,0 +1,67 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_1_2_10($objTNT) +{ + $templateOverrides = array( + array( + 'fileName' => 'view.tpl', + 'directorySrc' => 'views/templates/admin/override/controllers/admin/templates/orders/helpers/view/', + 'directoryDst' => 'controllers/admin/templates/orders/helpers/view/', + ), + ); + + foreach ($templateOverrides as $template) { + try { + $directoryDst = _PS_OVERRIDE_DIR_.$template['directoryDst']; + if (!is_dir($directoryDst)) { + mkdir($directoryDst, 0777, true); + } + $overrideDestination = $directoryDst.$template['fileName']; + if (file_exists($overrideDestination)) { + unlink($overrideDestination); + } + } catch (Exception $objException) { + $logger = new FileLogger(); + $logger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $logger->log($objException->getMessage(), 3); + return false; + } + + try { + $directoryDst = _PS_OVERRIDE_DIR_.$template['directoryDst']; + if (!is_dir($directoryDst)) { + mkdir($directoryDst, 0777, true); + } + $overrideSrc = $objTNT->getLocalPath().$template['directorySrc'].$template['fileName']; + $overrideDestination = $directoryDst.$template['fileName']; + + copy($overrideSrc, $overrideDestination); + } catch (Exception $objException) { + $logger = new FileLogger(); + $logger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $logger->log($objException->getMessage(), 3); + return false; + } + } + + // Reinstall Overrides + if (!$objTNT->uninstallOverrides()) { + return false; + } + if (!$objTNT->installOverrides()) { + return false; + } + + return true; +} diff --git a/www/modules/tntofficiel/upgrade/install-1.2.11.php b/www/modules/tntofficiel/upgrade/install-1.2.11.php new file mode 100644 index 00000000..ce268d85 --- /dev/null +++ b/www/modules/tntofficiel/upgrade/install-1.2.11.php @@ -0,0 +1,67 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_1_2_11($objTNT) +{ + $templateOverrides = array( + array( + 'fileName' => 'view.tpl', + 'directorySrc' => 'views/templates/admin/override/controllers/admin/templates/orders/helpers/view/', + 'directoryDst' => 'controllers/admin/templates/orders/helpers/view/', + ), + ); + + foreach ($templateOverrides as $template) { + try { + $directoryDst = _PS_OVERRIDE_DIR_.$template['directoryDst']; + if (!is_dir($directoryDst)) { + mkdir($directoryDst, 0777, true); + } + $overrideDestination = $directoryDst.$template['fileName']; + if (file_exists($overrideDestination)) { + unlink($overrideDestination); + } + } catch (Exception $objException) { + $logger = new FileLogger(); + $logger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $logger->log($objException->getMessage(), 3); + return false; + } + + try { + $directoryDst = _PS_OVERRIDE_DIR_.$template['directoryDst']; + if (!is_dir($directoryDst)) { + mkdir($directoryDst, 0777, true); + } + $overrideSrc = $objTNT->getLocalPath().$template['directorySrc'].$template['fileName']; + $overrideDestination = $directoryDst.$template['fileName']; + + copy($overrideSrc, $overrideDestination); + } catch (Exception $objException) { + $logger = new FileLogger(); + $logger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $logger->log($objException->getMessage(), 3); + return false; + } + } + + // Reinstall Overrides + if (!$objTNT->uninstallOverrides()) { + return false; + } + if (!$objTNT->installOverrides()) { + return false; + } + + return true; +} diff --git a/www/modules/tntofficiel/upgrade/install-1.2.12.php b/www/modules/tntofficiel/upgrade/install-1.2.12.php new file mode 100644 index 00000000..afe31b99 --- /dev/null +++ b/www/modules/tntofficiel/upgrade/install-1.2.12.php @@ -0,0 +1,67 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_1_2_12($objTNT) +{ + $templateOverrides = array( + array( + 'fileName' => 'view.tpl', + 'directorySrc' => 'views/templates/admin/override/controllers/admin/templates/orders/helpers/view/', + 'directoryDst' => 'controllers/admin/templates/orders/helpers/view/', + ), + ); + + foreach ($templateOverrides as $template) { + try { + $directoryDst = _PS_OVERRIDE_DIR_.$template['directoryDst']; + if (!is_dir($directoryDst)) { + mkdir($directoryDst, 0777, true); + } + $overrideDestination = $directoryDst.$template['fileName']; + if (file_exists($overrideDestination)) { + unlink($overrideDestination); + } + } catch (Exception $objException) { + $logger = new FileLogger(); + $logger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $logger->log($objException->getMessage(), 3); + return false; + } + + try { + $directoryDst = _PS_OVERRIDE_DIR_.$template['directoryDst']; + if (!is_dir($directoryDst)) { + mkdir($directoryDst, 0777, true); + } + $overrideSrc = $objTNT->getLocalPath().$template['directorySrc'].$template['fileName']; + $overrideDestination = $directoryDst.$template['fileName']; + + copy($overrideSrc, $overrideDestination); + } catch (Exception $objException) { + $logger = new FileLogger(); + $logger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $logger->log($objException->getMessage(), 3); + return false; + } + } + + // Reinstall Overrides + if (!$objTNT->uninstallOverrides()) { + return false; + } + if (!$objTNT->installOverrides()) { + return false; + } + + return true; +} diff --git a/www/modules/tntofficiel/upgrade/install-1.2.13.php b/www/modules/tntofficiel/upgrade/install-1.2.13.php new file mode 100644 index 00000000..0922be4d --- /dev/null +++ b/www/modules/tntofficiel/upgrade/install-1.2.13.php @@ -0,0 +1,75 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_1_2_13($objTNT) +{ + $templateOverrides = array( + array( + 'fileName' => 'view.tpl', + 'directorySrc' => 'views/templates/admin/override/controllers/admin/templates/orders/helpers/view/', + 'directoryDst' => 'controllers/admin/templates/orders/helpers/view/', + ), + ); + + foreach ($templateOverrides as $template) { + try { + $directoryDst = _PS_OVERRIDE_DIR_.$template['directoryDst']; + if (!is_dir($directoryDst)) { + mkdir($directoryDst, 0777, true); + } + $overrideDestination = $directoryDst.$template['fileName']; + if (file_exists($overrideDestination)) { + unlink($overrideDestination); + } + } catch (Exception $objException) { + $logger = new FileLogger(); + $logger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $logger->log($objException->getMessage(), 3); + return false; + } + + try { + $directoryDst = _PS_OVERRIDE_DIR_.$template['directoryDst']; + if (!is_dir($directoryDst)) { + mkdir($directoryDst, 0777, true); + } + $overrideSrc = $objTNT->getLocalPath().$template['directorySrc'].$template['fileName']; + $overrideDestination = $directoryDst.$template['fileName']; + + copy($overrideSrc, $overrideDestination); + } catch (Exception $objException) { + $logger = new FileLogger(); + $logger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $logger->log($objException->getMessage(), 3); + return false; + } + } + + // Reinstall Overrides + if (!$objTNT->uninstallOverrides()) { + return false; + } + if (!$objTNT->installOverrides()) { + return false; + } + + $intCarrierIDTNT = Configuration::get('TNT_CARRIER_ID'); + if ($intCarrierIDTNT > 0) { + Db::getInstance()->execute(' + UPDATE '._DB_PREFIX_.'carrier + SET max_weight = 0.0 + WHERE id_carrier = '.(int)$intCarrierIDTNT); + } + + return true; +} diff --git a/www/modules/tntofficiel/upgrade/install-1.2.14.php b/www/modules/tntofficiel/upgrade/install-1.2.14.php new file mode 100644 index 00000000..8cca774f --- /dev/null +++ b/www/modules/tntofficiel/upgrade/install-1.2.14.php @@ -0,0 +1,67 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_1_2_14($objTNT) +{ + $templateOverrides = array( + array( + 'fileName' => 'view.tpl', + 'directorySrc' => 'views/templates/admin/override/controllers/admin/templates/orders/helpers/view/', + 'directoryDst' => 'controllers/admin/templates/orders/helpers/view/', + ), + ); + + foreach ($templateOverrides as $template) { + try { + $directoryDst = _PS_OVERRIDE_DIR_.$template['directoryDst']; + if (!is_dir($directoryDst)) { + mkdir($directoryDst, 0777, true); + } + $overrideDestination = $directoryDst.$template['fileName']; + if (file_exists($overrideDestination)) { + unlink($overrideDestination); + } + } catch (Exception $objException) { + $logger = new FileLogger(); + $logger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $logger->log($objException->getMessage(), 3); + return false; + } + + try { + $directoryDst = _PS_OVERRIDE_DIR_.$template['directoryDst']; + if (!is_dir($directoryDst)) { + mkdir($directoryDst, 0777, true); + } + $overrideSrc = $objTNT->getLocalPath().$template['directorySrc'].$template['fileName']; + $overrideDestination = $directoryDst.$template['fileName']; + + copy($overrideSrc, $overrideDestination); + } catch (Exception $objException) { + $logger = new FileLogger(); + $logger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $logger->log($objException->getMessage(), 3); + return false; + } + } + + // Reinstall Overrides + if (!$objTNT->uninstallOverrides()) { + return false; + } + if (!$objTNT->installOverrides()) { + return false; + } + + return true; +} diff --git a/www/modules/tntofficiel/upgrade/install-1.2.17.php b/www/modules/tntofficiel/upgrade/install-1.2.17.php new file mode 100644 index 00000000..3ab7a48f --- /dev/null +++ b/www/modules/tntofficiel/upgrade/install-1.2.17.php @@ -0,0 +1,64 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_1_2_17($objArgTNTOfficiel_1_2_17) +{ + $arrTemplateOverrideList = array( + array( + 'fileName' => 'view.tpl', + 'directorySrc' => 'views/templates/admin/override/controllers/admin/templates/orders/helpers/view/', + 'directoryDst' => 'controllers/admin/templates/orders/helpers/view/', + ), + ); + + //$strModuleDirSrc = _PS_MODULE_DIR_.$objTNTOfficiel->name.DIRECTORY_SEPARATOR; + $strModuleDirSrc = $objArgTNTOfficiel_1_2_17->getLocalPath(); + + foreach ($arrTemplateOverrideList as $arrTemplateOverride) { + $strPathTemplateSrc = $strModuleDirSrc.$arrTemplateOverride['directorySrc']; + $strFileTemplateSrc = $strPathTemplateSrc.$arrTemplateOverride['fileName']; + $strPathTemplateDst = _PS_OVERRIDE_DIR_.$arrTemplateOverride['directoryDst']; + $strFileTemplateDst = $strPathTemplateDst.$arrTemplateOverride['fileName']; + + try { + // Create directory if unexist. + if (!is_dir($strPathTemplateDst)) { + mkdir($strPathTemplateDst, 0777, true); + } + // Delete previous template file if exist. + if (file_exists($strFileTemplateDst)) { + unlink($strFileTemplateDst); + } + // Copy new template file. + copy($strFileTemplateSrc, $strFileTemplateDst); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + return false; + } + } + + // Reinstall Overrides: Module::uninstallOverrides() Module::installOverrides(). + if (!($objArgTNTOfficiel_1_2_17->uninstallOverrides() && $objArgTNTOfficiel_1_2_17->installOverrides())) { + return false; + } + + // Delete unused config. + if (!Configuration::deleteByName('TNT_CARRIER_CREDENTIALS_OK')) { + return false; + } + + // Success. + return true; +} diff --git a/www/modules/tntofficiel/upgrade/install-1.2.18.php b/www/modules/tntofficiel/upgrade/install-1.2.18.php new file mode 100644 index 00000000..cdadbc30 --- /dev/null +++ b/www/modules/tntofficiel/upgrade/install-1.2.18.php @@ -0,0 +1,67 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_1_2_18($objArgTNTOfficiel_1_2_18) +{ + $arrTemplateOverrideList = array( + array( + 'fileName' => 'view.tpl', + 'directorySrc' => 'views/templates/admin/override/controllers/admin/templates/orders/helpers/view/', + 'directoryDst' => 'controllers/admin/templates/orders/helpers/view/', + ), + ); + + $boolCopy = true; + + //$strModuleDirSrc = _PS_MODULE_DIR_.$objTNTOfficiel->name.DIRECTORY_SEPARATOR; + $strModuleDirSrc = $objArgTNTOfficiel_1_2_18->getLocalPath(); + + foreach ($arrTemplateOverrideList as $arrTemplateOverride) { + $strPathTemplateSrc = $strModuleDirSrc.$arrTemplateOverride['directorySrc']; + $strFileTemplateSrc = $strPathTemplateSrc.$arrTemplateOverride['fileName']; + $strPathTemplateDst = _PS_OVERRIDE_DIR_.$arrTemplateOverride['directoryDst']; + $strFileTemplateDst = $strPathTemplateDst.$arrTemplateOverride['fileName']; + + try { + // Create directory if unexist. + if (!is_dir($strPathTemplateDst)) { + mkdir($strPathTemplateDst, 0777, true); + } + // Delete previous template file if exist. + if (file_exists($strFileTemplateDst)) { + unlink($strFileTemplateDst); + } + // Copy new template file. + $boolCopy = $boolCopy && copy($strFileTemplateSrc, $strFileTemplateDst); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + + return false; + } + } + + // If at least a file copy has fail. + if (!$boolCopy) { + return false; + } + + // Reinstall Overrides: Module::uninstallOverrides() Module::installOverrides(). + if (!($objArgTNTOfficiel_1_2_18->uninstallOverrides() && $objArgTNTOfficiel_1_2_18->installOverrides())) { + return false; + } + + // Success. + return true; +} diff --git a/www/modules/tntofficiel/upgrade/install-1.2.19.php b/www/modules/tntofficiel/upgrade/install-1.2.19.php new file mode 100644 index 00000000..75b2eaa7 --- /dev/null +++ b/www/modules/tntofficiel/upgrade/install-1.2.19.php @@ -0,0 +1,67 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_1_2_19($objArgTNTOfficiel_1_2_19) +{ + $arrTemplateOverrideList = array( + array( + 'fileName' => 'view.tpl', + 'directorySrc' => 'views/templates/admin/override/controllers/admin/templates/orders/helpers/view/', + 'directoryDst' => 'controllers/admin/templates/orders/helpers/view/', + ), + ); + + $boolCopy = true; + + //$strModuleDirSrc = _PS_MODULE_DIR_.$objTNTOfficiel->name.DIRECTORY_SEPARATOR; + $strModuleDirSrc = $objArgTNTOfficiel_1_2_19->getLocalPath(); + + foreach ($arrTemplateOverrideList as $arrTemplateOverride) { + $strPathTemplateSrc = $strModuleDirSrc.$arrTemplateOverride['directorySrc']; + $strFileTemplateSrc = $strPathTemplateSrc.$arrTemplateOverride['fileName']; + $strPathTemplateDst = _PS_OVERRIDE_DIR_.$arrTemplateOverride['directoryDst']; + $strFileTemplateDst = $strPathTemplateDst.$arrTemplateOverride['fileName']; + + try { + // Create directory if unexist. + if (!is_dir($strPathTemplateDst)) { + mkdir($strPathTemplateDst, 0777, true); + } + // Delete previous template file if exist. + if (file_exists($strFileTemplateDst)) { + unlink($strFileTemplateDst); + } + // Copy new template file. + $boolCopy = $boolCopy && copy($strFileTemplateSrc, $strFileTemplateDst); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + + return false; + } + } + + // If at least a file copy has fail. + if (!$boolCopy) { + return false; + } + + // Reinstall Overrides: Module::uninstallOverrides() Module::installOverrides(). + if (!($objArgTNTOfficiel_1_2_19->uninstallOverrides() && $objArgTNTOfficiel_1_2_19->installOverrides())) { + return false; + } + + // Success. + return true; +} diff --git a/www/modules/tntofficiel/upgrade/install-1.2.20.php b/www/modules/tntofficiel/upgrade/install-1.2.20.php new file mode 100644 index 00000000..4ce2788c --- /dev/null +++ b/www/modules/tntofficiel/upgrade/install-1.2.20.php @@ -0,0 +1,150 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_1_2_20($objArgTNTOfficiel_1_2_20) +{ + $strTablePrefix = _DB_PREFIX_; + + // Dop unused log table. + $strSQLTableLogDropTable = <<execute($strSQLTableLogDropTable) + || !$objDB->execute($strSQLTableExtraAddColumns) + || !$objDB->execute($strSQLTableExtraChangeColumns) + || !$objDB->execute($strSQLTableExtraRenameTable) + || !$objDB->execute($strSQLTableOrderChangeColumns) + || !$objDB->execute($strSQLTableOrderRenameTable) + || !$objDB->execute($strSQLTableParcelChangeColumns) + || !$objDB->execute($strSQLTableParcelRenameTable) + ) { + return false; + } + + $arrTemplateOverrideList = array( + array( + 'fileName' => 'view.tpl', + 'directorySrc' => 'views/templates/admin/override/controllers/admin/templates/orders/helpers/view/', + 'directoryDst' => 'controllers/admin/templates/orders/helpers/view/', + ), + ); + + $boolCopy = true; + + //$strModuleDirSrc = _PS_MODULE_DIR_.$objTNTOfficiel->name.DIRECTORY_SEPARATOR; + $strModuleDirSrc = $objArgTNTOfficiel_1_2_20->getLocalPath(); + + foreach ($arrTemplateOverrideList as $arrTemplateOverride) { + $strPathTemplateSrc = $strModuleDirSrc.$arrTemplateOverride['directorySrc']; + $strFileTemplateSrc = $strPathTemplateSrc.$arrTemplateOverride['fileName']; + $strPathTemplateDst = _PS_OVERRIDE_DIR_.$arrTemplateOverride['directoryDst']; + $strFileTemplateDst = $strPathTemplateDst.$arrTemplateOverride['fileName']; + + try { + // Create directory if unexist. + if (!is_dir($strPathTemplateDst)) { + mkdir($strPathTemplateDst, 0777, true); + } + // Delete previous template file if exist. + if (file_exists($strFileTemplateDst)) { + unlink($strFileTemplateDst); + } + // Copy new template file. + $boolCopy = $boolCopy && copy($strFileTemplateSrc, $strFileTemplateDst); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + + return false; + } + } + + // If at least a file copy has fail. + if (!$boolCopy) { + return false; + } + + // Reinstall Overrides: Module::uninstallOverrides() Module::installOverrides(). + if (!($objArgTNTOfficiel_1_2_20->uninstallOverrides() && $objArgTNTOfficiel_1_2_20->installOverrides())) { + return false; + } + + // Success. + return true; +} diff --git a/www/modules/tntofficiel/upgrade/install-1.2.21.php b/www/modules/tntofficiel/upgrade/install-1.2.21.php new file mode 100644 index 00000000..108849ee --- /dev/null +++ b/www/modules/tntofficiel/upgrade/install-1.2.21.php @@ -0,0 +1,70 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +if (!defined('_PS_VERSION_')) { + exit; +} + +function upgrade_module_1_2_21($objArgTNTOfficiel_1_2_21) +{ + // TODO : rename. + //$obCarrier->external_module_name === 'tnt' + + $arrTemplateOverrideList = array( + array( + 'fileName' => 'view.tpl', + 'directorySrc' => 'views/templates/admin/override/controllers/admin/templates/orders/helpers/view/', + 'directoryDst' => 'controllers/admin/templates/orders/helpers/view/', + ), + ); + + $boolCopy = true; + + //$strModuleDirSrc = _PS_MODULE_DIR_.$objTNTOfficiel->name.DIRECTORY_SEPARATOR; + $strModuleDirSrc = $objArgTNTOfficiel_1_2_21->getLocalPath(); + + foreach ($arrTemplateOverrideList as $arrTemplateOverride) { + $strPathTemplateSrc = $strModuleDirSrc.$arrTemplateOverride['directorySrc']; + $strFileTemplateSrc = $strPathTemplateSrc.$arrTemplateOverride['fileName']; + $strPathTemplateDst = _PS_OVERRIDE_DIR_.$arrTemplateOverride['directoryDst']; + $strFileTemplateDst = $strPathTemplateDst.$arrTemplateOverride['fileName']; + + try { + // Create directory if unexist. + if (!is_dir($strPathTemplateDst)) { + mkdir($strPathTemplateDst, 0777, true); + } + // Delete previous template file if exist. + if (file_exists($strFileTemplateDst)) { + unlink($strFileTemplateDst); + } + // Copy new template file. + $boolCopy = $boolCopy && copy($strFileTemplateSrc, $strFileTemplateDst); + } catch (Exception $objException) { + $objFileLogger = new FileLogger(); + $objFileLogger->setFilename(_PS_ROOT_DIR_.'/log/'.date('Ymd').'_tnt_exception.log'); + $objFileLogger->logError($objException->getMessage()); + + return false; + } + } + + // If at least a file copy has fail. + if (!$boolCopy) { + return false; + } + + // Reinstall Overrides: Module::uninstallOverrides() Module::installOverrides(). + if (!($objArgTNTOfficiel_1_2_21->uninstallOverrides() && $objArgTNTOfficiel_1_2_21->installOverrides())) { + return false; + } + + // Success. + return true; +} diff --git a/www/modules/tntofficiel/views/css/AdminTNTOfficiel.css b/www/modules/tntofficiel/views/css/AdminTNTOfficiel.css new file mode 100644 index 00000000..db6efa35 --- /dev/null +++ b/www/modules/tntofficiel/views/css/AdminTNTOfficiel.css @@ -0,0 +1,15 @@ +.fluidMedia { + position: relative; + padding-bottom: 56.25%; /* proportion value to aspect ratio 16:9 (9 / 16 = 0.5625 or 56.25%) */ + padding-top: 30px; + height: 0; + overflow: hidden; +} + +.fluidMedia iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} \ No newline at end of file diff --git a/www/modules/tntofficiel/views/css/deliveryPointsBox.css b/www/modules/tntofficiel/views/css/deliveryPointsBox.css new file mode 100644 index 00000000..e3a4edf6 --- /dev/null +++ b/www/modules/tntofficiel/views/css/deliveryPointsBox.css @@ -0,0 +1,735 @@ +.relay-points *, +.repositories * { + font-family: 'Open Sans', sans-serif; +} + +.addresses-list { + position: absolute; + left: 0; + top: 142px; + right: 0; + bottom: 0; + z-index: 1; + background-color: #FFFFFF; +} + +#list_scrollbar_container, +#relay_points_map, +#repositories_map { + display: block; +} + +#list_scrollbar_container { + float: left; + position: relative; + width: 64.5% !important; +} + +#relay_points_map, +#repositories_map { + float: right; + width: 35%; + height: 100%; + border-left: 1px solid #FFFFFF; +} + +.relay-points .validation-advice, +.repositories .validation-advice { + position: absolute; + background-color: #df280a; + padding: 0 10px; + color: #FFF !important; + top: -30px; + border-radius: 2px; +} + +.relay-points .validation-advice::before, +.repositories .validation-advice::before { + content: '\25BC'; + color: #df280a; + position: absolute; + top: 17px; + left: 30px; +} + +.relay-points button, .repositories button { + padding: 5px 10px; + font-size: 12px; + font-weight: bold; + border: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + color: white; + background: #1cb3f4; + cursor: pointer; +} + +.relay-points-container, +.repositories-container { + overflow: hidden; +} + +.relay-points-form, +.repositories-form { + overflow: hidden; +} + +.relay-points-form .label, +.repositories-form .label { + font-weight: bold; + color: #444; +} + +.relay-points-list .relay-point-item:hover, +.relay-points-list .relay-point-item.is-selected, +.relay-points-list .repository-item:hover, +.relay-points-list .repository-item.is-selected, +.repositories-list .relay-point-item:hover, +.repositories-list .relay-point-item.is-selected, +.repositories-list .repository-item:hover, +.repositories-list .repository-item.is-selected { + background: #eeeeee !important; + cursor: pointer; +} + +.relay-points-list .relay-point-item-please-wait, +.relay-points-list .repository-item-please-wait, +.repositories-list .relay-point-item-please-wait, +.repositories-list .repository-item-please-wait { + float: none; +} + +.relay-points-list .relay-point-name, +.relay-points-list .repository-name, +.repositories-list .relay-point-name, +.repositories-list .repository-name { + font-weight: bold; +} + +.relay-points-list .no-results, +.repositories-list .no-results{ + border: 1px solid #e7e7e7; + padding: 20px; + margin-right: -26px; + text-align: center; +} +.relay-points-header { + height: 80px; + /*background: url("../img/carrier/delivery/option-RelaisColis.png") right center no-repeat;*/ + margin-right: 25px; +} + +.repositories-header { + height: 80px; + /*background: url("../img/carrier/delivery/option-Entreprise.png") right center no-repeat;*/ + margin-right: 25px; +} + +.relay-points-header h2 { + display: block; + font-size: 26px; + margin: 0; + padding-left: 110px; + line-height: 80px; + /*text-transform: uppercase;*/ + font-weight: normal; + /*background: url("../img/modal/top-picto.png") left center no-repeat;*/ + background: url("../img/carrier/delivery/option-RelaisColis.png") left center no-repeat; +} + +.repositories-header h2 { + display: block; + font-size: 26px; + margin: 0; + padding-left: 110px; + line-height: 80px; + /*text-transform: uppercase;*/ + font-weight: normal; + /*background: url("../img/modal/top-picto.png") left center no-repeat;*/ + background: url("../img/carrier/delivery/option-Entreprise.png") left center no-repeat; +} + +.location-topbar { + padding: 8px 10px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border: 1px solid #e7e7e7; + background: #f8f8f8; + overflow: visible; + position: relative; +} + +.location-topbar .relay-points-form, +.location-topbar .repositories-form { + display: table; + width: 100%; +} + +.location-topbar .relay-points-form span, +.location-topbar .relay-points-form .form-list, +.location-topbar .repositories-form span, +.location-topbar .repositories-form .form-list { + display: table-cell; + vertical-align: middle; +} + +.location-topbar .relay-points-form .form-list, +.location-topbar .repositories-form .form-list { + max-width: 750px; +} + +.location-topbar .relay-points-form .fields, +.location-topbar .repositories-form .fields { + margin: 0 0 0 15px; +} + +.location-topbar .relay-points-form .field, +.location-topbar .repositories-form .field { + float: left; + margin: 0 10px; + position: relative; + vertical-align: middle; + width: inherit +} + +.lt-ie8 .location-topbar .relay-points-form .field, +.lt-ie8 .location-topbar .repositories-form .field { + display: inline; + zoom: 1; +} + +.location-topbar .relay-points-form .field label, +.location-topbar .repositories-form .field label { + color: #000000 !important; + font-weight: normal !important; +} + +.location-topbar .relay-points-form .field label, +.location-topbar .relay-points-form .field select, +.location-topbar .relay-points-form .field .input-box, +.location-topbar .repositories-form .field label, +.location-topbar .repositories-form .field select, +.location-topbar .repositories-form .field .input-box { + display: table-cell; + vertical-align: middle; + height: 30px; + line-height: 30px; +} + +.location-topbar .relay-points-form .field select, +.location-topbar .repositories-form .field select { + margin-top: 0 +} + +.location-topbar .relay-points-form .field select, +.location-topbar .relay-points-form .field .input-box input, +.location-topbar .repositories-form .field select, +.location-topbar .repositories-form .field .input-box input { + height: 30px; + width: inherit; + margin-left: 20px; + padding: 0 10px; + border: 1px solid #e7e7e7; + border-radius: 4px; + line-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.location-topbar .relay-points-form .field em.required, +.location-topbar .repositories-form .field em.required { + color: #eb340a; + float: right; +} + +.location-topbar button { + font-size: 14px; + position: relative; +} + +.relay-points-list .relay-point-item, +.relay-points-list .repository-item, +.repositories-list .relay-point-item, +.repositories-list .repository-item { + display: table; + margin-bottom: 18px; + border: 1px solid #e7e7e7; +} + +.relay-points-list .relay-point-item:hover, +.relay-points-list .repository-item:hover, +.repositories-list .relay-point-item:hover, +.repositories-list .repository-item:hover { + background: white; +} + +.relay-points-list .relay-point-item > div, +.relay-points-list .repository-item > div, +.repositories-list .relay-point-item > div, +.repositories-list .repository-item > div { + display: table-cell; + vertical-align: top; + padding: 15px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.relay-points-list .relay-point-item > div.relay-point-address, +.relay-points-list .relay-point-item > div.repository-address, +.relay-points-list .repository-item > div.relay-point-address, +.relay-points-list .repository-item > div.repository-address, +.repositories-list .relay-point-item > div.relay-point-address, +.repositories-list .relay-point-item > div.repository-address, +.repositories-list .repository-item > div.relay-point-address, +.repositories-list .repository-item > div.repository-address { + width: 32%; + background: #f8f8f8; +} + +.relay-points-list .relay-point-item > div.relay-point-address > p, +.relay-points-list .relay-point-item > div.repository-address > p, +.relay-points-list .repository-item > div.relay-point-address > p, +.relay-points-list .repository-item > div.repository-address > p, +.repositories-list .relay-point-item > div.relay-point-address > p, +.repositories-list .relay-point-item > div.repository-address > p, +.repositories-list .repository-item > div.relay-point-address > p, +.repositories-list .repository-item > div.repository-address > p { + display: block; +} + +.relay-points-list .relay-point-item > div.relay-point-details, +.relay-points-list .relay-point-item > div.repository-details, +.relay-points-list .repository-item > div.relay-point-details, +.relay-points-list .repository-item > div.repository-details, +.repositories-list .relay-point-item > div.relay-point-details, +.repositories-list .relay-point-item > div.repository-details, +.repositories-list .repository-item > div.relay-point-details, +.repositories-list .repository-item > div.repository-details { + width: 44%; +} + +.relay-points-list .relay-point-item > div.relay-point-details p, +.relay-points-list .relay-point-item > div.repository-details p, +.relay-points-list .repository-item > div.relay-point-details p, +.relay-points-list .repository-item > div.repository-details p, +.repositories-list .relay-point-item > div.relay-point-details p, +.repositories-list .relay-point-item > div.repository-details p, +.repositories-list .repository-item > div.relay-point-details p, +.repositories-list .repository-item > div.repository-details p { + display: inline; +} + +.relay-points-list .relay-point-item > div.relay-point-action, +.relay-points-list .relay-point-item > div.repository-action, +.relay-points-list .repository-item > div.relay-point-action, +.relay-points-list .repository-item > div.repository-action, +.repositories-list .relay-point-item > div.relay-point-action, +.repositories-list .relay-point-item > div.repository-action, +.repositories-list .repository-item > div.relay-point-action, +.repositories-list .repository-item > div.repository-action { + width: 10%; + text-align: center; +} + +.relay-points-list .relay-point-item > div.relay-point-action > div, +.relay-points-list .relay-point-item > div.repository-action > div, +.relay-points-list .repository-item > div.relay-point-action > div, +.relay-points-list .repository-item > div.repository-action > div, +.repositories-list .relay-point-item > div.relay-point-action > div, +.repositories-list .relay-point-item > div.repository-action > div, +.repositories-list .repository-item > div.relay-point-action > div, +.repositories-list .repository-item > div.repository-action > div { + margin-bottom: 10px; +} + +.relay-points-list .relay-point-item > div.relay-point-action .location-code, +.relay-points-list .relay-point-item > div.repository-action .location-code, +.relay-points-list .repository-item > div.relay-point-action .location-code, +.relay-points-list .repository-item > div.repository-action .location-code, +.repositories-list .relay-point-item > div.relay-point-action .location-code, +.repositories-list .relay-point-item > div.repository-action .location-code, +.repositories-list .repository-item > div.relay-point-action .location-code, +.repositories-list .repository-item > div.repository-action .location-code { + font-size: 16px; + font-weight: bold; + text-transform: uppercase; +} + +.relay-points-list .relay-point-item > div.relay-point-action .location-nb, +.relay-points-list .relay-point-item > div.repository-action .location-nb, +.relay-points-list .repository-item > div.relay-point-action .location-nb, +.relay-points-list .repository-item > div.repository-action .location-nb, +.repositories-list .relay-point-item > div.relay-point-action .location-nb, +.repositories-list .relay-point-item > div.repository-action .location-nb, +.repositories-list .repository-item > div.relay-point-action .location-nb, +.repositories-list .repository-item > div.repository-action .location-nb { + background: url("../img/modal/location-point.png") center no-repeat; + height: 34px; + line-height: 25px; + color: white; + font-weight: bold; + width: 21px; + display: inline-block; + vertical-align: middle; +} + +.lt-ie8 .relay-points-list .relay-point-item > div.relay-point-action .location-nb, +.lt-ie8 .relay-points-list .relay-point-item > div.repository-action .location-nb, +.lt-ie8 .relay-points-list .repository-item > div.relay-point-action .location-nb, +.lt-ie8 .relay-points-list .repository-item > div.repository-action .location-nb, +.lt-ie8 .repositories-list .relay-point-item > div.relay-point-action .location-nb, +.lt-ie8 .repositories-list .relay-point-item > div.repository-action .location-nb, +.lt-ie8 .repositories-list .repository-item > div.relay-point-action .location-nb, +.lt-ie8 .repositories-list .repository-item > div.repository-action .location-nb { + display: inline; + zoom: 1; +} + +.relay-points-list .relay-point-item > div.relay-point-action .location-distance, +.relay-points-list .relay-point-item > div.repository-action .location-distance, +.relay-points-list .repository-item > div.relay-point-action .location-distance, +.relay-points-list .repository-item > div.repository-action .location-distance, +.repositories-list .relay-point-item > div.relay-point-action .location-distance, +.repositories-list .relay-point-item > div.repository-action .location-distance, +.repositories-list .repository-item > div.relay-point-action .location-distance, +.repositories-list .repository-item > div.repository-action .location-distance { + font-size: 14px; + font-weight: bold; + color: white; + background: #ea661d; +} + +.shipping-method-info { + padding: 15px; +} + +.shipping-method-info-name { + font-weight: bold; +} + +.shipping-method-info-details { + margin-top: 10px; +} + +.shipping-method-info-time > p { + display: inline-block; + vertical-align: middle; +} + +.relay-point-time p, +.repository-time p { + display: inline-block; + *display: inline; + *z-index: 1; +} + +.lt-ie8 .shipping-method-info-time > p { + display: inline; + zoom: 1; +} + +.shipping-method-info-select { + margin-top: 10px +} + +/* TNT Service description */ +#order .delivery_option > div > table.resume td.delivery_option_info_tnt i{ + font-style: italic; +} + +/* TNT delivery logo */ +#order .delivery_option > div > table.resume td.delivery_option_logo_tnt, +#order-opc .delivery_option > div > table.resume td.delivery_option_logo_tnt { + padding: 0; +} + +table.resume tbody > tr > td.delivery_option_radio, +table.resume tbody > tr > td.delivery_option_logo { + vertical-align: middle; +} + +/* TNT radio or checkbox input */ +input[type="radio"].tnt_carrier_radio,input[type="checkbox"].tnt_carrier_radio { + display:inline-block; +} + +table.resume td.delivery_option_logo_tnt > img.order_carrier_logo { + max-width: 100%; + min-width: 48px; + max-height: none; + margin: 0 auto; + display: block; +} + + +@media (max-width: 770px) { + .relay-points-header, .repositories-header { + background-position: 50% 0; + background-size: auto 50px; + display: block; + height: auto; + margin-bottom: 10px; + margin-right: 0; + padding-top: 10px; + text-align: center; + vertical-align: middle + } + + .relay-points-header h2, .repositories-header h2 { + background: transparent none repeat scroll 0 0; + display: inline; + font-size: 16px; + line-height: inherit; + margin-bottom: 0; + margin-left: 0; + margin-right: 0; + padding-left: 0; + position: relative + } + + .relay-points-container .relay-points-form > span, + .relay-points-container .repositories-form > span, + .repositories-container .relay-points-form > span, + .repositories-container .repositories-form > span { + display: block + } + + .relay-points-container .relay-points-form .form-list, + .relay-points-container .repositories-form .form-list, + .repositories-container .relay-points-form .form-list, + .repositories-container .repositories-form .form-list { + display: block + } + + .relay-points-container .relay-points-form .form-list .fields, + .relay-points-container .relay-points-form .form-list .field, + .relay-points-container .relay-points-form .form-list input, + .relay-points-container .relay-points-form .form-list select, + .relay-points-container .repositories-form .form-list .fields, + .relay-points-container .repositories-form .form-list .field, + .relay-points-container .repositories-form .form-list input, + .relay-points-container .repositories-form .form-list select, + .repositories-container .relay-points-form .form-list .fields, + .repositories-container .relay-points-form .form-list .field, + .repositories-container .relay-points-form .form-list input, + .repositories-container .relay-points-form .form-list select, + .repositories-container .repositories-form .form-list .fields, + .repositories-container .repositories-form .form-list .field, + .repositories-container .repositories-form .form-list input, + .repositories-container .repositories-form .form-list select { + margin: 0 + } + + .relay-points-container .relay-points-form .form-list .field, + .relay-points-container .repositories-form .form-list .field, + .repositories-container .relay-points-form .form-list .field, + .repositories-container .repositories-form .form-list .field { + overflow: hidden; + padding-top: 6px; + width: 100% + } + + .relay-points-container .relay-points-form .form-list .field label, + .relay-points-container .repositories-form .form-list .field label, + .repositories-container .relay-points-form .form-list .field label, + .repositories-container .repositories-form .form-list .field label { + width: 15% + } + + .relay-points-container .relay-points-form .form-list .field .input-box, + .relay-points-container .repositories-form .form-list .field .input-box, + .repositories-container .relay-points-form .form-list .field .input-box, + .repositories-container .repositories-form .form-list .field .input-box { + width: 20% + } + + .relay-points-container .relay-points-form .form-list .field input, + .relay-points-container .relay-points-form .form-list .field select, + .relay-points-container .repositories-form .form-list .field input, + .relay-points-container .repositories-form .form-list .field select, + .repositories-container .relay-points-form .form-list .field input, + .repositories-container .relay-points-form .form-list .field select, + .repositories-container .repositories-form .form-list .field input, + .repositories-container .repositories-form .form-list .field select { + display: block; + margin: 0; + width: 100% + } + + .relay-points-container .relay-points-form .form-list button[type="submit"], + .relay-points-container .repositories-form .form-list button[type="submit"], + .repositories-container .relay-points-form .form-list button[type="submit"], + .repositories-container .repositories-form .form-list button[type="submit"] { + text-align: center; + width: 100% + } + + .relay-points-container .relay-points-form .form-list button[type="submit"] span, + .relay-points-container .repositories-form .form-list button[type="submit"] span, + .repositories-container .relay-points-form .form-list button[type="submit"] span, + .repositories-container .repositories-form .form-list button[type="submit"] span { + display: block + } + + .relay-points-container #list_scrollbar_container, + .repositories-container #list_scrollbar_container { + display: block; + float: none; + width: 100% !important + } + + .relay-points-container #list_scrollbar_container .relay-point-address, + .relay-points-container #list_scrollbar_container .relay-point-details, + .relay-points-container #list_scrollbar_container .relay-point-action, + .relay-points-container #list_scrollbar_container .repository-address, + .relay-points-container #list_scrollbar_container .repository-details, + .relay-points-container #list_scrollbar_container .repository-action, + .repositories-container #list_scrollbar_container .relay-point-address, + .repositories-container #list_scrollbar_container .relay-point-details, + .repositories-container #list_scrollbar_container .relay-point-action, + .repositories-container #list_scrollbar_container .repository-address, + .repositories-container #list_scrollbar_container .repository-details, + .repositories-container #list_scrollbar_container .repository-action { + display: block; + width: 100% + } + + .relay-points-container #list_scrollbar_container div.relay-point-address, + .relay-points-container #list_scrollbar_container div.relay-point-details, + .repositories-container #list_scrollbar_container div.relay-point-address, + .repositories-container #list_scrollbar_container div.relay-point-details, + .relay-points-container #list_scrollbar_container .relay-point-action, + .relay-points-container #list_scrollbar_container .repository-action, + .repositories-container #list_scrollbar_container .relay-point-action, + .repositories-container #list_scrollbar_container .repository-action { + font-size: 1em; + line-height: normal; + padding: 0.825em 0; + } + + .relay-points-container #list_scrollbar_container li.relay-point-item p, + .repositories-container #list_scrollbar_container li.relay-point-item p { + margin: 0 0 0.75ex; + } + + .relay-points-container #list_scrollbar_container .relay-point-action .location-nb, + .relay-points-container #list_scrollbar_container .repository-action .location-nb, + .repositories-container #list_scrollbar_container .relay-point-action .location-nb, + .repositories-container #list_scrollbar_container .repository-action .location-nb { + display: block; + width: 100% + } + + .relay-points-container #list_scrollbar_container .relay-point-action .location-distance, + .relay-points-container #list_scrollbar_container .repository-action .location-distance, + .repositories-container #list_scrollbar_container .relay-point-action .location-distance, + .repositories-container #list_scrollbar_container .repository-action .location-distance { + padding: 0 10px; + display: inline-block; + vertical-align: middle + } + + .lt-ie8 .relay-points-container #list_scrollbar_container .relay-point-action .location-distance, + .lt-ie8 .relay-points-container #list_scrollbar_container .repository-action .location-distance, + .lt-ie8 .repositories-container #list_scrollbar_container .relay-point-action .location-distance, + .lt-ie8 .repositories-container #list_scrollbar_container .repository-action .location-distance { + display: inline; + zoom: 1 + } + + .relay-points-container #list_scrollbar_container .relay-point-item, + .relay-points-container #list_scrollbar_container .repositories-item, + .repositories-container #list_scrollbar_container .relay-point-item, + .repositories-container #list_scrollbar_container .repositories-item { + display: block; + text-align: center !important + } + + .relay-points-container #list_scrollbar_container .please-wait, + .repositories-container #list_scrollbar_container .please-wait { + margin-bottom: 15px; + margin-left: 0 !important; + margin-right: 0 !important; + margin-top: 0 !important; + display: inline-block; + vertical-align: middle + } + + .lt-ie8 .relay-points-container #list_scrollbar_container .please-wait, + .lt-ie8 .repositories-container #list_scrollbar_container .please-wait { + display: inline; + zoom: 1 + } + + .relay-points-container .relay-points-map, .relay-points-container .repositories-map, + .repositories-container .relay-points-map, .repositories-container .repositories-map { + display: none !important + } + + .relay-points .addresses-list, .repositories .addresses-list { + top: 204px; + } + + .lv_contentBottom { + overflow: hidden + } +} + +@media (max-width: 320px) { + .relay-points-container #list_scrollbar_container div.relay-point-address, + .relay-points-container #list_scrollbar_container div.relay-point-details, + .repositories-container #list_scrollbar_container div.relay-point-address, + .repositories-container #list_scrollbar_container div.relay-point-details, + .relay-points-container #list_scrollbar_container .relay-point-action, + .relay-points-container #list_scrollbar_container .repository-action, + .repositories-container #list_scrollbar_container .relay-point-action, + .repositories-container #list_scrollbar_container .repository-action { + font-size: 0.925em; + line-height: normal; + padding: 0.825em 0; + } + + .relay-points-container #list_scrollbar_container li.relay-point-item p, + .repositories-container #list_scrollbar_container li.relay-point-item p { + margin: 0 0 0.5ex; + } +} + + +@media (min-width: 770px) and (max-width: 979px) { + .location-topbar .relay-points-form .field, + .location-topbar .repositories-form .field { + display: block; + float: none + } + + .location-topbar .relay-points-form .field label, + .location-topbar .repositories-form .field label { + width: 40% + } + + .location-topbar .relay-points-form .field .input-box, + .location-topbar .repositories-form .field .input-box { + width: 60% + } + + .location-topbar .relay-points-form button[type="submit"], + .location-topbar .repositories-form button[type="submit"] { + margin-top: 10px; + text-align: center; + width: 100% + } + + .location-topbar .relay-points-form button[type="submit"] span, + .location-topbar .repositories-form button[type="submit"] span { + display: block + } + + .relay-points .addresses-list, .repositories .addresses-list { + top: 212px; + } +} diff --git a/www/modules/tntofficiel/views/css/extraAddressData.css b/www/modules/tntofficiel/views/css/extraAddressData.css new file mode 100644 index 00000000..b36bcc16 --- /dev/null +++ b/www/modules/tntofficiel/views/css/extraAddressData.css @@ -0,0 +1,31 @@ +#loading { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(255, 255, 255, 0.2); + z-index: 10000000; +} + +#loading img { + display: block; + margin: 0 auto; + position: relative; + top: 50%; + -webkit-transform: translateY(-50%); + -moz-transform: translateY(-50%); + -ms-transform: translateY(-50%); + -o-transform: translateY(-50%); + transform: translateY(-50%); +} + +span.required:after { + content: " *"; + color: red; +} + +p.required { + text-align: right; + color: red; +} diff --git a/www/modules/tntofficiel/views/css/index.php b/www/modules/tntofficiel/views/css/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/css/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/css/manifest.css b/www/modules/tntofficiel/views/css/manifest.css new file mode 100644 index 00000000..e209998f --- /dev/null +++ b/www/modules/tntofficiel/views/css/manifest.css @@ -0,0 +1,60 @@ +.tablehead{ + padding: 10px; + border-bottom: solid black 5px; + border-top: solid black 5px; +} + +.parcels{ + font-size: smaller; + padding: 5px; +} + +.title { + text-align: center; + text-decoration: underline; + font-weight: normal; + font-size: 11pt; +} + +.body { + font-size: 9pt; +} + +.bold { + font-weight: bold; +} + +.uppercase { + text-transform: uppercase; +} + +.logo-container, .pagination-container { + text-align: right; +} + +.table-header td { + width: 33%; +} + +.parcels-table-container { + border: 1px solid white; +} +.parcels-table-container tr, .parcels-table-container td { + border: 1px solid white; +} + +.parcels td { + font-size: 9pt; + padding: 10px 0; + margin: 10px 0; +} + +.footer-text { + margin: 0; + padding: 0; + font-size: 18px; +} + +.signature { + margin-top: 30px; +} \ No newline at end of file diff --git a/www/modules/tntofficiel/views/css/style.css b/www/modules/tntofficiel/views/css/style.css new file mode 100644 index 00000000..bca9fe59 --- /dev/null +++ b/www/modules/tntofficiel/views/css/style.css @@ -0,0 +1,39 @@ +@font-face { + font-family: 'tnt-middleware'; + src: url(data:font/opentype;base64,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) format('opentype'); + font-weight: normal; + font-style: normal; +} + +[class^="icon-AdminTNTOfficiel"], [class*=" icon-AdminTNTOfficiel"] { + font-family: 'tnt-middleware'; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + text-align: center; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-AdminTNTOfficiel:before { + content: "\e600"; +} + +.bootstrap .alert.alert-danger.alert-danger-small, .bootstrap .alert.alert-success.alert-danger-small{ + display: inline-block; + padding: 5px; + margin-bottom: 0px; +} + +.bootstrap .alert.alert-danger.alert-danger-small::before, .bootstrap .alert.alert-success.alert-danger-small::before { + content: ""; +} + +.export-logs { + padding: 10px; +} \ No newline at end of file diff --git a/www/modules/tntofficiel/views/css/tracking.css b/www/modules/tntofficiel/views/css/tracking.css new file mode 100644 index 00000000..b845c4b7 --- /dev/null +++ b/www/modules/tntofficiel/views/css/tracking.css @@ -0,0 +1,208 @@ +/* Tracking Popup */ +div { + font-family: 'Open Sans', sans-serif; +} + +div.header { + background-color:#f59b48; + border-color: #f59b48; + color: #ffffff ; + height : 60px; + width: 100%; + padding: -20px; +} + +div.header div.title { + margin-left: 10px; + font-size: 25px; + text-transform: uppercase; + display: inline-block; + vertical-align: top; + margin-top: 10px; +} + +div.header div.tnt-logo { + width: 100px; + height: 40px; + background: url("../img/_r2_c2.jpg") 0 0 no-repeat; + margin-left: 15px; + margin-top: 13px; + display: inline-block; +} + +div.header a.close { + text-decoration: none; + background: url("../img/_r2_c4.jpg") 0 0 no-repeat; + float: right; + width: 24px; + height: 24px; + margin-top: 18px; + margin-right: 15px; + display: inline-block; +} + + +div.tracklist { + margin-bottom: 50px; +} + +div.header-track { + margin-top: 20px; + border: 1px solid #d3d3d3; + border-radius: 3px; + background-color: #F5F5F5; + width: 100%; + padding: 0px 5px 5px 5px; + box-sizing: border-box; +} + + + + +div.header-track div { + vertical-align: middle; +} + +div.header-track div.button { + font-weight: bold; + color: #ffffff; + background-color: #1cb3f4; + font-size : 13px; + text-align: right; + text-transform: none; + padding: 12px 20px 2px 25px; + text-align: right; + border-radius: 3px; + margin: 4px 20px 2px 108px; + height: 30px; +} + +div.header-track div.button a { + color: #ffffff; + height: 15px; + +} + +div.header-track div.track-label { + display: inline-block; + font-weight: bold; + font-size: 16px; + width: 175px; + padding-left: 10px; +} + +div.header-track div.track-number { + display: inline-block; + font-weight: bold; + font-size: 15px; + background-color: #ffffff; + border-radius: 3px; + border: 1px solid #d3d3d3; + padding: 2px 2px 2px 7px; + height: 30px; + width: 180px; + margin: 10px 2px 2px 0px; +} + +div.status-track p { + margin-top: 20px; + padding-left: 10px; + font-weight: bold; + font-size: 15px; + margin-bottom: 20px; +} + +div.status-track li.status { + display: inline-block; + background-color: #d3d3d3; + color: #7F7F7F; + margin: 2px; + border-radius: 3px; + font-size: 13px; + font-weight: 600; + height: 36px; + padding: 7px 17px; + line-height: 33px; +} + +div.status-track ul li.current { + display: inline-block; + background-color: #1cb3f4; + color: #ffffff; +} + +.history-track { + margin-bottom: 30px; +} + +.history-track ul li { + margin-top: 15px; + display: block; +} + +.history-track ul li ul li { + display: inline-block; +} + +.history-track ul li ul li.label { + width: 250px; + color: #000000; + +} + +.history-track ul li ul { + margin-left: 10px; +} + +.history-track ul li ul li.date , .history-track ul li ul li.center { + font-weight: bold; + font-size: 13px ; +} + +.history-track ul li ul li.index { + font-weight: bold; + font-size: 12px; + line-height: 16px; + border-radius: 50px; + background-color: #f59b48; + width: 16px; + height: 16px; + color: #ffffff; + text-align: center; + padding: 3px; +} + + +div.button { + font-weight: bold; + color: #ffffff; + background-color: #1cb3f4; + font-size : 13px; + text-align: right; + text-transform: none; + padding: 7px 20px 2px 25px; + border-radius: 3px; + margin: 10px 3px 2px 0px; + height: 30px; + float: right; +} + +div.tnt-arrow { + width: 10px; + height: 16px; + background: url("../img/arrow.png") 0 0 no-repeat; + display: inline-block; + margin-left: 10px; +} + +div.header-track div.button a { + text-decoration: none; +} + +div.footer-track div.button { + padding: 11px 20px 2px 25px; +} +div.footer-track div.button a{ + color: #ffffff; + text-decoration: none; +} \ No newline at end of file diff --git a/www/modules/tntofficiel/views/fonts/index.php b/www/modules/tntofficiel/views/fonts/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/fonts/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/fonts/tnt-middleware.eot b/www/modules/tntofficiel/views/fonts/tnt-middleware.eot new file mode 100644 index 0000000000000000000000000000000000000000..ead1e602a73782d9bc5ca7f00d20473ef9944342 GIT binary patch literal 1904 zcma)7UuauZ82`@wm(z5nskEKc(A`ew%49Krt6~!dVz;2fq;-WMUA=AY(sW5~NN!o{ zzzHJR2CjMVMG*8!@WCm#LB}>2if?6tk9+V%*ozNSL~zhH{?5HOE)i{e!a3jX`+dLf zoO5&jReeO?Xhe)8>Mo3$OfYX`yLq8?OQvvRiDTg+F{igQ~BC!^U~>Wk>Q@w=?G> zx%Gqpk$i_HC`V`M0)0w9(r@^H*oZVZ5RjfZ7?utPTW&qR&o7uHhX!!m}%6{9MEU&Mkdp+XY~VT>W$1!F?K1vw3f?VJ(o(I zyPC_bEu}XvIt)`A1`Q}YwTT(Z+^(t(+Zd3sko&0xSChF zOT;D;vLNOZpKo);r_J{Sxw@qBUcM+K?1JW#?_{ssEEaEG$&Q^cQz`SrSlj*|zpdn& zVv^0=UhTb8DwnpucBY$?xOz$;zCEpSMSgAixTN+ybf)u_##Q;%spEJ8#fA>xxR@%saFv!{iJ+kJ+|I1#9e?h;1=XKXNvq=g781;*y*l9b$fCh zkp`u6s&SeIXoO{*43&N-+^s0>o*l<)0(8ymm*GNepIiwUpLx6t{&f#4z}G#j; + + +Generated by IcoMoon + + + + + + + \ No newline at end of file diff --git a/www/modules/tntofficiel/views/fonts/tnt-middleware.ttf b/www/modules/tntofficiel/views/fonts/tnt-middleware.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b7ea657a9cd652cf448ab3600d68981dbcb9e021 GIT binary patch literal 1712 zcma)6U1%It6#nka+}WE=-E1UDC5CiTtqql~`x_OrOF>M#NO3o@fg)*~WT%@=cXz_> zlqMFeAhK=2CJ(*{f<6g8*gjYxMGHmoEmZKa555R}@u7+c7Lu&z-kHVigKcKGbH4MP z@0@$?%)J8!pcfxNNBpgsmy&%?^RI~cp2oY2HG5@vcB=)j5%S+I+szfSQSzk~XRoHRs;5@7yK-Ce3kg#cg^r8!$Iy9J+alZGh90Xdr-BNX$ku2ds1@Cxx^2xxROSohK1 zX}48Y2ebBX!v^Jb*JWU&>g(b(;N@49%-9o&LxTh6i|pVFiGJT^`s2#a zvh+l1EIBlIChUD>NiW2yfDvEYx^Gcy`WwVlR zHP0Nd=Db!u-}2_H18178{NrNma&CFOSiE*Fn>}}}SX^JuZC_Fhp^n{tzZ2_d%_(8p z;b_QQ=3<{Hn?jiEJyUFdB=~7VXsK*UGeUxwxbTVOWLlTRyb%g*uZGNpo~Yoa9xU*44uJ2`8I%PKs0n^bBC$Ke zg`vMOb6n$n4^%r}n}X}FPaijU^nsG7yz449-N}=iSnfp{Ti=%R^L>+lqt{Sd`xoP5 zR|4M#yO90`bO!v3a@3hZct;Z9hh00}S8%_Q@5nS#s#8s;X#k_FpfWiAL`Z2mmHh<& z8Nv0SE<=PU|Kw2}P{hX?p)Uih z6Ms6u2H_t9%rS&afKB2*3~(4}{NvTVqqRz@RCO-c4F?|TG>)Q%3QBZW;ot&nG~moS zjb_EITZvd4vqU%0B#}!A77~adzV}jlS571{()fN`8M$bGJNp+HjTxN{Eq`woozx5;d EUn{~g=Kufz literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/fonts/tnt-middleware.woff b/www/modules/tntofficiel/views/fonts/tnt-middleware.woff new file mode 100644 index 0000000000000000000000000000000000000000..5af17ebdd2da932fdca4a160c4b98936d6154340 GIT binary patch literal 1788 zcma)6U1%It6h3$U_GVKz8%a`#A)QofL#6BfM#bz>5Vu{VbT_eqB59mtr@Nc(?v&jr zNi5h0k+lVzyb1+<5`3@T)vOEP%7|YTHafT6Dp^gz zeT7(Pg@sGiwR7OUB~m^R);hBJS=qLVL>i2ygoP#+=F1?#T}S+su+W#mZ^|`y72Fo$ zAz|SiQmf9A(EW&bpR`FCSj^X_29r}SviQjUC{{4e zVkyX@@dOI=M~%okmCY;p{FTj0uGKtyz?^qmxm?SgHxHa`wsH^4v3D}d>xII#^Xc^Y zYlXu4a;AM*GC*D5ezTkFYK<&6tYA1`EbDw9FBzO0>e zUa=ZBxm1T8r5aVJh^I<6t&l|xvghnZv*OgvSR_hwpc~YL$U%WgF^W)h??dffIb)YD zR;>ojV8RmKMpdk3@8wyi?wTdLZZ|B~E}DyLW^Tzj={WTWW#!UcEWU)X>vBUD_HJX> bCN0t$`W!7mbrL4F8NrwIPD1auegOXilbbns literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/AdminTNTOfficiel.gif b/www/modules/tntofficiel/views/img/AdminTNTOfficiel.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b2f8c1797eb9649903f44085bbbb4a19b0dde4a GIT binary patch literal 945 zcmZ?wbhEHb6krfw_|5@vg<=eQ(%@X(=BU6n$RV@Of3kmrZ?N zH}`)#w(9$_)juxm{B`sA@5fjFym|cZ+sFU^|AP$}B}PMFsD^;zPZmZ7hW`vYAP<1@ z1OrDO!+%a0j|~eBHgo)!JAM_cT8=1KNT(%O(W!TB0KhLMaK!L#;0BxXO Aq5uE@ literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/_r2_c2.jpg b/www/modules/tntofficiel/views/img/_r2_c2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ccebe47076e0dcab08a08d3a61e76b2dddf86e83 GIT binary patch literal 1951 zcmYj}2|U#K8^?chnH&?tj6~Ep%E%Gg~zc4=*4Ced5>;LIz{Kvq33Ly6ZM*w>W2nm3ZAP5q~?FOU( z5CDdNK)_GIAW#sP4}kMbO%VVDhJhh4I27{32Z12~6vl@X#fYinWi^P`OW>#jat495 zB=?{ju9-8ukR%VrBmU$80F)O3!T5OI2_yi5Kmjm(-~SH4-#=hTjF_w_TAk>6Jwp!9 zqjgNLYq|w#aNhz#yhAV&f&}z|9dhj@fkc}RGtD;hEkzEsL(wsz>hp?B`=$8@=BAhR>4XyTJ7-g-iL?x5!e`K0l)igi; z8UYhl>}csytvKA;+c+RTt6(rw|5~wf9@`Ra?h-SlYlIFXMBHR_RQpc~p&~`i%9=wy z_m*Bvwn>hj$TsS67SmjwRAwh^nT-dC2}pYTm{h2#vt_f5UMnPW3?G|ppdclp{6f)% zWc^X3%%e3#6c-R6TkL(QG!%cqcpKY_ds)tR894Y^N-?5)47)T=&HVkHts`agLA%S| zrV&$_!>Y=!d*!T<=bkV+`(BJK^^{f3RTk*h4O%hB1&xPTuWizd+Ur;D zwg_59MR68BIz=RrAd*1) zMs?J~VuBXmV%T)f@=UI#oYZDy-SVi-7T9_UoAQd0S0i`!xdER*jDGk)?8A6>mp`e| z2R)$HGKd#DI98}TYZBki8pZg5Ric+K_##`EYYb{S36;6cQO zC+U!n@zYpkUl7)edBUZh8Cdn%(Z9k5&PRpZWfI;uu#8Eh5=AC?qK)Zk52@2V|JIt6 zWv#j$#jUD@+m1{&CrGU1P0HayusUg#jO9YhBVGY10+YYzvDY#FzA3_IPjYCe#~RD6 z;r#~aDc#_A-V5Uk31{$`VXI7Xl*UT;!@QoNHNFPSarcA$CY*Up zHWM$bhOb+l=%Wya)U+(tho+X&=!?vzO6;FsDkkyg%;t)g5^_&Oo@@zA;R16k=dd&( zrk0-$b(*~H1Hc~zcopFCJ!j#OI zK`!;f>%Qv_{^cWP&no&>H#2=ddO9rKrUs7OFW?ZUAQ;veA*Vfev#&G$eFw?lQ{VQE z2G**@I+-5a7+n>&SXtqe?P=^o_Pcb%8)K+5r00nU`9c@u`}{5>->WXMV5`1i+SEE{ zM#{bZVtqj|JmrdizRr&80|xQzVTCqMRr_3Kg@_uuMhavK3MsMEN`{hL!26XWU45jN1q~o z1}oEz6RsYv&HE!POL@4-ua!C@yqa6=6t1{spflFeb6UwVP|qQ_trw@g&}0>nr~A% zWE1&n+K*)s{KDA3qHym`Hpaoqc(S#r|R=fN5M IPR3l;zeV?HMgRZ+ literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/_r2_c4.jpg b/www/modules/tntofficiel/views/img/_r2_c4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e05bf112c1a90b9d7fd34d5c6bc880b8e569e4e GIT binary patch literal 1596 zcmbu3X&}^j7{~uJW5yXXh8c|e&K-?PhjlcJaV)vUxya4Xv^2=kMOs%On#$ye++ruW zrE#B?afPHL*E*wwS$2ET`@YYc-}8K*&-eMUMp#n-+ysZm0U!_vFy1eK^%gKV=zd8D zA-@!G0JE9_1P6cy&=3#;03$#U1c=1|Q2%`u_(_}`T>Eo5H~@Its(o4a_QOZq+kH(Uh4;MAu(nZ(YY;)psrxspLp+2J#_Q=Q9?#iQ+b6$B;@Y(sW zVHR+^zgsk;dbV0_)k63wb9pDL%u&I542B^BpoH;X^ow0!i)?mlA)o93rKren(&|{dnc}~ z`@`1>^C2uXUZE=m>wo*%EMABatC1tKRHr9dn8s87;z+EZAq{r^^Qna14LX238)0Ad zT~)A7n*L@Px>=Aad}q5R`4GlHZamMLTlpeKCi2N%76mOg{3YUh!I!fl+`8tMMExF< z6E#7zGDL2!TlGd-#o>*wEz4^1INB=e%wpp4`IDlD*CpWdqrFziN~_qA-N2EOODiKE zGi}ML_96yBV*2cKOo&>?V5f&IJ@3?!oZ6*Qca;K4M!I$Y?$yPFFunE@I#JC7-IG3I zF@fjJT8hJGv#OOH3ZSG|!;Z1&qJ(j6q+*TIiKOTGbKZZENe;D33-9Oq)E=f=rzT!^ z6qx(Hs27FYo3fpC+w=D22P5q}xjGC_9ATR|6lc-Cl7u{#W#w21OT2E@rQj6EokHnK zYbGqC^e40ZHwl4myeAj$Ni7fUmw%z({|H=(BzRRj# zrJ|~^#C8utDcuc{W@N`Z+yLF$l#)9$TmY4Vt4nu8y7qZpuT|ZSbBOkqugmi1oZD^; za!#`uay@7BIZg>jH{{=97MXEAe!$Dwsmv3va#gnshITW)w(_8msY)|d<%;bzEy^{e z3V1#0f<5$OdbRl4mSS(Au%8-eN!6{>Y(irCCOSQRnDC+LlM@r6?<$sFPSh<{N@&0H zYA;zRuhf<{rJ;zF`D+~<95rinxTitR0!30%q!Zb zP}CeePNEGFM+7fn<_BUzH@{>bMhxolECjHCAlpD~!1jw%}y60R9YofYzw7Xa5#C@8tO6uw;!v%js+$dXghkW4+mU%ps84}ev zg@t|)=}UQ$hL+5*Ebg>>2^2F1&S|<-=F}p321T)fqr@(H>y$?oI9f6l zwGQQbjMRK?Evl4&aB%mObwxTU9X(7S25)hTC;JV(shZ?zdw<(e kk}5x3fI;OG$++%%&6)3>rvt_%B_Oc8PKZMr3t)}@3)_u_{Qv*} literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/ajax-loader.gif b/www/modules/tntofficiel/views/img/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..c97ec6ea9739a68e25637c0aa4adaaea05e3e4ca GIT binary patch literal 4178 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 C0gm_p literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/carrier.jpg b/www/modules/tntofficiel/views/img/carrier.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92d5fabb3ae56159ffdc28146dbbf195a2824884 GIT binary patch literal 9932 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 CqWB8{ literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/carrier/delivery/index.php b/www/modules/tntofficiel/views/img/carrier/delivery/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/img/carrier/delivery/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/img/carrier/delivery/option-ChezVous.png b/www/modules/tntofficiel/views/img/carrier/delivery/option-ChezVous.png new file mode 100644 index 0000000000000000000000000000000000000000..6dfc7be01d0438887ff7c1a637c89c0f20328060 GIT binary patch literal 4484 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 literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/carrier/delivery/option-Entreprise.png b/www/modules/tntofficiel/views/img/carrier/delivery/option-Entreprise.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2be50ea19feb7b94ca821d79475760ec38831d GIT binary patch literal 4144 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 Pg}%PFiB^@S%cK7QX{fJ= literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/carrier/delivery/option-RelaisColis.png b/www/modules/tntofficiel/views/img/carrier/delivery/option-RelaisColis.png new file mode 100644 index 0000000000000000000000000000000000000000..3ba9ac9f38530b5889b40eff194f1d7bf1ea00fe GIT binary patch literal 4454 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 + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/img/carrier/tntofficiel.jpg b/www/modules/tntofficiel/views/img/carrier/tntofficiel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad458c54605c6fc5f91e84aa6ca88c0e04477065 GIT binary patch literal 3643 zcmbtXc{G&m8-8cT*nQ1d8FLe+xt!Xp+}r7y7VXKMP0-c$49mZ zOlVm+0Ac}ySeOI)2ORJ0xPfbXWzC|YqCq> zsllcjSxwgowCnu5n_=f14e(lOqcAZ&sr$6L;AXq^&_D2CzoD zA%1MdT~^j#XT=`xFCa8WDbas86kO4Egyvc0oMiL%uCq4I>FU*7m!MfeEmj7g{WW-c z_qjqc0WD26C@nfnQ3-O1>z9|Ev``J2-zWVee zdlbOjbPW`W?WmN|6OvppFRncz@Ks#PFe%|SRRT$AvtuLj-=n9iEo?1Z#E;uKRpOto ztJ_9l0*8dz^j$NxHOl|8xkGnMX{qCDQWDjdjMlJRtk8PeapvHIPy9e9oL29e#t?xge=Bp%(XVsB$Ve&;@o?~T>h&VF02lOdM zGQT!28;kie+%fN>f2MT)?V44iGxTOkCyQ*M8toGM0xSvtu46SmE7g`JXEvJSl~4`K zn?vIq=6SCBQ3o6aI~xc?SJ_M2j&TnmyAvEu=c%LMFE0`AW+~Je@<5H&JjGja=)Rve z=G5uTuXd7{GTpC7*YKem8>*U4a|1^sMro4X>Q`)`y2JI^TKC0=!k|P$8KT=zhQyf< z0S!gkL0PIY92L{mhW-0bd9Xh)P~WjHeVl4+qipOz_XS7#M%**uxAU%Qg?~Ue@*>BY zS>SEqMeW8i^!6Bs{n{j@kwU8|oM26nn)(XQ^7O$$!K^sp-k@}jS4I7;{s(%KNQW6f z_Rf&I#I+1D8Wr=Xrq0>yR{douO;Zi-`02Ff-U0jP@hM-*sA3}@Rc;=IIaQq5KWr@L zG=Ecf;*Xw~#RC8{B?Ykkt|83nZ$0txvjGAqaX}%ZlCsKC{oi^5@9BvFIO>lExm864 z;>daOF=XAmmtMtP?ihrZ0 zJEP2th{=>*OL`sm!T#as*r{MS?yYAr=Qqr@=;2N_Ta7i^Qu}7Y$&oeCSx`$G`Ew*A+2<7%}$~snU_`bpp!*R~{*jeR5(^ zZx*aYlvHFu3f|0UjAtSmA~@G0Z<)Puy%8HEjmhBYlfThjdpWlBDACS)9-RC?= z+14NU*tJkPtkpASAEF!J+v$65Le-rZpfVtSkvR4sE=*PnY%*>B*tYJv+k9idg`c<} zO6pd#MZR2oT^FT49{1ww0LO{%y#wBFAv!Ht$))XR9b-A5UYL&R4F2eUq1%1CaUxLQ zzQARK$S;T5P|=(_f!y*>Gz$xdemh_ljIN41I~t*9vbfJVGHw?Ir;9sZ}|OK zV`pxk>MjPbr>P?_rk?hC6a>QZr)mGz6r7ipj~@jHh@&NxRgjX0^py;3{%)15y5QZ% zTlE+LjvR9F{5Y%T2&(Klu3c^Ukz(Rb;HNe@$vEQ%N}=V6r~}KX}_u0oGVNzav}LmJ$I#nB8PAFHhLZDe6+ zYkRx>@<)>)(UttJxg*UhPL1a8XI{0I@>wVEi$x1We-k6DtD}H{E%L|C(mt{~caG|g z@DsC=a$MEZlhtmC@^=mU;zcjbJ&u~Xz}q@d>?H4%JJ`{6zC0HDoZ>nBl=#BId1IqI zP_p}}cN;IJ=q`Pxp!(T4G`X>DSt-JBD#qT!pmHb+9Fay+5aTo|cnIle8ii!>p|wmb zv1Ok=d)A=tt;+QxosJ0@Jkp5vTKDSG6jrd5=kLIu*O=_GzxWyQB(2;|<`a${t{SsK zu9=Zlqi`u-4`ipCoCLuD^qO?Mw(yJH?C!L5r#CtagXQ*TKizBKU&&qEOu8YH)_qqo z+z~NPwr!nTUHsgfk;lmZcwABITqCbShl87!UZ1$^n5WHQQE-Ra6>T@R1wB}4?sHHo zQLkFMZIWAqKh>+6^EuRcTI5rQ;ZL@&xz~_f(q=7*+Q!;yaim)6EBWXu)!4N!{O>b- zCeW-%_X_GJFQv^9^E2GyKxXH3+uNcA+=7sK8HTtaI{0|>_DbBY%_nrz2G*n5y<`0d zv;8Tb%MS*uZ()v+ZZ{n_=zD!*s_P+_(LiR(UFmd{U2A4uio$*yRDfCU{|*ow1)!1o zHvd>QUDPiraJaIUnM-?VuOTAqal)s4oV@#LE^y>T-N1Q4Td2O*#CCG-pIPgRz%AY@ zvP^)lAkFWYc0w&VqmGx2g@&$DPu|WcyvOQ8zI7MW#iPKnx1PX^Sf}J<61Z1dlE9x8qb@j1@mGA;PZ8&df0r!d)`Bp(N#0-U zp6Xc5V-fgsb-fcGyF2LVxm%_9nkk*%?v`nd0f1?6r8(YT&aKJXW43RPEPRjbe_b=v zQlnt{NG0??))4lKZ4$#*+Rmd_pg!$#hX}>99LH`h>2WS}{6J<3uWBPysQ5`1jaBxn znmR!NWJxCG0>5&Ku>ef&O0%Mclth(Exzhv;@9^L|cjl8_?glQtjMhjYA9AMf_q4+l z!Sl6J&_~r%cy$3SnAgSE{i`_;!Wy*y?nIG>o04<7=f{lc*x{6vP4}9H@LzD`V}g-vc^#UYtxCVKNcfWAa}jz#bDcQt40i*z3tKnziLMqlMP|AINI8upE#~ z6&Nqm9omwz(JqSj&x9IW{c?MSUDe5iGo;l$5k6Dod*BpWf?cX%l`D_aaau-7A*j~G z&h~l#pwjt`sY@q@bKdff9f_IU_kv)>SO17)BfaT@kO&=>IoBOzmi2hTU^NNjrzz3L zk8PTVOovpZ!#HXsBc24b16&WW^U*8DL4eB|P%7kN#b!5_a(<7*@7()O>M`#$a1>HW z|IgoG-WHf7dMuYu8hL`m1=S0MZpYewGvk|^uX92~Kkdy1dfEB&B1sM4ttAU3fVDvj zicNtON?u61xzaHOufAY3{8yupc6P^11+4}__qua!nAG#KgtFmA3^V2q7a@KuA22QY zocBE@ZQ|QQ>#$@+6ol$26+Q3zLfI?hEYbd4NVbD!t0wOWI@wQnv}RmWht}n-$Q2qx@<}}m* literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/depot_r8_c2.jpg b/www/modules/tntofficiel/views/img/depot_r8_c2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c7f3a1fe99c627c53cbec00456078929235a7ee9 GIT binary patch literal 8213 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 literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/domicile_r4_c2.jpg b/www/modules/tntofficiel/views/img/domicile_r4_c2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23d52797fdf3099dcc650970e64e0cbc418ef2c0 GIT binary patch literal 4781 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 P;u)^;e|IM;7t{X&p*!Yh literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/entreprise_r2_c2.jpg b/www/modules/tntofficiel/views/img/entreprise_r2_c2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..677812e5250177089b1d25e25ca48344173ee9ac GIT binary patch literal 8454 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
s!Ql3$8cu95c3;^-*#` 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 literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/index.php b/www/modules/tntofficiel/views/img/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/img/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/img/modal/index.php b/www/modules/tntofficiel/views/img/modal/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/img/modal/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/img/modal/location-point-map.png b/www/modules/tntofficiel/views/img/modal/location-point-map.png new file mode 100644 index 0000000000000000000000000000000000000000..0aca310815d362f83288fd61c6c9d877fec29fb3 GIT binary patch literal 1094 zcmV-M1iAZ(P)v$JzvX7}E6 ze)r6oId{%Iid%>a{KtXkfC=DUpa9f>-+|-67uwi`ZuY7RbUScZpuOZca8Mh2wkO;L z{xiTQz%a?>8t|ev_DEN_3;apoOTeRl34v#|u}9nBF7U^JQ@|+c)CQ;M&*=z(Pjw1>rSqTt_m3-{8dIp97Tv z!4=^&!?m%OfSCc|Gs0=}9N^sn;Z62UaBb{q;8;rVF|ntc=Kyb}gtytX!L_lADPlh( zcJ%Um-HS#-aHHGZc7$tV&&NNsJ!D$+N$NSkTflM;@UrO97hD@#1`hRr9}>OfwPH&Z zHVf?OFg2%*-FqwBBxT!6z~z>)%QDVDaBZvwrdo!lWIP*jfj{E{KXQSeI0y25@B?5> zu8G7;==B8f8K8j|T;Si9#7^~q?gL%{_O(p?1AGd6td0F6G28{dN7#5Os$ZYN%k3s? zpz;NxdJViBE&oe|jiV|*^nw2H-&0-TF7S)Me!|A9YGm`ysCp&w!%)Qy^{7(*8ZUQP z8#{Mn+y(w7U=ny4qK6XXRhR9n2Dv<-=7INtukygRz>c+3O}KXJX(U&GumN6f7qAOB z=>hlMygzTSWN5a(-vg>QC)I%PCi`l>y;@SUQSDmE8`-GTW=*)VL{zaIpRUF0JvX!Xp2rH|RDh!W7v^V~eC>QuEl6mWA$?e+M-%@N3+kmt2vb>@}HvnoxE8}8yh7JO9<=+ z9+UIrufTp_Mdl_&uj&H-BVdyY{P%$GJHg`%cogt~4ZxE!e;!z`vKE0S;5O)>sH7H19}T<1b)Iu4UjSU{ySy2QEnKX-=HH7+c`d|ErNQpL9IX-~a#s M07*qoM6N<$f+HH@p0TdmhMFC7XMyCYO zb&Pfe&~l8n1kiAdHU#kK7=0ALjbrpi09QcY5!eT=gw&=9)E%L9sZBH7P^ym5Du4FQ z6QGk5>{#a)mD;=keooZ4&d@G@m=hiJ4^XMi15nEd)@(mS{EzlCqCwpso3!(%@p7OcufFb?Ko1QQk!?6oPd_?xa70c$T8>w zSc$lGDYaRR>q|P~>;UbNTHDsigi37;us2fPv-Nxll;;P^>j%n9wT35Bx(b-J*Tnn) X$M1MO+YABs00000NkvXXu0mjfb?x4! literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/modal/marker/1.png b/www/modules/tntofficiel/views/img/modal/marker/1.png new file mode 100644 index 0000000000000000000000000000000000000000..95a8a0aeb6cdbe6b01b919716c80089fb315af4a GIT binary patch literal 1366 zcmeAS@N?(olHy`uVBq!ia0vp^qCl*~!3HEZWK3!XQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?>q8Ln2Bde0{8v^KbxNJqiQz|cV7z);`NK-bX1%D~LZ#8?3elz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij`p|xTF>*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu08>uqjxTudkJ7 zUU5lcUUI6Zi>(q+pI&BWij|3lvw@|hsj0b{v7@1(tEq*nxr?QNtErQvtFxP_nK?|a zOMY@`Zfaf$Om7N8uNh9gpahUx0JPa9wJ5VJHN~wcKUV?lQL9YcZZXDb9#n4%Znv1= z)TA3ng>kdMZm-?ru@8yfr0Ugr;B4q#jQ2dti72X zMOxppsY)qkES$TRCHmqqrKx4x_IW5fajlk!7W~7QCCrk$=1NYKVrx>O0!LGXgbIuH zWft8}4#J9^AARQVs@yD1D}R3Ip^owQy5jE#-(;i+zJGYK@`ja2%d!QIEBKx+uzr#B z$Yj3R>Z?8pmp3Hy39~lmGyY5BWGxUaW8+i&&(2a$6Fij`z>c=`x&>OjqLLZ2KKAgc>YbYQXUi=a z<|@9cG54x^i~lXi*vWD^)~WQ|%Ue(RW1XzO%4&pFwyDZ8P2Mx_#FP3huLW*}US~a; z<7?YY+{Rs|5IsKa6# z|C(v9EZJfYi}@_eV~E+ZN?5kgY+=#)h?)J9l{I#qJgj7USkUgB-Uo@26-Q&#>K!IY hw;kKT{W!dVkzp}Qm+f80c2!VG=jrO_vd$@?2>{kwe@qj19PO+_(g_3t0qfMuu^AQGyDKfUM=N4Wp~C_xRhZk*(jN2%*E_D)(V|me za}nGa8~(^pVMQ5C0bPn9lPM(PAaz-@NG22~+rYRiBEu2Kz_=>{?vJrc?!G_r-uwJ| zxr&Um;MPqU_#x4S~Qs zgeg#f&yvd4W&lc(#sG;B78v1J7>GrLNQ^i}EQ$t1Fakp`0wJ&fk)m)cDvkjb9*~Vj zoAOYdO1%(^Jt;sl!%!#$6&Du^i(`Z&oev>0nGAwOkVqt85dy2j!WirVi#2jlL4{e3 zG)^%%X#sqShFsFdC_pyTXC)BSlB~tL&?dHFkljE*h!FObvUY9=W_nJJk^X|<@vVr2{# zBc@R)K$a)OaTBUWU@;P-LgHe@FoGmWq=-Zv=!aBs3%+`TUpO4Xwb@j^@PcZ_w4{szYxNw*39BcgQA+ zceh<}OpX&jU7fjk^3I9R1d-vhF~f8G3B@h$rEOsz0ke|W=K84Kb(b-^#TR#7PG4~k zTfKoR|CRURq+lexxpK~%V2&7dtP1Usj=Zc-OYe-ozpm${*wCJck)Y<GVT^*HRl@fo;s>muI%@MzvkH_o{wGgPFlc&R6ctnXf3{rc3@`0V~CEl!O#ifVLhX&qlvlAYT;G&g&| zH6w7l2cu6D_0E$AoN>wV`k97@UuEV5c&0CeNr;*~9yHwP^;>sv;zDL#{q8V&wy3H9 zh@tM1v#{4TP~2K}1FyOz%`#6o?uHM}dT(cZ-MXtb%eiGomHVlv@1|mKxH0eY3FX!4 zsNR{Nq=9_uw`x!OXy}8ff$EHX-2r{k`zZGdW$s-0C->yF{{8}f*2=!Z1g_lM9+7N0 zw%f(uTK0j(7Pu)-(Gdu5I36-HwsW(0)&1*SJ2=%J9_o7JteGs`sH%J1d30(`JMXdD zS`g5a(^-^LFOBqcg~W#!@m3~D_Mfea`nf1LDBr#szhC!F{oLX7iA{Q_yGh{>b4t;E UWg{5n`*CwLNolIK?R(4r0Z-ODt^fc4 literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/modal/marker/2.png b/www/modules/tntofficiel/views/img/modal/marker/2.png new file mode 100644 index 0000000000000000000000000000000000000000..ce89cf1b56b81a5d184f7ecc816830ffa48fcf47 GIT binary patch literal 1480 zcmeAS@N?(olHy`uVBq!ia0vp^qCl*~!3HEZWK3!XQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?>q8Ln2Bde0{8v^KbxNJqiQz|cV7z);`NK-bX1%D~LZ#8?3elz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij`p|xTF>*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu08>uqjxTudkJ7 zUU5lcUUI6Zi>(q+pI&BWij|YIp{0wZv8%b6v7@1(tEr=rshOLbxrv#np`)d_r4vlA zOMY@`Zfaf$Om7N8uNzLipahUx0JPa9wJ5VJHN~wcKUV?lQL9YcZgIwG9#n4%ZnwDL z)TA3ng>kdMZm$gS&kO^u4#!lAe8(?-#y@(b2Ei8sACcKiq9ku4>G ztG93@9c5Q~_sEIcHTmcdkDmX=dxd8_Id^CFOt~M$lV(@fJ-<`!|IVi)=FN8pXZ1VM z8f>Ocq8D^a7;2lJ&GS*ap0ZJqa}DRa$qg%e9=>P1U);*{Ln=>dl}hdIrhANg0$5l# zu;AwR1D*LKFx$@RNiq8RUOU){ydGO43Kdg`K6WLRhZGIQ>d)ln0cKj6+m#{vU7g3#ma3o;USYE+g7dk^CfqKe(Zd{uB=}RLk>oG^-R{+Smk+$ ySB!_h>tjM&uE9c?>bXDL)XEuFiN|GrXX0Ual(>72Vy!E8U}fi7AzZCsS=07?>q8Ln2Bde0{8v^KbxNJqiQz|cV7z);`NK-bX1%D~LZ#8?3elz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij`p|xTF>*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu08>uqjxTudkJ7 zUU5lcUUI6Zi>(q+pI&BWij|?Mk)x%vtBbjriGiV^tEr_4P{7p8#KqOZ$js8z6{goE zKe;qFHLnDwHwB^B6{lWM0>~`@+U$~Alv$RV;#QQOs{r<>RVHq?IN>x8sy79+k#cydq81E%pJU}8?TZCl8|z!c-@;uunKYt6Lt-XVb^ z$IsvJR#$aC61Lb|@{WW{8m%qonueNwx`#tXd>jUL{#n0!Qw|sxs`uSdtpEte*JkH%=w?a0n zP0y)*;rt6WU!J}C-0Q#UP6yL9rtcw#e2#q(JP=;Hkm1{by)BDU@+~tM9-K4|VA%ce zo|9-vopoCkW8HH{#-78qjjJ?w$U0qTj4R&l)y6XEjDMHk#izVKQh(K#T|Vf(U-Oky zZI9L~>6J6i2J98)6X9t+3;emUhEAn zXYq5zn|_`VD>E-q$tnQEl%m>m-h4($5Vp;soA+lxn zVjKDER!8@WNN?Tj>8`Qh=8Ap^jdIzash9YxzT~={xOBv)borHR4e6o@DXPy|x~5$& zSUKUslqXYse!6(9nEu`|@G1M95{Cy{&Zr03^s6yBd4KX+u;QEPfxW&bZ9cuevNmc1 zi&#i_Ia}AN{dd@Bw5q1s%(P0a=E;?8h&Jk5vtY%!|A!5kOMH&ayub8RTyxsPcbav- z7!um!=e-n77dSO#ZR!&%)}}?$a&s1^o?cvJJLjRI6g1{ literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/modal/marker/4.png b/www/modules/tntofficiel/views/img/modal/marker/4.png new file mode 100644 index 0000000000000000000000000000000000000000..a2aee782e43763fe9e0a9c18279f1b3539867ae2 GIT binary patch literal 1446 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 gch{A)N)-<)pboFyt=akR{02ER|FaQ7m literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/modal/marker/7.png b/www/modules/tntofficiel/views/img/modal/marker/7.png new file mode 100644 index 0000000000000000000000000000000000000000..d3119b4451213ff0f39d4d94f80ad4d7cc95cf6c GIT binary patch literal 1412 zcmeAS@N?(olHy`uVBq!ia0vp^qCl*~!3HEZWK3!XQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?>q8Ln2Bde0{8v^KbxNJqiQz|cV7z);`NK-bX1%D~LZ#8?3elz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij`p|xTF>*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu08>uqjxTudkJ7 zUU5lcUUI6Zi>(q+pI&BWij|XrnTe5$g^RhFiGiV^tErQrp`)v*rG=TflbMB?qbp3W zOMY@`Zfaf$Om7N8uPaWypahUx0JPa9wJ5VJHN~wcKUV?lQL9YcZgIkC9#n4%Znrq& z)TA3ng>kdMZm;7y*6PT0|OJ2r;B4q#jQ2dc6&2B z3LH~U>Tnatd6VOs*D&&&KfkRqR-TxbJv2Z)Cx#HsO7~q*$qtwx%*pjfk zm17e7lh)3U(s#L4cAj2WUiZOp!_1#=-`q{h&rMnIy>*>qi)97NySBF<)MeVwKiqq6 z?R4$EQM38hh$jXgNJ;vk^dQh#qrsTNx`2D7Hvf5MnH9}UFWhdl&wla#S5rEp-3kZB zH;y~n=cdF(?%;ngx`W?4ai~ zEWC6)d+`<}XW>-=?~JndZo9MsEFLL#V*(^WQK6!9<-Mq|kTIj{56O->R z&06QUoa3>T{ai+i#1Qq}k18I9oQ?46nXIX?tJ3kqRi58Rc9=diWO-=hKJ`zU>pP}9 fii<+-Gx0E7DqD6+qlPIER4#hD`njxgN@xNAh7<$7 literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/modal/marker/8.png b/www/modules/tntofficiel/views/img/modal/marker/8.png new file mode 100644 index 0000000000000000000000000000000000000000..a4acb8485439822747ef531c7fa54e3f1bb260ac GIT binary patch literal 1531 zcmeAS@N?(olHy`uVBq!ia0vp^qCl*~!3HEZWK3!XQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?>q8Ln2Bde0{8v^KbxNJqiQz|cV7z);`NK-bX1%D~LZ#8?3elz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij`p|xTF>*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu08>uqjxTudkJ7 zUU5lcUUI6Zi>(q+pI&BWij}jGqpP8lqp`V}iGiV^tEr{AtFxuKft#t3i<7aFr3p;0 zOMY@`Zfaf$Om7N8uL(}QpahUx0JPa9wJ5VJHN~wcKUV?lQL9YcZZX7Z9#n4%ZnqfW z)TA3ng>kdMZm<|EuS}=fq|*g)5S5Q;?|mJz8)cg zBFE47oWIh^=A3PstC}O+F)?+Az-Cw7sXXFs3Rk?2$GWWEW;uJItH{=sb24Xgi0WNB z#IfXnqt7j0ZbKj4IUkele$BsKyV!VN_506z{}ot#emCdy?&tT)@73x%aINK;yNjco z`5I$(Q|RHcMDGpXH;AjtFSWON$|jR=wt!#tj7r;mwi-uH)(=*9f+KWyUKe|#cHlAl z0)}sg_O`IT{GfH<7lYrl1q}1rW;eH<*ln~ytU>(ksz-K>DxV)O3JST&^?&BS`R59k z{#~}hLBr>&Z*EHGF@sh2jkfybM)S9>>%H*pjW(B=%ZaWz3%_oR(@Lvb9b{GU^Nx_| zs*Yn3UDw{lFZ}b0zpysv0prsP({8R*Up3|J0=^9Wy%X-P_6lCOR;uk;iC|1%t%+x7 zL{;o_1zF46zR@?hdW-h_5&dJauzQuf?<2Rl;-R1Fo}HS1%IohFFLB=kf3jxP-QDRh zTiB56ewB`uqw>W+npgMFky*igd4BrhM{Xa(QsR!k(Aed;Sj2fb|K*!U*L-yIEuQaJ zxaP9qj@>5OHsRYozZGV^$hmN}@|1&SE1spyt6gyBz}DAt4XciEh!!j^+qX~i>zZb} z2M#+^PIec{Ub*1(TlHMX?OP&mU`DE3 z-X-ONpl8CCd-~s1wM=_D)zR>_IDhr*36)D$U72V4UT8*n)Lll6w7+@#55#EbJw6$t z`C2aLCPU1$!Y5o^H-BE~kXjHZnf`CusvkU6+}EFexNgm$zxtEUe2eA{yubNnyo?FkK{H+Oe#k11+TIKI^U)p`bIh7-z{E+t>eI}Iw1Jzf1=);T3K F0RZ$GPTl|j literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/modal/marker/9.png b/www/modules/tntofficiel/views/img/modal/marker/9.png new file mode 100644 index 0000000000000000000000000000000000000000..12221769095a911101118d9deda528c3571d83c1 GIT binary patch literal 1504 zcmeAS@N?(olHy`uVBq!ia0vp^qCl*~!3HEZWK3!XQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?>q8Ln2Bde0{8v^KbxNJqiQz|cV7z);`NK-bX1%D~LZ#8?3elz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij`p|xTF>*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-xUqS~&|m@vn0`fKfxe-h0mw@*g}%P{mFDKcRTq~8r6Sym)!^cg z%7Rq=pw#00(xPNw#HA^NtSYc_E=o--$uA1Y&(DE{Vn9ZINq%ugeu08>uqjxTudkJ7 zUU5lcUUI6Zi>(q+pI&BWij|A0xwECCxtqC}iGiV^tEr{2g@u!ak%0@4>E>(z*Xxp> zT$-DjR|3lf8KeihOY>5BU^u|mW}SME)6?>@=i%Xo|A9`7Z(3)!o;tBlbzwh)zHJkeL_>7T zo{&9%TYoY1Jz2nD*Zi9^bVBj&=2?t=QlYIeOrFo$U6!uc#QKl@uYLAYuitN7rkQM+ z=%2&0_UrGG=ypfbgB+>n{7(dbY>|7n?q!jd!k$A`KfYFa{|FV_`Z#-vO~kSz&%z61 z|2~}j!Mr$m)s*V>q8C}C)V&vt$wdr?-h4u`Tn=E-?C$J46k+@p3l&* zE?6HLAC&p{^cyytnB^sPuXVP>noKF1zb7KdF?b`h;%v35RTq~&Ti9~iZPJ7}IwGp^ zhgxHu4o{kV{ps=;r{bTM8g4&%x4#nDq4l}b=b!syzJ-;Ql>t59P9MC}mMXVW%hc`c z4VJVs_udJLES8hDH;@*a^l{1RDY;BmR~h_MWo|YlmHcC5HNCK)=koleTz!srZ0^sn z`Nj4iI&|K<4&wv0yEf#X{{4ibE9+5#GV6BtC$;5mnH + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/img/modal/top-logo.png b/www/modules/tntofficiel/views/img/modal/top-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2df498a77f5cebc3a03c5459894ede06b85bb523 GIT binary patch literal 15629 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 F{68u5|Aqhn literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/img/modal/top-picto.png b/www/modules/tntofficiel/views/img/modal/top-picto.png new file mode 100644 index 0000000000000000000000000000000000000000..60281b732802bc999979d4397eca750c07668093 GIT binary patch literal 3805 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 Pw))@vfBmQCcJ6-wtV_}I literal 0 HcmV?d00001 diff --git a/www/modules/tntofficiel/views/js/address-city-check.js b/www/modules/tntofficiel/views/js/address-city-check.js new file mode 100644 index 00000000..d3ca1bff --- /dev/null +++ b/www/modules/tntofficiel/views/js/address-city-check.js @@ -0,0 +1,147 @@ +/** + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$(document).ready(function () { + + // Remove the data-validate attribute from the city and postcode fields. + $("#postcode").removeAttr("data-validate"); + $("#city").removeAttr("data-validate"); + $("#postcode").removeClass("validate"); + $("#city").removeClass("validate"); + + // Create the FancyBox. + createFancyBox(); + + // When a city is selected. + $("#validateCity").on('click', function () { + // Actions to perform when a city is selected in the fancybox. + // put the value in the city field + $("#city").val($("#helper_city").val()); + // add the form-ok class to the city and postcode field + $("#city").parent().removeClass('form-error').addClass('form-ok'); + $("#postcode").parent().removeClass('form-error').addClass('form-ok'); + // close the fancybox + $.fancybox.close(); + // enable the save button + $("#submitAddress").removeClass("disabled"); + }); + + $("#add_address").on('submit', function (objEvent) { + var strPostalCode = $("#postcode").val(); + var boolIsPostalCodeCityValid = false; + + // Do not perform a check if the postcode or the city is not entered + if (strPostalCode.length < 1) { + return null; + } + + // call the middleware to check if the city match the CP. + var objJqXHR = $.ajax({ + "url": window.TNTOfficiel.link.front.module.checkAddressPostcodeCity, + "method": 'POST', + "data": { + "postcode": strPostalCode, + "city": $("#city").val(), + "countryId": $("#id_country").val() + }, + "async": false + }); + + objJqXHR + .done(function (mxdData, strTextStatus, objJqXHR) { + // handle the response from the ajax request. + var response = JSON.parse(mxdData); + //if the city match the postcode + //resultCode are defined in TntAddressModuleFrontController + switch (response.resultCode) { + // postcode/city is not valid. + case 0: + $("#city").parent().removeClass('form-ok').addClass('form-error'); + //display the fancybox + displayFancyBox(response.cities, strPostalCode); + break; + // postcode/city is valid. + case 1: + $("#city").parent().removeClass('form-error').addClass('form-ok'); + $("#postcode").parent().removeClass('form-error').addClass('form-ok'); + boolIsPostalCodeCityValid = true; + break; + // postcode/city does not require validation. + default: + boolIsPostalCodeCityValid = true; + } + }) + .fail(function (objJqXHR, strTextStatus, strErrorThrown) { + // console.error( objJqXHR.status + ' ' + objJqXHR.statusText ); + }) + .always(function () { + // if postal code and city is not correct. + if (!boolIsPostalCodeCityValid) { + objEvent.preventDefault(); + } + }); + }); +}); + + +/** + * insert the fancy box html into the page + */ +function createFancyBox() { + $("#page").append('\ +\ +
\ +
\ +

Sélectionnez votre ville

\ +
\ + \ + \ +
\ +
\ + \ + \ +
\ +

\ + \ +

\ +
\ +
' + ); +} + +/** + * Display the fancybox + */ +function displayFancyBox(arrArgCities, strArgPostCode) { + // fancybox configuration + $("a#fancybox_city_helper").fancybox({ + "transitionIn": 'elastic', + "transitionOut": 'elastic', + "type": 'inline', + "speedIn": 600, + "speedOut": 200, + "overlayShow": false, + "autoDimensions": true, + "helpers": { + overlay: {closeClick: false} + } + }); + + // Generate the options to be put in the city select field. + var strHTMLOptions = ""; + $.each(arrArgCities, function (index, city) { + strHTMLOptions += ""; + }); + + $("#helper_city").html(strHTMLOptions); + $("#helper_city").addClass("form-control"); + $("#helper_postcode").val(strArgPostCode); + $("a#fancybox_city_helper").trigger("click"); +} \ No newline at end of file diff --git a/www/modules/tntofficiel/views/js/adminTntOrders.js b/www/modules/tntofficiel/views/js/adminTntOrders.js new file mode 100644 index 00000000..2334227b --- /dev/null +++ b/www/modules/tntofficiel/views/js/adminTntOrders.js @@ -0,0 +1,20 @@ +/** + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$(document).ready(function () { + $("#form-order button").on('click', function () { + var $elmtForm = $("#form-order"); + var strAttrAction = $elmtForm.attr('action'); + if (strAttrAction) { + strAttrAction = strAttrAction.replace('&submitBulkgetManifestorder', '').replace('&submitBulkgetBTorder', ''); + $elmtForm.attr('action', strAttrAction); + } + }); + +}); + diff --git a/www/modules/tntofficiel/views/js/deliveryPointsBox.js b/www/modules/tntofficiel/views/js/deliveryPointsBox.js new file mode 100644 index 00000000..8441cc63 --- /dev/null +++ b/www/modules/tntofficiel/views/js/deliveryPointsBox.js @@ -0,0 +1,488 @@ +/** + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + + +// On DOM Ready. +$(function () { + + if ( + // If Google Map API not loaded. + !(window.google && window.google.maps && window.google.maps.Map) + // and Google Map config exist. + && (window.TNTOfficiel && window.TNTOfficiel.config && window.TNTOfficiel.config.google && window.TNTOfficiel.config.google.map) + ) { + // Load Google Map API. + $.ajax({ + "url": window.TNTOfficiel.config.google.map.url, + "data": window.TNTOfficiel.config.google.map.data, + "dataType": 'script', + "cache": true + }) + .done(function () {}); + } + +}); + + +// Constructor +function TNTOfficielGMapMarkersConstrutor(elmtMapContainer, objGoogleMapsConfig) { + return this.init(elmtMapContainer, objGoogleMapsConfig); +}; + +// Prototype +TNTOfficielGMapMarkersConstrutor.prototype = { + + // Google Map Default Config. + objGMapsConfig: { + "lat": 46.227638, + "lng": 2.213749, + "zoom": 4 + }, + + // Google Map Object. + objGMapMap: null, + // Google Map Markers Area Boundaries. + objGMapMarkersBounds: null, + // Google Map Markers Collection. + arrGMapMarkersCollection: [], + // Google Map Markers Info Window (Bubble). + objGMapMarkersInfoWindow: null, + + /** + * Initialisation. + */ + init: function init(elmtMapContainer, objGoogleMapsConfig) { + // Extend Configuration. + jQuery.extend(this.objGMapsConfig, objGoogleMapsConfig); + + // Google Map Object. + this.objGMapMap = new window.google.maps.Map(elmtMapContainer, { + center: new window.google.maps.LatLng(this.objGMapsConfig.lat, this.objGMapsConfig.lng), + zoom: this.objGMapsConfig.zoom + }); + + // Init Markers. + this.objGMapMarkersBounds = new window.google.maps.LatLngBounds(); + this.arrGMapMarkersCollection = []; + this.objGMapMarkersInfoWindow = new window.google.maps.InfoWindow(); + + return this; + }, + /** + * + */ + addMarker: function addMarker(fltLatitude, fltLongitude, strURLIcon, strInfoWindowContent, objListeners) { + var _this = this; + + var objGMapLatLng = new window.google.maps.LatLng(fltLatitude, fltLongitude); + + // Create a new Google Map Marker. + var objGMapMarker = new window.google.maps.Marker({ + position: objGMapLatLng, + icon: strURLIcon + }); + // Add Marker to the Google Map. + objGMapMarker.setMap(this.objGMapMap); + // Extend Markers Area Boundaries. + this.objGMapMarkersBounds.extend(objGMapMarker.getPosition() /* objGMapLatLng */); + + //objGMapMarker.getMap(); + + // Bind Markers Events. + jQuery.each(objListeners, function (strEventType, evtCallback) { + // If callback is a function. + if (jQuery.type(evtCallback) === 'function') { + // Set Marker Event Listeners and Bind this to callback. + objGMapMarker.addListener(strEventType, $.proxy(function (objGMapEvent) { + // Default click action is to show InfoWindow (if any). + if (strEventType === 'click') { + this.objGMapMarkersInfoWindow.close(); + if (strInfoWindowContent) { + this.objGMapMarkersInfoWindow.setContent(strInfoWindowContent); + this.objGMapMarkersInfoWindow.open(this.objGMapMap /* objGMapMarker.getMap() */, objGMapMarker); + } + // Adjust zoom min/max range. + objGMapMarker.map.setZoom(Math.max(Math.min(17, objGMapMarker.map.getZoom()),10)); + // Update the Google Maps size. + this.trigger('resize', this.objGMapMap); + // Go to marker position. + objGMapMarker.map.panTo(objGMapMarker.getPosition()); + } + + return evtCallback.call(this, objGMapEvent); + }, _this)); + } + }); + + // Add Marker to collection. + this.arrGMapMarkersCollection.push(objGMapMarker); + + return objGMapMarker; + }, + /** + * + */ + fitBounds: function () { + // Fit Boundaries to display all markers. + if (this.arrGMapMarkersCollection.length > 0) { + this.objGMapMap.fitBounds(this.objGMapMarkersBounds); + } + + // Bind event to callback to execute only once. + window.google.maps.event.addListenerOnce(this.objGMapMap, 'bounds_changed', function () { + // this === this.objGMapMap + this.setZoom(Math.min(17, this.getZoom())); + }); + + // Update the Google Maps size. + this.trigger('resize', this.objGMapMap); + + return this; + }, + /** + * + */ + trigger: function (strEventType, objBind) { + window.google.maps.event.trigger(objBind, strEventType); + + return this; + } +}; + + +/** + * + * @param method + * @param strDataB64 + * @constructor + */ +var TNTOfficiel_deliveryPointsBox = function (method, strDataB64) { + var _this = this; + + // xett, pex + this.strRepoType = (method === 'relay_points') ? 'xett' : 'pex'; + // relay_points, repositories. + this.method = method; + // ClassName Plural Prefix. + this.strClassNameRepoPrefixPlural = (this.strRepoType === 'xett') ? 'relay-points' : 'repositories'; + // ClassName Prefix. + this.strClassNameRepoPrefix = (this.strRepoType === 'xett') ? 'relay-point' : 'repository'; + + this.strClassNameInfoBlocSelected = 'is-selected'; + + this.CSSSelectors = { + // Loading Mask and Progress indicator. + loading: '#loading', + // Popin Content Container. + // div#repositories.repositories + popInContentContainer: '#' + this.method, + // Popin Header Container. + // div.repositories-header + popInHeaderContainer: '.' + this.strClassNameRepoPrefixPlural + '-header', + + // Search form CP/Cities. + // form#repositories_form.repositories-form + formSearchRepo: 'form.' + this.strClassNameRepoPrefixPlural + '-form', + // Repo List Container. + // ul#repositories_list.repositories-list + infoBlocListContainer: '.' + this.strClassNameRepoPrefixPlural + '-list', + // Google Map Container. + // div#repositories_map.repositories-map + mapContainer: '.' + this.strClassNameRepoPrefixPlural + '-map', + + // All Repo Bloc Item Container. + // li#repositories_item_.repository-item + infoBlocItemContainerCollection: '.' + this.strClassNameRepoPrefix + '-item', + // Repo Selected Button Bloc Item. + // button.repository-item-select + infoBlocItemButtonSelected: '.' + this.strClassNameRepoPrefix + '-item-select' + + // One Repo Bloc Item Container. + // li#repositories_item_.repository-item + // '#' + this.method + '_item_' + id + }; + + // getRelayPoints, getRepositories List. + this.arrRepoList = JSON.parse(base64_decode(strDataB64)) || null; + + // If invalid repo list. + if ($.type(this.arrRepoList) !== 'array') { + // Set empty repo list. + this.arrRepoList = []; + } + + // On repo form search submit. + $(this.CSSSelectors.formSearchRepo).on('submit', function (objEvent) { + + $(_this.CSSSelectors.loading).show(); + + objEvent.preventDefault(); + + // If test is valid, get all data for postcode and city and update the list + var objJqXHR = $.ajax({ + "url": window.TNTOfficiel.link.front.module[_this.strRepoType === 'xett' ? 'boxRelayPoints' : 'boxDropOffPoints'], + "method": 'GET', + "data": $(objEvent.target).serialize(), + "dataType": 'html', + "cache": false, + "global": false + }); + + objJqXHR + .done(function (mxdData, strTextStatus, objJqXHR) { + // Update PopIn Content. + $(_this.CSSSelectors.popInContentContainer).parent().html(mxdData); + }) + .fail(function (objJqXHR, strTextStatus, strErrorThrown) { + // console.error( objJqXHR.status + ' ' + objJqXHR.statusText ); + alert('Une erreur de communication avec le serveur est survenue, le transporteur TNT est momentanément indisponible.'); + location.reload(); + }) + .always(function () { + $(_this.CSSSelectors.loading).hide(); + }); + + }); + + // TODO: remove or add unbinding on close. + /* + $(window).off('.'+window.TNTOfficiel.module.name) + .on('resize.'+window.TNTOfficiel.module.name, $.proxy(this.prepareScrollbar, this)); + // this.eventGoogleMaps(); + */ + + // On select button repo info bloc click. + $(this.CSSSelectors.infoBlocItemButtonSelected).off().on('click', function () { + var intMarkerIndex = $(this).parents(_this.CSSSelectors.infoBlocItemContainerCollection).attr('id').split('_').pop(); + + // Loading. + $(_this.CSSSelectors.loading).show(); + + var objJqXHR = $.ajax({ + "url": window.TNTOfficiel.link.front.module.saveProductInfo, + "method": 'GET', + "data": { + product: _this.arrRepoList[intMarkerIndex] + }, + "dataType": 'html', + "cache": false, + "global": false + }); + + objJqXHR + .done(function (mxdData, strTextStatus, objJqXHR) { + // Delete existing Repository Info. + $('.shipping-method-info').remove(); + // Add Repository Info in Carrier Bloc. + $('.tnt_carrier_radio:checked').parents('tr').find('td.delivery_option_info').append(mxdData); + + $.fancybox.close(); + + $(document).trigger('hook_extra_carrier_shipping_method_popup:close'); + }) + .fail(function (objJqXHR, strTextStatus, strErrorThrown) { + // console.error( objJqXHR.status + ' ' + objJqXHR.statusText ); + }) + .always(function () { + if ($('#opc_payment_methods').length > 0) { + $(_this.CSSSelectors.loading).hide(); + } + }); + }); + + + this.eventGoogleMaps = function () { + // If no Google library. + if (window.google && window.google.maps) { + var objTNTOfficielGMapMarkers = new TNTOfficielGMapMarkersConstrutor( + $(_this.CSSSelectors.mapContainer)[0], + window.TNTOfficiel.config.google.map.default + ); + + // Prepare and returns data marker to add on the map. + for (var intMarkerIndex = 0; intMarkerIndex < _this.arrRepoList.length; intMarkerIndex++) { + + var objRepoItem = _this.arrRepoList[intMarkerIndex]; + + // Set Marker InfoWindow Content. + var strInfoWindowContent = '\ +
    \ + ' + ( this.strRepoType == 'xett' ? '
  • Code: ' + objRepoItem[this.strRepoType] + '
  • ' : '') + '\ +
  • ' + objRepoItem.name + '
  • \ +
  • ' + ( objRepoItem.address ? objRepoItem.address : objRepoItem.address1 + '
    ' + objRepoItem.address2 ) + '
  • \ +
  • ' + objRepoItem.postcode + ' ' + objRepoItem.city + '
  • \ +
'; + + var strCSSSelectorRepoInfoBloc = '#' + _this.method + '_item_' + intMarkerIndex; + + var objGMapMarker = objTNTOfficielGMapMarkers.addMarker( + objRepoItem.latitude, + objRepoItem.longitude, + window.TNTOfficiel.link.front.shop + 'modules/' + window.TNTOfficiel.module.name + '/' + 'views/img/' + 'modal/marker/' + (intMarkerIndex + 1) + '.png', + strInfoWindowContent, + { + // On Marker Click. + "click": $.proxy(function (strCSSSelectorRepoInfoBloc, objGMapEvent) { + var strClassNameInfoBlocSelected = 'is-selected', + $elmtInfoBlocSelect = $(strCSSSelectorRepoInfoBloc); + + // Highlight Selected Marker Info. + $(_this.CSSSelectors.infoBlocItemContainerCollection + '.' + strClassNameInfoBlocSelected) + .removeClass(strClassNameInfoBlocSelected); + $elmtInfoBlocSelect.addClass(strClassNameInfoBlocSelected); + + // The event is the click on marker (not triggered from list). + if (objGMapEvent != null) { + // Scroll to item + _this.scrollY($elmtInfoBlocSelect); + } + }, null, strCSSSelectorRepoInfoBloc) + } + ); + + // On click on info bloc item, trigger click on marker. + $(strCSSSelectorRepoInfoBloc).off().on('click', $.proxy(function (objGMapMarker) { + objTNTOfficielGMapMarkers.trigger('click', objGMapMarker); + }, null, objGMapMarker)); + + } + + objTNTOfficielGMapMarkers.fitBounds(); + } + + }; + + /** + * Prepare scrollbar for list item + * @private + */ + this.prepareScrollbar = function () { + $('#list_scrollbar_container').nanoScroller({ + preventPageScrolling: true + }); + }; + + // Scroll to item. + this.scrollY = function ($elmtInfoBlocSelect) { + var $elmtContainer = $('#list_scrollbar_container'), + $elmtContent = $('#list_scrollbar_content'), + intPositionItem = parseInt($elmtInfoBlocSelect.offset().top + $elmtContent.scrollTop() - $elmtContainer.offset().top); + $elmtContent.scrollTop(intPositionItem); + }; + + this.prepareScrollbar(); + this.eventGoogleMaps(); + + return this; +}; + + +$(document).ready(function () { + + /* + * Global jQuery AJAX event, excepted for request with option "global":false. + */ + + // Triggered if an AJAX request is started and no other AJAX requests are currently running. + $(document).ajaxStart(function () { + $('#loading').show(); + }); + // Triggered if there are no more Ajax requests being processed. + $(document).ajaxStop(function () { + $('#loading').hide(); + }); + + /* + * Payment Choice. + */ + + if (window.TNTOfficiel.order.isOPC) { + // On payment mode choice with OPC. + $(document).on('click', '#opc_payment_methods a', XHRcheckProductCode); + } else { + // On payment mode choice. + $('#form').on('submit', XHRcheckProductCode); + } + +}); + +function XHRcheckProductCode (objEvent) { + + // result from async AJAX request. + var result = null; + + var objJqXHR = $.ajax({ + "url": window.TNTOfficiel.link.front.module.checkProductCode, + "method": 'POST', + "data": { + product: _getCurrentShippingMethod(), + deliveryOptionTnt: deliveryOptionTnt + }, + "async": false + }); + + objJqXHR + .done(function (mxdData, strTextStatus, objJqXHR) { + result = JSON.parse(mxdData); + }) + .fail(function (objJqXHR, strTextStatus, strErrorThrown) { + // console.error( objJqXHR.status + ' ' + objJqXHR.statusText ); + }) + .always(function () { + + }); + + // If no result or has error. + if (!result || result.error == 1) { + alert("Vous ne pouvez pas continuer votre commande car aucun mode de livraison n'est sélectionné."); + objEvent.preventDefault(); + + return false; + } + + if (!(window.TNTOfficiel.order.isOPC && result.error == 0 && result[ window.TNTOfficiel.module.name ] == 1 + || !window.TNTOfficiel.order.isOPC && result.error == 0) + ) { + return false; + } + + var $elmtForm = $(this); + + if (window.TNTOfficiel.order.isOPC) { + window.$elmtPaymentLink = $elmtForm; + } + var $elmtCurrentSpMethod = $('.tnt_carrier_radio:checked'); + var boolCGVDisplayed = $('#cgv').length > 0; + var boolCGVChecked = $('input#cgv:checked').length > 0; + var boolHasRepoAddressSelected = $($elmtCurrentSpMethod).closest('table').find('.shipping-method-info').length > 0; + var boolShowPopup = true; + + if (($elmtCurrentSpMethod.attr('product-type') == 'dropoffpoint'|$elmtCurrentSpMethod.attr('product-type') == 'depot')& !boolHasRepoAddressSelected) { + boolShowPopup = false; + } + + if ((boolCGVDisplayed&boolCGVChecked| !boolCGVDisplayed) && $elmtCurrentSpMethod.length && boolShowPopup) { + if (!$elmtForm.data('valid')) { + // Stop form submit + objEvent.preventDefault(); + + // Shows the modal popup + displayExtraAddressDataPopup($elmtCurrentSpMethod.attr('product-type')); + + // Save which tnt product was chosen + XHRStoreProductPrice($elmtCurrentSpMethod); + } else { + if (window.TNTOfficiel.order.isOPC) { + window.location = $elmtForm.attr('href'); + } else { + $elmtForm.submit(); + } + } + } +} + diff --git a/www/modules/tntofficiel/views/js/displayAdminOrder.js b/www/modules/tntofficiel/views/js/displayAdminOrder.js new file mode 100644 index 00000000..58499a22 --- /dev/null +++ b/www/modules/tntofficiel/views/js/displayAdminOrder.js @@ -0,0 +1,277 @@ +/** + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$(document).ready(function () { + $("#parcelsTbody").on('click', function (objEvent) { + var $elmt = $(objEvent.target); + if ($elmt.hasClass('removeParcel')) { + removeParcel($elmt.val()); + } + if ($elmt.hasClass('updateParcel')) { + updateParcel($elmt.val()); + } + }); + + $("#submitAddParcel").on('click', function () { + addParcel(); + }); + + $("a#fancyBoxAddParcelLink").fancybox({ + "afterClose": function () { + $("#addParcelFancyBox #addParcelError").hide(); + $("#addParcelWeight").val(""); + }, + "transitionIn": 'elastic', + "transitionOut": 'elastic', + "type": 'inline', + "speedIn": 600, + "speedOut": 200, + "overlayShow": false, + "autoDimensions": true, + "autoCenter": false, + "helpers": { + overlay: { + closeClick: false, + locked: false + } + } + }); + + $("input[id*='parcelWeight-']").on('change', function () { + var value = parseFloat($(this).val()); + if (value.toFixed(1) == 0.0) { + value = 0.1; + } + $(this).val(value.toFixed(1)); + }); + + $('#shipping_date').datepicker({ + "minDate": startDate, + "dateFormat": 'dd/mm/yy', + "onSelect": function () { + $('#formAdminShippingDatePanel .alert').hide(); + $('.waitimage').show(); + var data = {}; + data['orderId'] = id_order; + data['shippingDate'] = $('#shipping_date').val(); + $.ajax({ + type: 'POST', + url: checkShippingDateValidUrl, + data: data, + global: false, + success: function (json) { + var data = jQuery.parseJSON(json); + if (data.error) { + if (data.error.length) { + $("#delivery-date-error").html(data.error); + } else { + $("#delivery-date-error").html('La date n\'est pas valide.'); + } + $("#delivery-date-error").show(); + return; + } + + if (data.dueDate) { + $("#due-date").html(data.dueDate); + } + + if (data.mdwMessage) { + $("#delivery-date-success").html(data.mdwMessage); + } else { + $("#delivery-date-success").html('La date est valide.'); + } + $("#delivery-date-success").show(); + + }, + error: function () { + $("#delivery-date-error").html('Une erreur s\'est produite, merci de réessayer dans quelques minutes.'); + $("#delivery-date-error").show(); + }, + complete: function () { + $('.waitimage').hide(); + } + }); + } + }); + + if (typeof shippingDate != 'undefined') { + $("#shipping_date").datepicker("setDate", shippingDate); + } + if (boolIsShipped) { + $("#shipping_date").datepicker("option", "disabled", true); + } + + if (!boolIsAddressEditable) { + $("#addressShipping form :input").attr("disabled", true); + $('#addressShipping a').css("cursor", "not-allowed"); + $('#addressShipping a').on('click', function (objEvent) { + objEvent.preventDefault(); + }); + } + + updateTotalWeight(); + +}); + +/** + * remove a parcel + * @param rowNumber + */ +function removeParcel(parcelId) { + var data = { + "parcelId": parcelId + }; + var parcelCount = getParcelRowCount(); + + if (parcelCount <= 1) { + $("#updateParcelErrorMessage-" + parcelId).html(atLeastOneParcelStr); + $("#parcelWeightError-" + parcelId).show(); + } + else { + $.ajax({ + type: 'POST', + url: removeParcelUrl, + data: data, + success: function (json) { + $("#row-parcel-" + parcelId).remove(); + updateTotalWeight(); + } + }); + } +} + +/** + * Update a parcel + * @param parcelId + */ +function updateParcel(parcelId) { + $("#parcelWeightError-" + parcelId).hide(); + $("#parcelWeightSuccess-" + parcelId).hide(); + var data = {}; + data['parcelId'] = parcelId; + data['weight'] = $("#parcelWeight-" + parcelId).val(); + data['orderId'] = id_order; + if (isNaN($("#parcelWeight-" + parcelId).val()) || $("#parcelWeight-" + parcelId).val() <= 0) { + $("#updateParcelErrorMessage-" + parcelId).html("Le poids n'est pas valide"); + $("#parcelWeightError-" + parcelId).show(); + } else { + $.ajax({ + type: 'POST', + url: updateParcelUrl, + data: data, + success: function (json) { + var response = JSON.parse(json); + if (!response.result) { + $("#updateParcelErrorMessage-" + parcelId).html(response.error); + $("#parcelWeightError-" + parcelId).show(); + } else { + $("#parcelWeight-" + parcelId).val(response.weight); + $("#parcelWeightSuccess-" + parcelId).show(); + updateTotalWeight(); + } + } + }); + } +} + +/** + * Add a parcel + */ +function addParcel() { + $("#addParcelFancyBox #addParcelError").hide(); + //check if the weight value is valid + if (isNaN($("#addParcelWeight").val()) || ($("#addParcelWeight").val() <= 0)) { + $("#addParcelFancyBox #addParcelErrorMessage").html("Le poids n'est pas valide"); + $("#addParcelFancyBox #addParcelError").show(); + } else { + var data = {}; + data['orderId'] = id_order; + data['weight'] = $("#addParcelWeight").val(); + $.ajax({ + type: 'POST', + url: addParcelUrl, + data: data, + success: function (json) { + var response = JSON.parse(json); + if (response.result) { + $.fancybox.close(); + addRowParcel(json); + updateTotalWeight(); + } else { + $("#addParcelFancyBox #addParcelErrorMessage").html(response.error); + $("#addParcelFancyBox #addParcelError").show(); + } + } + }); + } + +}; + +/** + * Get the TNT admin controller token + * @returns {*|jQuery} + */ +function getAdminTNTOfficielToken() { + return $("#AdminTNTOfficielToken").val(); +}; + +/** + * add a row in the parcels table + */ +function addRowParcel(json) { + var nextRowNumber = getNexttParcelNumber(); + var data = JSON.parse(json); + + $("#parcelsTbody").append('\ +\ + \ +
' + nextRowNumber + '
\ + \ + \ +  \ + \ + \ + \ + \ +  \ + \ + \ +'); + +} + +/* + * Add or update total weight + */ +function updateTotalWeight() { + var sum = 0; + $("[id*='parcelWeight-']").each(function () { + var value = $(this).val(); + // add only if the value is number + if (!isNaN(value) && value.length != 0) { + sum += parseFloat(value); + } + }); + $("#total-weight").html(sum); +} + +function getParcelRowCount() { + return $("#parcelsTable > #parcelsTbody tr").length++; +} + +function getNexttParcelNumber() { + return parseInt($("#parcelsTable > #parcelsTbody tr:last-child td:first-child div.input-group").html()) + 1 +} \ No newline at end of file diff --git a/www/modules/tntofficiel/views/js/index.php b/www/modules/tntofficiel/views/js/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/js/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/js/lib/index.php b/www/modules/tntofficiel/views/js/lib/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/js/lib/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/js/lib/kvz/index.php b/www/modules/tntofficiel/views/js/lib/kvz/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/js/lib/kvz/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/js/lib/kvz/phpjs/index.php b/www/modules/tntofficiel/views/js/lib/kvz/phpjs/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/js/lib/kvz/phpjs/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/js/lib/kvz/phpjs/url/base64_decode.js b/www/modules/tntofficiel/views/js/lib/kvz/phpjs/url/base64_decode.js new file mode 100644 index 00000000..c5f91c0c --- /dev/null +++ b/www/modules/tntofficiel/views/js/lib/kvz/phpjs/url/base64_decode.js @@ -0,0 +1,64 @@ +/** + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +function base64_decode(data) { + // discuss at: http://phpjs.org/functions/base64_decode/ + // original by: Tyler Akins (http://rumkin.com) + // improved by: Thunder.m + // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // input by: Aman Gupta + // input by: Brett Zamir (http://brett-zamir.me) + // bugfixed by: Onno Marsman + // bugfixed by: Pellentesque Malesuada + // bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA=='); + // returns 1: 'Kevin van Zonneveld' + // example 2: base64_decode('YQ==='); + // returns 2: 'a' + // example 3: base64_decode('4pyTIMOgIGxhIG1vZGU='); + // returns 3: '✓ à la mode' + + var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, + ac = 0, + dec = '', + tmp_arr = []; + + if (!data) { + return data; + } + + data += ''; + + do { + // unpack four hexets into three octets using index points in b64 + h1 = b64.indexOf(data.charAt(i++)); + h2 = b64.indexOf(data.charAt(i++)); + h3 = b64.indexOf(data.charAt(i++)); + h4 = b64.indexOf(data.charAt(i++)); + + bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; + + o1 = bits >> 16 & 0xff; + o2 = bits >> 8 & 0xff; + o3 = bits & 0xff; + + if (h3 == 64) { + tmp_arr[ac++] = String.fromCharCode(o1); + } else if (h4 == 64) { + tmp_arr[ac++] = String.fromCharCode(o1, o2); + } else { + tmp_arr[ac++] = String.fromCharCode(o1, o2, o3); + } + } while (i < data.length); + + dec = tmp_arr.join(''); + + return decodeURIComponent(escape(dec.replace(/\0+$/, ''))); +} \ No newline at end of file diff --git a/www/modules/tntofficiel/views/js/lib/kvz/phpjs/url/base64_encode.js b/www/modules/tntofficiel/views/js/lib/kvz/phpjs/url/base64_encode.js new file mode 100644 index 00000000..81cb9871 --- /dev/null +++ b/www/modules/tntofficiel/views/js/lib/kvz/phpjs/url/base64_encode.js @@ -0,0 +1,59 @@ +/** + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +function base64_encode(data) { + // discuss at: http://phpjs.org/functions/base64_encode/ + // original by: Tyler Akins (http://rumkin.com) + // improved by: Bayron Guevara + // improved by: Thunder.m + // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // improved by: Rafał Kukawski (http://kukawski.pl) + // bugfixed by: Pellentesque Malesuada + // example 1: base64_encode('Kevin van Zonneveld'); + // returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA==' + // example 2: base64_encode('a'); + // returns 2: 'YQ==' + // example 3: base64_encode('✓ à la mode'); + // returns 3: '4pyTIMOgIGxhIG1vZGU=' + + var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, + ac = 0, + enc = '', + tmp_arr = []; + + if (!data) { + return data; + } + + data = unescape(encodeURIComponent(data)); + + do { + // pack three octets into four hexets + o1 = data.charCodeAt(i++); + o2 = data.charCodeAt(i++); + o3 = data.charCodeAt(i++); + + bits = o1 << 16 | o2 << 8 | o3; + + h1 = bits >> 18 & 0x3f; + h2 = bits >> 12 & 0x3f; + h3 = bits >> 6 & 0x3f; + h4 = bits & 0x3f; + + // use hexets to index into b64, and append result to encoded string + tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4); + } while (i < data.length); + + enc = tmp_arr.join(''); + + var r = data.length % 3; + + return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3); +} \ No newline at end of file diff --git a/www/modules/tntofficiel/views/js/lib/kvz/phpjs/url/index.php b/www/modules/tntofficiel/views/js/lib/kvz/phpjs/url/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/js/lib/kvz/phpjs/url/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/js/lib/nanoscroller/index.php b/www/modules/tntofficiel/views/js/lib/nanoscroller/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/js/lib/nanoscroller/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/js/lib/nanoscroller/jquery.nanoscroller.min.js b/www/modules/tntofficiel/views/js/lib/nanoscroller/jquery.nanoscroller.min.js new file mode 100644 index 00000000..6658830d --- /dev/null +++ b/www/modules/tntofficiel/views/js/lib/nanoscroller/jquery.nanoscroller.min.js @@ -0,0 +1,3 @@ +/*! nanoScrollerJS - v0.8.7 - (c) 2015 James Florentino; Licensed MIT */ + +!function(a){return"function"==typeof define&&define.amd?define(["jquery"],function(b){return a(b,window,document)}):"object"==typeof exports?module.exports=a(require("jquery"),window,document):a(jQuery,window,document)}(function(a,b,c){"use strict";var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H;z={paneClass:"nano-pane",sliderClass:"nano-slider",contentClass:"nano-content",enabledClass:"has-scrollbar",flashedClass:"flashed",activeClass:"active",iOSNativeScrolling:!1,preventPageScrolling:!1,disableResize:!1,alwaysVisible:!1,flashDelay:1500,sliderMinHeight:20,sliderMaxHeight:null,documentContext:null,windowContext:null},u="scrollbar",t="scroll",l="mousedown",m="mouseenter",n="mousemove",p="mousewheel",o="mouseup",s="resize",h="drag",i="enter",w="up",r="panedown",f="DOMMouseScroll",g="down",x="wheel",j="keydown",k="keyup",v="touchmove",d="Microsoft Internet Explorer"===b.navigator.appName&&/msie 7./i.test(b.navigator.appVersion)&&b.ActiveXObject,e=null,D=b.requestAnimationFrame,y=b.cancelAnimationFrame,F=c.createElement("div").style,H=function(){var a,b,c,d,e,f;for(d=["t","webkitT","MozT","msT","OT"],a=e=0,f=d.length;f>e;a=++e)if(c=d[a],b=d[a]+"ransform",b in F)return d[a].substr(0,d[a].length-1);return!1}(),G=function(a){return H===!1?!1:""===H?a:H+a.charAt(0).toUpperCase()+a.substr(1)},E=G("transform"),B=E!==!1,A=function(){var a,b,d;return a=c.createElement("div"),b=a.style,b.position="absolute",b.width="100px",b.height="100px",b.overflow=t,b.top="-9999px",c.body.appendChild(a),d=a.offsetWidth-a.clientWidth,c.body.removeChild(a),d},C=function(){var a,c,d;return c=b.navigator.userAgent,(a=/(?=.+Mac OS X)(?=.+Firefox)/.test(c))?(d=/Firefox\/\d{2}\./.exec(c),d&&(d=d[0].replace(/\D+/g,"")),a&&+d>23):!1},q=function(){function j(d,f){this.el=d,this.options=f,e||(e=A()),this.$el=a(this.el),this.doc=a(this.options.documentContext||c),this.win=a(this.options.windowContext||b),this.body=this.doc.find("body"),this.$content=this.$el.children("."+this.options.contentClass),this.$content.attr("tabindex",this.options.tabIndex||0),this.content=this.$content[0],this.previousPosition=0,this.options.iOSNativeScrolling&&null!=this.el.style.WebkitOverflowScrolling?this.nativeScrolling():this.generate(),this.createEvents(),this.addEvents(),this.reset()}return j.prototype.preventScrolling=function(a,b){if(this.isActive)if(a.type===f)(b===g&&a.originalEvent.detail>0||b===w&&a.originalEvent.detail<0)&&a.preventDefault();else if(a.type===p){if(!a.originalEvent||!a.originalEvent.wheelDelta)return;(b===g&&a.originalEvent.wheelDelta<0||b===w&&a.originalEvent.wheelDelta>0)&&a.preventDefault()}},j.prototype.nativeScrolling=function(){this.$content.css({WebkitOverflowScrolling:"touch"}),this.iOSNativeScrolling=!0,this.isActive=!0},j.prototype.updateScrollValues=function(){var a,b;a=this.content,this.maxScrollTop=a.scrollHeight-a.clientHeight,this.prevScrollTop=this.contentScrollTop||0,this.contentScrollTop=a.scrollTop,b=this.contentScrollTop>this.previousPosition?"down":this.contentScrollTop=a.maxScrollTop&&a.prevScrollTop!==a.maxScrollTop?a.$el.trigger("scrollend"):0===a.contentScrollTop&&0!==a.prevScrollTop&&a.$el.trigger("scrolltop"),!1}}(this),up:function(a){return function(b){return a.isBeingDragged=!1,a.pane.removeClass(a.options.activeClass),a.doc.unbind(n,a.events[h]).unbind(o,a.events[w]),a.body.unbind(m,a.events[i]),!1}}(this),resize:function(a){return function(b){a.reset()}}(this),panedown:function(a){return function(b){return a.sliderY=(b.offsetY||b.originalEvent.layerY)-.5*a.sliderHeight,a.scroll(),a.events.down(b),!1}}(this),scroll:function(a){return function(b){a.updateScrollValues(),a.isBeingDragged||(a.iOSNativeScrolling||(a.sliderY=a.sliderTop,a.setOnScrollStyles()),null!=b&&(a.contentScrollTop>=a.maxScrollTop?(a.options.preventPageScrolling&&a.preventScrolling(b,g),a.prevScrollTop!==a.maxScrollTop&&a.$el.trigger("scrollend")):0===a.contentScrollTop&&(a.options.preventPageScrolling&&a.preventScrolling(b,w),0!==a.prevScrollTop&&a.$el.trigger("scrolltop"))))}}(this),wheel:function(a){return function(b){var c;if(null!=b)return c=b.delta||b.wheelDelta||b.originalEvent&&b.originalEvent.wheelDelta||-b.detail||b.originalEvent&&-b.originalEvent.detail,c&&(a.sliderY+=-c/3),a.scroll(),!1}}(this),enter:function(a){return function(b){var c;if(a.isBeingDragged)return 1!==(b.buttons||b.which)?(c=a.events)[w].apply(c,arguments):void 0}}(this)}},j.prototype.addEvents=function(){var a;this.removeEvents(),a=this.events,this.options.disableResize||this.win.bind(s,a[s]),this.iOSNativeScrolling||(this.slider.bind(l,a[g]),this.pane.bind(l,a[r]).bind(""+p+" "+f,a[x])),this.$content.bind(""+t+" "+p+" "+f+" "+v,a[t])},j.prototype.removeEvents=function(){var a;a=this.events,this.win.unbind(s,a[s]),this.iOSNativeScrolling||(this.slider.unbind(),this.pane.unbind()),this.$content.unbind(""+t+" "+p+" "+f+" "+v,a[t])},j.prototype.generate=function(){var a,c,d,f,g,h,i;return f=this.options,h=f.paneClass,i=f.sliderClass,a=f.contentClass,(g=this.$el.children("."+h)).length||g.children("."+i).length||this.$el.append('
'),this.pane=this.$el.children("."+h),this.slider=this.pane.find("."+i),0===e&&C()?(d=b.getComputedStyle(this.content,null).getPropertyValue("padding-right").replace(/[^0-9.]+/g,""),c={right:-14,paddingRight:+d+14}):e&&(c={right:-e},this.$el.addClass(f.enabledClass)),null!=c&&this.$content.css(c),this},j.prototype.restore=function(){this.stopped=!1,this.iOSNativeScrolling||this.pane.show(),this.addEvents()},j.prototype.reset=function(){var a,b,c,f,g,h,i,j,k,l,m,n;return this.iOSNativeScrolling?void(this.contentHeight=this.content.scrollHeight):(this.$el.find("."+this.options.paneClass).length||this.generate().stop(),this.stopped&&this.restore(),a=this.content,f=a.style,g=f.overflowY,d&&this.$content.css({height:this.$content.height()}),b=a.scrollHeight+e,l=parseInt(this.$el.css("max-height"),10),l>0&&(this.$el.height(""),this.$el.height(a.scrollHeight>l?l:a.scrollHeight)),i=this.pane.outerHeight(!1),k=parseInt(this.pane.css("top"),10),h=parseInt(this.pane.css("bottom"),10),j=i+k+h,n=Math.round(j/b*i),nthis.options.sliderMaxHeight&&(n=this.options.sliderMaxHeight),g===t&&f.overflowX!==t&&(n+=e),this.maxSliderTop=j-n,this.contentHeight=b,this.paneHeight=i,this.paneOuterHeight=j,this.sliderHeight=n,this.paneTop=k,this.slider.height(n),this.events.scroll(),this.pane.show(),this.isActive=!0,a.scrollHeight===a.clientHeight||this.pane.outerHeight(!0)>=a.scrollHeight&&g!==t?(this.pane.hide(),this.isActive=!1):this.el.clientHeight===a.scrollHeight&&g===t?this.slider.hide():this.slider.show(),this.pane.css({opacity:this.options.alwaysVisible?1:"",visibility:this.options.alwaysVisible?"visible":""}),c=this.$content.css("position"),("static"===c||"relative"===c)&&(m=parseInt(this.$content.css("right"),10),m&&this.$content.css({right:"",marginRight:m})),this)},j.prototype.scroll=function(){return this.isActive?(this.sliderY=Math.max(0,this.sliderY),this.sliderY=Math.min(this.maxSliderTop,this.sliderY),this.$content.scrollTop(this.maxScrollTop*this.sliderY/this.maxSliderTop),this.iOSNativeScrolling||(this.updateScrollValues(),this.setOnScrollStyles()),this):void 0},j.prototype.scrollBottom=function(a){return this.isActive?(this.$content.scrollTop(this.contentHeight-this.$content.height()-a).trigger(p),this.stop().restore(),this):void 0},j.prototype.scrollTop=function(a){return this.isActive?(this.$content.scrollTop(+a).trigger(p),this.stop().restore(),this):void 0},j.prototype.scrollTo=function(a){return this.isActive?(this.scrollTop(this.$el.find(a).get(0).offsetTop),this):void 0},j.prototype.stop=function(){return y&&this.scrollRAF&&(y(this.scrollRAF),this.scrollRAF=null),this.stopped=!0,this.removeEvents(),this.iOSNativeScrolling||this.pane.hide(),this},j.prototype.destroy=function(){return this.stopped||this.stop(),!this.iOSNativeScrolling&&this.pane.length&&this.pane.remove(),d&&this.$content.height(""),this.$content.removeAttr("tabindex"),this.$el.hasClass(this.options.enabledClass)&&(this.$el.removeClass(this.options.enabledClass),this.$content.css({right:""})),this},j.prototype.flash=function(){return!this.iOSNativeScrolling&&this.isActive?(this.reset(),this.pane.addClass(this.options.flashedClass),setTimeout(function(a){return function(){a.pane.removeClass(a.options.flashedClass)}}(this),this.options.flashDelay),this):void 0},j}(),a.fn.nanoScroller=function(b){return this.each(function(){var c,d;if((d=this.nanoscroller)||(c=a.extend({},z,b),this.nanoscroller=d=new q(this,c)),b&&"object"==typeof b){if(a.extend(d.options,b),null!=b.scrollBottom)return d.scrollBottom(b.scrollBottom);if(null!=b.scrollTop)return d.scrollTop(b.scrollTop);if(b.scrollTo)return d.scrollTo(b.scrollTo);if("bottom"===b.scroll)return d.scrollBottom(0);if("top"===b.scroll)return d.scrollTop(0);if(b.scroll&&b.scroll instanceof a)return d.scrollTo(b.scroll);if(b.stop)return d.stop();if(b.destroy)return d.destroy();if(b.flash)return d.flash()}return d.reset()})},a.fn.nanoScroller.Constructor=q}); \ No newline at end of file diff --git a/www/modules/tntofficiel/views/js/lib/nanoscroller/nanoscroller.css b/www/modules/tntofficiel/views/js/lib/nanoscroller/nanoscroller.css new file mode 100644 index 00000000..252fdda6 --- /dev/null +++ b/www/modules/tntofficiel/views/js/lib/nanoscroller/nanoscroller.css @@ -0,0 +1,48 @@ +/** initial setup **/ +.nano { + position : relative; + width : 100%; + height : 100%; + overflow : hidden; +} +.nano > .nano-content { + position : absolute; + overflow : scroll; + overflow-x : hidden; + top : 0; + right : 0; + bottom : 0; + left : 0; + padding-right : 27px; +} +.nano > .nano-content:focus { + outline: thin dotted; +} +.nano > .nano-content::-webkit-scrollbar { + display: none; +} +.has-scrollbar > .nano-content::-webkit-scrollbar { + display: block; +} +.nano > .nano-pane { + background : #E5E5E5; + position : absolute; + width : 20px; + right : 1px; + top : 0; + bottom : 0; + margin : 0 0 0 5px; + -moz-border-radius : 5px; + -webkit-border-radius : 5px; + border-radius : 5px; +} +.nano > .nano-pane > .nano-slider { + background: #CACACA; + position : relative; + margin : 0 0px; + -moz-border-radius : 5px; + -webkit-border-radius : 5px; + border-radius : 5px; +} +.nano:hover > .nano-pane, .nano-pane.active, .nano-pane.flashed { +} diff --git a/www/modules/tntofficiel/views/js/order-city-check.js b/www/modules/tntofficiel/views/js/order-city-check.js new file mode 100644 index 00000000..d856d23f --- /dev/null +++ b/www/modules/tntofficiel/views/js/order-city-check.js @@ -0,0 +1,119 @@ +/** + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +$(document).ready(function () { + + // Create the FancyBox. + createFancyBox(); + + var boolIsCityValid = false; + + // When a city is selected. + $("#validateCity").on('click', function () { + + var objJqXHR = $.ajax({ + "url": window.TNTOfficiel.link.front.module.updateAddressDelivery, + "method": 'POST', + "data": { + "city": $("#helper_city").val() + }, + "async": false + }); + + objJqXHR + .done(function (mxdData, strTextStatus, objJqXHR) { + }) + .fail(function (objJqXHR, strTextStatus, strErrorThrown) { + // console.error( objJqXHR.status + ' ' + objJqXHR.statusText ); + }) + .always(function () { + // Close the FancyBox. + $.fancybox.close(); + boolIsCityValid = true; + }); + }); + + $("[name='processAddress']").on('click', function (objEvent) { + if (!boolIsCityValid) { + objEvent.preventDefault(); + + var objJqXHR = $.ajax({ + "url": window.TNTOfficiel.link.front.module.getAddressCities, + "method": 'POST', + "async": false + }); + + objJqXHR + .done(function (mxdData, strTextStatus, objJqXHR) { + var response = JSON.parse(mxdData); + displayFancyBox(response.cities, response.postcode) + }) + .fail(function (objJqXHR, strTextStatus, strErrorThrown) { + // console.error( objJqXHR.status + ' ' + objJqXHR.statusText ); + }) + .always(function () {}); + } + }); +}); + +/** + * insert the fancy box html into the page + */ +function createFancyBox() { + $("#page").append('\ +\ +
\ +
\ +

Sélectionnez votre ville

\ +
\ + \ + \ +
\ +
\ + \ + \ +
\ +

\ + \ +

\ +
\ +
' + ); +} + +/** + * Display the fancybox + */ +function displayFancyBox(arrArgCities, strArgPostCode) { + // fancybox configuration + $("a#fancybox_city_helper").fancybox({ + "transitionIn": 'elastic', + "transitionOut": 'elastic', + "type": 'inline', + "speedIn": 600, + "speedOut": 200, + "overlayShow": false, + "autoDimensions": true, + "helpers": { + overlay: {closeClick: false} + } + }); + + // Generate the options to be put in the city select field. + var strHTMLOptions = ""; + $.each(arrArgCities, function (index, city) { + strHTMLOptions += ""; + }); + + $("#helper_city").html(strHTMLOptions); + $("#helper_city").addClass("form-control"); + $("#helper_postcode").val(strArgPostCode); + $("a#fancybox_city_helper").trigger("click"); +} \ No newline at end of file diff --git a/www/modules/tntofficiel/views/templates/hook/displayAdminOrder.tpl b/www/modules/tntofficiel/views/templates/hook/displayAdminOrder.tpl new file mode 100644 index 00000000..5aaf9e8d --- /dev/null +++ b/www/modules/tntofficiel/views/templates/hook/displayAdminOrder.tpl @@ -0,0 +1,169 @@ +{* + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + *} +
+
+ + {l s='Shipping date' mod='tntofficiel'} +
+
+ + + + + + + + + + + + + +
{l s='Shipping date' mod='tntofficiel'}{l s='Due date' mod='tntofficiel'}
+
+ +
+ +
+
+ + +
+ {$dueDate|escape:'htmlall':'UTF-8'} +
+
+ + + + +
+ +
+
+ + {l s='parcels' mod='tntofficiel'} {$parcels|@count} {if !empty($pickupNumber)}{l s='Pickup number: ' mod='tntofficiel'} {$pickupNumber|escape:'htmlall':'UTF-8'}{/if} + {l s='Total weight: ' mod='tntofficiel'} 0 {l s='Kg' mod='tntofficiel'} +
+
+ + + + + + + + + + + {foreach from=$parcels item=parcel key=parcelIndex} + + + + + + + {/foreach} + +
{l s='parcel number' mod='tntofficiel'}{l s='weight' mod='tntofficiel'}{l s='action' mod='tntofficiel'}{l s='PDL' mod='tntofficiel'}
+
+ {$parcelIndex + 1|intval} +
+
+ + + + + {if empty($isShipped)} + + + {/if} + + {if $parcel['pdl'] != ''} + + + + {/if} +
+
+ {if empty($isShipped)} + + {/if} +
+ +
+
+

{l s='add parcel' mod='tntofficiel'}

+ +
+ + +
+ +

+ +

+
+
+ +
+ +
+
+ +
+ + \ No newline at end of file diff --git a/www/modules/tntofficiel/views/templates/hook/displayBeforeCarrier.tpl b/www/modules/tntofficiel/views/templates/hook/displayBeforeCarrier.tpl new file mode 100644 index 00000000..3d5e82a6 --- /dev/null +++ b/www/modules/tntofficiel/views/templates/hook/displayBeforeCarrier.tpl @@ -0,0 +1,19 @@ +{* + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + *} + \ No newline at end of file diff --git a/www/modules/tntofficiel/views/templates/hook/displayCarrierList.tpl b/www/modules/tntofficiel/views/templates/hook/displayCarrierList.tpl index 8d5cd1de..a58dea12 100644 --- a/www/modules/tntofficiel/views/templates/hook/displayCarrierList.tpl +++ b/www/modules/tntofficiel/views/templates/hook/displayCarrierList.tpl @@ -91,7 +91,7 @@ + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + *} +{if isset($item)} + {if $method_name == 'relay-point'} + {assign var='method_code' value='xett'} + {assign var='method_name_item' value='relay-point'} + {else} + {assign var='method_code' value='pex'} + {assign var='method_name_item' value='repository'} + {/if} + + {assign var='id' value=$item.$method_code|lower} + {*{tnt_shipping_method_get_schedules_schedules hours=$item.hours assign='schedules'}*} + {assign var='schedules' value=$item.schedule} +
+
+ {if $method_code == 'xett'} +
Code: {$item.xett|escape:'htmlall':'UTF-8'}
+ {/if} +
{$item.name|escape:'htmlall':'UTF-8'}
+ {* For relay points *} + {if $method_code == 'xett'} +
{$item.address|escape:'htmlall':'UTF-8'}
+ {else} + {* For repositories *} +
{$item.address1|escape:'htmlall':'UTF-8'}
+
{$item.address2|escape:'htmlall':'UTF-8'}
+ {/if} +
{$item.postcode|escape:'htmlall':'UTF-8'} {$item.city|escape:'htmlall':'UTF-8'}
+
+
+

{l s='Schedules' mod='tntofficiel'} :

+ {foreach from=$schedules key=day item=schedule} +
+

{l s=$day mod='tntofficiel'}:

+ {*{l s='Monday' mod='tntofficiel'} + {l s='Tuesday' mod='tntofficiel'} + {l s='Wednesday' mod='tntofficiel'} + {l s='Thursday' mod='tntofficiel'} + {l s='Friday' mod='tntofficiel'} + {l s='Saturday' mod='tntofficiel'} + {l s='Sunday' mod='tntofficiel'}*} + +

+ {if !empty($schedule)} + {assign var='i' value=0} + {foreach from=$schedule item=part} + {' - '|implode:$part|escape:'htmlall':'UTF-8'} + {if ($schedule|@count) > 1 and $i < (($schedule|@count) -1)} + {l s='and' mod='tntofficiel'} + {/if} + {assign var='i' value=$i+1} + {/foreach} + {else} + {l s='Closed' mod='tntofficiel'} + {/if} +

+
+ {/foreach} +
+ +
+ +{/if} \ No newline at end of file diff --git a/www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox.tpl b/www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox.tpl new file mode 100644 index 00000000..7188b5c1 --- /dev/null +++ b/www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox.tpl @@ -0,0 +1,33 @@ +{* + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + *} +
+
+

+ {if $method_id == 'relay_points'} + {l s='Choose your package relay point' mod='tntofficiel'} + {else} + {l s='Choose your depot' mod='tntofficiel'} + {/if} +

+
+ +
+ {include file='./deliveryPointsBox/form.tpl'} +
+
+ {include file='./deliveryPointsBox/list.tpl'} +
+
+
+ + \ No newline at end of file diff --git a/www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox/form.tpl b/www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox/form.tpl new file mode 100644 index 00000000..f00003d9 --- /dev/null +++ b/www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox/form.tpl @@ -0,0 +1,58 @@ +{* + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + *} +
+ {l s='Shipping Address' mod='tntofficiel'} +
    + {* Postcode *} +
  • +
    + + +
    + +
    +
    + + {* Cities list *} +
    + {* If cities *} + {if !empty($cities)} + +
    + +
    + {else} + {* if no results *} + +
    + +
    + {/if} +
    + + {* Cities list *} +
    + +
    +
  • +
+
\ No newline at end of file diff --git a/www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox/index.php b/www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox/list.tpl b/www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox/list.tpl new file mode 100644 index 00000000..9f92eed4 --- /dev/null +++ b/www/modules/tntofficiel/views/templates/hook/displayCarrierList/deliveryPointsBox/list.tpl @@ -0,0 +1,100 @@ +{* + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + *} + +
+
+
    + {if !empty($results)} + {if $method_name == 'relay-points'} + {assign var='method_code' value='xett'} + {assign var='method_name_item' value='relay-point'} + {else} + {assign var='method_code' value='pex'} + {assign var='method_name_item' value='repository'} + {/if} + + {foreach from=$results key=index item=item} + {assign var='id' value=$item.$method_code|lower} + + {*{tnt_shipping_method_get_schedules hours=$item.hours assign='schedules'}*} + {assign var='schedules' value=$item.schedule} + {*$item.schedule*} +
  • +
    + {if $method_code == 'xett'} +

    Code: {$item.xett|escape:'htmlall':'UTF-8'}

    + {/if} +

    {$item.name|escape:'htmlall':'UTF-8'}

    + {* For relay points *} + {if $method_code == 'xett'} +

    {$item.address|escape:'htmlall':'UTF-8'}

    + {else} + {* For repositories *} +

    {$item.address1|escape:'htmlall':'UTF-8'}

    +

    {$item.address2|escape:'htmlall':'UTF-8'}

    + {/if} +

    {$item.postcode|escape:'htmlall':'UTF-8'} {$item.city|escape:'htmlall':'UTF-8'}

    +
    +
    +

    {l s='Schedules' mod='tntofficiel'} : +

    + {foreach from=$schedules key=day item=schedule} +
    +

    {l s=$day mod='tntofficiel'}:

    + {*{l s='Monday' mod='tntofficiel'} + {l s='Tuesday' mod='tntofficiel'} + {l s='Wednesday' mod='tntofficiel'} + {l s='Thursday' mod='tntofficiel'} + {l s='Friday' mod='tntofficiel'} + {l s='Saturday' mod='tntofficiel'} + {l s='Sunday' mod='tntofficiel'}*} + +

    + {if !empty($schedule)} + {assign var='i' value=0} + {foreach from=$schedule item=part} + {' - '|implode:$part|escape:'htmlall':'UTF-8'} + {if ($schedule|@count) > 1 and $i < (($schedule|@count) -1)} + {l s='and' mod='tntofficiel'} + {/if} + {assign var='i' value=$i+1} + {/foreach} + {else} + {l s='Closed' mod='tntofficiel'} + {/if} +

    +
    + {/foreach} +
    +
    +
    {$id|escape:'htmlall':'UTF-8'}
    +
    +
    {$index|intval + 1}
    + {if isset($item.distance)} +
    {'%s Km'|sprintf:$item.distance|escape:'htmlall':'UTF-8'|ltrim:0}
    + {/if} +
    + +
    +
  • + {/foreach} + {elseif empty($cities)} +
  • + {l s='No matching cities for the requested postal code.' mod='tntofficiel'} +
    {l s='Check the postal code and click' mod='tntofficiel'} {l s='Change' mod='tntofficiel'}. +
  • + {elseif empty($current_city)} +
  • {l s='Select a city from the list and click' mod='tntofficiel'} {l s='Change' mod='tntofficiel'}.
  • + {else} +
  • {l s='No delivery point for this city.' mod='tntofficiel'}
  • + {/if} +
+
+
diff --git a/www/modules/tntofficiel/views/templates/hook/displayCarrierList/index.php b/www/modules/tntofficiel/views/templates/hook/displayCarrierList/index.php new file mode 100644 index 00000000..b3e6797b --- /dev/null +++ b/www/modules/tntofficiel/views/templates/hook/displayCarrierList/index.php @@ -0,0 +1,18 @@ + + * @copyright 2016-2017 GFI Informatique, 2016-2017 TNT + * @license https://opensource.org/licenses/MIT MIT License + */ + +header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); +header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + +header('Cache-Control: no-store, no-cache, must-revalidate'); +header('Cache-Control: post-check=0, pre-check=0', false); +header('Pragma: no-cache'); + +header('Location: ../'); +exit; diff --git a/www/modules/tntofficiel/views/templates/hook/displayCarrierList2.tpl b/www/modules/tntofficiel/views/templates/hook/displayCarrierList2.tpl new file mode 100644 index 00000000..d23b25f6 --- /dev/null +++ b/www/modules/tntofficiel/views/templates/hook/displayCarrierList2.tpl @@ -0,0 +1,637 @@ +{* + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + *} + +{foreach $carriers.products as $tnt_index => $product} + {foreach $current_delivery_option as $idAddressSelected => $idCarrierOptionSelected} + + {assign var='img_path' value='tntofficiel/views/img/carrier.jpg'} + {assign var='descript' value=""} + {assign var='label' value=$product.label} + + {if $product.id|strstr:"ENTERPRISE" } + {assign var='img_path' value='tntofficiel/views/img/carrier/delivery/option-Entreprise.png'} + + {* 9:00 Express (ENTERPRISE) *} + {if $product.id == "A_ENTERPRISE"} + {assign var='label' value="09:00 Express en Entreprise"} + {assign var='descript' value="Pour une livraison aux entreprises en France métropolitaine.
+ Livraison en mains propres et contre signature dès le lendemain de l'expédition de votre commande, avant 9 heures."} + + {* Express (ENTERPRISE) *} + {elseif $product.id == "J_ENTERPRISE"} + {assign var='label' value="En entreprise"} + {assign var='descript' value="Pour une livraison aux entreprises ou sur votre lieu de travail en France métropolitaine.
+ Livraison en mains propres et contre signature dès le lendemain de l'expédition de votre commande (1).
+ (1) avant 13 heures ou en début d'après-midi en zone rurale."} + {* 12:00 Express (ENTERPRISE) *} + {elseif $product.id == "M_ENTERPRISE"} + {assign var='label' value="12:00 Express en Entreprise"} + {assign var='descript' value="Pour une livraison aux entreprises en France métropolitaine.
+ Livraison en mains propres et contre signature dès le lendemain de l'expédition de votre commande, avant midi."} + + {* 10:00 Express (ENTERPRISE) *} + {elseif $product.id == "T_ENTERPRISE"} + {assign var='label' value="10:00 Express en Entreprise"} + {assign var='descript' value="Pour une livraison aux entreprises en France métropolitaine.
+ Livraison en mains propres et contre signature dès le lendemain de l'expédition de votre commande, avant 10 heures."} + {/if} + + {elseif $product.id|strstr:"INDIVIDUAL" } + {assign var='img_path' value='tntofficiel/views/img/carrier/delivery/option-ChezVous.png'} + + {* 9:00 Express (INDIVIDUAL) *} + {if $product.id == "AZ_INDIVIDUAL"} + {assign var='label' value="09:00 Express à domicile"} + {assign var='descript' value="Pour une livraison à domicile en France métropolitaine.
+ Livraison en mains propres et contre signature dès le lendemain de l'expédition de votre commande, avant 9 heures."} + + {* Express à domicile (INDIVIDUAL) *} + {elseif $product.id == "JZ_INDIVIDUAL"} + {assign var='label' value="À domicile"} + {assign var='descript' value="Pour une livraison à domicile en France métropolitaine.
+ Livraison en mains propres et contre signature dès le lendemain de l'expédition de votre commande (1).
+ (1) avant 13 heures ou en début d'après-midi en zone rurale."} + {* 12:00 Express à domicile (INDIVIDUAL) *} + {elseif $product.id == "MZ_INDIVIDUAL"} + {assign var='label' value="12:00 Express à domicile"} + {assign var='descript' value="Pour une livraison aux entreprises en France métropolitaine.
+ Livraison en mains propres et contre signature dès le lendemain de l'expédition de votre commande, avant midi."} + + {* 10:00 Express à domicile (INDIVIDUAL) *} + {elseif $product.id == "TZ_INDIVIDUAL"} + {assign var='label' value="10:00 Express à domicile"} + {assign var='descript' value="Pour une livraison aux entreprises en France métropolitaine.
+ Livraison en mains propres et contre signature dès le lendemain de l'expédition de votre commande, avant 10 heures."} + {/if} + + {elseif $product.id|strstr:"DROPOFFPOINT" } + {assign var='img_path' value='tntofficiel/views/img/carrier/delivery/option-RelaisColis.png'} + {assign var='label' value="En Relais Colis®"} + {assign var='descript' value="Mise à disposition dans l’un des 4200 Relais Colis® de France métropolitaine.
+ Remise contre signature et présentation d’une pièce d’identité dès le lendemain de l'expédition de votre commande (1).
+ (1) avant 13 heures ou en début d'après-midi en zone rurale."} + {elseif $product.id|strstr:"DEPOT" } + {assign var='img_path' value='tntofficiel/views/img/carrier/delivery/option-Entreprise.png'} + {assign var='label' value="Dépôt restant"} + {assign var='descript' value="Pour une livraisons dans une de nos agences TNT en France métropolitaine.
+ Mise à votre disposition sur présentation d'une pièce d'identité et contre signature dès 8 heures le lendemain de l'expédition de votre commande et ce pendant 10 Jours."} + {/if} +
+
+ + + + + + + +
+ + + {$label|escape:'htmlall':'UTF-8'} +
{$descript|escape:'htmlall':'UTF-8'|replace:'<':'<'|replace:">":">"} + {if !empty($product.due_date)} +
+ Date prévisionnelle de livraison : {$product.due_date|escape:'htmlall':'UTF-8'} + {/if} + {if $deliveryOption === $product.id and $idCarrierOptionSelected === "{$idTntCarrier},"} + {assign var='item_info' value=''} + {if {$product.type|lower} == 'dropoffpoint' and isset($deliveryPoint.xett)} + {assign var='current_method_id' value='relay_point'} + {assign var='current_method_name' value='relay-point'} + {assign var='item_info' value=$deliveryPoint} + {elseif {$product.type|lower} == 'depot' and isset($deliveryPoint.pex)} + {assign var='current_method_id' value='repository'} + {assign var='current_method_name' value='repository'} + {assign var='item_info' value=$deliveryPoint} + {/if} + + {if isset($item_info) and $item_info != ''} + {include './displayCarrierList/deliveryPointSet.tpl' item=$item_info method_id=$current_method_id method_name=$current_method_name} + {/if} + {/if} +
+
+ {if $product.total_price_with_tax && !$product.is_free && (!isset($free_shipping) || (isset($free_shipping) && !$free_shipping))} + {if $use_taxes == 1} + {if $priceDisplay == 1} + {convertPrice price=$product.total_price_without_tax}{if $display_tax_label} HT{/if} + {else} + {convertPrice price=$product.total_price_with_tax}{if $display_tax_label} TTC{/if} + {/if} + {else} + {convertPrice price=$product.total_price_without_tax} + {/if} + {else} + gratuit + {/if} +
+
+
+
+ {/foreach} +{/foreach} + +{if $cityPostcodeIsValid == false} + +
+
+

{l s='Can not purchase the order' mod='tntofficiel'}

+ {*COMMANDE IMPOSSIBLE*} + +
+

{l s='Entering city in the address is unknown for the postal code %s' sprintf=$postcode mod='tntofficiel'}

+
+
+
+{/if} + + + + + +
+ +
+

{l s='TNT Additional Address' mod='tntofficiel'}

+ +
+

+
+ +
+ + +
+
+ + {*Téléphone portable*} + +
+
+ + {*Numéro du bâtiment*} + +
+
+ + {*Code interphone*} + +
+
+ + {*Etage*} + +
+

+ +

+

{l s='Required fields' mod='tntofficiel'}

+
+
+ + diff --git a/www/modules/tntofficiel/views/templates/hook/displayOrderDetail.tpl b/www/modules/tntofficiel/views/templates/hook/displayOrderDetail.tpl new file mode 100644 index 00000000..40582b59 --- /dev/null +++ b/www/modules/tntofficiel/views/templates/hook/displayOrderDetail.tpl @@ -0,0 +1,18 @@ +{* + * TNT OFFICIAL MODULE FOR PRESTASHOP + * + * @author GFI Informatique + * @copyright 2016 GFI Informatique, 2016 TNT + * @license https://opensource.org/licenses/MIT MIT License + *} +
+ + + {l s='show' mod='tntofficiel'} + + + +

+ {l s='Follow my parcels' mod='tntofficiel'} +

+
\ No newline at end of file