From 1ce73c7a0cd74f156d8fb180cc5d588bdfb5a1be Mon Sep 17 00:00:00 2001 From: Rohit Date: Wed, 24 May 2017 12:17:56 +0530 Subject: [PATCH] V1.1.0 released: Feature Pricing, Room Disable on specific dates --- CHANGELOG.txt | 65 +- README.md | 43 +- admin/backups/1493622063-32c255f.sql.bz2 | Bin 0 -> 80228 bytes admin/backups/1493622136-16fa28fc.sql.bz2 | Bin 0 -> 80292 bytes admin/themes/default/css/admin-theme.css | 2 +- .../dashboard/helpers/view/view.tpl | 1 + .../template/controllers/login/content.tpl | 12 +- .../controllers/orders/_new_product.tpl | 4 +- .../controllers/orders/_product_line.tpl | 21 +- .../orders/current_cart_details_data.tpl | 19 +- .../controllers/orders/helpers/view/view.tpl | 325 +- .../controllers/products/configuration.tpl | 504 +- .../template/controllers/products/prices.tpl | 75 + cache/class_index.php | 4286 ----------------- cache/sandbox/16in.xml | 72 - ...de0bbef8162c93ab31c912.blocksocial.tpl.php | 51 - cache/smarty/cache/last_template_flush | 0 ...4d826b8b86ffa76ae9e5578.file.modal.tpl.php | 75 - ...f4594b287.file.page_header_toolbar.tpl.php | 174 - ...7dfc7419c2797527.file.login_addons.tpl.php | 114 - ...d47c16dab79bb45ea59aa5.file.footer.tpl.php | 136 - ...5ac798c29f69ed100035a11b.file.form.tpl.php | 1802 ------- ...d9a0120c455d51523c71c65c3.file.nav.tpl.php | 90 - ...f5fa3112e3afe0d5cf1cff.file.layout.tpl.php | 131 - ...b987dda7792666a73.file.search_form.tpl.php | 124 - ...9e291374fcc42bd00f6692.file.header.tpl.php | 550 --- ...3a4a13ffaee94ec9a2fa942.file.modal.tpl.php | 37 - ...9abe22a6858624e2a1014.file.content.tpl.php | 39 - ...e56a78e2fa316.file.notification_bt.tpl.php | 175 - ...3f5b052bbe404c2a7f.file.javascript.tpl.php | 101 - cache/smarty/compile/last_flush | 0 classes/Cart.php | 110 +- classes/PaymentModule.php | 2107 ++++---- classes/Product.php | 1 + classes/order/Order.php | 4 + classes/pdf/HTMLTemplateInvoice.php | 978 ++-- classes/webservice/WebserviceRequest.php | 13 +- .../admin/AdminDashboardController.php | 1 + controllers/admin/AdminOrdersController.php | 129 +- controllers/admin/AdminProductsController.php | 462 +- controllers/front/CategoryController.php | 8 + controllers/front/HistoryController.php | 47 +- .../front/HotelRoomTypeFeaturePricing.php | 487 ++ .../front/OrderConfirmationController.php | 42 +- controllers/front/OrderDetailController.php | 124 +- controllers/front/OrderOpcController.php | 1740 ++++--- controllers/front/ProductController.php | 69 +- img/favicon.ico | Bin 34494 -> 32038 bytes img/logo.jpg | Bin 11566 -> 3098 bytes img/logo.png | Bin 2005 -> 0 bytes img/logo_invoice.jpg | Bin 11566 -> 2979 bytes img/logo_mail.jpg | Bin 0 -> 2979 bytes img/logo_stores.gif | Bin 0 -> 613 bytes img/logo_stores.png | Bin 2962 -> 0 bytes img/prestashop@2x.png | Bin 6315 -> 1150 bytes img/preston-login-wink@2x.png | Bin 12041 -> 1939 bytes img/preston-login@2x.png | Bin 12316 -> 1939 bytes install/data/db_structure.sql | 1 + install/error_log | 1081 ----- install/models/install.php | 41 + install/theme/img/logo.png | Bin 5512 -> 2373 bytes install/theme/view.css | 2 +- install/theme/views/welcome.phtml | 8 +- js/admin/dashboard.js | 527 +- js/admin/orders.js | 24 +- mails/en/advanced-book-data.tpl | 59 + mails/en/advanced-book-data.txt | 11 + mails/fr/advanced-book-data.tpl | 59 + mails/fr/advanced-book-data.txt | 11 + modules/bankwire/bankwire.php | 523 +- modules/bankwire/config.xml | 13 + modules/blockadvertising/config.xml | 12 + modules/blockbanner/config.xml | 12 + modules/blockbestsellers/config.xml | 12 + modules/blockcart/blockcart.php | 52 +- modules/blockcart/config.xml | 12 + modules/blockcart/error_log | 284 -- modules/blockcategories/config.xml | 12 + modules/blockcms/config.xml | 12 + modules/blockcmsinfo/config.xml | 12 + modules/blockcontact/config.xml | 12 + modules/blockcontactinfos/config.xml | 12 + modules/blockcurrencies/config.xml | 12 + modules/blockcustomerprivacy/config.xml | 12 + modules/blockfacebook/config.xml | 12 + modules/blocklanguages/config.xml | 12 + modules/blocklayered/config.xml | 12 + modules/blocklink/config.xml | 13 + modules/blockmanufacturer/config.xml | 12 + modules/blockmyaccount/config.xml | 12 + modules/blockmyaccountfooter/config.xml | 12 + modules/blocknavigationmenu/config.xml | 12 + modules/blocknewproducts/config.xml | 12 + modules/blocknewsletter/config.xml | 13 + modules/blockpaymentlogo/config.xml | 12 + modules/blockpermanentlinks/config.xml | 12 + modules/blockreinsurance/config.xml | 12 + modules/blockrss/config.xml | 12 + modules/blocksearch/config.xml | 12 + modules/blocksharefb/config.xml | 12 + modules/blocksocial/config.xml | 12 + modules/blockspecials/config.xml | 12 + modules/blockstore/config.xml | 12 + modules/blocksupplier/config.xml | 12 + modules/blocktags/config.xml | 12 + modules/blocktopmenu/config.xml | 12 + modules/blockuserinfo/config.xml | 12 + modules/blockviewed/config.xml | 12 + modules/blockwishlist/config.xml | 12 + modules/cashondelivery/CHANGELOG.txt | 7 + modules/cashondelivery/Readme.md | 37 + modules/cashondelivery/cashondelivery.gif | Bin 0 -> 2391 bytes modules/cashondelivery/cashondelivery.jpg | Bin 0 -> 3009 bytes modules/cashondelivery/cashondelivery.php | 118 + modules/cashondelivery/composer.json | 19 + modules/cashondelivery/config.xml | 12 + .../controllers/front/index.php | 35 + .../controllers/front/validation.php | 80 + modules/cashondelivery/controllers/index.php | 35 + modules/cashondelivery/index.php | 35 + modules/cashondelivery/logo.gif | Bin 0 -> 425 bytes modules/cashondelivery/logo.png | Bin 0 -> 1365 bytes modules/cashondelivery/translations/en.php | 25 + modules/cashondelivery/translations/fr.php | 8 + modules/cashondelivery/translations/index.php | 35 + modules/cashondelivery/views/index.php | 35 + .../views/templates/front/index.php | 35 + .../views/templates/front/validation.tpl | 60 + .../views/templates/hook/confirmation.tpl | 31 + .../views/templates/hook/index.php | 35 + .../views/templates/hook/payment.tpl | 33 + .../cashondelivery/views/templates/index.php | 35 + modules/cheque/config.xml | 13 + modules/cronjobs/classes/CronJobsForms.php | 574 +-- modules/cronjobs/config.xml | 12 + .../admin/AdminCronJobsController.php | 128 +- .../cronjobs/controllers/front/callback.php | 12 +- modules/cronjobs/cronjobs.php | 1299 ++--- modules/cronjobs/translations/fr.php | 44 +- modules/cronjobs/upgrade/upgrade-1.0.6.php | 12 +- modules/cronjobs/views/css/bootstrap.min.css | 5 + .../cronjobs/views/css/configure-ps-15.css | 65 + .../cronjobs/views/css/configure-ps-16.css | 6 + modules/cronjobs/views/css/index.php | 35 + .../admin/_configure/helpers/form/form.tpl | 66 +- .../views/templates/admin/configure.tpl | 18 +- .../cronjobs/views/templates/admin/task.tpl | 12 +- modules/crossselling/config.xml | 12 + modules/dashactivity/config.xml | 12 + modules/dashactivity/dashactivity.php | 4 +- modules/dashactivity/views/js/dashactivity.js | 199 +- modules/dashgoals/config.xml | 12 + modules/dashproducts/config.xml | 12 + modules/dashtrends/config.xml | 12 + modules/dashtrends/views/js/dashtrends.js | 127 +- modules/gamification/config.xml | 12 + .../admin/AdminGamificationController.php | 2 +- modules/gamification/data/data_EN_INR_IN.json | 1 - modules/gamification/data/data_EN_USD_IN.json | 1 + modules/gamification/data/data_EN_USD_US.json | 1 + modules/gamification/gamification.php | 16 +- modules/gamification/translations/es.php | 72 +- modules/gamification/translations/fr.php | 52 +- .../views/css/advice-1.6.1.1_27.css | 8 + .../views/css/advice-1.6.1.1_590.css | 27 + .../views/css/advice-1.6.1.1_782.css | 9 + .../views/css/advice-1.6.1.1_785.css | 9 + .../views/css/advice-1.6.1.1_797.css | 9 + .../views/css/advice-1.6.1.1_806.css | 9 + .../views/css/advice-1.6.1.1_808.css | 9 + .../gamification/views/css/gamification.css | 30 + .../gamification/views/js/gamification_bt.js | 27 +- .../views/templates/hook/notification_bt.tpl | 3 + modules/graphnvd3/config.xml | 12 + modules/gridhtml/config.xml | 12 + modules/homefeatured/config.xml | 12 + modules/homeslider/config.xml | 12 + .../classes/ChannelManagerServices.php | 60 + .../classes/ChannelOrderPayment.php | 37 + .../classes/HotelAdvancedPayment.php | 419 +- .../classes/HotelBookingDetail.php | 574 ++- .../classes/HotelBranchFeatures.php | 93 +- .../classes/HotelBranchInformation.php | 33 +- .../classes/HotelCartBookingData.php | 1165 +++-- .../classes/HotelCustomerAdvancedPayment.php | 16 +- .../HotelCustomerAdvancedProductPayment.php | 8 +- .../classes/HotelFeatures.php | 244 +- .../classes/HotelHelper.php | 63 +- .../classes/HotelOrderRefundInfo.php | 87 +- .../classes/HotelOrderRefundRules.php | 92 +- .../classes/HotelRoomDisableDates.php | 59 + .../classes/HotelRoomInformation.php | 388 +- .../classes/HotelRoomType.php | 10 +- .../classes/HotelRoomTypeFeaturePricing.php | 507 ++ .../classes/QloRoomType.php | 304 ++ .../classes/QloWebservice.php | 145 + .../WebserviceSpecificManagementQlo.php | 179 + modules/hotelreservationsystem/config.xml | 13 + .../admin/AdminAddHotelController.php | 127 +- ...minHotelConfigurationSettingController.php | 2 + .../admin/AdminHotelFeaturePricesSettings.php | 356 ++ .../AdminHotelGeneralSettingsController.php | 16 +- .../AdminHotelRoomsBookingController.php | 1024 ++-- .../admin/AdminHotelfeaturesController.php | 319 +- .../AdminOrderRefundRequestsController.php | 161 +- .../admin/AdminOrderRefundRulesController.php | 365 +- .../AdminOrderRestrictSettingsController.php | 5 +- modules/hotelreservationsystem/define.php | 9 + .../hotelreservationsystem.php | 66 +- modules/hotelreservationsystem/install.sql | 34 +- .../views/css/HotelReservationAdmin.css | 35 +- .../views/js/HotelReservationAdmin.js | 180 +- .../views/js/bookingProduct.js | 317 ++ .../views/js/roomSearchBlock.js | 19 +- .../admin/add_hotel/helpers/form/form.tpl | 8 +- .../helpers/view/view.tpl | 10 + .../helpers/form/form.tpl | 204 + .../helpers/form/index.php | 10 + .../helpers/index.php | 10 + .../helpers/options/index.php | 10 + .../helpers/options/options.tpl | 35 + .../hotel_feature_prices_settings/index.php | 10 + .../helpers/form/form.tpl | 6 +- modules/onboarding/config.xml | 12 + modules/pagesnotfound/config.xml | 12 + modules/paypalusa/config.xml | 13 + modules/productcomments/config.xml | 12 + modules/productpaymentlogos/config.xml | 12 + modules/productscategory/config.xml | 12 + modules/producttooltip/config.xml | 12 + modules/sekeywords/config.xml | 12 + modules/sendtoafriend/config.xml | 12 + modules/socialsharing/config.xml | 12 + modules/statsbestcategories/config.xml | 12 + modules/statsbestcustomers/config.xml | 12 + modules/statsbestmanufacturers/config.xml | 12 + modules/statsbestproducts/config.xml | 12 + modules/statsbestsuppliers/config.xml | 12 + modules/statsbestvouchers/config.xml | 12 + modules/statscarrier/config.xml | 12 + modules/statscatalog/config.xml | 12 + modules/statscheckup/config.xml | 12 + modules/statsdata/config.xml | 12 + modules/statsequipment/config.xml | 12 + modules/statsforecast/config.xml | 12 + modules/statslive/config.xml | 12 + modules/statsnewsletter/config.xml | 12 + modules/statsorigin/config.xml | 12 + modules/statspersonalinfos/config.xml | 12 + modules/statsproduct/config.xml | 12 + modules/statsregistrations/config.xml | 12 + modules/statssearch/config.xml | 12 + modules/statsstock/config.xml | 12 + modules/statsvisits/config.xml | 12 + modules/themeconfigurator/translations/ag.php | 77 - modules/themeconfigurator/translations/ar.php | 31 - modules/themeconfigurator/translations/br.php | 77 - modules/themeconfigurator/translations/ca.php | 75 - modules/themeconfigurator/translations/en.php | 77 - modules/themeconfigurator/translations/es.php | 77 - modules/themeconfigurator/translations/fr.php | 77 - modules/themeconfigurator/translations/gl.php | 25 - modules/themeconfigurator/translations/id.php | 77 - modules/themeconfigurator/translations/nl.php | 77 - modules/trackingfront/config.xml | 12 + modules/vatnumber/config.xml | 12 + modules/wkabouthotelblock/config.xml | 12 + modules/wkfooteraboutblock/config.xml | 12 + modules/wkfooterexploreblock/config.xml | 12 + modules/wkfooterlangcurrencyblock/config.xml | 12 + modules/wkfooternotificationblock/config.xml | 12 + modules/wkfooterpaymentblock/config.xml | 12 + .../config.xml | 12 + modules/wkhotelfeaturesblock/config.xml | 12 + modules/wkhotelfilterblock/config.xml | 12 + .../views/js/wkhotelfilterblock.js | 24 +- .../views/templates/hook/htlfilterblock.tpl | 3 + modules/wkhotelfiltersearchblock/config.xml | 12 + modules/wkhotelroom/config.xml | 12 + .../views/css/WkHotelRoomBlockFront.css | 6 + .../templates/hook/hotelRoomDisplayBlock.tpl | 11 +- modules/wkhotelroom/wkhotelroom.php | 125 +- modules/wkpaypaladaptive/config.xml | 12 + .../controllers/front/payment.php | 2 +- modules/wkpaypaladaptive/wkpaypaladaptive.php | 16 +- modules/wkroomsearchblock/config.xml | 12 + .../controllers/front/autocompletesearch.php | 1 - modules/wktestimonialblock/config.xml | 12 + pdf/invoice.product-tab.tpl | 2 +- pdf/invoice.total-tab.tpl | 2 +- themes/hotel-reservation-theme/category.tpl | 12 +- .../hotel-reservation-theme/css/category.css | 6 + .../hotel-reservation-theme/css/history.css | 8 +- .../hotel-reservation-theme/css/order-opc.css | 8 +- .../hotel-reservation-theme/css/product.css | 6 + .../js/modules/blockcart/ajax-cart.js | 9 +- themes/hotel-reservation-theme/js/product.js | 63 +- .../views/templates/hook/payment_return.tpl | 3 + .../order-confirmation.tpl | 23 +- .../hotel-reservation-theme/order-detail.tpl | 42 +- themes/hotel-reservation-theme/product.tpl | 37 +- .../hotel-reservation-theme/shopping-cart.tpl | 35 +- translations/ag/admin.php | 0 translations/ag/errors.php | 0 translations/ag/fields.php | 0 translations/ag/pdf.php | 0 translations/ag/tabs.php | 0 .../custom_mails/advanced-book-data.tpl | 59 + .../custom_mails/advanced-book-data.txt | 11 + translations/en/admin.php | 0 translations/en/errors.php | 0 translations/en/fields.php | 0 translations/en/pdf.php | 0 translations/en/tabs.php | 0 translations/es/admin.php | 0 translations/es/errors.php | 0 translations/es/fields.php | 0 translations/es/pdf.php | 0 translations/es/tabs.php | 0 translations/fr/admin.php | 0 translations/fr/errors.php | 0 translations/fr/fields.php | 0 translations/fr/pdf.php | 0 translations/fr/tabs.php | 0 324 files changed, 14485 insertions(+), 17324 deletions(-) create mode 100644 admin/backups/1493622063-32c255f.sql.bz2 create mode 100644 admin/backups/1493622136-16fa28fc.sql.bz2 delete mode 100644 cache/class_index.php delete mode 100644 cache/sandbox/16in.xml delete mode 100644 cache/smarty/cache/blocksocial/1/1/110/c4/c7/ba/c4c7ba9c6d76b84ba3de0bbef8162c93ab31c912.blocksocial.tpl.php delete mode 100644 cache/smarty/cache/last_template_flush delete mode 100644 cache/smarty/compile/07/b4/ad/07b4ad4448c7f940a4d826b8b86ffa76ae9e5578.file.modal.tpl.php delete mode 100644 cache/smarty/compile/18/d1/05/18d105cd2a76b49b1074002ad97be1af4594b287.file.page_header_toolbar.tpl.php delete mode 100644 cache/smarty/compile/67/94/29/679429e4ca3f277aac8c7e697dfc7419c2797527.file.login_addons.tpl.php delete mode 100644 cache/smarty/compile/69/a1/a1/69a1a12fe4be76abbbd47c16dab79bb45ea59aa5.file.footer.tpl.php delete mode 100644 cache/smarty/compile/6e/ca/e4/6ecae477f7199e035ac798c29f69ed100035a11b.file.form.tpl.php delete mode 100644 cache/smarty/compile/6f/80/e1/6f80e12d1b121d4d9a0120c455d51523c71c65c3.file.nav.tpl.php delete mode 100644 cache/smarty/compile/86/4d/08/864d08e140a923f33ef5fa3112e3afe0d5cf1cff.file.layout.tpl.php delete mode 100644 cache/smarty/compile/9a/6d/13/9a6d13eabb69df1ee1d8359b987dda7792666a73.file.search_form.tpl.php delete mode 100644 cache/smarty/compile/c0/df/ca/c0dfca9f8787d0fe2b9e291374fcc42bd00f6692.file.header.tpl.php delete mode 100644 cache/smarty/compile/c9/b0/f6/c9b0f6e10e5edd2753a4a13ffaee94ec9a2fa942.file.modal.tpl.php delete mode 100644 cache/smarty/compile/dc/78/41/dc7841eebd388b702ed9abe22a6858624e2a1014.file.content.tpl.php delete mode 100644 cache/smarty/compile/eb/36/62/eb366249782b69e5c9ea107af76e56a78e2fa316.file.notification_bt.tpl.php delete mode 100644 cache/smarty/compile/ed/04/3d/ed043dadf49537335bd9273f5b052bbe404c2a7f.file.javascript.tpl.php delete mode 100644 cache/smarty/compile/last_flush create mode 100644 controllers/front/HotelRoomTypeFeaturePricing.php delete mode 100644 img/logo.png create mode 100644 img/logo_mail.jpg create mode 100644 img/logo_stores.gif delete mode 100644 img/logo_stores.png delete mode 100644 install/error_log create mode 100644 mails/en/advanced-book-data.tpl create mode 100644 mails/en/advanced-book-data.txt create mode 100644 mails/fr/advanced-book-data.tpl create mode 100644 mails/fr/advanced-book-data.txt create mode 100644 modules/bankwire/config.xml create mode 100644 modules/blockadvertising/config.xml create mode 100644 modules/blockbanner/config.xml create mode 100644 modules/blockbestsellers/config.xml create mode 100644 modules/blockcart/config.xml create mode 100644 modules/blockcategories/config.xml create mode 100644 modules/blockcms/config.xml create mode 100644 modules/blockcmsinfo/config.xml create mode 100644 modules/blockcontact/config.xml create mode 100644 modules/blockcontactinfos/config.xml create mode 100644 modules/blockcurrencies/config.xml create mode 100644 modules/blockcustomerprivacy/config.xml create mode 100644 modules/blockfacebook/config.xml create mode 100644 modules/blocklanguages/config.xml create mode 100644 modules/blocklayered/config.xml create mode 100644 modules/blocklink/config.xml create mode 100644 modules/blockmanufacturer/config.xml create mode 100644 modules/blockmyaccount/config.xml create mode 100644 modules/blockmyaccountfooter/config.xml create mode 100644 modules/blocknavigationmenu/config.xml create mode 100644 modules/blocknewproducts/config.xml create mode 100644 modules/blocknewsletter/config.xml create mode 100644 modules/blockpaymentlogo/config.xml create mode 100644 modules/blockpermanentlinks/config.xml create mode 100644 modules/blockreinsurance/config.xml create mode 100644 modules/blockrss/config.xml create mode 100644 modules/blocksearch/config.xml create mode 100644 modules/blocksharefb/config.xml create mode 100644 modules/blocksocial/config.xml create mode 100644 modules/blockspecials/config.xml create mode 100644 modules/blockstore/config.xml create mode 100644 modules/blocksupplier/config.xml create mode 100644 modules/blocktags/config.xml create mode 100644 modules/blocktopmenu/config.xml create mode 100644 modules/blockuserinfo/config.xml create mode 100644 modules/blockviewed/config.xml create mode 100644 modules/blockwishlist/config.xml create mode 100644 modules/cashondelivery/CHANGELOG.txt create mode 100644 modules/cashondelivery/Readme.md create mode 100644 modules/cashondelivery/cashondelivery.gif create mode 100644 modules/cashondelivery/cashondelivery.jpg create mode 100644 modules/cashondelivery/cashondelivery.php create mode 100644 modules/cashondelivery/composer.json create mode 100644 modules/cashondelivery/config.xml create mode 100644 modules/cashondelivery/controllers/front/index.php create mode 100644 modules/cashondelivery/controllers/front/validation.php create mode 100644 modules/cashondelivery/controllers/index.php create mode 100644 modules/cashondelivery/index.php create mode 100644 modules/cashondelivery/logo.gif create mode 100644 modules/cashondelivery/logo.png create mode 100644 modules/cashondelivery/translations/en.php create mode 100644 modules/cashondelivery/translations/fr.php create mode 100644 modules/cashondelivery/translations/index.php create mode 100644 modules/cashondelivery/views/index.php create mode 100644 modules/cashondelivery/views/templates/front/index.php create mode 100644 modules/cashondelivery/views/templates/front/validation.tpl create mode 100644 modules/cashondelivery/views/templates/hook/confirmation.tpl create mode 100644 modules/cashondelivery/views/templates/hook/index.php create mode 100644 modules/cashondelivery/views/templates/hook/payment.tpl create mode 100644 modules/cashondelivery/views/templates/index.php create mode 100644 modules/cheque/config.xml create mode 100644 modules/cronjobs/config.xml create mode 100644 modules/cronjobs/views/css/bootstrap.min.css create mode 100644 modules/cronjobs/views/css/configure-ps-15.css create mode 100644 modules/cronjobs/views/css/configure-ps-16.css create mode 100644 modules/cronjobs/views/css/index.php create mode 100644 modules/crossselling/config.xml create mode 100644 modules/dashactivity/config.xml create mode 100644 modules/dashgoals/config.xml create mode 100644 modules/dashproducts/config.xml create mode 100644 modules/dashtrends/config.xml create mode 100644 modules/gamification/config.xml delete mode 100644 modules/gamification/data/data_EN_INR_IN.json create mode 100644 modules/gamification/data/data_EN_USD_IN.json create mode 100644 modules/gamification/data/data_EN_USD_US.json create mode 100644 modules/gamification/views/css/advice-1.6.1.1_27.css create mode 100644 modules/gamification/views/css/advice-1.6.1.1_590.css create mode 100644 modules/gamification/views/css/advice-1.6.1.1_782.css create mode 100644 modules/gamification/views/css/advice-1.6.1.1_785.css create mode 100644 modules/gamification/views/css/advice-1.6.1.1_797.css create mode 100644 modules/gamification/views/css/advice-1.6.1.1_806.css create mode 100644 modules/gamification/views/css/advice-1.6.1.1_808.css create mode 100644 modules/graphnvd3/config.xml create mode 100644 modules/gridhtml/config.xml create mode 100644 modules/homefeatured/config.xml create mode 100644 modules/homeslider/config.xml create mode 100644 modules/hotelreservationsystem/classes/ChannelManagerServices.php create mode 100644 modules/hotelreservationsystem/classes/ChannelOrderPayment.php create mode 100644 modules/hotelreservationsystem/classes/HotelRoomDisableDates.php create mode 100644 modules/hotelreservationsystem/classes/HotelRoomTypeFeaturePricing.php create mode 100644 modules/hotelreservationsystem/classes/QloRoomType.php create mode 100644 modules/hotelreservationsystem/classes/QloWebservice.php create mode 100644 modules/hotelreservationsystem/classes/WebserviceSpecificManagementQlo.php create mode 100644 modules/hotelreservationsystem/config.xml create mode 100644 modules/hotelreservationsystem/controllers/admin/AdminHotelFeaturePricesSettings.php create mode 100644 modules/hotelreservationsystem/views/js/bookingProduct.js create mode 100644 modules/hotelreservationsystem/views/templates/admin/hotel_feature_prices_settings/helpers/form/form.tpl create mode 100644 modules/hotelreservationsystem/views/templates/admin/hotel_feature_prices_settings/helpers/form/index.php create mode 100644 modules/hotelreservationsystem/views/templates/admin/hotel_feature_prices_settings/helpers/index.php create mode 100644 modules/hotelreservationsystem/views/templates/admin/hotel_feature_prices_settings/helpers/options/index.php create mode 100644 modules/hotelreservationsystem/views/templates/admin/hotel_feature_prices_settings/helpers/options/options.tpl create mode 100644 modules/hotelreservationsystem/views/templates/admin/hotel_feature_prices_settings/index.php create mode 100644 modules/onboarding/config.xml create mode 100644 modules/pagesnotfound/config.xml create mode 100644 modules/paypalusa/config.xml create mode 100644 modules/productcomments/config.xml create mode 100644 modules/productpaymentlogos/config.xml create mode 100644 modules/productscategory/config.xml create mode 100644 modules/producttooltip/config.xml create mode 100644 modules/sekeywords/config.xml create mode 100644 modules/sendtoafriend/config.xml create mode 100644 modules/socialsharing/config.xml create mode 100644 modules/statsbestcategories/config.xml create mode 100644 modules/statsbestcustomers/config.xml create mode 100644 modules/statsbestmanufacturers/config.xml create mode 100644 modules/statsbestproducts/config.xml create mode 100644 modules/statsbestsuppliers/config.xml create mode 100644 modules/statsbestvouchers/config.xml create mode 100644 modules/statscarrier/config.xml create mode 100644 modules/statscatalog/config.xml create mode 100644 modules/statscheckup/config.xml create mode 100644 modules/statsdata/config.xml create mode 100644 modules/statsequipment/config.xml create mode 100644 modules/statsforecast/config.xml create mode 100644 modules/statslive/config.xml create mode 100644 modules/statsnewsletter/config.xml create mode 100644 modules/statsorigin/config.xml create mode 100644 modules/statspersonalinfos/config.xml create mode 100644 modules/statsproduct/config.xml create mode 100644 modules/statsregistrations/config.xml create mode 100644 modules/statssearch/config.xml create mode 100644 modules/statsstock/config.xml create mode 100644 modules/statsvisits/config.xml delete mode 100644 modules/themeconfigurator/translations/ag.php delete mode 100644 modules/themeconfigurator/translations/ar.php delete mode 100644 modules/themeconfigurator/translations/br.php delete mode 100644 modules/themeconfigurator/translations/ca.php delete mode 100644 modules/themeconfigurator/translations/en.php delete mode 100644 modules/themeconfigurator/translations/es.php delete mode 100644 modules/themeconfigurator/translations/fr.php delete mode 100644 modules/themeconfigurator/translations/gl.php delete mode 100644 modules/themeconfigurator/translations/id.php delete mode 100644 modules/themeconfigurator/translations/nl.php create mode 100644 modules/trackingfront/config.xml create mode 100644 modules/vatnumber/config.xml create mode 100644 modules/wkabouthotelblock/config.xml create mode 100644 modules/wkfooteraboutblock/config.xml create mode 100644 modules/wkfooterexploreblock/config.xml create mode 100644 modules/wkfooterlangcurrencyblock/config.xml create mode 100644 modules/wkfooternotificationblock/config.xml create mode 100644 modules/wkfooterpaymentblock/config.xml create mode 100644 modules/wkfooterpaymentinfoblockcontainer/config.xml create mode 100644 modules/wkhotelfeaturesblock/config.xml create mode 100644 modules/wkhotelfilterblock/config.xml create mode 100644 modules/wkhotelfiltersearchblock/config.xml create mode 100644 modules/wkhotelroom/config.xml create mode 100644 modules/wkpaypaladaptive/config.xml create mode 100644 modules/wkroomsearchblock/config.xml create mode 100644 modules/wktestimonialblock/config.xml mode change 100755 => 100644 translations/ag/admin.php mode change 100755 => 100644 translations/ag/errors.php mode change 100755 => 100644 translations/ag/fields.php mode change 100755 => 100644 translations/ag/pdf.php mode change 100755 => 100644 translations/ag/tabs.php create mode 100644 translations/custom_mails/advanced-book-data.tpl create mode 100644 translations/custom_mails/advanced-book-data.txt mode change 100755 => 100644 translations/en/admin.php mode change 100755 => 100644 translations/en/errors.php mode change 100755 => 100644 translations/en/fields.php mode change 100755 => 100644 translations/en/pdf.php mode change 100755 => 100644 translations/en/tabs.php mode change 100755 => 100644 translations/es/admin.php mode change 100755 => 100644 translations/es/errors.php mode change 100755 => 100644 translations/es/fields.php mode change 100755 => 100644 translations/es/pdf.php mode change 100755 => 100644 translations/es/tabs.php mode change 100755 => 100644 translations/fr/admin.php mode change 100755 => 100644 translations/fr/errors.php mode change 100755 => 100644 translations/fr/fields.php mode change 100755 => 100644 translations/fr/pdf.php mode change 100755 => 100644 translations/fr/tabs.php diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 8d9759128..7d01d793f 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,66 @@ +#################################### +# V1.1.0 +#################################### + +## Added Features: + +[+] Project : `source` column is added in the `order` table to show the source of the booking. + +[+] Project : Everywhere now prices are shown according to the feature prices. + +[+] Project : Everywhere prestashop logo is replaced with Qloapps logo + +[+] BO : Feature price plans functionality has been added. +[+] BO : Funnctionality to disable rooms for many dates is added. +[+] BO : processConfiguration(), initFormConfiguration() are modified and validateDisableDateRanges() is added for disabled dated functionality in AdminProductsController. +[+] BO : AdminOrdersController is modified for feature price funtionality. renderview and renderform functions also modified to display according to feature prices. + +[+] FO : OrderConfirmationController, OrderOpcController, OrderDetailsController and ProductControler are modified for feature price functionality. display files of the controllers also modified. + +[+] MO : hotelreservationsystem : ChannelManagerServices.php is added. +[+] MO : hotelreservationsystem : ChannelOrderPayment.php is added. +[+] MO : hotelreservationsystem : HotelCustomerAdvancedProductPayment.php is added. +[+] MO : hotelreservationsystem : HotelRoomDisableDates.php is added. +[+] MO : hotelreservationsystem : QloWebservice.php is added. +[+] MO : hotelreservationsystem : WebserviceSpecificManagementQlo.php is added. + +[+] MO : hotelreservationsystem : ChannelManagerServices.php is added. +[+] MO : hotelreservationsystem : HotelRoomTypeFeaturePricing.php is added. +[+] MO : hotelreservationsystem : ChannelOrderPayment.php is added. +[+] MO : hotelreservationsystem : getRoomMinAdvPaymentAmount() is added in HotelAdvancedPayment.php. +[+] MO : hotelreservationsystem : createQloAppsBookingByChannels(), createQloCustomerChannelCustomerInfo(), createQloCustomerAddressByChannelCustomerInfo(), createQloCartForBookingFromChannel(), ProcessCreateQloOrderForChannelBooking() are added for Qloapps Api need in HotelBookingDetails.php. +[+] MO : hotelreservationsystem : 'total_price_tax_excl' and 'total_price_tax_incl' columns are added in `htl_booking_detail` table to store the booking time price. +[+] MO : hotelreservationsystem : getProductFeaturePricePlanByDateByPriority(), getHotelCartBookingData() are added in HotelCartBookingData.php. +[+] MO : hotelreservationsystem : 'disabled_dates' column is added in the table `htl_room_information`. +[+] MO : hotelreservationsystem : getRoomTypeAvailableRoomsForDateRange(), getRoomTypeDisabledRoomsForDateRange(), getRoomTypeBookedRoomsForDateRange() are added in HotelRoomInformation.php. +[+] MO : hotelreservationsystem : room status 'Hold For Maintenance is replace with 'Temporary incative'; +[+] MO : hotelreservationsystem : AdminHotelRoomsBookingController.php and AdminOrderRefundRequestsController.php are changed to make compatible with feature price functionality. + +## Improved/changed features: + +[*] MO : wkhotelroom : price of the room types are shown at home page according to feature price plans. +[*] FO : price of the room types are shown at home page according to feature price plans. + + +## Bug/Issues Resolved: + +[-] FO : Resolved :: issue on saving Room type information at admin product information. On saving product sometimes redirecting to renderlist. +[-] FO : Resolved :: If admin left the 'max global date field' to be blank,then invalid dates are shown in check in-checkout fields at frontend. +[-] FO : Resolved :: On submitting the total order cancellation request,Popup with "Parser error text" is shown. (If submit request for single room first and then for all the rooms in the order). +[-] BO : Resolved :: Some validation issues on manage order refund rules page. +[-] BO : Resolved :: Room type column added on manage order refund request -> view page. (#158) +[-] BO : Resolved :: Advance paid amount on "manage order refund request view page" is shown for the single room.(#150) +[-] BO : Resolved :: If admin deleted the room from "order detail page",then errors are shown on the "customer order detail page".(#137) +[-] BO : Resolved :: While reallocating the rooms,sometimes the JSON is getting breakable,due to which no room is shown for swapping & reallocation.(#133) +[-] FO : Resolved :: While placing an order,if customer signed out on "order summary page",then error is shown. (#119) +[-] FO : Resolved :: If filtered with any parameter on category page,then on clicking the 'Book now button',page is redirecting to the category page itself.(#118) +[-] FO : Resolved :: On clicking to the 'add new icon',the page is redirecting to the 'assign features page' rather than 'add new features page'.(#106) +[-] BO : Resolved :: While adding the hotel features,no success message is shown on add new features-> manage hotel features page. (#105) +[-] BO : Resolved :: hotel interior heading and description are not changing on saving new ones.(#87) +[-] BO : Resolved :: PlayPal..Php curl issue on installation. needs curl to be installed on server for istallation (#89) +[-] BO : Resolved :: Many Order Edit issues resolved. + + #################################### # V1.0.1 #################################### @@ -11,7 +74,6 @@ [*] FO : Font-family in order summary page in synced with the theme fonts now. [*] BO : Bacorder setting option is removed from Settings->General Settings. -[*] MO : wkpaypaladaptive : Remove PHP CURL check from installation and display warning in "AdminPaymentsSetting" controller ## Fixed bugs: @@ -19,7 +81,6 @@ [-] BO : Fixed showing wrong way of payment on refund request page. [-] BO : Fixed showing wrong cancellation charges on refund request page. [-] MO : wkabouthotel : Fixed interior heading and description does not change on changing from Setting->Hotel interior Block Setting. -[-] MO : hotelreservationsystem : refund rule bug for type percentage is resolved. # Change Log previous version to V1.0.0: diff --git a/README.md b/README.md index 466582a4a..3d9dd6ba7 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,38 @@ -QloApps +Hotel Commerce -------- -Hotel Commerce plays a vital role in hotel industry as it has changed the online presence of the hotels.QloApps also known as Qlo is a Hotel Commerce Software or you can say a Hotel Booking & Reservation System. Qlo is an open source and free platform which help you to launch your own hotel booking website and manage your online & On-Desk booking easily +Hotel Commerce is Hotel Booking & Reservarion system . Using this you can easily launch your hotel booking website and even manage your offline booking too . This package is developed on top of Prestashop 1.6. Demo -------- -FrontEnd : http://demo.qloapps.com
-Backend : http://demo.qloapps.com/adminhtl/index.php
+FrontEnd : http://prestashop.webkul.com/hotel-reservation/
+Backend : http://prestashop.webkul.com/hotel-reservation/adminhtl/
username : demo@demo.com
Password : demodemo
+ + Server configuration -------- -To install Qlo, you need a web server running PHP 5.2+ and any flavor of MySQL 5.0+ (MySQL, MariaDB, Percona Server, etc) + +To install HotelCommerce, you need a web server running PHP 5.2+ and any flavor of MySQL 5.0+ (MySQL, MariaDB, Percona Server, etc) You will also need a database administration tool, such as phpMyAdmin, in order to create a database for PrestaShop. We recommend the Apache or Nginx web servers. Installation -------- -a) from Source
-Please go through this blog : http://qloapps.com/install-qloapps/ for detail instruction about installation. -In nutshell : -Once the files in the QloApps archive have been decompressed and uploaded on your hosting space, go to the root of your QloApps directory with your web browser, and the QloApps installer will start automatically. Follow the instructions until QloApps is installed. -b) Docker Image :
-https://github.com/webkul/qloapps_docker
-https://hub.docker.com/r/webkul/qloapps_docker/
- -c) Vagrant Image : -https://github.com/webkul/Vagrant_qloapps +Once the files in the HotelCommerce archive have been decompressed and uploaded on your hosting space, go to the root of your HotelCommerce directory with your web browser, and the HotelCommerce installer will start automatically. Follow the instructions until HotelCommerce is installed. Getting support -------- -If you need help using QloApps, contact the QloApps support team: qloapps@webkul.com -or raise ticket at https://webkul.uvdesk.com +If you need help using PrestaShop 1.6, contact the PrestaShop support team: support@webkul.com +or raise ticket at https://webkul.com/ticket/ -Webkul is known for his proactive support and already developed more than 100+ plugins on prestashop and more than 700+ plugins on other -platforms. +Webkul is known for his proactive support and already developed more than 100+ plugins on prestashop and more than 700+ plugins on other opensource platforms. -license --------- -OSL V3 : https://opensource.org/licenses/OSL-3.0 - - -Credits --------- -Crafted with :heart: at [Webkul](http://webkul.com) - - -Thank you for downloading. \ No newline at end of file +Thank you for downloading . diff --git a/admin/backups/1493622063-32c255f.sql.bz2 b/admin/backups/1493622063-32c255f.sql.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..9e6bab69a97cb075139b2aea97bcb9182b704407 GIT binary patch literal 80228 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 -
-
- Logo PrestaShop Addons -

"Connect your shop with PrestaShop's marketplace in order to automatically import all your Addons purchases."),$_smarty_tpl);?> -

-
-
-
-
-

"Don't have an account?"),$_smarty_tpl);?> -

-

"Discover the Power of PrestaShop Addons! Explore the PrestaShop Official Marketplace and find over 3 500 innovative modules and themes that optimize conversion rates, increase traffic, build customer loyalty and maximize your productivity"),$_smarty_tpl);?> -

-
-
-

'Connect to PrestaShop Addons'),$_smarty_tpl);?> -

-
-
- - -
-
- -
-
- -
- -
-
- -
-
-
- -
- -
- - - - - - diff --git a/cache/smarty/compile/69/a1/a1/69a1a12fe4be76abbbd47c16dab79bb45ea59aa5.file.footer.tpl.php b/cache/smarty/compile/69/a1/a1/69a1a12fe4be76abbbd47c16dab79bb45ea59aa5.file.footer.tpl.php deleted file mode 100644 index 616a14259..000000000 --- a/cache/smarty/compile/69/a1/a1/69a1a12fe4be76abbbd47c16dab79bb45ea59aa5.file.footer.tpl.php +++ /dev/null @@ -1,136 +0,0 @@ - -decodeProperties(array ( - 'file_dependency' => - array ( - '69a1a12fe4be76abbbd47c16dab79bb45ea59aa5' => - array ( - 0 => '/home/rjain/www/html/d4/htld6/adminhtl/themes/default/template/footer.tpl', - 1 => 1475505965, - 2 => 'file', - ), - ), - 'nocache_hash' => '9055349715800873e3c3e49-50405100', - 'function' => - array ( - ), - 'variables' => - array ( - 'display_footer' => 0, - 'timer_start' => 0, - 'lang_iso' => 0, - 'host_mode' => 0, - 'iso_is_fr' => 0, - 'php_errors' => 0, - 'modals' => 0, - ), - 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.19', - 'unifunc' => 'content_5800873e422bd3_50292079', -),false); /*/%%SmartyHeaderCode%%*/?> - - - - -tpl_vars['display_footer']->value) {?> - - -tpl_vars['php_errors']->value)) {?> - getSubTemplate ("error.tpl", $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, null, array(), 0);?> - - - -tpl_vars['modals']->value)) {?> -
- tpl_vars['modals']->value;?> - -
- - - - - diff --git a/cache/smarty/compile/6e/ca/e4/6ecae477f7199e035ac798c29f69ed100035a11b.file.form.tpl.php b/cache/smarty/compile/6e/ca/e4/6ecae477f7199e035ac798c29f69ed100035a11b.file.form.tpl.php deleted file mode 100644 index 34e3eb721..000000000 --- a/cache/smarty/compile/6e/ca/e4/6ecae477f7199e035ac798c29f69ed100035a11b.file.form.tpl.php +++ /dev/null @@ -1,1802 +0,0 @@ - -decodeProperties(array ( - 'file_dependency' => - array ( - '6ecae477f7199e035ac798c29f69ed100035a11b' => - array ( - 0 => '/home/rjain/www/html/d4/htld6/adminhtl/themes/default/template/controllers/performance/helpers/form/form.tpl', - 1 => 1475506007, - 2 => 'file', - ), - '83cc84f4f1227396fe298138820cd85fd0f99612' => - array ( - 0 => '/home/rjain/www/html/d4/htld6/adminhtl/themes/default/template/helpers/form/form.tpl', - 1 => 1475505998, - 2 => 'file', - ), - '161dd40e838110aab7d72e6704d6461a0179ef0b' => - array ( - 0 => '/home/rjain/www/html/d4/htld6/adminhtl/themes/default/template/helpers/form/form_group.tpl', - 1 => 1475505998, - 2 => 'file', - ), - ), - 'nocache_hash' => '12561455495800873cd35aa6-15699871', - 'function' => - array ( - ), - 'variables' => - array ( - 'fields' => 0, - 'tabs' => 0, - 'identifier_bk' => 0, - 'identifier' => 0, - 'table_bk' => 0, - 'table' => 0, - 'name_controller' => 0, - 'current' => 0, - 'token' => 0, - 'style' => 0, - 'form_id' => 0, - 'submit_action' => 0, - 'f' => 0, - 'fieldset' => 0, - 'key' => 0, - 'field' => 0, - 'input' => 0, - 'contains_states' => 0, - 'fields_value' => 0, - 'hint' => 0, - 'languages' => 0, - 'language' => 0, - 'defaultFormLanguage' => 0, - 'value_text' => 0, - 'name' => 0, - 'value' => 0, - 'option' => 0, - 'optiongroup' => 0, - 'field_value' => 0, - 'id_checkbox' => 0, - 'select' => 0, - 'k' => 0, - 'v' => 0, - 'categories_tree' => 0, - 'asso_shop' => 0, - 'p' => 0, - 'hookName' => 0, - 'show_cancel_button' => 0, - 'back_url' => 0, - 'btn' => 0, - 'tinymce' => 0, - 'iso' => 0, - 'ad' => 0, - 'firstCall' => 0, - 'vat_number' => 0, - 'allowEmployeeFormLang' => 0, - 'use_textarea_autosize' => 0, - ), - 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.19', - 'unifunc' => 'content_5800873dd2d432_57194878', -),false); /*/%%SmartyHeaderCode%%*/?> - -tpl_vars['fields']->value['title'])) {?>

tpl_vars['fields']->value['title'];?> -

- -tpl_vars['tabs']->value)&&count($_smarty_tpl->tpl_vars['tabs']->value)) {?> - - - -tpl_vars['identifier_bk']->value)&&$_smarty_tpl->tpl_vars['identifier_bk']->value==$_smarty_tpl->tpl_vars['identifier']->value) {?>_capture_stack[0][] = array('identifier_count', null, null); ob_start(); ?>'identifier_count'),$_smarty_tpl);?> -_capture_stack[0]); -if (!empty($_capture_buffer)) { - if (isset($_capture_assign)) $_smarty_tpl->assign($_capture_assign, ob_get_contents()); - if (isset( $_capture_append)) $_smarty_tpl->append( $_capture_append, ob_get_contents()); - Smarty::$_smarty_vars['capture'][$_capture_buffer]=ob_get_clean(); -} else $_smarty_tpl->capture_error();?> -tpl_vars['identifier_bk'] = new Smarty_variable($_smarty_tpl->tpl_vars['identifier']->value, null, 1); -if ($_smarty_tpl->parent != null) $_smarty_tpl->parent->tpl_vars['identifier_bk'] = clone $_smarty_tpl->tpl_vars['identifier_bk'];?> -tpl_vars['table_bk']->value)&&$_smarty_tpl->tpl_vars['table_bk']->value==$_smarty_tpl->tpl_vars['table']->value) {?>_capture_stack[0][] = array('table_count', null, null); ob_start(); ?>'table_count'),$_smarty_tpl);?> -_capture_stack[0]); -if (!empty($_capture_buffer)) { - if (isset($_capture_assign)) $_smarty_tpl->assign($_capture_assign, ob_get_contents()); - if (isset( $_capture_append)) $_smarty_tpl->append( $_capture_append, ob_get_contents()); - Smarty::$_smarty_vars['capture'][$_capture_buffer]=ob_get_clean(); -} else $_smarty_tpl->capture_error();?> -tpl_vars['table_bk'] = new Smarty_variable($_smarty_tpl->tpl_vars['table']->value, null, 1); -if ($_smarty_tpl->parent != null) $_smarty_tpl->parent->tpl_vars['table_bk'] = clone $_smarty_tpl->tpl_vars['table_bk'];?> -
tpl_vars['current']->value)&&$_smarty_tpl->tpl_vars['current']->value) {?> action="tpl_vars['current']->value, ENT_QUOTES, 'UTF-8', true);?> -tpl_vars['token']->value)&&$_smarty_tpl->tpl_vars['token']->value) {?>&token=tpl_vars['token']->value, ENT_QUOTES, 'UTF-8', true);?> -" method="post" enctype="multipart/form-data"tpl_vars['style']->value)) {?> style="tpl_vars['style']->value;?> -" novalidate> - tpl_vars['form_id']->value) {?> - - - tpl_vars['submit_action']->value)) {?> - - - tpl_vars['fieldset'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['fieldset']->_loop = false; - $_smarty_tpl->tpl_vars['f'] = new Smarty_Variable; - $_from = $_smarty_tpl->tpl_vars['fields']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['fieldset']->key => $_smarty_tpl->tpl_vars['fieldset']->value) { -$_smarty_tpl->tpl_vars['fieldset']->_loop = true; - $_smarty_tpl->tpl_vars['f']->value = $_smarty_tpl->tpl_vars['fieldset']->key; -?> - - _capture_stack[0][] = array('fieldset_name', null, null); ob_start(); ?>'fieldset_name'),$_smarty_tpl);?> -_capture_stack[0]); -if (!empty($_capture_buffer)) { - if (isset($_capture_assign)) $_smarty_tpl->assign($_capture_assign, ob_get_contents()); - if (isset( $_capture_append)) $_smarty_tpl->append( $_capture_append, ob_get_contents()); - Smarty::$_smarty_vars['capture'][$_capture_buffer]=ob_get_clean(); -} else $_smarty_tpl->capture_error();?> -
- tpl_vars['field'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['field']->_loop = false; - $_smarty_tpl->tpl_vars['key'] = new Smarty_Variable; - $_from = $_smarty_tpl->tpl_vars['fieldset']->value['form']; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['field']->key => $_smarty_tpl->tpl_vars['field']->value) { -$_smarty_tpl->tpl_vars['field']->_loop = true; - $_smarty_tpl->tpl_vars['key']->value = $_smarty_tpl->tpl_vars['field']->key; -?> - tpl_vars['key']->value=='legend') {?> - -
- tpl_vars['field']->value['image'])&&isset($_smarty_tpl->tpl_vars['field']->value['title'])) {?><?php echo htmlspecialchars($_smarty_tpl->tpl_vars['field']->value['title'], ENT_QUOTES, 'UTF-8', true);?>
- - tpl_vars['field']->value['icon'])) {?> - tpl_vars['field']->value['title'];?> - -
- - tpl_vars['key']->value=='description'&&$_smarty_tpl->tpl_vars['field']->value) {?> -
tpl_vars['field']->value;?> -
- tpl_vars['key']->value=='warning'&&$_smarty_tpl->tpl_vars['field']->value) {?> -
tpl_vars['field']->value;?> -
- tpl_vars['key']->value=='success'&&$_smarty_tpl->tpl_vars['field']->value) {?> -
tpl_vars['field']->value;?> -
- tpl_vars['key']->value=='error'&&$_smarty_tpl->tpl_vars['field']->value) {?> -
tpl_vars['field']->value;?> -
- tpl_vars['key']->value=='input') {?> -
- tpl_vars['input'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['input']->_loop = false; - $_from = $_smarty_tpl->tpl_vars['field']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['input']->key => $_smarty_tpl->tpl_vars['input']->value) { -$_smarty_tpl->tpl_vars['input']->_loop = true; -?> - - tpl_vars['input']->value['name']=='caching_system') {?>
tpl_vars['_PS_CACHE_ENABLED_']->value)&&!$_smarty_tpl->tpl_vars['_PS_CACHE_ENABLED_']->value) {?> style="display:none"> - tpl_vars['input']->value['name']=='smarty_caching_type'||$_smarty_tpl->tpl_vars['input']->value['name']=='smarty_clear_cache') {?>
tpl_vars['fields_value']->value['smarty_cache'])&&!$_smarty_tpl->tpl_vars['fields_value']->value['smarty_cache']) {?> style="display:none"> - -
tpl_vars['input']->value['name']=='id_state') {?> id="contains_states"tpl_vars['contains_states']->value) {?> style="display:none;"tpl_vars['tabs']->value)&&isset($_smarty_tpl->tpl_vars['input']->value['tab'])) {?> data-tab-id="tpl_vars['input']->value['tab'];?> -"> - tpl_vars['input']->value['type']=='hidden') {?> - - - - tpl_vars['input']->value['label'])) {?> - - - - - -
- - tpl_vars['input']->value['type']=='radio'&&$_smarty_tpl->tpl_vars['input']->value['name']=='combination'&&$_smarty_tpl->tpl_vars['input']->value['disabled']) {?> -
- 'This feature cannot be disabled because it is currently in use.'),$_smarty_tpl);?> - -
- - - tpl_vars['input']->value['type']=='text'||$_smarty_tpl->tpl_vars['input']->value['type']=='tags') {?> - tpl_vars['input']->value['lang'])&&$_smarty_tpl->tpl_vars['input']->value['lang']) {?> - tpl_vars['languages']->value)>1) {?> -
- - tpl_vars['language'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['language']->_loop = false; - $_from = $_smarty_tpl->tpl_vars['languages']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['language']->key => $_smarty_tpl->tpl_vars['language']->value) { -$_smarty_tpl->tpl_vars['language']->_loop = true; -?> - tpl_vars['value_text'] = new Smarty_variable($_smarty_tpl->tpl_vars['fields_value']->value[$_smarty_tpl->tpl_vars['input']->value['name']][$_smarty_tpl->tpl_vars['language']->value['id_lang']], null, 0);?> - tpl_vars['languages']->value)>1) {?> -
tpl_vars['language']->value['id_lang']!=$_smarty_tpl->tpl_vars['defaultFormLanguage']->value) {?>style="display:none"> -
- - tpl_vars['input']->value['type']=='tags') {?> - - - - - tpl_vars['input']->value['maxchar'])||isset($_smarty_tpl->tpl_vars['input']->value['prefix'])||isset($_smarty_tpl->tpl_vars['input']->value['suffix'])) {?> -
- - tpl_vars['input']->value['maxchar'])) {?> - - tpl_vars['input']->value['maxchar'];?> - - - - tpl_vars['input']->value['prefix'])) {?> - - tpl_vars['input']->value['prefix'];?> - - - - tpl_vars['input']->value['size'])) {?> size="tpl_vars['input']->value['size'];?> -" - tpl_vars['input']->value['maxchar'])) {?> data-maxchar="tpl_vars['input']->value['maxchar'];?> -" - tpl_vars['input']->value['maxlength'])) {?> maxlength="tpl_vars['input']->value['maxlength'];?> -" - tpl_vars['input']->value['readonly'])&&$_smarty_tpl->tpl_vars['input']->value['readonly']) {?> readonly="readonly" - tpl_vars['input']->value['disabled'])&&$_smarty_tpl->tpl_vars['input']->value['disabled']) {?> disabled="disabled" - tpl_vars['input']->value['autocomplete'])&&!$_smarty_tpl->tpl_vars['input']->value['autocomplete']) {?> autocomplete="off" - tpl_vars['input']->value['required'])&&$_smarty_tpl->tpl_vars['input']->value['required']) {?> required="required" - tpl_vars['input']->value['placeholder'])&&$_smarty_tpl->tpl_vars['input']->value['placeholder']) {?> placeholder="tpl_vars['input']->value['placeholder'];?> -" /> - tpl_vars['input']->value['suffix'])) {?> - - tpl_vars['input']->value['suffix'];?> - - - - tpl_vars['input']->value['maxchar'])||isset($_smarty_tpl->tpl_vars['input']->value['prefix'])||isset($_smarty_tpl->tpl_vars['input']->value['suffix'])) {?> -
- - tpl_vars['languages']->value)>1) {?> -
-
- - -
-
- - - tpl_vars['input']->value['maxchar'])) {?> - - - tpl_vars['languages']->value)>1) {?> -
- - - tpl_vars['input']->value['type']=='tags') {?> - - - - - tpl_vars['value_text'] = new Smarty_variable($_smarty_tpl->tpl_vars['fields_value']->value[$_smarty_tpl->tpl_vars['input']->value['name']], null, 0);?> - tpl_vars['input']->value['maxchar'])||isset($_smarty_tpl->tpl_vars['input']->value['prefix'])||isset($_smarty_tpl->tpl_vars['input']->value['suffix'])) {?> -
- - tpl_vars['input']->value['maxchar'])) {?> - tpl_vars['input']->value['maxchar'];?> - - - tpl_vars['input']->value['prefix'])) {?> - - tpl_vars['input']->value['prefix'];?> - - - - tpl_vars['input']->value['size'])) {?> size="tpl_vars['input']->value['size'];?> -" - tpl_vars['input']->value['maxchar'])) {?> data-maxchar="tpl_vars['input']->value['maxchar'];?> -" - tpl_vars['input']->value['maxlength'])) {?> maxlength="tpl_vars['input']->value['maxlength'];?> -" - tpl_vars['input']->value['readonly'])&&$_smarty_tpl->tpl_vars['input']->value['readonly']) {?> readonly="readonly" - tpl_vars['input']->value['disabled'])&&$_smarty_tpl->tpl_vars['input']->value['disabled']) {?> disabled="disabled" - tpl_vars['input']->value['autocomplete'])&&!$_smarty_tpl->tpl_vars['input']->value['autocomplete']) {?> autocomplete="off" - tpl_vars['input']->value['required'])&&$_smarty_tpl->tpl_vars['input']->value['required']) {?> required="required" - tpl_vars['input']->value['placeholder'])&&$_smarty_tpl->tpl_vars['input']->value['placeholder']) {?> placeholder="tpl_vars['input']->value['placeholder'];?> -" - /> - tpl_vars['input']->value['suffix'])) {?> - - tpl_vars['input']->value['suffix'];?> - - - - - tpl_vars['input']->value['maxchar'])||isset($_smarty_tpl->tpl_vars['input']->value['prefix'])||isset($_smarty_tpl->tpl_vars['input']->value['suffix'])) {?> -
- - tpl_vars['input']->value['maxchar'])) {?> - - - - tpl_vars['input']->value['type']=='textbutton') {?> - tpl_vars['value_text'] = new Smarty_variable($_smarty_tpl->tpl_vars['fields_value']->value[$_smarty_tpl->tpl_vars['input']->value['name']], null, 0);?> -
-
- tpl_vars['input']->value['maxchar'])) {?> -
- - tpl_vars['input']->value['maxchar'];?> - - - - tpl_vars['input']->value['size'])) {?> size="tpl_vars['input']->value['size'];?> -" - tpl_vars['input']->value['maxchar'])) {?> data-maxchar="tpl_vars['input']->value['maxchar'];?> -" - tpl_vars['input']->value['maxlength'])) {?> maxlength="tpl_vars['input']->value['maxlength'];?> -" - tpl_vars['input']->value['readonly'])&&$_smarty_tpl->tpl_vars['input']->value['readonly']) {?> readonly="readonly" - tpl_vars['input']->value['disabled'])&&$_smarty_tpl->tpl_vars['input']->value['disabled']) {?> disabled="disabled" - tpl_vars['input']->value['autocomplete'])&&!$_smarty_tpl->tpl_vars['input']->value['autocomplete']) {?> autocomplete="off" - tpl_vars['input']->value['placeholder'])&&$_smarty_tpl->tpl_vars['input']->value['placeholder']) {?> placeholder="tpl_vars['input']->value['placeholder'];?> -" - /> - tpl_vars['input']->value['suffix'])) {?>tpl_vars['input']->value['suffix'];?> - - tpl_vars['input']->value['maxchar'])) {?> -
- -
-
- -
-
- tpl_vars['input']->value['maxchar'])) {?> - - - tpl_vars['input']->value['type']=='swap') {?> -
-
-
-
- - 'Add'),$_smarty_tpl);?> - -
-
- - 'Remove'),$_smarty_tpl);?> - -
-
-
-
- tpl_vars['input']->value['type']=='select') {?> - tpl_vars['input']->value['options']['query'])&&!$_smarty_tpl->tpl_vars['input']->value['options']['query']&&isset($_smarty_tpl->tpl_vars['input']->value['empty_message'])) {?> - tpl_vars['input']->value['empty_message'];?> - - createLocalArrayVariable('input', null, 0); -$_smarty_tpl->tpl_vars['input']->value['required'] = false;?> - createLocalArrayVariable('input', null, 0); -$_smarty_tpl->tpl_vars['input']->value['desc'] = null;?> - - - - tpl_vars['input']->value['type']=='radio') {?> - tpl_vars['value'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['value']->_loop = false; - $_from = $_smarty_tpl->tpl_vars['input']->value['values']; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['value']->key => $_smarty_tpl->tpl_vars['value']->value) { -$_smarty_tpl->tpl_vars['value']->_loop = true; -?> -
- -
- tpl_vars['value']->value['p'])&&$_smarty_tpl->tpl_vars['value']->value['p']) {?>

tpl_vars['value']->value['p'];?> -

- - tpl_vars['input']->value['type']=='switch') {?> - - tpl_vars['value'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['value']->_loop = false; - $_from = $_smarty_tpl->tpl_vars['input']->value['values']; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['value']->key => $_smarty_tpl->tpl_vars['value']->value) { -$_smarty_tpl->tpl_vars['value']->_loop = true; -?> - tpl_vars['value']->value['value']==1) {?> id="tpl_vars['input']->value['name'];?> -_on" id="tpl_vars['input']->value['name'];?> -_off" value="tpl_vars['value']->value['value'];?> -"tpl_vars['fields_value']->value[$_smarty_tpl->tpl_vars['input']->value['name']]==$_smarty_tpl->tpl_vars['value']->value['value']) {?> checked="checked"tpl_vars['input']->value['disabled'])&&$_smarty_tpl->tpl_vars['input']->value['disabled']) {?> disabled="disabled"/> - - - - - tpl_vars['input']->value['type']=='textarea') {?> - tpl_vars['use_textarea_autosize'] = new Smarty_variable(true, null, 0);?> - tpl_vars['input']->value['lang'])&&$_smarty_tpl->tpl_vars['input']->value['lang']) {?> - tpl_vars['language'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['language']->_loop = false; - $_from = $_smarty_tpl->tpl_vars['languages']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['language']->key => $_smarty_tpl->tpl_vars['language']->value) { -$_smarty_tpl->tpl_vars['language']->_loop = true; -?> - tpl_vars['languages']->value)>1) {?> -
tpl_vars['language']->value['id_lang']!=$_smarty_tpl->tpl_vars['defaultFormLanguage']->value) {?> style="display:none;"> -
- - - tpl_vars['languages']->value)>1) {?> -
-
- - -
-
- - - - - - - - tpl_vars['input']->value['type']=='checkbox') {?> - tpl_vars['input']->value['expand'])) {?> - - - tpl_vars['input']->value['expand']['show']['text'];?> - - tpl_vars['input']->value['expand']['print_total'])&&$_smarty_tpl->tpl_vars['input']->value['expand']['print_total']>0) {?> - tpl_vars['input']->value['expand']['print_total'];?> - - - - - - tpl_vars['input']->value['expand']['hide']['text'];?> - - tpl_vars['input']->value['expand']['print_total'])&&$_smarty_tpl->tpl_vars['input']->value['expand']['print_total']>0) {?> - tpl_vars['input']->value['expand']['print_total'];?> - - - - - tpl_vars['value'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['value']->_loop = false; - $_from = $_smarty_tpl->tpl_vars['input']->value['values']['query']; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['value']->key => $_smarty_tpl->tpl_vars['value']->value) { -$_smarty_tpl->tpl_vars['value']->_loop = true; -?> - tpl_vars['id_checkbox'] = new Smarty_variable((($_smarty_tpl->tpl_vars['input']->value['name']).('_')).($_smarty_tpl->tpl_vars['value']->value[$_smarty_tpl->tpl_vars['input']->value['values']['id']]), null, 0);?> -
- -
- - tpl_vars['input']->value['type']=='change-password') {?> -
-
- -
-
- -
-
- - - - -
-
-
-
-
- -
-
- - - - -
- -
-
-
- -
-
- - - - -
-
-
-
-
- - -
-
-
-
-

- -

-
-
-
-
- -
-
-
-
-
- - tpl_vars['input']->value['type']=='password') {?> -
- - - - tpl_vars['input']->value['autocomplete'])&&!$_smarty_tpl->tpl_vars['input']->value['autocomplete']) {?>autocomplete="off" - tpl_vars['input']->value['required'])&&$_smarty_tpl->tpl_vars['input']->value['required']) {?> required="required" /> -
- - tpl_vars['input']->value['type']=='birthday') {?> -
- tpl_vars['select'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['select']->_loop = false; - $_smarty_tpl->tpl_vars['key'] = new Smarty_Variable; - $_from = $_smarty_tpl->tpl_vars['input']->value['options']; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['select']->key => $_smarty_tpl->tpl_vars['select']->value) { -$_smarty_tpl->tpl_vars['select']->_loop = true; - $_smarty_tpl->tpl_vars['key']->value = $_smarty_tpl->tpl_vars['select']->key; -?> -
- -
- -
- tpl_vars['input']->value['type']=='group') {?> - tpl_vars['groups'] = new Smarty_variable($_smarty_tpl->tpl_vars['input']->value['values'], null, 0);?> - setupInlineSubTemplate('helpers/form/form_group.tpl', $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, null, array(), 0, '12561455495800873cd35aa6-15699871'); -content_5800873d947a27_49619184($_smarty_tpl); -$_smarty_tpl = array_pop($_tpl_stack); -/* End of included template "helpers/form/form_group.tpl" */?> - tpl_vars['input']->value['type']=='shop') {?> - tpl_vars['input']->value['html'];?> - - tpl_vars['input']->value['type']=='categories') {?> - tpl_vars['categories_tree']->value;?> - - tpl_vars['input']->value['type']=='file') {?> - tpl_vars['input']->value['file'];?> - - tpl_vars['input']->value['type']=='categories_select') {?> - tpl_vars['input']->value['category_tree'];?> - - tpl_vars['input']->value['type']=='asso_shop'&&isset($_smarty_tpl->tpl_vars['asso_shop']->value)&&$_smarty_tpl->tpl_vars['asso_shop']->value) {?> - tpl_vars['asso_shop']->value;?> - - tpl_vars['input']->value['type']=='color') {?> -
-
-
-
- tpl_vars['input']->value['class'])) {?> class="tpl_vars['input']->value['class'];?> -" - class="color mColorPickerInput" - name="tpl_vars['input']->value['name'];?> -" - value="tpl_vars['fields_value']->value[$_smarty_tpl->tpl_vars['input']->value['name']], ENT_QUOTES, 'UTF-8', true);?> -" /> -
-
-
-
- tpl_vars['input']->value['type']=='date') {?> -
-
- tpl_vars['input']->value['class'])) {?> class="tpl_vars['input']->value['class'];?> -" - class="datepicker" - name="tpl_vars['input']->value['name'];?> -" - value="tpl_vars['fields_value']->value[$_smarty_tpl->tpl_vars['input']->value['name']], ENT_QUOTES, 'UTF-8', true);?> -" /> - - - -
-
- tpl_vars['input']->value['type']=='datetime') {?> -
-
- tpl_vars['input']->value['class'])) {?> class="tpl_vars['input']->value['class'];?> -" - class="datetimepicker" - name="tpl_vars['input']->value['name'];?> -" - value="tpl_vars['fields_value']->value[$_smarty_tpl->tpl_vars['input']->value['name']], ENT_QUOTES, 'UTF-8', true);?> -" /> - - - -
-
- tpl_vars['input']->value['type']=='free') {?> - tpl_vars['fields_value']->value[$_smarty_tpl->tpl_vars['input']->value['name']];?> - - tpl_vars['input']->value['type']=='html') {?> - tpl_vars['input']->value['html_content'])) {?> - tpl_vars['input']->value['html_content'];?> - - - tpl_vars['input']->value['name'];?> - - - - - - - - tpl_vars['input']->value['desc'])&&!empty($_smarty_tpl->tpl_vars['input']->value['desc'])) {?> -

- tpl_vars['input']->value['desc'])) {?> - tpl_vars['p'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['p']->_loop = false; - $_from = $_smarty_tpl->tpl_vars['input']->value['desc']; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['p']->key => $_smarty_tpl->tpl_vars['p']->value) { -$_smarty_tpl->tpl_vars['p']->_loop = true; -?> - tpl_vars['p']->value)) {?> - tpl_vars['p']->value['text'];?> -
- - tpl_vars['p']->value;?> -
- - - - tpl_vars['input']->value['desc'];?> - - -

- - - tpl_vars['input']->value['type']=='radio'&&$_smarty_tpl->tpl_vars['input']->value['name']=='combination') {?> -
    -
  • 'Combinations tab on product page'),$_smarty_tpl);?> -
  • -
  • 'Value'),$_smarty_tpl);?> -
  • -
  • 'Attribute'),$_smarty_tpl);?> -
  • -
- tpl_vars['input']->value['type']=='radio'&&$_smarty_tpl->tpl_vars['input']->value['name']=='feature') {?> -
    -
  • 'Features tab on product page'),$_smarty_tpl);?> -
  • -
  • 'Feature'),$_smarty_tpl);?> -
  • -
  • 'Feature value'),$_smarty_tpl);?> -
  • -
- - -
- - -
- - tpl_vars['input']->value['name']=='caching_system'||$_smarty_tpl->tpl_vars['input']->value['name']=='smarty_caching_type'||$_smarty_tpl->tpl_vars['input']->value['name']=='smarty_clear_cache') {?>
- - - smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['hook'][0][0]->smartyHook(array('h'=>'displayAdminForm','fieldset'=>$_smarty_tpl->tpl_vars['f']->value),$_smarty_tpl);?> - - tpl_vars['name_controller']->value)) {?> - _capture_stack[0][] = array('hookName', 'hookName', null); ob_start(); ?>displaytpl_vars['name_controller']->value);?> -Form_capture_stack[0]); -if (!empty($_capture_buffer)) { - if (isset($_capture_assign)) $_smarty_tpl->assign($_capture_assign, ob_get_contents()); - if (isset( $_capture_append)) $_smarty_tpl->append( $_capture_append, ob_get_contents()); - Smarty::$_smarty_vars['capture'][$_capture_buffer]=ob_get_clean(); -} else $_smarty_tpl->capture_error();?> - smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['hook'][0][0]->smartyHook(array('h'=>$_smarty_tpl->tpl_vars['hookName']->value,'fieldset'=>$_smarty_tpl->tpl_vars['f']->value),$_smarty_tpl);?> - - - _capture_stack[0][] = array('hookName', 'hookName', null); ob_start(); ?>display -Form_capture_stack[0]); -if (!empty($_capture_buffer)) { - if (isset($_capture_assign)) $_smarty_tpl->assign($_capture_assign, ob_get_contents()); - if (isset( $_capture_append)) $_smarty_tpl->append( $_capture_append, ob_get_contents()); - Smarty::$_smarty_vars['capture'][$_capture_buffer]=ob_get_clean(); -} else $_smarty_tpl->capture_error();?> - smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['hook'][0][0]->smartyHook(array('h'=>$_smarty_tpl->tpl_vars['hookName']->value,'fieldset'=>$_smarty_tpl->tpl_vars['f']->value),$_smarty_tpl);?> - - -
- tpl_vars['key']->value=='desc') {?> -
- tpl_vars['field']->value)) {?> - tpl_vars['p'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['p']->_loop = false; - $_smarty_tpl->tpl_vars['k'] = new Smarty_Variable; - $_from = $_smarty_tpl->tpl_vars['field']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['p']->key => $_smarty_tpl->tpl_vars['p']->value) { -$_smarty_tpl->tpl_vars['p']->_loop = true; - $_smarty_tpl->tpl_vars['k']->value = $_smarty_tpl->tpl_vars['p']->key; -?> - tpl_vars['p']->value)) {?> - tpl_vars['p']->value['id'])) {?> id="tpl_vars['p']->value['id'];?> -">tpl_vars['p']->value['text'];?> -
- - tpl_vars['p']->value;?> - - tpl_vars['field']->value[$_smarty_tpl->tpl_vars['k']->value+1])) {?>
- - - - tpl_vars['field']->value;?> - - -
- - - tpl_vars['key']->value=='memcachedServers') {?> -
-
-
- -
-
- - tpl_vars['servers']->value) {?> -
- - - - - - - - - - - - tpl_vars['server'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['server']->_loop = false; - $_from = $_smarty_tpl->tpl_vars['servers']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['server']->key => $_smarty_tpl->tpl_vars['server']->value) { -$_smarty_tpl->tpl_vars['server']->_loop = true; -?> - - - - - - - - - -
'ID'),$_smarty_tpl);?> -'IP address'),$_smarty_tpl);?> -'Port'),$_smarty_tpl);?> -'Weight'),$_smarty_tpl);?> - 
tpl_vars['server']->value['id_memcached_server'];?> -tpl_vars['server']->value['ip'];?> -tpl_vars['server']->value['port'];?> -tpl_vars['server']->value['weight'];?> - - 'Remove'),$_smarty_tpl);?> - -
-
- -
- - - - - _capture_stack[0][] = array('form_submit_btn', null, null); ob_start(); ?>'form_submit_btn'),$_smarty_tpl);?> -_capture_stack[0]); -if (!empty($_capture_buffer)) { - if (isset($_capture_assign)) $_smarty_tpl->assign($_capture_assign, ob_get_contents()); - if (isset( $_capture_append)) $_smarty_tpl->append( $_capture_append, ob_get_contents()); - Smarty::$_smarty_vars['capture'][$_capture_buffer]=ob_get_clean(); -} else $_smarty_tpl->capture_error();?> - tpl_vars['fieldset']->value['form']['submit'])||isset($_smarty_tpl->tpl_vars['fieldset']->value['form']['buttons'])) {?> - - - -
- - - - - - - -tpl_vars['tinymce']->value)&&$_smarty_tpl->tpl_vars['tinymce']->value) {?> - - -tpl_vars['firstCall']->value) {?> - - - - - - -tpl_vars['groups']->value)&&isset($_smarty_tpl->tpl_vars['groups']->value)) {?> -
-
- - - - - - - - - - tpl_vars['group'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['group']->_loop = false; - $_smarty_tpl->tpl_vars['key'] = new Smarty_Variable; - $_from = $_smarty_tpl->tpl_vars['groups']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['group']->key => $_smarty_tpl->tpl_vars['group']->value) { -$_smarty_tpl->tpl_vars['group']->_loop = true; - $_smarty_tpl->tpl_vars['key']->value = $_smarty_tpl->tpl_vars['group']->key; -?> - - - - - - - -
- - - - 'ID'),$_smarty_tpl);?> - - - 'Group name'),$_smarty_tpl);?> - - -
- tpl_vars['id_checkbox'] = new Smarty_variable((('groupBox').('_')).($_smarty_tpl->tpl_vars['group']->value['id_group']), null, 0);?> - tpl_vars['fields_value']->value[$_smarty_tpl->tpl_vars['id_checkbox']->value]) {?>checked="checked" /> - tpl_vars['group']->value['id_group'];?> - - -
-
-
- -

- 'No group created'),$_smarty_tpl);?> - -

- diff --git a/cache/smarty/compile/6f/80/e1/6f80e12d1b121d4d9a0120c455d51523c71c65c3.file.nav.tpl.php b/cache/smarty/compile/6f/80/e1/6f80e12d1b121d4d9a0120c455d51523c71c65c3.file.nav.tpl.php deleted file mode 100644 index 2f3bbd4b6..000000000 --- a/cache/smarty/compile/6f/80/e1/6f80e12d1b121d4d9a0120c455d51523c71c65c3.file.nav.tpl.php +++ /dev/null @@ -1,90 +0,0 @@ - -decodeProperties(array ( - 'file_dependency' => - array ( - '6f80e12d1b121d4d9a0120c455d51523c71c65c3' => - array ( - 0 => '/home/rjain/www/html/d4/htld6/adminhtl/themes/default/template/nav.tpl', - 1 => 1475505965, - 2 => 'file', - ), - ), - 'nocache_hash' => '4320767995800873e2ed5d6-11448157', - 'function' => - array ( - ), - 'variables' => - array ( - 'employee' => 0, - 'tab' => 0, - 'tabs' => 0, - 't' => 0, - 't2' => 0, - ), - 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.19', - 'unifunc' => 'content_5800873e36f2b0_54023847', -),false); /*/%%SmartyHeaderCode%%*/?> -
- -
- diff --git a/cache/smarty/compile/86/4d/08/864d08e140a923f33ef5fa3112e3afe0d5cf1cff.file.layout.tpl.php b/cache/smarty/compile/86/4d/08/864d08e140a923f33ef5fa3112e3afe0d5cf1cff.file.layout.tpl.php deleted file mode 100644 index 1789acf5a..000000000 --- a/cache/smarty/compile/86/4d/08/864d08e140a923f33ef5fa3112e3afe0d5cf1cff.file.layout.tpl.php +++ /dev/null @@ -1,131 +0,0 @@ - -decodeProperties(array ( - 'file_dependency' => - array ( - '864d08e140a923f33ef5fa3112e3afe0d5cf1cff' => - array ( - 0 => '/home/rjain/www/html/d4/htld6/adminhtl/themes/default/template/layout.tpl', - 1 => 1475505965, - 2 => 'file', - ), - ), - 'nocache_hash' => '11238736135800873e4294a2-07764315', - 'function' => - array ( - ), - 'variables' => - array ( - 'header' => 0, - 'conf' => 0, - 'errors' => 0, - 'disableDefaultErrorOutPut' => 0, - 'error' => 0, - 'informations' => 0, - 'info' => 0, - 'confirmations' => 0, - 'warnings' => 0, - 'warning' => 0, - 'page' => 0, - 'footer' => 0, - ), - 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.19', - 'unifunc' => 'content_5800873e498339_79615111', -),false); /*/%%SmartyHeaderCode%%*/?> - -tpl_vars['header']->value;?> - -tpl_vars['conf']->value)) {?> -
-
- - tpl_vars['conf']->value;?> - -
-
- -tpl_vars['errors']->value)&¤t($_smarty_tpl->tpl_vars['errors']->value)!=''&&(!isset($_smarty_tpl->tpl_vars['disableDefaultErrorOutPut']->value)||$_smarty_tpl->tpl_vars['disableDefaultErrorOutPut']->value==false)) {?> - -
-
- - tpl_vars['errors']->value)==1) {?> - tpl_vars['errors']->value);?> - - - '%d errors','sprintf'=>count($_smarty_tpl->tpl_vars['errors']->value)),$_smarty_tpl);?> - -
-
    - tpl_vars['error'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['error']->_loop = false; - $_from = $_smarty_tpl->tpl_vars['errors']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['error']->key => $_smarty_tpl->tpl_vars['error']->value) { -$_smarty_tpl->tpl_vars['error']->_loop = true; -?> -
  1. tpl_vars['error']->value;?> -
  2. - -
- -
-
- -tpl_vars['informations']->value)&&count($_smarty_tpl->tpl_vars['informations']->value)&&$_smarty_tpl->tpl_vars['informations']->value) {?> -
-
- -
    - tpl_vars['info'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['info']->_loop = false; - $_from = $_smarty_tpl->tpl_vars['informations']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['info']->key => $_smarty_tpl->tpl_vars['info']->value) { -$_smarty_tpl->tpl_vars['info']->_loop = true; -?> -
  • tpl_vars['info']->value;?> -
  • - -
-
-
- -tpl_vars['confirmations']->value)&&count($_smarty_tpl->tpl_vars['confirmations']->value)&&$_smarty_tpl->tpl_vars['confirmations']->value) {?> -
-
- tpl_vars['conf'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['conf']->_loop = false; - $_from = $_smarty_tpl->tpl_vars['confirmations']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['conf']->key => $_smarty_tpl->tpl_vars['conf']->value) { -$_smarty_tpl->tpl_vars['conf']->_loop = true; -?> - tpl_vars['conf']->value;?> - - -
-
- -tpl_vars['warnings']->value)) {?> -
-
- - tpl_vars['warnings']->value)>1) {?> -

'There are %d warnings:','sprintf'=>count($_smarty_tpl->tpl_vars['warnings']->value)),$_smarty_tpl);?> -

- -
    - tpl_vars['warning'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['warning']->_loop = false; - $_from = $_smarty_tpl->tpl_vars['warnings']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['warning']->key => $_smarty_tpl->tpl_vars['warning']->value) { -$_smarty_tpl->tpl_vars['warning']->_loop = true; -?> -
  • tpl_vars['warning']->value;?> -
  • - -
-
-
- -tpl_vars['page']->value;?> - -tpl_vars['footer']->value;?> - - diff --git a/cache/smarty/compile/9a/6d/13/9a6d13eabb69df1ee1d8359b987dda7792666a73.file.search_form.tpl.php b/cache/smarty/compile/9a/6d/13/9a6d13eabb69df1ee1d8359b987dda7792666a73.file.search_form.tpl.php deleted file mode 100644 index e31b49a0a..000000000 --- a/cache/smarty/compile/9a/6d/13/9a6d13eabb69df1ee1d8359b987dda7792666a73.file.search_form.tpl.php +++ /dev/null @@ -1,124 +0,0 @@ - -decodeProperties(array ( - 'file_dependency' => - array ( - '9a6d13eabb69df1ee1d8359b987dda7792666a73' => - array ( - 0 => '/home/rjain/www/html/d4/htld6/adminhtl/themes/default/template/search_form.tpl', - 1 => 1475505965, - 2 => 'file', - ), - ), - 'nocache_hash' => '16724359785800873e3780d4-64550985', - 'function' => - array ( - ), - 'variables' => - array ( - 'id' => 0, - 'show_clear_btn' => 0, - 'bo_query' => 0, - 'search_type' => 0, - ), - 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.19', - 'unifunc' => 'content_5800873e3bc186_52502760', -),false); /*/%%SmartyHeaderCode%%*/?> - - - diff --git a/cache/smarty/compile/c0/df/ca/c0dfca9f8787d0fe2b9e291374fcc42bd00f6692.file.header.tpl.php b/cache/smarty/compile/c0/df/ca/c0dfca9f8787d0fe2b9e291374fcc42bd00f6692.file.header.tpl.php deleted file mode 100644 index 5857b5202..000000000 --- a/cache/smarty/compile/c0/df/ca/c0dfca9f8787d0fe2b9e291374fcc42bd00f6692.file.header.tpl.php +++ /dev/null @@ -1,550 +0,0 @@ - -decodeProperties(array ( - 'file_dependency' => - array ( - 'c0dfca9f8787d0fe2b9e291374fcc42bd00f6692' => - array ( - 0 => '/home/rjain/www/html/d4/htld6/adminhtl/themes/default/template/header.tpl', - 1 => 1475505965, - 2 => 'file', - ), - ), - 'nocache_hash' => '14608651255800873df3afa2-57213920', - 'function' => - array ( - ), - 'variables' => - array ( - 'iso' => 0, - 'img_dir' => 0, - 'meta_title' => 0, - 'shop_name' => 0, - 'display_header_javascript' => 0, - 'controller_name' => 0, - 'iso_user' => 0, - 'full_language_code' => 0, - 'country_iso_code' => 0, - 'round_mode' => 0, - 'shop_context' => 0, - 'autorefresh_notifications' => 0, - 'token' => 0, - 'currentIndex' => 0, - 'default_language' => 0, - 'link' => 0, - 'tab_modules_list' => 0, - 'css_files' => 0, - 'css_uri' => 0, - 'js_def' => 0, - 'js_files' => 0, - 'displayBackOfficeHeader' => 0, - 'brightness' => 0, - 'display_header' => 0, - 'employee' => 0, - 'collapse_menu' => 0, - 'default_tab_link' => 0, - 'version' => 0, - 'is_multishop' => 0, - 'shop_list' => 0, - 'multishop_context' => 0, - 'show_new_orders' => 0, - 'show_new_customers' => 0, - 'show_new_messages' => 0, - 'quick_access' => 0, - 'quick' => 0, - 'matchQuickLink' => 0, - 'quick_access_current_link_name' => 0, - 'quick_access_current_link_icon' => 0, - 'logged_on_addons' => 0, - 'display_addons_connection' => 0, - 'base_url' => 0, - 'base_url_tc' => 0, - 'maintenance_mode' => 0, - 'host_mode' => 0, - 'login_link' => 0, - 'displayBackOfficeTop' => 0, - 'bootstrap' => 0, - 'page_header_toolbar' => 0, - 'modal_module_list' => 0, - 'install_dir_exists' => 0, - 'lite_display' => 0, - ), - 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.19', - 'unifunc' => 'content_5800873e2588d6_68944238', -),false); /*/%%SmartyHeaderCode%%*/?> - - - - - - - - - - - - - - - - - <?php if ($_smarty_tpl->tpl_vars['meta_title']->value!='') {?><?php echo $_smarty_tpl->tpl_vars['meta_title']->value;?> - • <?php }?><?php echo $_smarty_tpl->tpl_vars['shop_name']->value;?> - - tpl_vars['display_header_javascript']->value)||$_smarty_tpl->tpl_vars['display_header_javascript']->value) {?> - - -tpl_vars['css_files']->value)) {?> -tpl_vars['media'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['media']->_loop = false; - $_smarty_tpl->tpl_vars['css_uri'] = new Smarty_Variable; - $_from = $_smarty_tpl->tpl_vars['css_files']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['media']->key => $_smarty_tpl->tpl_vars['media']->value) { -$_smarty_tpl->tpl_vars['media']->_loop = true; - $_smarty_tpl->tpl_vars['css_uri']->value = $_smarty_tpl->tpl_vars['media']->key; -?> - - - - tpl_vars['js_def']->value)&&count($_smarty_tpl->tpl_vars['js_def']->value)||isset($_smarty_tpl->tpl_vars['js_files']->value)&&count($_smarty_tpl->tpl_vars['js_files']->value))) {?> - getSubTemplate ((@constant('_PS_ALL_THEMES_DIR_')).("javascript.tpl"), $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, null, array(), 0);?> - - - - tpl_vars['displayBackOfficeHeader']->value)) {?> - tpl_vars['displayBackOfficeHeader']->value;?> - - - tpl_vars['brightness']->value)) {?> - - - - -tpl_vars['display_header']->value) {?> - - - - -
- getSubTemplate ('nav.tpl', $_smarty_tpl->cache_id, $_smarty_tpl->compile_id, 0, null, array(), 0);?> - - -
- tpl_vars['page_header_toolbar']->value)) {?>tpl_vars['page_header_toolbar']->value;?> - - tpl_vars['modal_module_list']->value)) {?>tpl_vars['modal_module_list']->value;?> - - -tpl_vars['install_dir_exists']->value) {?> -
- 'For security reasons, you must also delete the /install folder.'),$_smarty_tpl);?> - -
- - - smarty->registered_plugins[Smarty::PLUGIN_FUNCTION]['hook'][0][0]->smartyHook(array('h'=>'displayAdminAfterHeader'),$_smarty_tpl);?> - - - - - - - tpl_vars['lite_display']->value)&&$_smarty_tpl->tpl_vars['lite_display']->value) {?> class="ps_back-office display-modal"> -
-
- - diff --git a/cache/smarty/compile/c9/b0/f6/c9b0f6e10e5edd2753a4a13ffaee94ec9a2fa942.file.modal.tpl.php b/cache/smarty/compile/c9/b0/f6/c9b0f6e10e5edd2753a4a13ffaee94ec9a2fa942.file.modal.tpl.php deleted file mode 100644 index 0dbe15f56..000000000 --- a/cache/smarty/compile/c9/b0/f6/c9b0f6e10e5edd2753a4a13ffaee94ec9a2fa942.file.modal.tpl.php +++ /dev/null @@ -1,37 +0,0 @@ - -decodeProperties(array ( - 'file_dependency' => - array ( - 'c9b0f6e10e5edd2753a4a13ffaee94ec9a2fa942' => - array ( - 0 => '/home/rjain/www/html/d4/htld6/adminhtl/themes/default/template/helpers/modules_list/modal.tpl', - 1 => 1475505998, - 2 => 'file', - ), - ), - 'nocache_hash' => '2995733205800873df35ec4-53956342', - 'function' => - array ( - ), - 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.19', - 'unifunc' => 'content_5800873df38080_17435765', -),false); /*/%%SmartyHeaderCode%%*/?> - - diff --git a/cache/smarty/compile/dc/78/41/dc7841eebd388b702ed9abe22a6858624e2a1014.file.content.tpl.php b/cache/smarty/compile/dc/78/41/dc7841eebd388b702ed9abe22a6858624e2a1014.file.content.tpl.php deleted file mode 100644 index eff66b9ee..000000000 --- a/cache/smarty/compile/dc/78/41/dc7841eebd388b702ed9abe22a6858624e2a1014.file.content.tpl.php +++ /dev/null @@ -1,39 +0,0 @@ - -decodeProperties(array ( - 'file_dependency' => - array ( - 'dc7841eebd388b702ed9abe22a6858624e2a1014' => - array ( - 0 => '/home/rjain/www/html/d4/htld6/adminhtl/themes/default/template/content.tpl', - 1 => 1475505965, - 2 => 'file', - ), - ), - 'nocache_hash' => '18184055415800873dd946a3-99829689', - 'function' => - array ( - ), - 'variables' => - array ( - 'content' => 0, - ), - 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.19', - 'unifunc' => 'content_5800873dd9ed48_96061936', -),false); /*/%%SmartyHeaderCode%%*/?> - -
- - - - -
-
- tpl_vars['content']->value)) {?> - tpl_vars['content']->value;?> - - -
-
diff --git a/cache/smarty/compile/eb/36/62/eb366249782b69e5c9ea107af76e56a78e2fa316.file.notification_bt.tpl.php b/cache/smarty/compile/eb/36/62/eb366249782b69e5c9ea107af76e56a78e2fa316.file.notification_bt.tpl.php deleted file mode 100644 index 5eb484a89..000000000 --- a/cache/smarty/compile/eb/36/62/eb366249782b69e5c9ea107af76e56a78e2fa316.file.notification_bt.tpl.php +++ /dev/null @@ -1,175 +0,0 @@ - -decodeProperties(array ( - 'file_dependency' => - array ( - 'eb366249782b69e5c9ea107af76e56a78e2fa316' => - array ( - 0 => '/home/rjain/www/html/d4/htld6/modules/gamification/views/templates/hook/notification_bt.tpl', - 1 => 1475509394, - 2 => 'file', - ), - ), - 'nocache_hash' => '14110513165800873ee12a74-32316980', - 'function' => - array ( - ), - 'variables' => - array ( - 'current_id_tab' => 0, - 'current_level_percent' => 0, - 'current_level' => 0, - 'advice_hide_url' => 0, - 'link' => 0, - 'notification' => 0, - 'badges_to_display' => 0, - 'unlock_badges' => 0, - 'badge' => 0, - 'i' => 0, - 'next_badges' => 0, - ), - 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.19', - 'unifunc' => 'content_5800873eebfd41_52910389', -),false); /*/%%SmartyHeaderCode%%*/?> - - - diff --git a/cache/smarty/compile/ed/04/3d/ed043dadf49537335bd9273f5b052bbe404c2a7f.file.javascript.tpl.php b/cache/smarty/compile/ed/04/3d/ed043dadf49537335bd9273f5b052bbe404c2a7f.file.javascript.tpl.php deleted file mode 100644 index 8ba342c2e..000000000 --- a/cache/smarty/compile/ed/04/3d/ed043dadf49537335bd9273f5b052bbe404c2a7f.file.javascript.tpl.php +++ /dev/null @@ -1,101 +0,0 @@ - -decodeProperties(array ( - 'file_dependency' => - array ( - 'ed043dadf49537335bd9273f5b052bbe404c2a7f' => - array ( - 0 => '/home/rjain/www/html/d4/htld6/themes/javascript.tpl', - 1 => 1475505927, - 2 => 'file', - ), - ), - 'nocache_hash' => '3913045565800873e261804-31373410', - 'function' => - array ( - ), - 'variables' => - array ( - 'js_def' => 0, - 'k' => 0, - 'def' => 0, - 'js_files' => 0, - 'js_uri' => 0, - 'js_inline' => 0, - 'inline' => 0, - ), - 'has_nocache_code' => false, - 'version' => 'Smarty-3.1.19', - 'unifunc' => 'content_5800873e2e5a99_58260404', -),false); /*/%%SmartyHeaderCode%%*/?> - -tpl_vars['js_def']->value)&&is_array($_smarty_tpl->tpl_vars['js_def']->value)&&count($_smarty_tpl->tpl_vars['js_def']->value)) {?> - - -tpl_vars['js_files']->value)&&count($_smarty_tpl->tpl_vars['js_files']->value)) {?> -tpl_vars['js_uri'] = new Smarty_Variable; $_smarty_tpl->tpl_vars['js_uri']->_loop = false; - $_smarty_tpl->tpl_vars['k'] = new Smarty_Variable; - $_from = $_smarty_tpl->tpl_vars['js_files']->value; if (!is_array($_from) && !is_object($_from)) { settype($_from, 'array');} -foreach ($_from as $_smarty_tpl->tpl_vars['js_uri']->key => $_smarty_tpl->tpl_vars['js_uri']->value) { -$_smarty_tpl->tpl_vars['js_uri']->_loop = true; - $_smarty_tpl->tpl_vars['k']->value = $_smarty_tpl->tpl_vars['js_uri']->key; -?> - - - -tpl_vars['js_inline']->value)&&count($_smarty_tpl->tpl_vars['js_inline']->value)) {?> - - diff --git a/cache/smarty/compile/last_flush b/cache/smarty/compile/last_flush deleted file mode 100644 index e69de29bb..000000000 diff --git a/classes/Cart.php b/classes/Cart.php index 59539448f..07eb5bec7 100644 --- a/classes/Cart.php +++ b/classes/Cart.php @@ -678,25 +678,70 @@ class CartCore extends ObjectModel $cart_shop_context ); - switch (Configuration::get('PS_ROUND_TYPE')) - { - case Order::ROUND_TOTAL: - $row['total'] = $row['price_with_reduction_without_tax'] * (int)$row['cart_quantity']; - $row['total_wt'] = $row['price_with_reduction'] * (int)$row['cart_quantity']; - break; - case Order::ROUND_LINE: - $row['total'] = Tools::ps_round($row['price_with_reduction_without_tax'] * (int)$row['cart_quantity'], _PS_PRICE_COMPUTE_PRECISION_); - $row['total_wt'] = Tools::ps_round($row['price_with_reduction'] * (int)$row['cart_quantity'], _PS_PRICE_COMPUTE_PRECISION_); - break; - case Order::ROUND_ITEM: - default: - $row['total'] = Tools::ps_round($row['price_with_reduction_without_tax'], _PS_PRICE_COMPUTE_PRECISION_) * (int)$row['cart_quantity']; - $row['total_wt'] = Tools::ps_round($row['price_with_reduction'], _PS_PRICE_COMPUTE_PRECISION_) * (int)$row['cart_quantity']; - break; + + /*Before Changes by webkul*/ + // switch (Configuration::get('PS_ROUND_TYPE')) + // { + // case Order::ROUND_TOTAL: + // $row['total'] = $row['price_with_reduction_without_tax'] * (int)$row['cart_quantity']; + // $row['total_wt'] = $row['price_with_reduction'] * (int)$row['cart_quantity']; + // break; + // case Order::ROUND_LINE: + // $row['total'] = Tools::ps_round($row['price_with_reduction_without_tax'] * (int)$row['cart_quantity'], _PS_PRICE_COMPUTE_PRECISION_); + // $row['total_wt'] = Tools::ps_round($row['price_with_reduction'] * (int)$row['cart_quantity'], _PS_PRICE_COMPUTE_PRECISION_); + // break; + + // case Order::ROUND_ITEM: + // default: + // $row['total'] = Tools::ps_round($row['price_with_reduction_without_tax'], _PS_PRICE_COMPUTE_PRECISION_) * (int)$row['cart_quantity']; + // $row['total_wt'] = Tools::ps_round($row['price_with_reduction'], _PS_PRICE_COMPUTE_PRECISION_) * (int)$row['cart_quantity']; + // break; + // } + //$row['price_wt'] = $row['price_with_reduction']; + // + // + /*By Webkul */ + + if (Module::isInstalled('hotelreservationsystem') && Module::isEnabled('hotelreservationsystem')) { + require_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php'; + // by webkul to calculate rates of the product from hotelreservation syatem tables with feature prices.... + $hotelCartBookingData = new HotelCartBookingData(); + $roomTypesByIdProduct = $hotelCartBookingData->getCartInfoIdCartIdProduct($this->id, (int)$row['id_product']); + + // by webkul to calculate rates of the product from hotelreservation syatem tables with feature prices.... + $totalPriceByProductTaxIncl = 0; + $totalPriceByProductTaxExcl = 0; + $priceDisplay = Group::getPriceDisplayMethod(Group::getCurrent()->id); + foreach ($roomTypesByIdProduct as $key => $cartRoomInfo) { + $roomTotalPrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($cartRoomInfo['id_product'], $cartRoomInfo['date_from'], $cartRoomInfo['date_to']); + $totalPriceByProductTaxIncl += $roomTotalPrice['total_price_tax_incl']; + $totalPriceByProductTaxExcl += $roomTotalPrice['total_price_tax_excl']; + } + + switch (Configuration::get('PS_ROUND_TYPE')) + { + case Order::ROUND_TOTAL: + $row['total'] = $totalPriceByProductTaxExcl; + $row['total_wt'] = $totalPriceByProductTaxIncl; + break; + case Order::ROUND_LINE: + $row['total'] = Tools::ps_round($totalPriceByProductTaxExcl, _PS_PRICE_COMPUTE_PRECISION_); + $row['total_wt'] = Tools::ps_round($totalPriceByProductTaxIncl, _PS_PRICE_COMPUTE_PRECISION_); + break; + + case Order::ROUND_ITEM: + default: + $row['total'] = Tools::ps_round($totalPriceByProductTaxExcl, _PS_PRICE_COMPUTE_PRECISION_) * (int)$row['cart_quantity']; + $row['total_wt'] = Tools::ps_round($totalPriceByProductTaxIncl, _PS_PRICE_COMPUTE_PRECISION_) * (int)$row['cart_quantity']; + break; + } } + /*END*/ $row['price_wt'] = $row['price_with_reduction']; + + $row['description_short'] = Tools::nl2br($row['description_short']); // check if a image associated with the attribute exists @@ -1462,7 +1507,6 @@ class CartCore extends ObjectModel $products_total = array(); $ecotax_total = 0; - foreach ($products as $product) // products refer to the cart details { if ($virtual_context->shop->id != $product['id_shop']) @@ -1517,21 +1561,47 @@ class CartCore extends ObjectModel if (!isset($products_total[$id_tax_rules_group.'_'.$id_address])) $products_total[$id_tax_rules_group.'_'.$id_address] = 0; + + // by webkul to calculate rates of the product from hotelreservation syatem tables with feature prices.... + $hotelCartBookingData = new HotelCartBookingData(); + $roomTypesByIdProduct = $hotelCartBookingData->getCartInfoIdCartIdProduct($this->id, $product['id_product']); + + $totalPriceByProduct = 0; + $priceDisplay = Group::getPriceDisplayMethod(Group::getCurrent()->id); + foreach ($roomTypesByIdProduct as $key => $cartRoomInfo) { + $roomTotalPrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($cartRoomInfo['id_product'], $cartRoomInfo['date_from'], $cartRoomInfo['date_to']); + if ($with_taxes) { + $totalPriceByProduct += $roomTotalPrice['total_price_tax_incl']; + } else { + $totalPriceByProduct += $roomTotalPrice['total_price_tax_excl']; + } + } + switch ($ps_round_type) { case Order::ROUND_TOTAL: - $products_total[$id_tax_rules_group.'_'.$id_address] += $price * (int)$product['cart_quantity']; + // before + //$products_total[$id_tax_rules_group.'_'.$id_address] += $price * (int)$product['cart_quantity']; + //by webkul + $products_total[$id_tax_rules_group.'_'.$id_address] += $totalPriceByProduct; break; case Order::ROUND_LINE: - $product_price = $price * $product['cart_quantity']; + //Before + //$product_price = $price * $product['cart_quantity']; + //By webkul + $product_price = $totalPriceByProduct; $products_total[$id_tax_rules_group] += Tools::ps_round($product_price, $compute_precision); break; case Order::ROUND_ITEM: default: - $product_price = /*$with_taxes ? $tax_calculator->addTaxes($price) : */$price; - $products_total[$id_tax_rules_group] += Tools::ps_round($product_price, $compute_precision) * (int)$product['cart_quantity']; + //Before + //$product_price = /*$with_taxes ? $tax_calculator->addTaxes($price) : */$price; + //$products_total[$id_tax_rules_group] += Tools::ps_round($product_price, $compute_precision) * (int)$product['cart_quantity']; + // By Webkul + $product_price = $totalPriceByProduct; + $products_total[$id_tax_rules_group] += Tools::ps_round($product_price, $compute_precision); break; } } diff --git a/classes/PaymentModule.php b/classes/PaymentModule.php index 48f24044a..f4f666f20 100644 --- a/classes/PaymentModule.php +++ b/classes/PaymentModule.php @@ -26,1097 +26,1098 @@ abstract class PaymentModuleCore extends Module { - /** @var int Current order's id */ - public $currentOrder; - public $currencies = true; - public $currencies_mode = 'checkbox'; + /** @var int Current order's id */ + public $currentOrder; + public $currencies = true; + public $currencies_mode = 'checkbox'; - const DEBUG_MODE = false; + const DEBUG_MODE = false; - public function install() - { - if (!parent::install()) - return false; + public function install() + { + if (!parent::install()) { + return false; + } - // Insert currencies availability - if ($this->currencies_mode == 'checkbox') - { - if (!$this->addCheckboxCurrencyRestrictionsForModule()) - return false; - } - elseif ($this->currencies_mode == 'radio') - { - if (!$this->addRadioCurrencyRestrictionsForModule()) - return false; - } - else - Tools::displayError('No currency mode for payment module'); + // Insert currencies availability + if ($this->currencies_mode == 'checkbox') { + if (!$this->addCheckboxCurrencyRestrictionsForModule()) { + return false; + } + } elseif ($this->currencies_mode == 'radio') { + if (!$this->addRadioCurrencyRestrictionsForModule()) { + return false; + } + } else { + Tools::displayError('No currency mode for payment module'); + } - // Insert countries availability - $return = $this->addCheckboxCountryRestrictionsForModule(); + // Insert countries availability + $return = $this->addCheckboxCountryRestrictionsForModule(); - if (!Configuration::get('CONF_'.strtoupper($this->name).'_FIXED')) - Configuration::updateValue('CONF_'.strtoupper($this->name).'_FIXED', '0.2'); - if (!Configuration::get('CONF_'.strtoupper($this->name).'_VAR')) - Configuration::updateValue('CONF_'.strtoupper($this->name).'_VAR', '2'); - if (!Configuration::get('CONF_'.strtoupper($this->name).'_FIXED_FOREIGN')) - Configuration::updateValue('CONF_'.strtoupper($this->name).'_FIXED_FOREIGN', '0.2'); - if (!Configuration::get('CONF_'.strtoupper($this->name).'_VAR_FOREIGN')) - Configuration::updateValue('CONF_'.strtoupper($this->name).'_VAR_FOREIGN', '2'); + if (!Configuration::get('CONF_'.strtoupper($this->name).'_FIXED')) { + Configuration::updateValue('CONF_'.strtoupper($this->name).'_FIXED', '0.2'); + } + if (!Configuration::get('CONF_'.strtoupper($this->name).'_VAR')) { + Configuration::updateValue('CONF_'.strtoupper($this->name).'_VAR', '2'); + } + if (!Configuration::get('CONF_'.strtoupper($this->name).'_FIXED_FOREIGN')) { + Configuration::updateValue('CONF_'.strtoupper($this->name).'_FIXED_FOREIGN', '0.2'); + } + if (!Configuration::get('CONF_'.strtoupper($this->name).'_VAR_FOREIGN')) { + Configuration::updateValue('CONF_'.strtoupper($this->name).'_VAR_FOREIGN', '2'); + } - return $return; - } + return $return; + } - public function uninstall() - { - if (!Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'module_country` WHERE id_module = '.(int)$this->id) - || !Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'module_currency` WHERE id_module = '.(int)$this->id) - || !Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'module_group` WHERE id_module = '.(int)$this->id)) - return false; - return parent::uninstall(); - } + public function uninstall() + { + if (!Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'module_country` WHERE id_module = '.(int)$this->id) + || !Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'module_currency` WHERE id_module = '.(int)$this->id) + || !Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.'module_group` WHERE id_module = '.(int)$this->id)) { + return false; + } + return parent::uninstall(); + } - /** - * Add checkbox currency restrictions for a new module - * @param array $shops - * - * @return bool - */ - public function addCheckboxCurrencyRestrictionsForModule(array $shops = array()) - { - if (!$shops) - $shops = Shop::getShops(true, null, true); + /** + * Add checkbox currency restrictions for a new module + * @param array $shops + * + * @return bool + */ + public function addCheckboxCurrencyRestrictionsForModule(array $shops = array()) + { + if (!$shops) { + $shops = Shop::getShops(true, null, true); + } - foreach ($shops as $s) - { - if (!Db::getInstance()->execute(' + foreach ($shops as $s) { + if (!Db::getInstance()->execute(' INSERT INTO `'._DB_PREFIX_.'module_currency` (`id_module`, `id_shop`, `id_currency`) - SELECT '.(int)$this->id.', "'.(int)$s.'", `id_currency` FROM `'._DB_PREFIX_.'currency` WHERE deleted = 0')) - return false; - } - return true; - } - - /** - * Add radio currency restrictions for a new module - * @param array $shops - * - * @return bool - */ - public function addRadioCurrencyRestrictionsForModule(array $shops = array()) - { - if (!$shops) - $shops = Shop::getShops(true, null, true); - - foreach ($shops as $s) - if (!Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'module_currency` (`id_module`, `id_shop`, `id_currency`) - VALUES ('.(int)$this->id.', "'.(int)$s.'", -2)')) - return false; - return true; - } - - /** - * Add checkbox country restrictions for a new module - * @param array $shops - * - * @return bool - */ - public function addCheckboxCountryRestrictionsForModule(array $shops = array()) - { - $countries = Country::getCountries((int)Context::getContext()->language->id, true); //get only active country - $country_ids = array(); - foreach ($countries as $country) - $country_ids[] = $country['id_country']; - return Country::addModuleRestrictions($shops, $countries, array(array('id_module' => (int)$this->id))); - } - - /** - * Validate an order in database - * Function called from a payment module - * - * @param int $id_cart - * @param int $id_order_state - * @param float $amount_paid Amount really paid by customer (in the default currency) - * @param string $payment_method Payment method (eg. 'Credit card') - * @param null $message Message to attach to order - * @param array $extra_vars - * @param null $currency_special - * @param bool $dont_touch_amount - * @param bool $secure_key - * @param Shop $shop - * - * @return bool - * @throws PrestaShopException - */ - public function validateOrder($id_cart, $id_order_state, $amount_paid, $payment_method = 'Unknown', - $message = null, $extra_vars = array(), $currency_special = null, $dont_touch_amount = false, - $secure_key = false, Shop $shop = null) - { - if (self::DEBUG_MODE) - PrestaShopLogger::addLog('PaymentModule::validateOrder - Function called', 1, null, 'Cart', (int)$id_cart, true); - - if (!isset($this->context)) - $this->context = Context::getContext(); - $this->context->cart = new Cart($id_cart); - $this->context->customer = new Customer($this->context->cart->id_customer); - // The tax cart is loaded before the customer so re-cache the tax calculation method - $this->context->cart->setTaxCalculationMethod(); - - $this->context->language = new Language($this->context->cart->id_lang); - $this->context->shop = ($shop ? $shop : new Shop($this->context->cart->id_shop)); - ShopUrl::resetMainDomainCache(); - $id_currency = $currency_special ? (int)$currency_special : (int)$this->context->cart->id_currency; - $this->context->currency = new Currency($id_currency, null, $this->context->shop->id); - if (Configuration::get('PS_TAX_ADDRESS_TYPE') == 'id_address_delivery') - $context_country = $this->context->country; - - $order_status = new OrderState((int)$id_order_state, (int)$this->context->language->id); - if (!Validate::isLoadedObject($order_status)) - { - PrestaShopLogger::addLog('PaymentModule::validateOrder - Order Status cannot be loaded', 3, null, 'Cart', (int)$id_cart, true); - throw new PrestaShopException('Can\'t load Order status'); - } - - if (!$this->active) - { - PrestaShopLogger::addLog('PaymentModule::validateOrder - Module is not active', 3, null, 'Cart', (int)$id_cart, true); - die(Tools::displayError()); - } - - // Does order already exists ? - if (Validate::isLoadedObject($this->context->cart) && $this->context->cart->OrderExists() == false) - { - if ($secure_key !== false && $secure_key != $this->context->cart->secure_key) - { - PrestaShopLogger::addLog('PaymentModule::validateOrder - Secure key does not match', 3, null, 'Cart', (int)$id_cart, true); - die(Tools::displayError()); - } - - // For each package, generate an order - $delivery_option_list = $this->context->cart->getDeliveryOptionList(); - $package_list = $this->context->cart->getPackageList(); - $cart_delivery_option = $this->context->cart->getDeliveryOption(); - - // If some delivery options are not defined, or not valid, use the first valid option - foreach ($delivery_option_list as $id_address => $package) - if (!isset($cart_delivery_option[$id_address]) || !array_key_exists($cart_delivery_option[$id_address], $package)) - foreach ($package as $key => $val) - { - $cart_delivery_option[$id_address] = $key; - break; - } - - $order_list = array(); - $order_detail_list = array(); - - do - $reference = Order::generateReference(); - while (Order::getByReference($reference)->count()); - - $this->currentOrderReference = $reference; - - $order_creation_failed = false; - $cart_total_paid = (float)Tools::ps_round((float)$this->context->cart->getOrderTotal(true, Cart::BOTH), 2); - - /* Total cart total in case of Advance Payment By webkul*/ - $freeAdvancePaymentOrder = false; - if (Module::isInstalled('hotelreservationsystem')) - { - require_once (_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); - $obj_adv_pmt = new HotelAdvancedPayment(); - $freeAdvancePaymentOrder = $obj_adv_pmt->_checkFreeAdvancePaymentOrder(); - if ($freeAdvancePaymentOrder) { - $cart_total_paid = 0; - } - } - /*END*/ - - foreach ($cart_delivery_option as $id_address => $key_carriers) - foreach ($delivery_option_list[$id_address][$key_carriers]['carrier_list'] as $id_carrier => $data) - foreach ($data['package_list'] as $id_package) - { - // Rewrite the id_warehouse - $package_list[$id_address][$id_package]['id_warehouse'] = (int)$this->context->cart->getPackageIdWarehouse($package_list[$id_address][$id_package], (int)$id_carrier); - $package_list[$id_address][$id_package]['id_carrier'] = $id_carrier; - } - // Make sure CartRule caches are empty - CartRule::cleanCache(); - $cart_rules = $this->context->cart->getCartRules(); - foreach ($cart_rules as $cart_rule) - { - if (($rule = new CartRule((int)$cart_rule['obj']->id)) && Validate::isLoadedObject($rule)) - { - if ($error = $rule->checkValidity($this->context, true, true)) - { - $this->context->cart->removeCartRule((int)$rule->id); - if (isset($this->context->cookie) && isset($this->context->cookie->id_customer) && $this->context->cookie->id_customer && !empty($rule->code)) - { - if (Configuration::get('PS_ORDER_PROCESS_TYPE') == 1) - Tools::redirect('index.php?controller=order-opc&submitAddDiscount=1&discount_name='.urlencode($rule->code)); - Tools::redirect('index.php?controller=order&submitAddDiscount=1&discount_name='.urlencode($rule->code)); - } - else - { - $rule_name = isset($rule->name[(int)$this->context->cart->id_lang]) ? $rule->name[(int)$this->context->cart->id_lang] : $rule->code; - $error = sprintf(Tools::displayError('CartRule ID %1s (%2s) used in this cart is not valid and has been withdrawn from cart'), (int)$rule->id, $rule_name); - PrestaShopLogger::addLog($error, 3, '0000002', 'Cart', (int)$this->context->cart->id); - } - } - } - } - - foreach ($package_list as $id_address => $packageByAddress) - foreach ($packageByAddress as $id_package => $package) - { - /** @var Order $order */ - $order = new Order(); - $order->product_list = $package['product_list']; - - if (Configuration::get('PS_TAX_ADDRESS_TYPE') == 'id_address_delivery') - { - $address = new Address($id_address); - $this->context->country = new Country($address->id_country, $this->context->cart->id_lang); - if (!$this->context->country->active) - throw new PrestaShopException('The delivery address country is not active.'); - } - - $carrier = null; - if (!$this->context->cart->isVirtualCart() && isset($package['id_carrier'])) - { - $carrier = new Carrier($package['id_carrier'], $this->context->cart->id_lang); - $order->id_carrier = (int)$carrier->id; - $id_carrier = (int)$carrier->id; - } - else - { - $order->id_carrier = 0; - $id_carrier = 0; - } - $order->id_customer = (int)$this->context->cart->id_customer; - $order->id_address_invoice = (int)$this->context->cart->id_address_invoice; - $order->id_address_delivery = (int)$id_address; - $order->id_currency = $this->context->currency->id; - $order->id_lang = (int)$this->context->cart->id_lang; - $order->id_cart = (int)$this->context->cart->id; - $order->reference = $reference; - $order->id_shop = (int)$this->context->shop->id; - $order->id_shop_group = (int)$this->context->shop->id_shop_group; - - $order->secure_key = ($secure_key ? pSQL($secure_key) : pSQL($this->context->customer->secure_key)); - $order->payment = $payment_method; - if (isset($this->name)) - $order->module = $this->name; - $order->recyclable = $this->context->cart->recyclable; - $order->gift = (int)$this->context->cart->gift; - $order->gift_message = $this->context->cart->gift_message; - $order->mobile_theme = $this->context->cart->mobile_theme; - $order->conversion_rate = $this->context->currency->conversion_rate; - $amount_paid = !$dont_touch_amount ? Tools::ps_round((float)$amount_paid, 2) : $amount_paid; - $order->total_paid_real = 0; - - $order->total_products = (float)$this->context->cart->getOrderTotal(false, Cart::ONLY_PRODUCTS, $order->product_list, $id_carrier); - $order->total_products_wt = (float)$this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS, $order->product_list, $id_carrier); - $order->total_discounts_tax_excl = (float)abs($this->context->cart->getOrderTotal(false, Cart::ONLY_DISCOUNTS, $order->product_list, $id_carrier)); - $order->total_discounts_tax_incl = (float)abs($this->context->cart->getOrderTotal(true, Cart::ONLY_DISCOUNTS, $order->product_list, $id_carrier)); - $order->total_discounts = $order->total_discounts_tax_incl; - - $order->total_shipping_tax_excl = (float)$this->context->cart->getPackageShippingCost((int)$id_carrier, false, null, $order->product_list); - $order->total_shipping_tax_incl = (float)$this->context->cart->getPackageShippingCost((int)$id_carrier, true, null, $order->product_list); - $order->total_shipping = $order->total_shipping_tax_incl; - - if (!is_null($carrier) && Validate::isLoadedObject($carrier)) - $order->carrier_tax_rate = $carrier->getTaxesRate(new Address($this->context->cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')})); - - $order->total_wrapping_tax_excl = (float)abs($this->context->cart->getOrderTotal(false, Cart::ONLY_WRAPPING, $order->product_list, $id_carrier)); - $order->total_wrapping_tax_incl = (float)abs($this->context->cart->getOrderTotal(true, Cart::ONLY_WRAPPING, $order->product_list, $id_carrier)); - $order->total_wrapping = $order->total_wrapping_tax_incl; - - $order->total_paid_tax_excl = (float)Tools::ps_round((float)$this->context->cart->getOrderTotal(false, Cart::BOTH, $order->product_list, $id_carrier), _PS_PRICE_COMPUTE_PRECISION_); - $order->total_paid_tax_incl = (float)Tools::ps_round((float)$this->context->cart->getOrderTotal(true, Cart::BOTH, $order->product_list, $id_carrier), _PS_PRICE_COMPUTE_PRECISION_); - $order->total_paid = $order->total_paid_tax_incl; - $order->round_mode = Configuration::get('PS_PRICE_ROUND_MODE'); - $order->round_type = Configuration::get('PS_ROUND_TYPE'); - - $order->invoice_date = '0000-00-00 00:00:00'; - $order->delivery_date = '0000-00-00 00:00:00'; - - if (self::DEBUG_MODE) - PrestaShopLogger::addLog('PaymentModule::validateOrder - Order is about to be added', 1, null, 'Cart', (int)$id_cart, true); - - // Creating order - $result = $order->add(); - - if (!$result) - { - PrestaShopLogger::addLog('PaymentModule::validateOrder - Order cannot be created', 3, null, 'Cart', (int)$id_cart, true); - throw new PrestaShopException('Can\'t save Order'); - } - - // Amount paid by customer is not the right one -> Status = payment error - // We don't use the following condition to avoid the float precision issues : http://www.php.net/manual/en/language.types.float.php - // if ($order->total_paid != $order->total_paid_real) - // We use number_format in order to compare two string - if ($order_status->logable && number_format($cart_total_paid, _PS_PRICE_COMPUTE_PRECISION_) != number_format($amount_paid, _PS_PRICE_COMPUTE_PRECISION_)) - $id_order_state = Configuration::get('PS_OS_ERROR'); - - $order_list[] = $order; - - if (self::DEBUG_MODE) - PrestaShopLogger::addLog('PaymentModule::validateOrder - OrderDetail is about to be added', 1, null, 'Cart', (int)$id_cart, true); - - // Insert new Order detail list using cart for the current order - $order_detail = new OrderDetail(null, null, $this->context); - $order_detail->createList($order, $this->context->cart, $id_order_state, $order->product_list, 0, true, $package_list[$id_address][$id_package]['id_warehouse']); - $order_detail_list[] = $order_detail; - - if (self::DEBUG_MODE) - PrestaShopLogger::addLog('PaymentModule::validateOrder - OrderCarrier is about to be added', 1, null, 'Cart', (int)$id_cart, true); - - // Adding an entry in order_carrier table - if (!is_null($carrier)) - { - $order_carrier = new OrderCarrier(); - $order_carrier->id_order = (int)$order->id; - $order_carrier->id_carrier = (int)$id_carrier; - $order_carrier->weight = (float)$order->getTotalWeight(); - $order_carrier->shipping_cost_tax_excl = (float)$order->total_shipping_tax_excl; - $order_carrier->shipping_cost_tax_incl = (float)$order->total_shipping_tax_incl; - $order_carrier->add(); - } - } - - // The country can only change if the address used for the calculation is the delivery address, and if multi-shipping is activated - if (Configuration::get('PS_TAX_ADDRESS_TYPE') == 'id_address_delivery') - $this->context->country = $context_country; - - if (!$this->context->country->active) - { - PrestaShopLogger::addLog('PaymentModule::validateOrder - Country is not active', 3, null, 'Cart', (int)$id_cart, true); - throw new PrestaShopException('The order address country is not active.'); - } - - if (self::DEBUG_MODE) - PrestaShopLogger::addLog('PaymentModule::validateOrder - Payment is about to be added', 1, null, 'Cart', (int)$id_cart, true); - - // Register Payment only if the order status validate the order - if ($order_status->logable) - { - // $order is the last order loop in the foreach - // The method addOrderPayment of the class Order make a create a paymentOrder - // linked to the order reference and not to the order id - if (isset($extra_vars['transaction_id'])) - $transaction_id = $extra_vars['transaction_id']; - else - $transaction_id = null; - - if (!$order->addOrderPayment($amount_paid, null, $transaction_id)) - { - PrestaShopLogger::addLog('PaymentModule::validateOrder - Cannot save Order Payment', 3, null, 'Cart', (int)$id_cart, true); - throw new PrestaShopException('Can\'t save Order Payment'); - } - } - - // Next ! - $only_one_gift = false; - $cart_rule_used = array(); - $products = $this->context->cart->getProducts(); - - // Make sure CartRule caches are empty - CartRule::cleanCache(); - foreach ($order_detail_list as $key => $order_detail) - { - /** @var OrderDetail $order_detail */ - - $order = $order_list[$key]; - if (!$order_creation_failed && isset($order->id)) - { - if (!$secure_key) - $message .= '
'.Tools::displayError('Warning: the secure key is empty, check your payment account before validation'); - // Optional message to attach to this order - if (isset($message) & !empty($message)) - { - $msg = new Message(); - $message = strip_tags($message, '
'); - if (Validate::isCleanHtml($message)) - { - if (self::DEBUG_MODE) - PrestaShopLogger::addLog('PaymentModule::validateOrder - Message is about to be added', 1, null, 'Cart', (int)$id_cart, true); - $msg->message = $message; - $msg->id_cart = (int)$id_cart; - $msg->id_customer = intval($order->id_customer); - $msg->id_order = intval($order->id); - $msg->private = 1; - $msg->add(); - } - } - - // Insert new Order detail list using cart for the current order - //$orderDetail = new OrderDetail(null, null, $this->context); - //$orderDetail->createList($order, $this->context->cart, $id_order_state); - - // Construct order detail table for the email - $products_list = ''; - $virtual_product = true; - - $product_var_tpl_list = array(); - foreach ($order->product_list as $product) - { - $price = Product::getPriceStatic((int)$product['id_product'], false, ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), 6, null, false, true, $product['cart_quantity'], false, (int)$order->id_customer, (int)$order->id_cart, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); - $price_wt = Product::getPriceStatic((int)$product['id_product'], true, ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), 2, null, false, true, $product['cart_quantity'], false, (int)$order->id_customer, (int)$order->id_cart, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); - - $product_price = Product::getTaxCalculationMethod() == PS_TAX_EXC ? Tools::ps_round($price, 2) : $price_wt; - - $product_var_tpl = array( - 'reference' => $product['reference'], - 'name' => $product['name'].(isset($product['attributes']) ? ' - '.$product['attributes'] : ''), - 'unit_price' => Tools::displayPrice($product_price, $this->context->currency, false), - 'price' => Tools::displayPrice($product_price * $product['quantity'], $this->context->currency, false), - 'quantity' => $product['quantity'], - 'customization' => array() - ); - - $customized_datas = Product::getAllCustomizedDatas((int)$order->id_cart); - if (isset($customized_datas[$product['id_product']][$product['id_product_attribute']])) - { - $product_var_tpl['customization'] = array(); - foreach ($customized_datas[$product['id_product']][$product['id_product_attribute']][$order->id_address_delivery] as $customization) - { - $customization_text = ''; - if (isset($customization['datas'][Product::CUSTOMIZE_TEXTFIELD])) - foreach ($customization['datas'][Product::CUSTOMIZE_TEXTFIELD] as $text) - $customization_text .= $text['name'].': '.$text['value'].'
'; - - if (isset($customization['datas'][Product::CUSTOMIZE_FILE])) - $customization_text .= sprintf(Tools::displayError('%d image(s)'), count($customization['datas'][Product::CUSTOMIZE_FILE])).'
'; - - $customization_quantity = (int)$product['customization_quantity']; - - $product_var_tpl['customization'][] = array( - 'customization_text' => $customization_text, - 'customization_quantity' => $customization_quantity, - 'quantity' => Tools::displayPrice($customization_quantity * $product_price, $this->context->currency, false) - ); - } - } - - $product_var_tpl_list[] = $product_var_tpl; - // Check if is not a virutal product for the displaying of shipping - if (!$product['is_virtual']) - $virtual_product &= false; - - } // end foreach ($products) - - $product_list_txt = ''; - $product_list_html = ''; - if (count($product_var_tpl_list) > 0) - { - $product_list_txt = $this->getEmailTemplateContent('order_conf_product_list.txt', Mail::TYPE_TEXT, $product_var_tpl_list); - $product_list_html = $this->getEmailTemplateContent('order_conf_product_list.tpl', Mail::TYPE_HTML, $product_var_tpl_list); - } - - $cart_rules_list = array(); - $total_reduction_value_ti = 0; - $total_reduction_value_tex = 0; - foreach ($cart_rules as $cart_rule) - { - $package = array('id_carrier' => $order->id_carrier, 'id_address' => $order->id_address_delivery, 'products' => $order->product_list); - $values = array( - 'tax_incl' => $cart_rule['obj']->getContextualValue(true, $this->context, CartRule::FILTER_ACTION_ALL_NOCAP, $package), - 'tax_excl' => $cart_rule['obj']->getContextualValue(false, $this->context, CartRule::FILTER_ACTION_ALL_NOCAP, $package) - ); - - // If the reduction is not applicable to this order, then continue with the next one - if (!$values['tax_excl']) - continue; - - // IF - // This is not multi-shipping - // The value of the voucher is greater than the total of the order - // Partial use is allowed - // This is an "amount" reduction, not a reduction in % or a gift - // THEN - // The voucher is cloned with a new value corresponding to the remainder - if (count($order_list) == 1 && $values['tax_incl'] > ($order->total_products_wt - $total_reduction_value_ti) && $cart_rule['obj']->partial_use == 1 && $cart_rule['obj']->reduction_amount > 0) - { - // Create a new voucher from the original - $voucher = new CartRule($cart_rule['obj']->id); // We need to instantiate the CartRule without lang parameter to allow saving it - unset($voucher->id); - - // Set a new voucher code - $voucher->code = empty($voucher->code) ? substr(md5($order->id.'-'.$order->id_customer.'-'.$cart_rule['obj']->id), 0, 16) : $voucher->code.'-2'; - if (preg_match('/\-([0-9]{1,2})\-([0-9]{1,2})$/', $voucher->code, $matches) && $matches[1] == $matches[2]) - $voucher->code = preg_replace('/'.$matches[0].'$/', '-'.(intval($matches[1]) + 1), $voucher->code); - - // Set the new voucher value - if ($voucher->reduction_tax) - { - $voucher->reduction_amount = ($total_reduction_value_ti + $values['tax_incl']) - $order->total_products_wt; - - // Add total shipping amout only if reduction amount > total shipping - if ($voucher->free_shipping == 1 && $voucher->reduction_amount >= $order->total_shipping_tax_incl) - $voucher->reduction_amount -= $order->total_shipping_tax_incl; - } - else - { - $voucher->reduction_amount = ($total_reduction_value_tex + $values['tax_excl']) - $order->total_products; - - // Add total shipping amout only if reduction amount > total shipping - if ($voucher->free_shipping == 1 && $voucher->reduction_amount >= $order->total_shipping_tax_excl) - $voucher->reduction_amount -= $order->total_shipping_tax_excl; - } - if ($voucher->reduction_amount <= 0) - continue; - - if ($this->context->customer->isGuest()) - $voucher->id_customer = 0; - else - $voucher->id_customer = $order->id_customer; - - $voucher->quantity = 1; - $voucher->quantity_per_user = 1; - $voucher->free_shipping = 0; - if ($voucher->add()) - { - // If the voucher has conditions, they are now copied to the new voucher - CartRule::copyConditions($cart_rule['obj']->id, $voucher->id); - - $params = array( - '{voucher_amount}' => Tools::displayPrice($voucher->reduction_amount, $this->context->currency, false), - '{voucher_num}' => $voucher->code, - '{firstname}' => $this->context->customer->firstname, - '{lastname}' => $this->context->customer->lastname, - '{id_order}' => $order->reference, - '{order_name}' => $order->getUniqReference() - ); - Mail::Send( - (int)$order->id_lang, - 'voucher', - sprintf(Mail::l('New voucher for your order %s', (int)$order->id_lang), $order->reference), - $params, - $this->context->customer->email, - $this->context->customer->firstname.' '.$this->context->customer->lastname, - null, null, null, null, _PS_MAIL_DIR_, false, (int)$order->id_shop - ); - } - - $values['tax_incl'] = $order->total_products_wt - $total_reduction_value_ti; - $values['tax_excl'] = $order->total_products - $total_reduction_value_tex; - - } - $total_reduction_value_ti += $values['tax_incl']; - $total_reduction_value_tex += $values['tax_excl']; - - $order->addCartRule($cart_rule['obj']->id, $cart_rule['obj']->name, $values, 0, $cart_rule['obj']->free_shipping); - - if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED') && !in_array($cart_rule['obj']->id, $cart_rule_used)) - { - $cart_rule_used[] = $cart_rule['obj']->id; - - // Create a new instance of Cart Rule without id_lang, in order to update its quantity - $cart_rule_to_update = new CartRule($cart_rule['obj']->id); - $cart_rule_to_update->quantity = max(0, $cart_rule_to_update->quantity - 1); - $cart_rule_to_update->update(); - } - - $cart_rules_list[] = array( - 'voucher_name' => $cart_rule['obj']->name, - 'voucher_reduction' => ($values['tax_incl'] != 0.00 ? '-' : '').Tools::displayPrice($values['tax_incl'], $this->context->currency, false) - ); - } - - $cart_rules_list_txt = ''; - $cart_rules_list_html = ''; - if (count($cart_rules_list) > 0) - { - $cart_rules_list_txt = $this->getEmailTemplateContent('order_conf_cart_rules.txt', Mail::TYPE_TEXT, $cart_rules_list); - $cart_rules_list_html = $this->getEmailTemplateContent('order_conf_cart_rules.tpl', Mail::TYPE_HTML, $cart_rules_list); - } - - // Specify order id for message - $old_message = Message::getMessageByCartId((int)$this->context->cart->id); - if ($old_message) - { - $update_message = new Message((int)$old_message['id_message']); - $update_message->id_order = (int)$order->id; - $update_message->update(); - - // Add this message in the customer thread - $customer_thread = new CustomerThread(); - $customer_thread->id_contact = 0; - $customer_thread->id_customer = (int)$order->id_customer; - $customer_thread->id_shop = (int)$this->context->shop->id; - $customer_thread->id_order = (int)$order->id; - $customer_thread->id_lang = (int)$this->context->language->id; - $customer_thread->email = $this->context->customer->email; - $customer_thread->status = 'open'; - $customer_thread->token = Tools::passwdGen(12); - $customer_thread->add(); - - $customer_message = new CustomerMessage(); - $customer_message->id_customer_thread = $customer_thread->id; - $customer_message->id_employee = 0; - $customer_message->message = $update_message->message; - $customer_message->private = 0; - - if (!$customer_message->add()) - $this->errors[] = Tools::displayError('An error occurred while saving message'); - } - - if (self::DEBUG_MODE) - PrestaShopLogger::addLog('PaymentModule::validateOrder - Hook validateOrder is about to be called', 1, null, 'Cart', (int)$id_cart, true); - - // Hook validate order - Hook::exec('actionValidateOrder', array( - 'cart' => $this->context->cart, - 'order' => $order, - 'customer' => $this->context->customer, - 'currency' => $this->context->currency, - 'orderStatus' => $order_status - )); - - foreach ($this->context->cart->getProducts() as $product) - if ($order_status->logable) - ProductSale::addProductSale((int)$product['id_product'], (int)$product['cart_quantity']); - - if (self::DEBUG_MODE) - PrestaShopLogger::addLog('PaymentModule::validateOrder - Order Status is about to be added', 1, null, 'Cart', (int)$id_cart, true); - - // Set the order status - $new_history = new OrderHistory(); - $new_history->id_order = (int)$order->id; - $new_history->changeIdOrderState((int)$id_order_state, $order, true); - $new_history->addWithemail(true, $extra_vars); - - // Switch to back order if needed - if (Configuration::get('PS_STOCK_MANAGEMENT') && $order_detail->getStockState()) - { - $history = new OrderHistory(); - $history->id_order = (int)$order->id; - $history->changeIdOrderState(Configuration::get($order->valid ? 'PS_OS_OUTOFSTOCK_PAID' : 'PS_OS_OUTOFSTOCK_UNPAID'), $order, true); - $history->addWithemail(); - } - - unset($order_detail); - - // Order is reloaded because the status just changed - $order = new Order($order->id); - - // Send an e-mail to customer (one order = one email) - if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED') && $this->context->customer->id) - { - $invoice = new Address($order->id_address_invoice); - $delivery = new Address($order->id_address_delivery); - $delivery_state = $delivery->id_state ? new State($delivery->id_state) : false; - $invoice_state = $invoice->id_state ? new State($invoice->id_state) : false; - - //by webkul changing mail format - $cart_booking_data = $this->cartBookingDataForMail($order); - $cart_booking_data_text = $this->getEmailTemplateContent('hotel-booking-cart-data.text', Mail::TYPE_TEXT, $cart_booking_data); - $cart_booking_data_html = $this->getEmailTemplateContent('hotel-booking-cart-data.tpl', Mail::TYPE_HTML, $cart_booking_data); - - //For Advanced Payment - $obj_customer_adv = new HotelCustomerAdvancedPayment(); - $order_adv_dtl = $obj_customer_adv->getCstAdvPaymentDtlByIdOrder($order->id); - if ($order_adv_dtl) - { - $order_adv_dtl['total_due_amount'] = $order_adv_dtl['total_order_amount'] - $order_adv_dtl['total_paid_amount']; - - $order_adv_dtl['total_paid_amount'] = Tools::displayPrice($order_adv_dtl['total_paid_amount'], $this->context->currency, false); - $order_adv_dtl['total_order_amount'] = Tools::displayPrice($order_adv_dtl['total_order_amount'], $this->context->currency, false); - $order_adv_dtl['total_due_amount'] = Tools::displayPrice($order_adv_dtl['total_due_amount'], $this->context->currency, false); - } - - $adv_data_html = $this->getEmailTemplateContent('advanced-book-data.tpl', Mail::TYPE_HTML, $order_adv_dtl); - $adv_data_text = $this->getEmailTemplateContent('advanced-book-data.txt', Mail::TYPE_TEXT, $order_adv_dtl); - - $data = array( - '{adv_data_html}' => $adv_data_html,//by webkul - '{adv_data_text}' => $adv_data_text,//by webkul - '{cart_booking_data_html}' => $cart_booking_data_html,//by webkul - '{firstname}' => $this->context->customer->firstname, - '{lastname}' => $this->context->customer->lastname, - '{email}' => $this->context->customer->email, - '{delivery_block_txt}' => $this->_getFormatedAddress($delivery, "\n"), - '{invoice_block_txt}' => $this->_getFormatedAddress($invoice, "\n"), - '{delivery_block_html}' => $this->_getFormatedAddress($delivery, '
', array( - 'firstname' => '%s', - 'lastname' => '%s' - )), - '{invoice_block_html}' => $this->_getFormatedAddress($invoice, '
', array( - 'firstname' => '%s', - 'lastname' => '%s' - )), - '{delivery_company}' => $delivery->company, - '{delivery_firstname}' => $delivery->firstname, - '{delivery_lastname}' => $delivery->lastname, - '{delivery_address1}' => $delivery->address1, - '{delivery_address2}' => $delivery->address2, - '{delivery_city}' => $delivery->city, - '{delivery_postal_code}' => $delivery->postcode, - '{delivery_country}' => $delivery->country, - '{delivery_state}' => $delivery->id_state ? $delivery_state->name : '', - '{delivery_phone}' => ($delivery->phone) ? $delivery->phone : $delivery->phone_mobile, - '{delivery_other}' => $delivery->other, - '{invoice_company}' => $invoice->company, - '{invoice_vat_number}' => $invoice->vat_number, - '{invoice_firstname}' => $invoice->firstname, - '{invoice_lastname}' => $invoice->lastname, - '{invoice_address2}' => $invoice->address2, - '{invoice_address1}' => $invoice->address1, - '{invoice_city}' => $invoice->city, - '{invoice_postal_code}' => $invoice->postcode, - '{invoice_country}' => $invoice->country, - '{invoice_state}' => $invoice->id_state ? $invoice_state->name : '', - '{invoice_phone}' => ($invoice->phone) ? $invoice->phone : $invoice->phone_mobile, - '{invoice_other}' => $invoice->other, - '{order_name}' => $order->getUniqReference(), - '{date}' => Tools::displayDate(date('Y-m-d H:i:s'), null, 1), - '{carrier}' => ($virtual_product || !isset($carrier->name)) ? Tools::displayError('No carrier') : $carrier->name, - '{payment}' => Tools::substr($order->payment, 0, 32), - '{products}' => $product_list_html, - '{products_txt}' => $product_list_txt, - '{discounts}' => $cart_rules_list_html, - '{discounts_txt}' => $cart_rules_list_txt, - '{total_paid}' => Tools::displayPrice($order->total_paid, $this->context->currency, false), - '{total_products}' => Tools::displayPrice(Product::getTaxCalculationMethod() == PS_TAX_EXC ? $order->total_products : $order->total_products_wt, $this->context->currency, false), - '{total_discounts}' => Tools::displayPrice($order->total_discounts, $this->context->currency, false), - '{total_shipping}' => Tools::displayPrice($order->total_shipping, $this->context->currency, false), - '{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $this->context->currency, false), - '{total_tax_paid}' => Tools::displayPrice(($order->total_products_wt - $order->total_products) + ($order->total_shipping_tax_incl - $order->total_shipping_tax_excl), $this->context->currency, false)); - - if (is_array($extra_vars)) - $data = array_merge($data, $extra_vars); - - // Join PDF invoice - if ((int)Configuration::get('PS_INVOICE') && $order_status->invoice && $order->invoice_number) - { - $order_invoice_list = $order->getInvoicesCollection(); - Hook::exec('actionPDFInvoiceRender', array('order_invoice_list' => $order_invoice_list)); - $pdf = new PDF($order_invoice_list, PDF::TEMPLATE_INVOICE, $this->context->smarty); - $file_attachement['content'] = $pdf->render(false); - $file_attachement['name'] = Configuration::get('PS_INVOICE_PREFIX', (int)$order->id_lang, null, $order->id_shop).sprintf('%06d', $order->invoice_number).'.pdf'; - $file_attachement['mime'] = 'application/pdf'; - } - else - $file_attachement = null; - - if (self::DEBUG_MODE) - PrestaShopLogger::addLog('PaymentModule::validateOrder - Mail is about to be sent', 1, null, 'Cart', (int)$id_cart, true); - - if (Validate::isEmail($this->context->customer->email)) - Mail::Send( - (int)$order->id_lang, - 'order_conf', - Mail::l('Order confirmation', (int)$order->id_lang), - $data, - $this->context->customer->email, - $this->context->customer->firstname.' '.$this->context->customer->lastname, - null, - null, - $file_attachement, - null, _PS_MAIL_DIR_, false, (int)$order->id_shop - ); - - // ddd('rohit'); - } - - // updates stock in shops - if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) - { - $product_list = $order->getProducts(); - foreach ($product_list as $product) - { - // if the available quantities depends on the physical stock - if (StockAvailable::dependsOnStock($product['product_id'])) - { - // synchronizes - StockAvailable::synchronize($product['product_id'], $order->id_shop); - } - } - } - - $order->updateOrderDetailTax(); - } - else - { - $error = Tools::displayError('Order creation failed'); - PrestaShopLogger::addLog($error, 4, '0000002', 'Cart', intval($order->id_cart)); - die($error); - } - } // End foreach $order_detail_list - - // Use the last order as currentOrder - if (isset($order) && $order->id) - $this->currentOrder = (int)$order->id; - - if (self::DEBUG_MODE) - PrestaShopLogger::addLog('PaymentModule::validateOrder - End of validateOrder', 1, null, 'Cart', (int)$id_cart, true); - - return true; - } - else - { - $error = Tools::displayError('Cart cannot be loaded or an order has already been placed using this cart'); - PrestaShopLogger::addLog($error, 4, '0000001', 'Cart', intval($this->context->cart->id)); - die($error); - } - } - - /** - * @deprecated 1.6.0.7 - * @param mixed $content - * @return mixed - */ - public function formatProductAndVoucherForEmail($content) - { - Tools::displayAsDeprecated(); - return $content; - } - - /** - * @param Object Address $the_address that needs to be txt formated - * @return String the txt formated address block - */ - protected function _getTxtFormatedAddress($the_address) - { - $adr_fields = AddressFormat::getOrderedAddressFields($the_address->id_country, false, true); - $r_values = array(); - foreach ($adr_fields as $fields_line) - { - $tmp_values = array(); - foreach (explode(' ', $fields_line) as $field_item) - { - $field_item = trim($field_item); - $tmp_values[] = $the_address->{$field_item}; - } - $r_values[] = implode(' ', $tmp_values); - } - - $out = implode("\n", $r_values); - return $out; - } - - /** - * @param Object Address $the_address that needs to be txt formated - * @return String the txt formated address block - */ - - protected function _getFormatedAddress(Address $the_address, $line_sep, $fields_style = array()) - { - return AddressFormat::generateAddress($the_address, array('avoid' => array()), $line_sep, ' ', $fields_style); - } - - /** - * @param int $id_currency : this parameter is optionnal but on 1.5 version of Prestashop, it will be REQUIRED - * @return Currency - */ - public function getCurrency($current_id_currency = null) - { - if (!(int)$current_id_currency) - $current_id_currency = Context::getContext()->currency->id; - - if (!$this->currencies) - return false; - if ($this->currencies_mode == 'checkbox') - { - $currencies = Currency::getPaymentCurrencies($this->id); - return $currencies; - } - elseif ($this->currencies_mode == 'radio') - { - $currencies = Currency::getPaymentCurrenciesSpecial($this->id); - $currency = $currencies['id_currency']; - if ($currency == -1) - $id_currency = (int)$current_id_currency; - elseif ($currency == -2) - $id_currency = (int)Configuration::get('PS_CURRENCY_DEFAULT'); - else - $id_currency = $currency; - } - if (!isset($id_currency) || empty($id_currency)) - return false; - $currency = new Currency($id_currency); - return $currency; - } - - /** - * Allows specified payment modules to be used by a specific currency - * - * @since 1.4.5 - * @param int $id_currency - * @param array $id_module_list - * @return bool - */ - public static function addCurrencyPermissions($id_currency, array $id_module_list = array()) - { - $values = ''; - if (count($id_module_list) == 0) - { - // fetch all installed module ids - $modules = PaymentModuleCore::getInstalledPaymentModules(); - foreach ($modules as $module) - $id_module_list[] = $module['id_module']; - } - - foreach ($id_module_list as $id_module) - $values .= '('.(int)$id_module.','.(int)$id_currency.'),'; - - if (!empty($values)) - { - return Db::getInstance()->execute(' + SELECT '.(int)$this->id.', "'.(int)$s.'", `id_currency` FROM `'._DB_PREFIX_.'currency` WHERE deleted = 0')) { + return false; + } + } + return true; + } + + /** + * Add radio currency restrictions for a new module + * @param array $shops + * + * @return bool + */ + public function addRadioCurrencyRestrictionsForModule(array $shops = array()) + { + if (!$shops) { + $shops = Shop::getShops(true, null, true); + } + + foreach ($shops as $s) { + if (!Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'module_currency` (`id_module`, `id_shop`, `id_currency`) + VALUES ('.(int)$this->id.', "'.(int)$s.'", -2)')) { + return false; + } + } + return true; + } + + /** + * Add checkbox country restrictions for a new module + * @param array $shops + * + * @return bool + */ + public function addCheckboxCountryRestrictionsForModule(array $shops = array()) + { + $countries = Country::getCountries((int)Context::getContext()->language->id, true); //get only active country + $country_ids = array(); + foreach ($countries as $country) { + $country_ids[] = $country['id_country']; + } + return Country::addModuleRestrictions($shops, $countries, array(array('id_module' => (int)$this->id))); + } + + /** + * Validate an order in database + * Function called from a payment module + * + * @param int $id_cart + * @param int $id_order_state + * @param float $amount_paid Amount really paid by customer (in the default currency) + * @param string $payment_method Payment method (eg. 'Credit card') + * @param null $message Message to attach to order + * @param array $extra_vars + * @param null $currency_special + * @param bool $dont_touch_amount + * @param bool $secure_key + * @param Shop $shop + * + * @return bool + * @throws PrestaShopException + */ + public function validateOrder($id_cart, $id_order_state, $amount_paid, $payment_method = 'Unknown', + $message = null, $extra_vars = array(), $currency_special = null, $dont_touch_amount = false, + $secure_key = false, Shop $shop = null) + { + if (self::DEBUG_MODE) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Function called', 1, null, 'Cart', (int)$id_cart, true); + } + if (!isset($this->context)) { + $this->context = Context::getContext(); + } + $this->context->cart = new Cart($id_cart); + $this->context->customer = new Customer($this->context->cart->id_customer); + // The tax cart is loaded before the customer so re-cache the tax calculation method + $this->context->cart->setTaxCalculationMethod(); + + $this->context->language = new Language($this->context->cart->id_lang); + $this->context->shop = ($shop ? $shop : new Shop($this->context->cart->id_shop)); + ShopUrl::resetMainDomainCache(); + $id_currency = $currency_special ? (int)$currency_special : (int)$this->context->cart->id_currency; + $this->context->currency = new Currency($id_currency, null, $this->context->shop->id); + if (Configuration::get('PS_TAX_ADDRESS_TYPE') == 'id_address_delivery') { + $context_country = $this->context->country; + } + + $order_status = new OrderState((int)$id_order_state, (int)$this->context->language->id); + if (!Validate::isLoadedObject($order_status)) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Order Status cannot be loaded', 3, null, 'Cart', (int)$id_cart, true); + throw new PrestaShopException('Can\'t load Order status'); + } + if (!$this->active) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Module is not active', 3, null, 'Cart', (int)$id_cart, true); + die(Tools::displayError()); + } + + // Does order already exists ? + if (Validate::isLoadedObject($this->context->cart) && $this->context->cart->OrderExists() == false) { + if ($secure_key !== false && $secure_key != $this->context->cart->secure_key) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Secure key does not match', 3, null, 'Cart', (int)$id_cart, true); + die(Tools::displayError()); + } + + // For each package, generate an order + $delivery_option_list = $this->context->cart->getDeliveryOptionList(); + $package_list = $this->context->cart->getPackageList(); + $cart_delivery_option = $this->context->cart->getDeliveryOption(); + + // If some delivery options are not defined, or not valid, use the first valid option + foreach ($delivery_option_list as $id_address => $package) { + if (!isset($cart_delivery_option[$id_address]) || !array_key_exists($cart_delivery_option[$id_address], $package)) { + foreach ($package as $key => $val) { + $cart_delivery_option[$id_address] = $key; + break; + } + } + } + + $order_list = array(); + $order_detail_list = array(); + + do { + $reference = Order::generateReference(); + } while (Order::getByReference($reference)->count()); + + $this->currentOrderReference = $reference; + + $order_creation_failed = false; + $cart_total_paid = (float)Tools::ps_round((float)$this->context->cart->getOrderTotal(true, Cart::BOTH), 2); + + /* Total cart total in case of Advance Payment By webkul*/ + $freeAdvancePaymentOrder = false; + if (Module::isInstalled('hotelreservationsystem')) { + require_once(_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); + $obj_adv_pmt = new HotelAdvancedPayment(); + $freeAdvancePaymentOrder = $obj_adv_pmt->_checkFreeAdvancePaymentOrder(); + if ($freeAdvancePaymentOrder) { + $cart_total_paid = 0; + } + } + /*END*/ + + foreach ($cart_delivery_option as $id_address => $key_carriers) { + foreach ($delivery_option_list[$id_address][$key_carriers]['carrier_list'] as $id_carrier => $data) { + foreach ($data['package_list'] as $id_package) { + // Rewrite the id_warehouse + $package_list[$id_address][$id_package]['id_warehouse'] = (int)$this->context->cart->getPackageIdWarehouse($package_list[$id_address][$id_package], (int)$id_carrier); + $package_list[$id_address][$id_package]['id_carrier'] = $id_carrier; + } + } + } + // Make sure CartRule caches are empty + CartRule::cleanCache(); + $cart_rules = $this->context->cart->getCartRules(); + foreach ($cart_rules as $cart_rule) { + if (($rule = new CartRule((int)$cart_rule['obj']->id)) && Validate::isLoadedObject($rule)) { + if ($error = $rule->checkValidity($this->context, true, true)) { + $this->context->cart->removeCartRule((int)$rule->id); + if (isset($this->context->cookie) && isset($this->context->cookie->id_customer) && $this->context->cookie->id_customer && !empty($rule->code)) { + if (Configuration::get('PS_ORDER_PROCESS_TYPE') == 1) { + Tools::redirect('index.php?controller=order-opc&submitAddDiscount=1&discount_name='.urlencode($rule->code)); + } + Tools::redirect('index.php?controller=order&submitAddDiscount=1&discount_name='.urlencode($rule->code)); + } else { + $rule_name = isset($rule->name[(int)$this->context->cart->id_lang]) ? $rule->name[(int)$this->context->cart->id_lang] : $rule->code; + $error = sprintf(Tools::displayError('CartRule ID %1s (%2s) used in this cart is not valid and has been withdrawn from cart'), (int)$rule->id, $rule_name); + PrestaShopLogger::addLog($error, 3, '0000002', 'Cart', (int)$this->context->cart->id); + } + } + } + } + + foreach ($package_list as $id_address => $packageByAddress) { + foreach ($packageByAddress as $id_package => $package) { + /** @var Order $order */ + $order = new Order(); + $order->product_list = $package['product_list']; + + if (Configuration::get('PS_TAX_ADDRESS_TYPE') == 'id_address_delivery') { + $address = new Address($id_address); + $this->context->country = new Country($address->id_country, $this->context->cart->id_lang); + if (!$this->context->country->active) { + throw new PrestaShopException('The delivery address country is not active.'); + } + } + + $carrier = null; + if (!$this->context->cart->isVirtualCart() && isset($package['id_carrier'])) { + $carrier = new Carrier($package['id_carrier'], $this->context->cart->id_lang); + $order->id_carrier = (int)$carrier->id; + $id_carrier = (int)$carrier->id; + } else { + $order->id_carrier = 0; + $id_carrier = 0; + } + $order->id_customer = (int)$this->context->cart->id_customer; + $order->id_address_invoice = (int)$this->context->cart->id_address_invoice; + $order->id_address_delivery = (int)$id_address; + $order->id_currency = $this->context->currency->id; + $order->id_lang = (int)$this->context->cart->id_lang; + $order->id_cart = (int)$this->context->cart->id; + $order->reference = $reference; + $order->id_shop = (int)$this->context->shop->id; + $order->id_shop_group = (int)$this->context->shop->id_shop_group; + + $order->secure_key = ($secure_key ? pSQL($secure_key) : pSQL($this->context->customer->secure_key)); + $order->payment = $payment_method; + if (isset($this->name)) { + $order->module = $this->name; + } + $order->recyclable = $this->context->cart->recyclable; + $order->gift = (int)$this->context->cart->gift; + $order->gift_message = $this->context->cart->gift_message; + $order->mobile_theme = $this->context->cart->mobile_theme; + $order->conversion_rate = $this->context->currency->conversion_rate; + $amount_paid = !$dont_touch_amount ? Tools::ps_round((float)$amount_paid, 2) : $amount_paid; + $order->total_paid_real = 0; + + $order->total_products = (float)$this->context->cart->getOrderTotal(false, Cart::ONLY_PRODUCTS, $order->product_list, $id_carrier); + $order->total_products_wt = (float)$this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS, $order->product_list, $id_carrier); + $order->total_discounts_tax_excl = (float)abs($this->context->cart->getOrderTotal(false, Cart::ONLY_DISCOUNTS, $order->product_list, $id_carrier)); + $order->total_discounts_tax_incl = (float)abs($this->context->cart->getOrderTotal(true, Cart::ONLY_DISCOUNTS, $order->product_list, $id_carrier)); + $order->total_discounts = $order->total_discounts_tax_incl; + + $order->total_shipping_tax_excl = (float)$this->context->cart->getPackageShippingCost((int)$id_carrier, false, null, $order->product_list); + $order->total_shipping_tax_incl = (float)$this->context->cart->getPackageShippingCost((int)$id_carrier, true, null, $order->product_list); + $order->total_shipping = $order->total_shipping_tax_incl; + + if (!is_null($carrier) && Validate::isLoadedObject($carrier)) { + $order->carrier_tax_rate = $carrier->getTaxesRate(new Address($this->context->cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')})); + } + + $order->total_wrapping_tax_excl = (float)abs($this->context->cart->getOrderTotal(false, Cart::ONLY_WRAPPING, $order->product_list, $id_carrier)); + $order->total_wrapping_tax_incl = (float)abs($this->context->cart->getOrderTotal(true, Cart::ONLY_WRAPPING, $order->product_list, $id_carrier)); + $order->total_wrapping = $order->total_wrapping_tax_incl; + + $order->total_paid_tax_excl = (float)Tools::ps_round((float)$this->context->cart->getOrderTotal(false, Cart::BOTH, $order->product_list, $id_carrier), _PS_PRICE_COMPUTE_PRECISION_); + $order->total_paid_tax_incl = (float)Tools::ps_round((float)$this->context->cart->getOrderTotal(true, Cart::BOTH, $order->product_list, $id_carrier), _PS_PRICE_COMPUTE_PRECISION_); + $order->total_paid = $order->total_paid_tax_incl; + $order->round_mode = Configuration::get('PS_PRICE_ROUND_MODE'); + $order->round_type = Configuration::get('PS_ROUND_TYPE'); + + $order->invoice_date = '0000-00-00 00:00:00'; + $order->delivery_date = '0000-00-00 00:00:00'; + + //source of the order from where booking came + if (isset($this->orderSource) && $this->orderSource) { + $order->source = $this->orderSource; + } else { + $order->source = Configuration::get('PS_SHOP_DOMAIN'); + } + + if (self::DEBUG_MODE) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Order is about to be added', 1, null, 'Cart', (int)$id_cart, true); + } + + // Creating order + $result = $order->add(); + + if (!$result) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Order cannot be created', 3, null, 'Cart', (int)$id_cart, true); + throw new PrestaShopException('Can\'t save Order'); + } + + // Amount paid by customer is not the right one -> Status = payment error + // We don't use the following condition to avoid the float precision issues : http://www.php.net/manual/en/language.types.float.php + // if ($order->total_paid != $order->total_paid_real) + // We use number_format in order to compare two string + if ($order_status->logable && number_format($cart_total_paid, _PS_PRICE_COMPUTE_PRECISION_) != number_format($amount_paid, _PS_PRICE_COMPUTE_PRECISION_)) { + $id_order_state = Configuration::get('PS_OS_ERROR'); + } + + $order_list[] = $order; + + if (self::DEBUG_MODE) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - OrderDetail is about to be added', 1, null, 'Cart', (int)$id_cart, true); + } + + // Insert new Order detail list using cart for the current order + $order_detail = new OrderDetail(null, null, $this->context); + $order_detail->createList($order, $this->context->cart, $id_order_state, $order->product_list, 0, true, $package_list[$id_address][$id_package]['id_warehouse']); + $order_detail_list[] = $order_detail; + + if (self::DEBUG_MODE) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - OrderCarrier is about to be added', 1, null, 'Cart', (int)$id_cart, true); + } + + // Adding an entry in order_carrier table + if (!is_null($carrier)) { + $order_carrier = new OrderCarrier(); + $order_carrier->id_order = (int)$order->id; + $order_carrier->id_carrier = (int)$id_carrier; + $order_carrier->weight = (float)$order->getTotalWeight(); + $order_carrier->shipping_cost_tax_excl = (float)$order->total_shipping_tax_excl; + $order_carrier->shipping_cost_tax_incl = (float)$order->total_shipping_tax_incl; + $order_carrier->add(); + } + } + } + + // The country can only change if the address used for the calculation is the delivery address, and if multi-shipping is activated + if (Configuration::get('PS_TAX_ADDRESS_TYPE') == 'id_address_delivery') { + $this->context->country = $context_country; + } + + if (!$this->context->country->active) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Country is not active', 3, null, 'Cart', (int)$id_cart, true); + throw new PrestaShopException('The order address country is not active.'); + } + + if (self::DEBUG_MODE) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Payment is about to be added', 1, null, 'Cart', (int)$id_cart, true); + } + + // Register Payment only if the order status validate the order + if ($order_status->logable) { + // $order is the last order loop in the foreach + // The method addOrderPayment of the class Order make a create a paymentOrder + // linked to the order reference and not to the order id + if (isset($extra_vars['transaction_id'])) { + $transaction_id = $extra_vars['transaction_id']; + } else { + $transaction_id = null; + } + + if (!$order->addOrderPayment($amount_paid, null, $transaction_id)) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Cannot save Order Payment', 3, null, 'Cart', (int)$id_cart, true); + throw new PrestaShopException('Can\'t save Order Payment'); + } + } + + // Next ! + $only_one_gift = false; + $cart_rule_used = array(); + $products = $this->context->cart->getProducts(); + + // Make sure CartRule caches are empty + CartRule::cleanCache(); + foreach ($order_detail_list as $key => $order_detail) { + /** @var OrderDetail $order_detail */ + + $order = $order_list[$key]; + if (!$order_creation_failed && isset($order->id)) { + if (!$secure_key) { + $message .= '
'.Tools::displayError('Warning: the secure key is empty, check your payment account before validation'); + } + // Optional message to attach to this order + if (isset($message) & !empty($message)) { + $msg = new Message(); + $message = strip_tags($message, '
'); + if (Validate::isCleanHtml($message)) { + if (self::DEBUG_MODE) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Message is about to be added', 1, null, 'Cart', (int)$id_cart, true); + } + $msg->message = $message; + $msg->id_cart = (int)$id_cart; + $msg->id_customer = intval($order->id_customer); + $msg->id_order = intval($order->id); + $msg->private = 1; + $msg->add(); + } + } + + // Insert new Order detail list using cart for the current order + //$orderDetail = new OrderDetail(null, null, $this->context); + //$orderDetail->createList($order, $this->context->cart, $id_order_state); + + // Construct order detail table for the email + $products_list = ''; + $virtual_product = true; + + $product_var_tpl_list = array(); + foreach ($order->product_list as $product) { + $price = Product::getPriceStatic((int)$product['id_product'], false, ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), 6, null, false, true, $product['cart_quantity'], false, (int)$order->id_customer, (int)$order->id_cart, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); + $price_wt = Product::getPriceStatic((int)$product['id_product'], true, ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), 2, null, false, true, $product['cart_quantity'], false, (int)$order->id_customer, (int)$order->id_cart, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); + + $product_price = Product::getTaxCalculationMethod() == PS_TAX_EXC ? Tools::ps_round($price, 2) : $price_wt; + + $product_var_tpl = array( + 'reference' => $product['reference'], + 'name' => $product['name'].(isset($product['attributes']) ? ' - '.$product['attributes'] : ''), + 'unit_price' => Tools::displayPrice($product_price, $this->context->currency, false), + 'price' => Tools::displayPrice($product_price * $product['quantity'], $this->context->currency, false), + 'quantity' => $product['quantity'], + 'customization' => array() + ); + + $customized_datas = Product::getAllCustomizedDatas((int)$order->id_cart); + if (isset($customized_datas[$product['id_product']][$product['id_product_attribute']])) { + $product_var_tpl['customization'] = array(); + foreach ($customized_datas[$product['id_product']][$product['id_product_attribute']][$order->id_address_delivery] as $customization) { + $customization_text = ''; + if (isset($customization['datas'][Product::CUSTOMIZE_TEXTFIELD])) { + foreach ($customization['datas'][Product::CUSTOMIZE_TEXTFIELD] as $text) { + $customization_text .= $text['name'].': '.$text['value'].'
'; + } + } + + if (isset($customization['datas'][Product::CUSTOMIZE_FILE])) { + $customization_text .= sprintf(Tools::displayError('%d image(s)'), count($customization['datas'][Product::CUSTOMIZE_FILE])).'
'; + } + + $customization_quantity = (int)$product['customization_quantity']; + + $product_var_tpl['customization'][] = array( + 'customization_text' => $customization_text, + 'customization_quantity' => $customization_quantity, + 'quantity' => Tools::displayPrice($customization_quantity * $product_price, $this->context->currency, false) + ); + } + } + + $product_var_tpl_list[] = $product_var_tpl; + // Check if is not a virutal product for the displaying of shipping + if (!$product['is_virtual']) { + $virtual_product &= false; + } + } // end foreach ($products) + + $product_list_txt = ''; + $product_list_html = ''; + if (count($product_var_tpl_list) > 0) { + $product_list_txt = $this->getEmailTemplateContent('order_conf_product_list.txt', Mail::TYPE_TEXT, $product_var_tpl_list); + $product_list_html = $this->getEmailTemplateContent('order_conf_product_list.tpl', Mail::TYPE_HTML, $product_var_tpl_list); + } + + $cart_rules_list = array(); + $total_reduction_value_ti = 0; + $total_reduction_value_tex = 0; + foreach ($cart_rules as $cart_rule) { + $package = array('id_carrier' => $order->id_carrier, 'id_address' => $order->id_address_delivery, 'products' => $order->product_list); + $values = array( + 'tax_incl' => $cart_rule['obj']->getContextualValue(true, $this->context, CartRule::FILTER_ACTION_ALL_NOCAP, $package), + 'tax_excl' => $cart_rule['obj']->getContextualValue(false, $this->context, CartRule::FILTER_ACTION_ALL_NOCAP, $package) + ); + + // If the reduction is not applicable to this order, then continue with the next one + if (!$values['tax_excl']) { + continue; + } + + // IF + // This is not multi-shipping + // The value of the voucher is greater than the total of the order + // Partial use is allowed + // This is an "amount" reduction, not a reduction in % or a gift + // THEN + // The voucher is cloned with a new value corresponding to the remainder + if (count($order_list) == 1 && $values['tax_incl'] > ($order->total_products_wt - $total_reduction_value_ti) && $cart_rule['obj']->partial_use == 1 && $cart_rule['obj']->reduction_amount > 0) { + // Create a new voucher from the original + $voucher = new CartRule($cart_rule['obj']->id); // We need to instantiate the CartRule without lang parameter to allow saving it + unset($voucher->id); + + // Set a new voucher code + $voucher->code = empty($voucher->code) ? substr(md5($order->id.'-'.$order->id_customer.'-'.$cart_rule['obj']->id), 0, 16) : $voucher->code.'-2'; + if (preg_match('/\-([0-9]{1,2})\-([0-9]{1,2})$/', $voucher->code, $matches) && $matches[1] == $matches[2]) { + $voucher->code = preg_replace('/'.$matches[0].'$/', '-'.(intval($matches[1]) + 1), $voucher->code); + } + + // Set the new voucher value + if ($voucher->reduction_tax) { + $voucher->reduction_amount = ($total_reduction_value_ti + $values['tax_incl']) - $order->total_products_wt; + + // Add total shipping amout only if reduction amount > total shipping + if ($voucher->free_shipping == 1 && $voucher->reduction_amount >= $order->total_shipping_tax_incl) { + $voucher->reduction_amount -= $order->total_shipping_tax_incl; + } + } else { + $voucher->reduction_amount = ($total_reduction_value_tex + $values['tax_excl']) - $order->total_products; + + // Add total shipping amout only if reduction amount > total shipping + if ($voucher->free_shipping == 1 && $voucher->reduction_amount >= $order->total_shipping_tax_excl) { + $voucher->reduction_amount -= $order->total_shipping_tax_excl; + } + } + if ($voucher->reduction_amount <= 0) { + continue; + } + + if ($this->context->customer->isGuest()) { + $voucher->id_customer = 0; + } else { + $voucher->id_customer = $order->id_customer; + } + + $voucher->quantity = 1; + $voucher->quantity_per_user = 1; + $voucher->free_shipping = 0; + if ($voucher->add()) { + // If the voucher has conditions, they are now copied to the new voucher + CartRule::copyConditions($cart_rule['obj']->id, $voucher->id); + + $params = array( + '{voucher_amount}' => Tools::displayPrice($voucher->reduction_amount, $this->context->currency, false), + '{voucher_num}' => $voucher->code, + '{firstname}' => $this->context->customer->firstname, + '{lastname}' => $this->context->customer->lastname, + '{id_order}' => $order->reference, + '{order_name}' => $order->getUniqReference() + ); + Mail::Send( + (int)$order->id_lang, + 'voucher', + sprintf(Mail::l('New voucher for your order %s', (int)$order->id_lang), $order->reference), + $params, + $this->context->customer->email, + $this->context->customer->firstname.' '.$this->context->customer->lastname, + null, null, null, null, _PS_MAIL_DIR_, false, (int)$order->id_shop + ); + } + + $values['tax_incl'] = $order->total_products_wt - $total_reduction_value_ti; + $values['tax_excl'] = $order->total_products - $total_reduction_value_tex; + } + $total_reduction_value_ti += $values['tax_incl']; + $total_reduction_value_tex += $values['tax_excl']; + + $order->addCartRule($cart_rule['obj']->id, $cart_rule['obj']->name, $values, 0, $cart_rule['obj']->free_shipping); + + if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED') && !in_array($cart_rule['obj']->id, $cart_rule_used)) { + $cart_rule_used[] = $cart_rule['obj']->id; + + // Create a new instance of Cart Rule without id_lang, in order to update its quantity + $cart_rule_to_update = new CartRule($cart_rule['obj']->id); + $cart_rule_to_update->quantity = max(0, $cart_rule_to_update->quantity - 1); + $cart_rule_to_update->update(); + } + + $cart_rules_list[] = array( + 'voucher_name' => $cart_rule['obj']->name, + 'voucher_reduction' => ($values['tax_incl'] != 0.00 ? '-' : '').Tools::displayPrice($values['tax_incl'], $this->context->currency, false) + ); + } + + $cart_rules_list_txt = ''; + $cart_rules_list_html = ''; + if (count($cart_rules_list) > 0) { + $cart_rules_list_txt = $this->getEmailTemplateContent('order_conf_cart_rules.txt', Mail::TYPE_TEXT, $cart_rules_list); + $cart_rules_list_html = $this->getEmailTemplateContent('order_conf_cart_rules.tpl', Mail::TYPE_HTML, $cart_rules_list); + } + + // Specify order id for message + $old_message = Message::getMessageByCartId((int)$this->context->cart->id); + if ($old_message) { + $update_message = new Message((int)$old_message['id_message']); + $update_message->id_order = (int)$order->id; + $update_message->update(); + + // Add this message in the customer thread + $customer_thread = new CustomerThread(); + $customer_thread->id_contact = 0; + $customer_thread->id_customer = (int)$order->id_customer; + $customer_thread->id_shop = (int)$this->context->shop->id; + $customer_thread->id_order = (int)$order->id; + $customer_thread->id_lang = (int)$this->context->language->id; + $customer_thread->email = $this->context->customer->email; + $customer_thread->status = 'open'; + $customer_thread->token = Tools::passwdGen(12); + $customer_thread->add(); + + $customer_message = new CustomerMessage(); + $customer_message->id_customer_thread = $customer_thread->id; + $customer_message->id_employee = 0; + $customer_message->message = $update_message->message; + $customer_message->private = 0; + + if (!$customer_message->add()) { + $this->errors[] = Tools::displayError('An error occurred while saving message'); + } + } + + if (self::DEBUG_MODE) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Hook validateOrder is about to be called', 1, null, 'Cart', (int)$id_cart, true); + } + + // Hook validate order + Hook::exec('actionValidateOrder', array( + 'cart' => $this->context->cart, + 'order' => $order, + 'customer' => $this->context->customer, + 'currency' => $this->context->currency, + 'orderStatus' => $order_status + )); + + foreach ($this->context->cart->getProducts() as $product) { + if ($order_status->logable) { + ProductSale::addProductSale((int)$product['id_product'], (int)$product['cart_quantity']); + } + } + + if (self::DEBUG_MODE) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Order Status is about to be added', 1, null, 'Cart', (int)$id_cart, true); + } + + // Set the order status + $new_history = new OrderHistory(); + $new_history->id_order = (int)$order->id; + $new_history->changeIdOrderState((int)$id_order_state, $order, true); + $new_history->addWithemail(true, $extra_vars); + + // Switch to back order if needed + if (Configuration::get('PS_STOCK_MANAGEMENT') && $order_detail->getStockState()) { + $history = new OrderHistory(); + $history->id_order = (int)$order->id; + $history->changeIdOrderState(Configuration::get($order->valid ? 'PS_OS_OUTOFSTOCK_PAID' : 'PS_OS_OUTOFSTOCK_UNPAID'), $order, true); + $history->addWithemail(); + } + + unset($order_detail); + + // Order is reloaded because the status just changed + $order = new Order($order->id); + + // Send an e-mail to customer (one order = one email) + if ($id_order_state != Configuration::get('PS_OS_ERROR') && $id_order_state != Configuration::get('PS_OS_CANCELED') && $this->context->customer->id) { + $invoice = new Address($order->id_address_invoice); + $delivery = new Address($order->id_address_delivery); + $delivery_state = $delivery->id_state ? new State($delivery->id_state) : false; + $invoice_state = $invoice->id_state ? new State($invoice->id_state) : false; + + //by webkul changing mail format + $cart_booking_data = $this->cartBookingDataForMail($order); + $cart_booking_data_text = $this->getEmailTemplateContent('hotel-booking-cart-data.text', Mail::TYPE_TEXT, $cart_booking_data); + $cart_booking_data_html = $this->getEmailTemplateContent('hotel-booking-cart-data.tpl', Mail::TYPE_HTML, $cart_booking_data); + + //For Advanced Payment + $obj_customer_adv = new HotelCustomerAdvancedPayment(); + $order_adv_dtl = $obj_customer_adv->getCstAdvPaymentDtlByIdOrder($order->id); + if ($order_adv_dtl) { + $order_adv_dtl['total_due_amount'] = $order_adv_dtl['total_order_amount'] - $order_adv_dtl['total_paid_amount']; + + $order_adv_dtl['total_paid_amount'] = Tools::displayPrice($order_adv_dtl['total_paid_amount'], $this->context->currency, false); + $order_adv_dtl['total_order_amount'] = Tools::displayPrice($order_adv_dtl['total_order_amount'], $this->context->currency, false); + $order_adv_dtl['total_due_amount'] = Tools::displayPrice($order_adv_dtl['total_due_amount'], $this->context->currency, false); + } + + $adv_data_html = $this->getEmailTemplateContent('advanced-book-data.tpl', Mail::TYPE_HTML, $order_adv_dtl); + $adv_data_text = $this->getEmailTemplateContent('advanced-book-data.txt', Mail::TYPE_TEXT, $order_adv_dtl); + + $data = array( + '{adv_data_html}' => $adv_data_html,//by webkul + '{adv_data_text}' => $adv_data_text,//by webkul + '{cart_booking_data_html}' => $cart_booking_data_html,//by webkul + '{firstname}' => $this->context->customer->firstname, + '{lastname}' => $this->context->customer->lastname, + '{email}' => $this->context->customer->email, + '{delivery_block_txt}' => $this->_getFormatedAddress($delivery, "\n"), + '{invoice_block_txt}' => $this->_getFormatedAddress($invoice, "\n"), + '{delivery_block_html}' => $this->_getFormatedAddress($delivery, '
', array( + 'firstname' => '%s', + 'lastname' => '%s' + )), + '{invoice_block_html}' => $this->_getFormatedAddress($invoice, '
', array( + 'firstname' => '%s', + 'lastname' => '%s' + )), + '{delivery_company}' => $delivery->company, + '{delivery_firstname}' => $delivery->firstname, + '{delivery_lastname}' => $delivery->lastname, + '{delivery_address1}' => $delivery->address1, + '{delivery_address2}' => $delivery->address2, + '{delivery_city}' => $delivery->city, + '{delivery_postal_code}' => $delivery->postcode, + '{delivery_country}' => $delivery->country, + '{delivery_state}' => $delivery->id_state ? $delivery_state->name : '', + '{delivery_phone}' => ($delivery->phone) ? $delivery->phone : $delivery->phone_mobile, + '{delivery_other}' => $delivery->other, + '{invoice_company}' => $invoice->company, + '{invoice_vat_number}' => $invoice->vat_number, + '{invoice_firstname}' => $invoice->firstname, + '{invoice_lastname}' => $invoice->lastname, + '{invoice_address2}' => $invoice->address2, + '{invoice_address1}' => $invoice->address1, + '{invoice_city}' => $invoice->city, + '{invoice_postal_code}' => $invoice->postcode, + '{invoice_country}' => $invoice->country, + '{invoice_state}' => $invoice->id_state ? $invoice_state->name : '', + '{invoice_phone}' => ($invoice->phone) ? $invoice->phone : $invoice->phone_mobile, + '{invoice_other}' => $invoice->other, + '{order_name}' => $order->getUniqReference(), + '{date}' => Tools::displayDate(date('Y-m-d H:i:s'), null, 1), + '{carrier}' => ($virtual_product || !isset($carrier->name)) ? Tools::displayError('No carrier') : $carrier->name, + '{payment}' => Tools::substr($order->payment, 0, 32), + '{products}' => $product_list_html, + '{products_txt}' => $product_list_txt, + '{discounts}' => $cart_rules_list_html, + '{discounts_txt}' => $cart_rules_list_txt, + '{total_paid}' => Tools::displayPrice($order->total_paid, $this->context->currency, false), + '{total_products}' => Tools::displayPrice(Product::getTaxCalculationMethod() == PS_TAX_EXC ? $order->total_products : $order->total_products_wt, $this->context->currency, false), + '{total_discounts}' => Tools::displayPrice($order->total_discounts, $this->context->currency, false), + '{total_shipping}' => Tools::displayPrice($order->total_shipping, $this->context->currency, false), + '{total_wrapping}' => Tools::displayPrice($order->total_wrapping, $this->context->currency, false), + '{total_tax_paid}' => Tools::displayPrice(($order->total_products_wt - $order->total_products) + ($order->total_shipping_tax_incl - $order->total_shipping_tax_excl), $this->context->currency, false)); + + if (is_array($extra_vars)) { + $data = array_merge($data, $extra_vars); + } + + // Join PDF invoice + if ((int)Configuration::get('PS_INVOICE') && $order_status->invoice && $order->invoice_number) { + $order_invoice_list = $order->getInvoicesCollection(); + Hook::exec('actionPDFInvoiceRender', array('order_invoice_list' => $order_invoice_list)); + $pdf = new PDF($order_invoice_list, PDF::TEMPLATE_INVOICE, $this->context->smarty); + $file_attachement['content'] = $pdf->render(false); + $file_attachement['name'] = Configuration::get('PS_INVOICE_PREFIX', (int)$order->id_lang, null, $order->id_shop).sprintf('%06d', $order->invoice_number).'.pdf'; + $file_attachement['mime'] = 'application/pdf'; + } else { + $file_attachement = null; + } + + if (self::DEBUG_MODE) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - Mail is about to be sent', 1, null, 'Cart', (int)$id_cart, true); + } + + if (Validate::isEmail($this->context->customer->email)) { + Mail::Send( + (int)$order->id_lang, + 'order_conf', + Mail::l('Order confirmation', (int)$order->id_lang), + $data, + $this->context->customer->email, + $this->context->customer->firstname.' '.$this->context->customer->lastname, + null, + null, + $file_attachement, + null, _PS_MAIL_DIR_, false, (int)$order->id_shop + ); + } + } + + // updates stock in shops + if (Configuration::get('PS_ADVANCED_STOCK_MANAGEMENT')) { + $product_list = $order->getProducts(); + foreach ($product_list as $product) { + // if the available quantities depends on the physical stock + if (StockAvailable::dependsOnStock($product['product_id'])) { + // synchronizes + StockAvailable::synchronize($product['product_id'], $order->id_shop); + } + } + } + + $order->updateOrderDetailTax(); + } else { + $error = Tools::displayError('Order creation failed'); + PrestaShopLogger::addLog($error, 4, '0000002', 'Cart', intval($order->id_cart)); + die($error); + } + } // End foreach $order_detail_list + + // Use the last order as currentOrder + if (isset($order) && $order->id) { + $this->currentOrder = (int)$order->id; + } + + if (self::DEBUG_MODE) { + PrestaShopLogger::addLog('PaymentModule::validateOrder - End of validateOrder', 1, null, 'Cart', (int)$id_cart, true); + } + + return true; + } else { + $error = Tools::displayError('Cart cannot be loaded or an order has already been placed using this cart'); + PrestaShopLogger::addLog($error, 4, '0000001', 'Cart', intval($this->context->cart->id)); + die($error); + } + } + + /** + * @deprecated 1.6.0.7 + * @param mixed $content + * @return mixed + */ + public function formatProductAndVoucherForEmail($content) + { + Tools::displayAsDeprecated(); + return $content; + } + + /** + * @param Object Address $the_address that needs to be txt formated + * @return String the txt formated address block + */ + protected function _getTxtFormatedAddress($the_address) + { + $adr_fields = AddressFormat::getOrderedAddressFields($the_address->id_country, false, true); + $r_values = array(); + foreach ($adr_fields as $fields_line) { + $tmp_values = array(); + foreach (explode(' ', $fields_line) as $field_item) { + $field_item = trim($field_item); + $tmp_values[] = $the_address->{$field_item}; + } + $r_values[] = implode(' ', $tmp_values); + } + + $out = implode("\n", $r_values); + return $out; + } + + /** + * @param Object Address $the_address that needs to be txt formated + * @return String the txt formated address block + */ + + protected function _getFormatedAddress(Address $the_address, $line_sep, $fields_style = array()) + { + return AddressFormat::generateAddress($the_address, array('avoid' => array()), $line_sep, ' ', $fields_style); + } + + /** + * @param int $id_currency : this parameter is optionnal but on 1.5 version of Prestashop, it will be REQUIRED + * @return Currency + */ + public function getCurrency($current_id_currency = null) + { + if (!(int)$current_id_currency) { + $current_id_currency = Context::getContext()->currency->id; + } + + if (!$this->currencies) { + return false; + } + if ($this->currencies_mode == 'checkbox') { + $currencies = Currency::getPaymentCurrencies($this->id); + return $currencies; + } elseif ($this->currencies_mode == 'radio') { + $currencies = Currency::getPaymentCurrenciesSpecial($this->id); + $currency = $currencies['id_currency']; + if ($currency == -1) { + $id_currency = (int)$current_id_currency; + } elseif ($currency == -2) { + $id_currency = (int)Configuration::get('PS_CURRENCY_DEFAULT'); + } else { + $id_currency = $currency; + } + } + if (!isset($id_currency) || empty($id_currency)) { + return false; + } + $currency = new Currency($id_currency); + return $currency; + } + + /** + * Allows specified payment modules to be used by a specific currency + * + * @since 1.4.5 + * @param int $id_currency + * @param array $id_module_list + * @return bool + */ + public static function addCurrencyPermissions($id_currency, array $id_module_list = array()) + { + $values = ''; + if (count($id_module_list) == 0) { + // fetch all installed module ids + $modules = PaymentModuleCore::getInstalledPaymentModules(); + foreach ($modules as $module) { + $id_module_list[] = $module['id_module']; + } + } + + foreach ($id_module_list as $id_module) { + $values .= '('.(int)$id_module.','.(int)$id_currency.'),'; + } + + if (!empty($values)) { + return Db::getInstance()->execute(' INSERT INTO `'._DB_PREFIX_.'module_currency` (`id_module`, `id_currency`) VALUES '.rtrim($values, ',')); - } + } - return true; - } + return true; + } - /** - * List all installed and active payment modules - * @see Module::getPaymentModules() if you need a list of module related to the user context - * - * @since 1.4.5 - * @return array module informations - */ - public static function getInstalledPaymentModules() - { - $hook_payment = 'Payment'; - if (Db::getInstance()->getValue('SELECT `id_hook` FROM `'._DB_PREFIX_.'hook` WHERE `name` = \'displayPayment\'')) - $hook_payment = 'displayPayment'; + /** + * List all installed and active payment modules + * @see Module::getPaymentModules() if you need a list of module related to the user context + * + * @since 1.4.5 + * @return array module informations + */ + public static function getInstalledPaymentModules() + { + $hook_payment = 'Payment'; + if (Db::getInstance()->getValue('SELECT `id_hook` FROM `'._DB_PREFIX_.'hook` WHERE `name` = \'displayPayment\'')) { + $hook_payment = 'displayPayment'; + } - return Db::getInstance()->executeS(' + return Db::getInstance()->executeS(' SELECT DISTINCT m.`id_module`, h.`id_hook`, m.`name`, hm.`position` FROM `'._DB_PREFIX_.'module` m LEFT JOIN `'._DB_PREFIX_.'hook_module` hm ON hm.`id_module` = m.`id_module`' - .Shop::addSqlRestriction(false, 'hm').' + .Shop::addSqlRestriction(false, 'hm').' LEFT JOIN `'._DB_PREFIX_.'hook` h ON hm.`id_hook` = h.`id_hook` INNER JOIN `'._DB_PREFIX_.'module_shop` ms ON (m.`id_module` = ms.`id_module` AND ms.id_shop='.(int)Context::getContext()->shop->id.') WHERE h.`name` = \''.pSQL($hook_payment).'\''); - } + } - public static function preCall($module_name) - { - if (!parent::preCall($module_name)) - return false; + public static function preCall($module_name) + { + if (!parent::preCall($module_name)) { + return false; + } - if (($module_instance = Module::getInstanceByName($module_name))) - { - /** @var PaymentModule $module_instance */ - if (!$module_instance->currencies || ($module_instance->currencies && count(Currency::checkPaymentCurrencies($module_instance->id)))) - return true; - } + if (($module_instance = Module::getInstanceByName($module_name))) { + /** @var PaymentModule $module_instance */ + if (!$module_instance->currencies || ($module_instance->currencies && count(Currency::checkPaymentCurrencies($module_instance->id)))) { + return true; + } + } - return false; - } + return false; + } - /** - * Fetch the content of $template_name inside the folder current_theme/mails/current_iso_lang/ if found, otherwise in mails/current_iso_lang - * - * @param string $template_name template name with extension - * @param int $mail_type Mail::TYPE_HTML or Mail::TYPE_TXT - * @param array $var list send to smarty - * - * @return string - */ - protected function getEmailTemplateContent($template_name, $mail_type, $var) - { - $email_configuration = Configuration::get('PS_MAIL_TYPE'); - if ($email_configuration != $mail_type && $email_configuration != Mail::TYPE_BOTH) - return ''; + /** + * Fetch the content of $template_name inside the folder current_theme/mails/current_iso_lang/ if found, otherwise in mails/current_iso_lang + * + * @param string $template_name template name with extension + * @param int $mail_type Mail::TYPE_HTML or Mail::TYPE_TXT + * @param array $var list send to smarty + * + * @return string + */ + protected function getEmailTemplateContent($template_name, $mail_type, $var) + { + $email_configuration = Configuration::get('PS_MAIL_TYPE'); + if ($email_configuration != $mail_type && $email_configuration != Mail::TYPE_BOTH) { + return ''; + } - $theme_template_path = _PS_THEME_DIR_.'mails'.DIRECTORY_SEPARATOR.$this->context->language->iso_code.DIRECTORY_SEPARATOR.$template_name; - $default_mail_template_path = _PS_MAIL_DIR_.$this->context->language->iso_code.DIRECTORY_SEPARATOR.$template_name; + $theme_template_path = _PS_THEME_DIR_.'mails'.DIRECTORY_SEPARATOR.$this->context->language->iso_code.DIRECTORY_SEPARATOR.$template_name; + $default_mail_template_path = _PS_MAIL_DIR_.$this->context->language->iso_code.DIRECTORY_SEPARATOR.$template_name; - if (Tools::file_exists_cache($theme_template_path)) - $default_mail_template_path = $theme_template_path; + if (Tools::file_exists_cache($theme_template_path)) { + $default_mail_template_path = $theme_template_path; + } - if (Tools::file_exists_cache($default_mail_template_path)) - { - $this->context->smarty->assign('list', $var); - return $this->context->smarty->fetch($default_mail_template_path); - } - return ''; - } + if (Tools::file_exists_cache($default_mail_template_path)) { + $this->context->smarty->assign('list', $var); + return $this->context->smarty->fetch($default_mail_template_path); + } + return ''; + } - public function cartBookingDataForMail($order) - { - $customer = new Customer($order->id_customer); - //by webkul to show order details properly on order history page - $products = $order->getProducts(); - if (Module::isInstalled('hotelreservationsystem')) - { - require_once (_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); + public function cartBookingDataForMail($order) + { + $customer = new Customer($order->id_customer); + //by webkul to show order details properly on order history page + $products = $order->getProducts(); + if (Module::isInstalled('hotelreservationsystem')) { + require_once(_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); - $obj_cart_bk_data = new HotelCartBookingData(); - $obj_htl_bk_dtl = new HotelBookingDetail(); - $obj_rm_type = new HotelRoomType(); + $obj_cart_bk_data = new HotelCartBookingData(); + $obj_htl_bk_dtl = new HotelBookingDetail(); + $obj_rm_type = new HotelRoomType(); - if (!empty($products)) - { - $cart_htl_data = array(); - foreach ($products as $type_key => $type_value) - { - $product = new Product($type_value['product_id'], false, $this->context->language->id); - $cover_image_arr = $product->getCover($type_value['product_id']); - - if(!empty($cover_image_arr)) - $cover_img = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default'); - else - $cover_img = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code."-default", 'small_default'); + if (!empty($products)) { + $cart_htl_data = array(); + foreach ($products as $type_key => $type_value) { + $product = new Product($type_value['product_id'], false, $this->context->language->id); + $cover_image_arr = $product->getCover($type_value['product_id']); + + if (!empty($cover_image_arr)) { + $cover_img = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default'); + } else { + $cover_img = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code."-default", 'small_default'); + } - $unit_price = Product::getPriceStatic($type_value['product_id'], true, null, 6, null, false, true, 1); + $unit_price = Product::getPriceStatic($type_value['product_id'], true, null, 6, null, false, true, 1); - if (isset($customer->id)) - { - $cart_obj = new Cart($order->id_cart); - $cart_bk_data = $obj_cart_bk_data->getOnlyCartBookingData($order->id_cart, $cart_obj->id_guest, $type_value['product_id'], $customer->id); - } - else - { - $cart_bk_data = $obj_cart_bk_data->getOnlyCartBookingData($order->id_cart, $customer->id_guest, $type_value['product_id']); - } - $rm_dtl = $obj_rm_type->getRoomTypeInfoByIdProduct($type_value['product_id']); + if (isset($customer->id)) { + $cart_obj = new Cart($order->id_cart); + $cart_bk_data = $obj_cart_bk_data->getOnlyCartBookingData($order->id_cart, $cart_obj->id_guest, $type_value['product_id'], $customer->id); + } else { + $cart_bk_data = $obj_cart_bk_data->getOnlyCartBookingData($order->id_cart, $customer->id_guest, $type_value['product_id']); + } + $rm_dtl = $obj_rm_type->getRoomTypeInfoByIdProduct($type_value['product_id']); - $cart_htl_data[$type_key]['id_product'] = $type_value['product_id']; - $cart_htl_data[$type_key]['cover_img'] = $cover_img; - $cart_htl_data[$type_key]['name'] = $product->name; - $cart_htl_data[$type_key]['unit_price'] = $unit_price; - $cart_htl_data[$type_key]['adult'] = $rm_dtl['adult']; - $cart_htl_data[$type_key]['children'] = $rm_dtl['children']; + $cart_htl_data[$type_key]['id_product'] = $type_value['product_id']; + $cart_htl_data[$type_key]['cover_img'] = $cover_img; + $cart_htl_data[$type_key]['name'] = $product->name; + $cart_htl_data[$type_key]['unit_price'] = $unit_price; + $cart_htl_data[$type_key]['adult'] = $rm_dtl['adult']; + $cart_htl_data[$type_key]['children'] = $rm_dtl['children']; - foreach ($cart_bk_data as $data_k => $data_v) - { - $date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']); + foreach ($cart_bk_data as $data_k => $data_v) { + $date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']); - if (isset($cart_htl_data[$type_key]['date_diff'][$date_join])) - { - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] += 1; + if (isset($cart_htl_data[$type_key]['date_diff'][$date_join])) { + $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] += 1; - $num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days']; - $vart_quant = (int)$cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] * $num_days; - - $amount = Product::getPriceStatic($type_value['product_id'], true, null, 6, null, false, true, 1); - $amount *= $vart_quant; + $num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days']; + $vart_quant = (int)$cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm']; + + //$amount = Product::getPriceStatic($type_value['product_id'], true, null, 6, null, false, true, 1); + //$amount *= $vart_quant; - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $amount; - } - else - { - $num_days = $obj_htl_bk_dtl->getNumberOfDays($data_v['date_from'], $data_v['date_to']); - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] = 1; - $cart_htl_data[$type_key]['date_diff'][$date_join]['data_form'] = $data_v['date_from']; - $cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to']; - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; - $amount = Product::getPriceStatic($type_value['product_id'], true, null, 6, null, false, true, 1); - $amount *= $num_days; - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $amount; - } - } - } - } - } - return $cart_htl_data; - } + $roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($type_value['id_product'], $data_v['date_from'], $data_v['date_to']); + + + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $roomTypeDateRangePrice['total_price_tax_incl']*$vart_quant; + } else { + $num_days = $obj_htl_bk_dtl->getNumberOfDays($data_v['date_from'], $data_v['date_to']); + + $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] = 1; + $cart_htl_data[$type_key]['date_diff'][$date_join]['data_form'] = $data_v['date_from']; + $cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to']; + $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; + /*$amount = Product::getPriceStatic($type_value['product_id'], true, null, 6, null, false, true, 1); + $amount *= $num_days;*/ + + $roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($type_value['id_product'], $data_v['date_from'], $data_v['date_to']); + + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $roomTypeDateRangePrice['total_price_tax_incl']; + } + } + } + } + } + return $cart_htl_data; + } } diff --git a/classes/Product.php b/classes/Product.php index f2cca9fb2..d6eea5c57 100644 --- a/classes/Product.php +++ b/classes/Product.php @@ -1038,6 +1038,7 @@ class ProductCore extends ObjectModel } SpecificPriceRule::applyAllRules(array((int)$this->id)); + return true; } diff --git a/classes/order/Order.php b/classes/order/Order.php index a47133676..bdeab4487 100644 --- a/classes/order/Order.php +++ b/classes/order/Order.php @@ -147,6 +147,9 @@ class OrderCore extends ObjectModel /** @var string Delivery creation date */ public $delivery_date; + /** @var string source */ + public $source; + /** @var bool Order validity: current order status is logable (usually paid and not canceled) */ public $valid; @@ -219,6 +222,7 @@ class OrderCore extends ObjectModel 'delivery_number' => array('type' => self::TYPE_INT), 'invoice_date' => array('type' => self::TYPE_DATE), 'delivery_date' => array('type' => self::TYPE_DATE), + 'source' => array('type' => self::TYPE_STRING), 'valid' => array('type' => self::TYPE_BOOL), 'reference' => array('type' => self::TYPE_STRING), 'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), diff --git a/classes/pdf/HTMLTemplateInvoice.php b/classes/pdf/HTMLTemplateInvoice.php index 160c8fc6c..f49a84e70 100644 --- a/classes/pdf/HTMLTemplateInvoice.php +++ b/classes/pdf/HTMLTemplateInvoice.php @@ -29,594 +29,582 @@ */ class HTMLTemplateInvoiceCore extends HTMLTemplate { - public $order; - public $available_in_your_account = false; + public $order; + public $available_in_your_account = false; - /** - * @param OrderInvoice $order_invoice - * @param $smarty - * @throws PrestaShopException - */ - public function __construct(OrderInvoice $order_invoice, $smarty) - { - $this->order_invoice = $order_invoice; - $this->order = new Order((int)$this->order_invoice->id_order); - $this->smarty = $smarty; + /** + * @param OrderInvoice $order_invoice + * @param $smarty + * @throws PrestaShopException + */ + public function __construct(OrderInvoice $order_invoice, $smarty) + { + $this->order_invoice = $order_invoice; + $this->order = new Order((int)$this->order_invoice->id_order); + $this->smarty = $smarty; - // header informations - $this->date = Tools::displayDate($order_invoice->date_add); + // header informations + $this->date = Tools::displayDate($order_invoice->date_add); - $id_lang = Context::getContext()->language->id; - $this->title = $order_invoice->getInvoiceNumberFormatted($id_lang); + $id_lang = Context::getContext()->language->id; + $this->title = $order_invoice->getInvoiceNumberFormatted($id_lang); - $this->shop = new Shop((int)$this->order->id_shop); - } + $this->shop = new Shop((int)$this->order->id_shop); + } - /** - * Returns the template's HTML header - * - * @return string HTML header - */ - public function getHeader() - { - $this->assignCommonHeaderData(); - $this->smarty->assign(array( - 'header' => $this->l('INVOICE'), - )); + /** + * Returns the template's HTML header + * + * @return string HTML header + */ + public function getHeader() + { + $this->assignCommonHeaderData(); + $this->smarty->assign(array( + 'header' => $this->l('INVOICE'), + )); - return $this->smarty->fetch($this->getTemplate('header')); - } + return $this->smarty->fetch($this->getTemplate('header')); + } - /** - * Compute layout elements size - * - * @params $params Array Layout elements - * - * @return Array Layout elements columns size - */ + /** + * Compute layout elements size + * + * @params $params Array Layout elements + * + * @return Array Layout elements columns size + */ - private function computeLayout($params) - { - $layout = array( - 'reference' => array( - 'width' => 15, - ), - 'product' => array( - 'width' => 40, - ), - 'quantity' => array( - 'width' => 8, - ), - 'tax_code' => array( - 'width' => 8, - ), - 'unit_price_tax_excl' => array( - 'width' => 0, - ), - 'total_tax_excl' => array( - 'width' => 0, - ) - ); + private function computeLayout($params) + { + $layout = array( + 'reference' => array( + 'width' => 15, + ), + 'product' => array( + 'width' => 40, + ), + 'quantity' => array( + 'width' => 8, + ), + 'tax_code' => array( + 'width' => 8, + ), + 'unit_price_tax_excl' => array( + 'width' => 0, + ), + 'total_tax_excl' => array( + 'width' => 0, + ) + ); - if (isset($params['has_discount']) && $params['has_discount']) - { - $layout['before_discount'] = array('width' => 0); - $layout['product']['width'] -= 7; - $layout['reference']['width'] -= 3; - } + if (isset($params['has_discount']) && $params['has_discount']) { + $layout['before_discount'] = array('width' => 0); + $layout['product']['width'] -= 7; + $layout['reference']['width'] -= 3; + } - $total_width = 0; - $free_columns_count = 0; - foreach ($layout as $data) - { - if ($data['width'] === 0) - ++$free_columns_count; + $total_width = 0; + $free_columns_count = 0; + foreach ($layout as $data) { + if ($data['width'] === 0) { + ++$free_columns_count; + } - $total_width += $data['width']; - } + $total_width += $data['width']; + } - $delta = 100 - $total_width; + $delta = 100 - $total_width; - foreach ($layout as $row => $data) - if ($data['width'] === 0) - $layout[$row]['width'] = $delta / $free_columns_count; + foreach ($layout as $row => $data) { + if ($data['width'] === 0) { + $layout[$row]['width'] = $delta / $free_columns_count; + } + } - $layout['_colCount'] = count($layout); + $layout['_colCount'] = count($layout); - return $layout; - } + return $layout; + } - /** - * Returns the template's HTML content - * - * @return string HTML content - */ - public function getContent() - { + /** + * Returns the template's HTML content + * + * @return string HTML content + */ + public function getContent() + { $invoiceAddressPatternRules = Tools::jsonDecode(Configuration::get('PS_INVCE_INVOICE_ADDR_RULES'), true); $deliveryAddressPatternRules = Tools::jsonDecode(Configuration::get('PS_INVCE_DELIVERY_ADDR_RULES'), true); - $invoice_address = new Address((int)$this->order->id_address_invoice); - $country = new Country((int)$invoice_address->id_country); + $invoice_address = new Address((int)$this->order->id_address_invoice); + $country = new Country((int)$invoice_address->id_country); - if ($this->order_invoice->invoice_address) - $formatted_invoice_address = $this->order_invoice->invoice_address; - else - $formatted_invoice_address = AddressFormat::generateAddress($invoice_address, $invoiceAddressPatternRules, '
', ' '); + if ($this->order_invoice->invoice_address) { + $formatted_invoice_address = $this->order_invoice->invoice_address; + } else { + $formatted_invoice_address = AddressFormat::generateAddress($invoice_address, $invoiceAddressPatternRules, '
', ' '); + } - $delivery_address = null; - $formatted_delivery_address = ''; - if (isset($this->order->id_address_delivery) && $this->order->id_address_delivery) - { - if ($this->order_invoice->delivery_address) - $formatted_delivery_address = $this->order_invoice->delivery_address; - else - { - $delivery_address = new Address((int)$this->order->id_address_delivery); - $formatted_delivery_address = AddressFormat::generateAddress($delivery_address, $deliveryAddressPatternRules, '
', ' '); - } - } + $delivery_address = null; + $formatted_delivery_address = ''; + if (isset($this->order->id_address_delivery) && $this->order->id_address_delivery) { + if ($this->order_invoice->delivery_address) { + $formatted_delivery_address = $this->order_invoice->delivery_address; + } else { + $delivery_address = new Address((int)$this->order->id_address_delivery); + $formatted_delivery_address = AddressFormat::generateAddress($delivery_address, $deliveryAddressPatternRules, '
', ' '); + } + } - $customer = new Customer((int)$this->order->id_customer); + $customer = new Customer((int)$this->order->id_customer); - $order_details = $this->order_invoice->getProducts(); + $order_details = $this->order_invoice->getProducts(); - $has_discount = false; - foreach ($order_details as $id => &$order_detail) - { - // Find out if column 'price before discount' is required - if ($order_detail['reduction_amount_tax_excl'] > 0) - { - $has_discount = true; - $order_detail['unit_price_tax_excl_before_specific_price'] = $order_detail['unit_price_tax_excl_including_ecotax'] + $order_detail['reduction_amount_tax_excl']; - } - elseif ($order_detail['reduction_percent'] > 0) - { - $has_discount = true; - $order_detail['unit_price_tax_excl_before_specific_price'] = (100 * $order_detail['unit_price_tax_excl_including_ecotax']) / (100 - 15); - } - - // Set tax_code - $taxes = OrderDetail::getTaxListStatic($id); - $tax_temp = array(); - foreach ($taxes as $tax) - { - $obj = new Tax($tax['id_tax']); - $tax_temp[] = sprintf($this->l('%1$s%2$s%%'), ($obj->rate + 0), ' '); + $has_discount = false; + foreach ($order_details as $id => &$order_detail) { + // Find out if column 'price before discount' is required + if ($order_detail['reduction_amount_tax_excl'] > 0) { + $has_discount = true; + $order_detail['unit_price_tax_excl_before_specific_price'] = $order_detail['unit_price_tax_excl_including_ecotax'] + $order_detail['reduction_amount_tax_excl']; + } elseif ($order_detail['reduction_percent'] > 0) { + $has_discount = true; + $order_detail['unit_price_tax_excl_before_specific_price'] = (100 * $order_detail['unit_price_tax_excl_including_ecotax']) / (100 - 15); } - $order_detail['order_detail_tax'] = $taxes; - $order_detail['order_detail_tax_label'] = implode(', ', $tax_temp); - } - unset($tax_temp); - unset($order_detail); + // Set tax_code + $taxes = OrderDetail::getTaxListStatic($id); + $tax_temp = array(); + foreach ($taxes as $tax) { + $obj = new Tax($tax['id_tax']); + $tax_temp[] = sprintf($this->l('%1$s%2$s%%'), ($obj->rate + 0), ' '); + } - if (Configuration::get('PS_PDF_IMG_INVOICE')) - { - foreach ($order_details as &$order_detail) - { - if ($order_detail['image'] != null) - { - $name = 'product_mini_'.(int)$order_detail['product_id'].(isset($order_detail['product_attribute_id']) ? '_'.(int)$order_detail['product_attribute_id'] : '').'.jpg'; - $path = _PS_PROD_IMG_DIR_.$order_detail['image']->getExistingImgPath().'.jpg'; + $order_detail['order_detail_tax'] = $taxes; + $order_detail['order_detail_tax_label'] = implode(', ', $tax_temp); + } + unset($tax_temp); + unset($order_detail); - $order_detail['image_tag'] = preg_replace( - '/\.*'.preg_quote(__PS_BASE_URI__, '/').'/', - _PS_ROOT_DIR_.DIRECTORY_SEPARATOR, - ImageManager::thumbnail($path, $name, 45, 'jpg', false), - 1 - ); + if (Configuration::get('PS_PDF_IMG_INVOICE')) { + foreach ($order_details as &$order_detail) { + if ($order_detail['image'] != null) { + $name = 'product_mini_'.(int)$order_detail['product_id'].(isset($order_detail['product_attribute_id']) ? '_'.(int)$order_detail['product_attribute_id'] : '').'.jpg'; + $path = _PS_PROD_IMG_DIR_.$order_detail['image']->getExistingImgPath().'.jpg'; - if (file_exists(_PS_TMP_IMG_DIR_.$name)) - $order_detail['image_size'] = getimagesize(_PS_TMP_IMG_DIR_.$name); - else - $order_detail['image_size'] = false; - } - } - unset($order_detail); // don't overwrite the last order_detail later - } + $order_detail['image_tag'] = preg_replace( + '/\.*'.preg_quote(__PS_BASE_URI__, '/').'/', + _PS_ROOT_DIR_.DIRECTORY_SEPARATOR, + ImageManager::thumbnail($path, $name, 45, 'jpg', false), + 1 + ); - $cart_rules = $this->order->getCartRules($this->order_invoice->id); - $free_shipping = false; - foreach ($cart_rules as $key => $cart_rule) - { - if ($cart_rule['free_shipping']) - { - $free_shipping = true; - /** - * Adjust cart rule value to remove the amount of the shipping. - * We're not interested in displaying the shipping discount as it is already shown as "Free Shipping". - */ - $cart_rules[$key]['value_tax_excl'] -= $this->order_invoice->total_shipping_tax_excl; - $cart_rules[$key]['value'] -= $this->order_invoice->total_shipping_tax_incl; + if (file_exists(_PS_TMP_IMG_DIR_.$name)) { + $order_detail['image_size'] = getimagesize(_PS_TMP_IMG_DIR_.$name); + } else { + $order_detail['image_size'] = false; + } + } + } + unset($order_detail); // don't overwrite the last order_detail later + } - /** - * Don't display cart rules that are only about free shipping and don't create - * a discount on products. - */ - if ($cart_rules[$key]['value'] == 0) - unset($cart_rules[$key]); - } - } + $cart_rules = $this->order->getCartRules($this->order_invoice->id); + $free_shipping = false; + foreach ($cart_rules as $key => $cart_rule) { + if ($cart_rule['free_shipping']) { + $free_shipping = true; + /** + * Adjust cart rule value to remove the amount of the shipping. + * We're not interested in displaying the shipping discount as it is already shown as "Free Shipping". + */ + $cart_rules[$key]['value_tax_excl'] -= $this->order_invoice->total_shipping_tax_excl; + $cart_rules[$key]['value'] -= $this->order_invoice->total_shipping_tax_incl; - $product_taxes = 0; - foreach ($this->order_invoice->getProductTaxesBreakdown($this->order) as $details) - $product_taxes += $details['total_amount']; + /** + * Don't display cart rules that are only about free shipping and don't create + * a discount on products. + */ + if ($cart_rules[$key]['value'] == 0) { + unset($cart_rules[$key]); + } + } + } - $product_discounts_tax_excl = $this->order_invoice->total_discount_tax_excl; - $product_discounts_tax_incl = $this->order_invoice->total_discount_tax_incl; - if ($free_shipping) - { - $product_discounts_tax_excl -= $this->order_invoice->total_shipping_tax_excl; - $product_discounts_tax_incl -= $this->order_invoice->total_shipping_tax_incl; - } + $product_taxes = 0; + foreach ($this->order_invoice->getProductTaxesBreakdown($this->order) as $details) { + $product_taxes += $details['total_amount']; + } - $products_after_discounts_tax_excl = $this->order_invoice->total_products - $product_discounts_tax_excl; - $products_after_discounts_tax_incl = $this->order_invoice->total_products_wt - $product_discounts_tax_incl; + $product_discounts_tax_excl = $this->order_invoice->total_discount_tax_excl; + $product_discounts_tax_incl = $this->order_invoice->total_discount_tax_incl; + if ($free_shipping) { + $product_discounts_tax_excl -= $this->order_invoice->total_shipping_tax_excl; + $product_discounts_tax_incl -= $this->order_invoice->total_shipping_tax_incl; + } - $shipping_tax_excl = $free_shipping ? 0 : $this->order_invoice->total_shipping_tax_excl; - $shipping_tax_incl = $free_shipping ? 0 : $this->order_invoice->total_shipping_tax_incl; - $shipping_taxes = $shipping_tax_incl - $shipping_tax_excl; + $products_after_discounts_tax_excl = $this->order_invoice->total_products - $product_discounts_tax_excl; + $products_after_discounts_tax_incl = $this->order_invoice->total_products_wt - $product_discounts_tax_incl; - $wrapping_taxes = $this->order_invoice->total_wrapping_tax_incl - $this->order_invoice->total_wrapping_tax_excl; + $shipping_tax_excl = $free_shipping ? 0 : $this->order_invoice->total_shipping_tax_excl; + $shipping_tax_incl = $free_shipping ? 0 : $this->order_invoice->total_shipping_tax_incl; + $shipping_taxes = $shipping_tax_incl - $shipping_tax_excl; - $total_taxes = $this->order_invoice->total_paid_tax_incl - $this->order_invoice->total_paid_tax_excl; + $wrapping_taxes = $this->order_invoice->total_wrapping_tax_incl - $this->order_invoice->total_wrapping_tax_excl; - $footer = array( - 'products_before_discounts_tax_excl' => $this->order_invoice->total_products, - 'product_discounts_tax_excl' => $product_discounts_tax_excl, - 'products_after_discounts_tax_excl' => $products_after_discounts_tax_excl, - 'products_before_discounts_tax_incl' => $this->order_invoice->total_products_wt, - 'product_discounts_tax_incl' => $product_discounts_tax_incl, - 'products_after_discounts_tax_incl' => $products_after_discounts_tax_incl, - 'product_taxes' => $product_taxes, - 'shipping_tax_excl' => $shipping_tax_excl, - 'shipping_taxes' => $shipping_taxes, - 'shipping_tax_incl' => $shipping_tax_incl, - 'wrapping_tax_excl' => $this->order_invoice->total_wrapping_tax_excl, - 'wrapping_taxes' => $wrapping_taxes, - 'wrapping_tax_incl' => $this->order_invoice->total_wrapping_tax_incl, - 'ecotax_taxes' => $total_taxes - $product_taxes - $wrapping_taxes - $shipping_taxes, - 'total_taxes' => $total_taxes, - 'total_paid_tax_excl' => $this->order_invoice->total_paid_tax_excl, - 'total_paid_tax_incl' => $this->order_invoice->total_paid_tax_incl - ); + $total_taxes = $this->order_invoice->total_paid_tax_incl - $this->order_invoice->total_paid_tax_excl; - foreach ($footer as $key => $value) - $footer[$key] = Tools::ps_round($value, _PS_PRICE_COMPUTE_PRECISION_, $this->order->round_mode); + $footer = array( + 'products_before_discounts_tax_excl' => $this->order_invoice->total_products, + 'product_discounts_tax_excl' => $product_discounts_tax_excl, + 'products_after_discounts_tax_excl' => $products_after_discounts_tax_excl, + 'products_before_discounts_tax_incl' => $this->order_invoice->total_products_wt, + 'product_discounts_tax_incl' => $product_discounts_tax_incl, + 'products_after_discounts_tax_incl' => $products_after_discounts_tax_incl, + 'product_taxes' => $product_taxes, + 'shipping_tax_excl' => $shipping_tax_excl, + 'shipping_taxes' => $shipping_taxes, + 'shipping_tax_incl' => $shipping_tax_incl, + 'wrapping_tax_excl' => $this->order_invoice->total_wrapping_tax_excl, + 'wrapping_taxes' => $wrapping_taxes, + 'wrapping_tax_incl' => $this->order_invoice->total_wrapping_tax_incl, + 'ecotax_taxes' => $total_taxes - $product_taxes - $wrapping_taxes - $shipping_taxes, + 'total_taxes' => $total_taxes, + 'total_paid_tax_excl' => $this->order_invoice->total_paid_tax_excl, + 'total_paid_tax_incl' => $this->order_invoice->total_paid_tax_incl + ); - /** - * Need the $round_mode for the tests. - */ - $round_type = null; - switch ($this->order->round_type) - { - case Order::ROUND_TOTAL: - $round_type = 'total'; - break; - case Order::ROUND_LINE; - $round_type = 'line'; - break; - case Order::ROUND_ITEM: - $round_type = 'item'; - break; - default: - $round_type = 'line'; - break; - } + foreach ($footer as $key => $value) { + $footer[$key] = Tools::ps_round($value, _PS_PRICE_COMPUTE_PRECISION_, $this->order->round_mode); + } - $display_product_images = Configuration::get('PS_PDF_IMG_INVOICE'); - $tax_excluded_display = Group::getPriceDisplayMethod($customer->id_default_group); + /** + * Need the $round_mode for the tests. + */ + $round_type = null; + switch ($this->order->round_type) { + case Order::ROUND_TOTAL: + $round_type = 'total'; + break; + case Order::ROUND_LINE; + $round_type = 'line'; + break; + case Order::ROUND_ITEM: + $round_type = 'item'; + break; + default: + $round_type = 'line'; + break; + } - $layout = $this->computeLayout(array('has_discount' => $has_discount)); + $display_product_images = Configuration::get('PS_PDF_IMG_INVOICE'); + $tax_excluded_display = Group::getPriceDisplayMethod($customer->id_default_group); - $legal_free_text = Hook::exec('displayInvoiceLegalFreeText', array('order' => $this->order)); - if (!$legal_free_text) - $legal_free_text = Configuration::get('PS_INVOICE_LEGAL_FREE_TEXT', (int)Context::getContext()->language->id, null, (int)$this->order->id_shop); - $order_obj = new Order($this->order->id); + $layout = $this->computeLayout(array('has_discount' => $has_discount)); - $this->context = Context::getContext(); - $products = $order_obj->getProducts(); + $legal_free_text = Hook::exec('displayInvoiceLegalFreeText', array('order' => $this->order)); + if (!$legal_free_text) { + $legal_free_text = Configuration::get('PS_INVOICE_LEGAL_FREE_TEXT', (int)Context::getContext()->language->id, null, (int)$this->order->id_shop); + } + $order_obj = new Order($this->order->id); - if (Module::isInstalled('hotelreservationsystem')) - { - require_once (_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); + $this->context = Context::getContext(); + $products = $order_obj->getProducts(); - $obj_cart_bk_data = new HotelCartBookingData(); - $obj_htl_bk_dtl = new HotelBookingDetail(); - $obj_rm_type = new HotelRoomType(); + if (Module::isInstalled('hotelreservationsystem')) { + require_once(_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); - $customer = new Customer($this->order->id_customer); - if (!empty($products)) - { - $processed_product = array(); - $refunded_rooms = 0; - $cart_bk_data=array(); + $obj_cart_bk_data = new HotelCartBookingData(); + $obj_htl_bk_dtl = new HotelBookingDetail(); + $obj_rm_type = new HotelRoomType(); - foreach ($products as $type_key => $type_value) - { - if (in_array($type_value['product_id'], $processed_product)) - continue; - $processed_product[] = $type_value['product_id']; + $customer = new Customer($this->order->id_customer); + if (!empty($products)) { + $processed_product = array(); + $refunded_rooms = 0; + $cart_bk_data=array(); - $product = new Product($type_value['product_id'], false, $this->context->language->id); - $order_prod_dtl = $obj_htl_bk_dtl->getPsOrderDetailsByProduct($product->id, $this->order->id); + foreach ($products as $type_key => $type_value) { + if (in_array($type_value['product_id'], $processed_product)) { + continue; + } + $processed_product[] = $type_value['product_id']; - $cover_image_arr = $product->getCover($type_value['product_id']); - - if(!empty($cover_image_arr)) - $cover_img = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default'); - else - $cover_img = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code."-default", 'small_default'); + $product = new Product($type_value['product_id'], false, $this->context->language->id); + $order_prod_dtl = $obj_htl_bk_dtl->getPsOrderDetailsByProduct($product->id, $this->order->id); - if (isset($customer->id)) - { - $cart_obj = new Cart($this->order->id_cart); - $order_bk_data = $obj_htl_bk_dtl->getOnlyOrderBookingData($this->order->id, $cart_obj->id_guest, $type_value['product_id'], $customer->id); - } - else - { - $order_bk_data = $obj_htl_bk_dtl->getOnlyOrderBookingData($this->order->id, $customer->id_guest, $type_value['product_id']); - } - $rm_dtl = $obj_rm_type->getRoomTypeInfoByIdProduct($type_value['product_id']); + $cover_image_arr = $product->getCover($type_value['product_id']); - $cart_htl_data[$type_key]['id_product'] = $type_value['product_id']; - $cart_htl_data[$type_key]['cover_img'] = $cover_img; - $cart_htl_data[$type_key]['adult'] = $rm_dtl['adult']; - $cart_htl_data[$type_key]['children'] = $rm_dtl['children']; + if (!empty($cover_image_arr)) { + $cover_img = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default'); + } else { + $cover_img = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code."-default", 'small_default'); + } - foreach ($order_bk_data as $data_k => $data_v) - { - $date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']); + if (isset($customer->id)) { + $cart_obj = new Cart($this->order->id_cart); + $order_bk_data = $obj_htl_bk_dtl->getOnlyOrderBookingData($this->order->id, $cart_obj->id_guest, $type_value['product_id'], $customer->id); + } else { + $order_bk_data = $obj_htl_bk_dtl->getOnlyOrderBookingData($this->order->id, $customer->id_guest, $type_value['product_id']); + } + $rm_dtl = $obj_rm_type->getRoomTypeInfoByIdProduct($type_value['product_id']); - /*Product price when order was created*/ - $order_details_obj = new OrderDetail($data_v['id_order_detail']); - $unit_price_tax_excl = 0; - $unit_price_tax_incl = 0; - $unit_price_tax_excl = $order_details_obj->unit_price_tax_excl; - $unit_price_tax_incl = $order_details_obj->unit_price_tax_incl; - $prod_ord_dtl_name = $order_details_obj->product_name; - $cart_htl_data[$type_key]['name'] = $prod_ord_dtl_name; + $cart_htl_data[$type_key]['id_product'] = $type_value['product_id']; + $cart_htl_data[$type_key]['cover_img'] = $cover_img; + $cart_htl_data[$type_key]['adult'] = $rm_dtl['adult']; + $cart_htl_data[$type_key]['children'] = $rm_dtl['children']; - $cart_htl_data[$type_key]['unit_price_tax_excl'] = $unit_price_tax_excl; - $cart_htl_data[$type_key]['unit_price_tax_incl'] = $unit_price_tax_incl; - //work on entring refund data - $obj_ord_ref_info = new HotelOrderRefundInfo(); - $ord_refnd_info = $obj_ord_ref_info->getOderRefundInfoByIdOrderIdProductByDate($this->order->id, $type_value['product_id'], $data_v['date_from'], $data_v['date_to']); - if ($ord_refnd_info) - { - $obj_refund_stages = new HotelOrderRefundStages(); - $stage_name = $obj_refund_stages->getNameById($ord_refnd_info['refund_stage_id']); + foreach ($order_bk_data as $data_k => $data_v) { + $date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']); - if ($stage_name == 'Refunded') - $refunded_rooms = 1; - } - else - { - $stage_name = ''; - } - // END Order Refund + /*Product price when order was created*/ + $order_details_obj = new OrderDetail($data_v['id_order_detail']); + $unit_price_tax_excl = 0; + $unit_price_tax_incl = 0; + $unit_price_tax_excl = $order_details_obj->unit_price_tax_excl; + $unit_price_tax_incl = $order_details_obj->unit_price_tax_incl; + $prod_ord_dtl_name = $order_details_obj->product_name; + $cart_htl_data[$type_key]['name'] = $prod_ord_dtl_name; + + $cart_htl_data[$type_key]['unit_price_tax_excl'] = $unit_price_tax_excl; + $cart_htl_data[$type_key]['unit_price_tax_incl'] = $unit_price_tax_incl; + //work on entring refund data + $obj_ord_ref_info = new HotelOrderRefundInfo(); + $ord_refnd_info = $obj_ord_ref_info->getOderRefundInfoByIdOrderIdProductByDate($this->order->id, $type_value['product_id'], $data_v['date_from'], $data_v['date_to']); + if ($ord_refnd_info) { + $obj_refund_stages = new HotelOrderRefundStages(); + $stage_name = $obj_refund_stages->getNameById($ord_refnd_info['refund_stage_id']); + + if ($stage_name == 'Refunded') { + $refunded_rooms = 1; + } + } else { + $stage_name = ''; + } + // END Order Refund - if (isset($cart_htl_data[$type_key]['date_diff'][$date_join])) - { - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] += 1; + if (isset($cart_htl_data[$type_key]['date_diff'][$date_join])) { + $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] += 1; - $num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days']; - $vart_quant = (int)$cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] * $num_days; + $num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days']; + $var_quant = (int)$cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm']; - $amount = $unit_price_tax_excl; - $amount *= $vart_quant; + $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; + $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_excl']/$num_days; - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $amount; + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $data_v['total_price_tax_excl']*$var_quant; - // For order refund - $cart_htl_data[$type_key]['date_diff'][$date_join]['stage_name'] = $stage_name; - $cart_htl_data[$type_key]['date_diff'][$date_join]['id_room'] = $data_v['id_room']; - } - else - { - $num_days = $obj_htl_bk_dtl->getNumberOfDays($data_v['date_from'], $data_v['date_to']); + // For order refund + $cart_htl_data[$type_key]['date_diff'][$date_join]['stage_name'] = $stage_name; + $cart_htl_data[$type_key]['date_diff'][$date_join]['id_room'] = $data_v['id_room']; + } else { + $num_days = $obj_htl_bk_dtl->getNumberOfDays($data_v['date_from'], $data_v['date_to']); - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] = 1; - $cart_htl_data[$type_key]['date_diff'][$date_join]['data_form'] = $data_v['date_from']; - $cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to']; - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; - $amount = $unit_price_tax_excl; - $amount *= $num_days; - - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $amount; - - // For order refund - $cart_htl_data[$type_key]['date_diff'][$date_join]['stage_name'] = $stage_name; - $cart_htl_data[$type_key]['date_diff'][$date_join]['id_room'] = $data_v['id_room']; - } - } - } + $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] = 1; + $cart_htl_data[$type_key]['date_diff'][$date_join]['data_form'] = $data_v['date_from']; + $cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to']; + $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; - // For Advanced Payment - $obj_customer_adv = new HotelCustomerAdvancedPayment(); - $order_adv_dtl = $obj_customer_adv->getCstAdvPaymentDtlByIdOrder($order_obj->id); - if ($order_adv_dtl) - $this->smarty->assign('order_adv_dtl', $order_adv_dtl); - } - } - $data = array( - 'cart_htl_data' => $cart_htl_data, - 'refunded_rooms' => $refunded_rooms, - 'order' => $this->order, + $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; + $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_excl']/$num_days; + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $data_v['total_price_tax_excl']; + + // For order refund + $cart_htl_data[$type_key]['date_diff'][$date_join]['stage_name'] = $stage_name; + $cart_htl_data[$type_key]['date_diff'][$date_join]['id_room'] = $data_v['id_room']; + } + } + } + + // For Advanced Payment + $obj_customer_adv = new HotelCustomerAdvancedPayment(); + $order_adv_dtl = $obj_customer_adv->getCstAdvPaymentDtlByIdOrder($order_obj->id); + if ($order_adv_dtl) { + $this->smarty->assign('order_adv_dtl', $order_adv_dtl); + } + } + } + $data = array( + 'cart_htl_data' => $cart_htl_data, + 'refunded_rooms' => $refunded_rooms, + 'order' => $this->order, 'order_invoice' => $this->order_invoice, 'order_details' => $order_details, - 'cart_rules' => $cart_rules, - 'delivery_address' => $formatted_delivery_address, - 'invoice_address' => $formatted_invoice_address, - 'addresses' => array('invoice' => $invoice_address, 'delivery' => $delivery_address), - 'tax_excluded_display' => $tax_excluded_display, - 'display_product_images' => $display_product_images, - 'layout' => $layout, - 'tax_tab' => $this->getTaxTabContent(), - 'customer' => $customer, - 'footer' => $footer, - 'ps_price_compute_precision' => _PS_PRICE_COMPUTE_PRECISION_, - 'round_type' => $round_type, - 'legal_free_text' => $legal_free_text, - ); + 'cart_rules' => $cart_rules, + 'delivery_address' => $formatted_delivery_address, + 'invoice_address' => $formatted_invoice_address, + 'addresses' => array('invoice' => $invoice_address, 'delivery' => $delivery_address), + 'tax_excluded_display' => $tax_excluded_display, + 'display_product_images' => $display_product_images, + 'layout' => $layout, + 'tax_tab' => $this->getTaxTabContent(), + 'customer' => $customer, + 'footer' => $footer, + 'ps_price_compute_precision' => _PS_PRICE_COMPUTE_PRECISION_, + 'round_type' => $round_type, + 'legal_free_text' => $legal_free_text, + ); - if (Tools::getValue('debug')) - die(json_encode($data)); + if (Tools::getValue('debug')) { + die(json_encode($data)); + } - $this->smarty->assign($data); + $this->smarty->assign($data); - $tpls = array( - 'style_tab' => $this->smarty->fetch($this->getTemplate('invoice.style-tab')), - 'addresses_tab' => $this->smarty->fetch($this->getTemplate('invoice.addresses-tab')), - 'summary_tab' => $this->smarty->fetch($this->getTemplate('invoice.summary-tab')), - 'product_tab' => $this->smarty->fetch($this->getTemplate('invoice.product-tab')), - 'tax_tab' => $this->getTaxTabContent(), - 'payment_tab' => $this->smarty->fetch($this->getTemplate('invoice.payment-tab')), - 'total_tab' => $this->smarty->fetch($this->getTemplate('invoice.total-tab')), - ); + $tpls = array( + 'style_tab' => $this->smarty->fetch($this->getTemplate('invoice.style-tab')), + 'addresses_tab' => $this->smarty->fetch($this->getTemplate('invoice.addresses-tab')), + 'summary_tab' => $this->smarty->fetch($this->getTemplate('invoice.summary-tab')), + 'product_tab' => $this->smarty->fetch($this->getTemplate('invoice.product-tab')), + 'tax_tab' => $this->getTaxTabContent(), + 'payment_tab' => $this->smarty->fetch($this->getTemplate('invoice.payment-tab')), + 'total_tab' => $this->smarty->fetch($this->getTemplate('invoice.total-tab')), + ); - $this->smarty->assign($tpls); - return $this->smarty->fetch($this->getTemplateByCountry($country->iso_code)); - } + $this->smarty->assign($tpls); + return $this->smarty->fetch($this->getTemplateByCountry($country->iso_code)); + } - /** - * Returns the tax tab content - * - * @return String Tax tab html content - */ - public function getTaxTabContent() - { - $debug = Tools::getValue('debug'); + /** + * Returns the tax tab content + * + * @return String Tax tab html content + */ + public function getTaxTabContent() + { + $debug = Tools::getValue('debug'); - $address = new Address((int)$this->order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); - $tax_exempt = Configuration::get('VATNUMBER_MANAGEMENT') - && !empty($address->vat_number) - && $address->id_country != Configuration::get('VATNUMBER_COUNTRY'); - $carrier = new Carrier($this->order->id_carrier); + $address = new Address((int)$this->order->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); + $tax_exempt = Configuration::get('VATNUMBER_MANAGEMENT') + && !empty($address->vat_number) + && $address->id_country != Configuration::get('VATNUMBER_COUNTRY'); + $carrier = new Carrier($this->order->id_carrier); - $tax_breakdowns = $this->getTaxBreakdown(); + $tax_breakdowns = $this->getTaxBreakdown(); - $data = array( - 'tax_exempt' => $tax_exempt, - 'use_one_after_another_method' => $this->order_invoice->useOneAfterAnotherTaxComputationMethod(), - 'display_tax_bases_in_breakdowns' => $this->order_invoice->displayTaxBasesInProductTaxesBreakdown(), - 'product_tax_breakdown' => $this->order_invoice->getProductTaxesBreakdown($this->order), - 'shipping_tax_breakdown' => $this->order_invoice->getShippingTaxesBreakdown($this->order), - 'ecotax_tax_breakdown' => $this->order_invoice->getEcoTaxTaxesBreakdown(), - 'wrapping_tax_breakdown' => $this->order_invoice->getWrappingTaxesBreakdown(), - 'tax_breakdowns' => $tax_breakdowns, - 'order' => $debug ? null : $this->order, - 'order_invoice' => $debug ? null : $this->order_invoice, - 'carrier' => $debug ? null : $carrier - ); + $data = array( + 'tax_exempt' => $tax_exempt, + 'use_one_after_another_method' => $this->order_invoice->useOneAfterAnotherTaxComputationMethod(), + 'display_tax_bases_in_breakdowns' => $this->order_invoice->displayTaxBasesInProductTaxesBreakdown(), + 'product_tax_breakdown' => $this->order_invoice->getProductTaxesBreakdown($this->order), + 'shipping_tax_breakdown' => $this->order_invoice->getShippingTaxesBreakdown($this->order), + 'ecotax_tax_breakdown' => $this->order_invoice->getEcoTaxTaxesBreakdown(), + 'wrapping_tax_breakdown' => $this->order_invoice->getWrappingTaxesBreakdown(), + 'tax_breakdowns' => $tax_breakdowns, + 'order' => $debug ? null : $this->order, + 'order_invoice' => $debug ? null : $this->order_invoice, + 'carrier' => $debug ? null : $carrier + ); - if ($debug) - return $data; + if ($debug) { + return $data; + } - $this->smarty->assign($data); + $this->smarty->assign($data); - return $this->smarty->fetch($this->getTemplate('invoice.tax-tab')); - } + return $this->smarty->fetch($this->getTemplate('invoice.tax-tab')); + } - /** - * Returns different tax breakdown elements - * - * @return Array Different tax breakdown elements - */ - protected function getTaxBreakdown() - { - $breakdowns = array( - 'product_tax' => $this->order_invoice->getProductTaxesBreakdown($this->order), - 'shipping_tax' => $this->order_invoice->getShippingTaxesBreakdown($this->order), - 'ecotax_tax' => $this->order_invoice->getEcoTaxTaxesBreakdown(), - 'wrapping_tax' => $this->order_invoice->getWrappingTaxesBreakdown(), - ); + /** + * Returns different tax breakdown elements + * + * @return Array Different tax breakdown elements + */ + protected function getTaxBreakdown() + { + $breakdowns = array( + 'product_tax' => $this->order_invoice->getProductTaxesBreakdown($this->order), + 'shipping_tax' => $this->order_invoice->getShippingTaxesBreakdown($this->order), + 'ecotax_tax' => $this->order_invoice->getEcoTaxTaxesBreakdown(), + 'wrapping_tax' => $this->order_invoice->getWrappingTaxesBreakdown(), + ); - foreach ($breakdowns as $type => $bd) - { - if (empty($bd)) - unset($breakdowns[$type]); - } + foreach ($breakdowns as $type => $bd) { + if (empty($bd)) { + unset($breakdowns[$type]); + } + } - if (empty($breakdowns)) - $breakdowns = false; + if (empty($breakdowns)) { + $breakdowns = false; + } - if (isset($breakdowns['product_tax'])) - { - foreach ($breakdowns['product_tax'] as &$bd) - $bd['total_tax_excl'] = $bd['total_price_tax_excl']; - } + if (isset($breakdowns['product_tax'])) { + foreach ($breakdowns['product_tax'] as &$bd) { + $bd['total_tax_excl'] = $bd['total_price_tax_excl']; + } + } - if (isset($breakdowns['ecotax_tax'])) { - foreach ($breakdowns['ecotax_tax'] as &$bd) { - $bd['total_tax_excl'] = $bd['ecotax_tax_excl']; - $bd['total_amount'] = $bd['ecotax_tax_incl'] - $bd['ecotax_tax_excl']; - } - } + if (isset($breakdowns['ecotax_tax'])) { + foreach ($breakdowns['ecotax_tax'] as &$bd) { + $bd['total_tax_excl'] = $bd['ecotax_tax_excl']; + $bd['total_amount'] = $bd['ecotax_tax_incl'] - $bd['ecotax_tax_excl']; + } + } - return $breakdowns; - } + return $breakdowns; + } /* - protected function getTaxLabel($tax_breakdowns) - { - $tax_label = ''; - $all_taxes = array(); + protected function getTaxLabel($tax_breakdowns) + { + $tax_label = ''; + $all_taxes = array(); - foreach ($tax_breakdowns as $type => $bd) - foreach ($bd as $line) - if(isset($line['id_tax'])) - $all_taxes[] = $line['id_tax']; + foreach ($tax_breakdowns as $type => $bd) + foreach ($bd as $line) + if(isset($line['id_tax'])) + $all_taxes[] = $line['id_tax']; - $taxes = array_unique($all_taxes); + $taxes = array_unique($all_taxes); - foreach ($taxes as $id_tax) { - $tax = new Tax($id_tax); - $tax_label .= $tax->id.': '.$tax->name[$this->order->id_lang].' ('.$tax->rate.'%) '; - } + foreach ($taxes as $id_tax) { + $tax = new Tax($id_tax); + $tax_label .= $tax->id.': '.$tax->name[$this->order->id_lang].' ('.$tax->rate.'%) '; + } - return $tax_label; - } + return $tax_label; + } */ - /** - * Returns the invoice template associated to the country iso_code - * - * @param string $iso_country - */ - protected function getTemplateByCountry($iso_country) - { - $file = Configuration::get('PS_INVOICE_MODEL'); + /** + * Returns the invoice template associated to the country iso_code + * + * @param string $iso_country + */ + protected function getTemplateByCountry($iso_country) + { + $file = Configuration::get('PS_INVOICE_MODEL'); - // try to fetch the iso template - $template = $this->getTemplate($file.'.'.$iso_country); + // try to fetch the iso template + $template = $this->getTemplate($file.'.'.$iso_country); - // else use the default one - if (!$template) - $template = $this->getTemplate($file); + // else use the default one + if (!$template) { + $template = $this->getTemplate($file); + } - return $template; - } + return $template; + } - /** - * Returns the template filename when using bulk rendering - * - * @return string filename - */ - public function getBulkFilename() - { - return 'invoices.pdf'; - } + /** + * Returns the template filename when using bulk rendering + * + * @return string filename + */ + public function getBulkFilename() + { + return 'invoices.pdf'; + } - /** - * Returns the template filename - * - * @return string filename - */ - public function getFilename() - { - return Configuration::get('PS_INVOICE_PREFIX', Context::getContext()->language->id, null, $this->order->id_shop).sprintf('%06d', $this->order_invoice->number).'.pdf'; - } -} \ No newline at end of file + /** + * Returns the template filename + * + * @return string filename + */ + public function getFilename() + { + return Configuration::get('PS_INVOICE_PREFIX', Context::getContext()->language->id, null, $this->order->id_shop).sprintf('%06d', $this->order_invoice->number).'.pdf'; + } +} diff --git a/classes/webservice/WebserviceRequest.php b/classes/webservice/WebserviceRequest.php index 3ef8ee72d..4494e2ead 100644 --- a/classes/webservice/WebserviceRequest.php +++ b/classes/webservice/WebserviceRequest.php @@ -323,6 +323,16 @@ class WebserviceRequestCore 'product_customization_fields' => array('description' => 'Customization Field', 'class' => 'CustomizationField'), 'customizations' => array('description' => 'Customization values', 'class' => 'Customization'), ); + + // Code from Prestashop 1.7.0.2 + $extra_resources = Hook::exec('addWebserviceResources', array('resources' => $resources), null, true, false); + if (is_array($extra_resources) && count($extra_resources)) { + foreach ($extra_resources as $new_resources) { + if (is_array($new_resources) && count($new_resources)) { + $resources = array_merge($resources, $new_resources); + } + } + } ksort($resources); return $resources; } @@ -585,7 +595,8 @@ class WebserviceRequestCore if (isset($this->objOutput)) { $this->objOutput->setStatus($status); } - $this->errors[] = $display_errors ? array($code, $label) : 'Internal error. To see this error please display the PHP errors.'; + //$this->errors[] = $display_errors ? array($code, $label) : 'Internal error. To see this error please display the PHP errors.'; + $this->errors[] = $display_errors ? array($code, $label) : 'Internal error. To see this error please display the PHP errors.'.$code.' '.$label; } /** diff --git a/controllers/admin/AdminDashboardController.php b/controllers/admin/AdminDashboardController.php index e407dee44..08e4bf0fb 100644 --- a/controllers/admin/AdminDashboardController.php +++ b/controllers/admin/AdminDashboardController.php @@ -265,6 +265,7 @@ class AdminDashboardControllerCore extends AdminController 'date_to' => $this->context->employee->stats_date_to, 'hookDashboardZoneOne' => Hook::exec('dashboardZoneOne', $params), 'hookDashboardZoneTwo' => Hook::exec('dashboardZoneTwo', $params), + 'hookDashboardZoneThree' => Hook::exec('dashboardZoneThree', $params), //'translations' => $translations, 'action' => '#', 'warning' => $this->getWarningDomainName(), diff --git a/controllers/admin/AdminOrdersController.php b/controllers/admin/AdminOrdersController.php index ec5a2c13b..9446b17e9 100644 --- a/controllers/admin/AdminOrdersController.php +++ b/controllers/admin/AdminOrdersController.php @@ -55,26 +55,25 @@ class AdminOrdersControllerCore extends AdminController $this->allow_export = true; $this->deleted = false; $this->context = Context::getContext(); - $this->_select = ' - (cap.total_order_amount - cap.total_paid_amount) AS `amount_due`, - a.id_currency, - a.id_order AS id_pdf, - CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) AS `customer`, - osl.`name` AS `osname`, - os.`color`, - 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'; + (cap.total_order_amount - cap.total_paid_amount) AS `amount_due`, a.source AS order_source, + a.id_currency, + a.id_order AS id_pdf, + CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) AS `customer`, + osl.`name` AS `osname`, + os.`color`, + 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`) - 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_.'htl_customer_adv_payment` cap ON (cap.`id_order` = a.`id_order`) - 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.')'; + LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`id_customer`) + 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_.'htl_customer_adv_payment` cap ON (cap.`id_order` = a.`id_order`) + 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'; $this->_use_found_rows = false; @@ -105,6 +104,10 @@ class AdminOrdersControllerCore extends AdminController 'title' => $this->l('Customer'), 'havingFilter' => true, ), + 'order_source' => array( + 'title' => $this->l('Order Source'), + 'havingFilter' => true, + ), ); if (Configuration::get('PS_B2B_ENABLE')) { @@ -163,13 +166,13 @@ class AdminOrdersControllerCore extends AdminController 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'); + 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) { @@ -1843,7 +1846,7 @@ class AdminOrdersControllerCore extends AdminController $order_detail_data = $obj_htl_bk_dtl->getOrderFormatedBookinInfoByIdOrder((int) Tools::getValue('id_order')); $total_tax = 0; - $total_rooms_cost = 0; + $totalRoomsCostTE = 0; if ($order_detail_data) { foreach ($order_detail_data as $key => $value) { //work on entring refund data @@ -1871,20 +1874,13 @@ class AdminOrdersControllerCore extends AdminController $order_detail_data[$key]['avail_rooms_to_swap'] = $obj_htl_bk_dtl->getAvailableRoomsForSwapping($value['date_from'], $value['date_to'], $value['id_product'], $value['id_hotel'], $value['id_room']); /*Product price when order was created*/ - $order_details_obj = new OrderDetail($value['id_order_detail']); - $unit_price_tax_excl = 0; - $unit_price_tax_incl = 0; - $unit_price_tax_excl = $order_details_obj->unit_price_tax_excl; - $unit_price_tax_incl = $order_details_obj->unit_price_tax_incl; - $tax_incl_price = $value['quantity'] * $unit_price_tax_incl; - $tax_excl_price = $value['quantity'] * $unit_price_tax_excl; - $total_tax += ($tax_incl_price - $tax_excl_price); - $total_rooms_cost += $tax_excl_price; - - $order_detail_data[$key]['unit_amt_tax_excl'] = $unit_price_tax_excl; - $order_detail_data[$key]['unit_amt_tax_incl'] = $unit_price_tax_incl; - $order_detail_data[$key]['amt_with_qty_tax_excl'] = $tax_excl_price; - $order_detail_data[$key]['amt_with_qty_tax_incl'] = $tax_incl_price; + $totalRoomsCostTE += $value['total_price_tax_excl']; + $total_tax += $value['total_price_tax_incl']-$value['total_price_tax_excl']; + $num_days = $obj_htl_bk_dtl->getNumberOfDays($value['date_from'], $value['date_to']); + $order_detail_data[$key]['unit_amt_tax_excl'] = $value['total_price_tax_excl']/$num_days; + $order_detail_data[$key]['unit_amt_tax_incl'] = $value['total_price_tax_incl']/$num_days; + $order_detail_data[$key]['amt_with_qty_tax_excl'] = $value['total_price_tax_excl']; + $order_detail_data[$key]['amt_with_qty_tax_incl'] = $value['total_price_tax_incl']; // For Order Refund Status $order_detail_data[$key]['stage_name'] = $stage_name; @@ -1892,7 +1888,6 @@ class AdminOrdersControllerCore extends AdminController } //end //by webkul to send order status on order detail page - $obj_bookin_detail = new HotelBookingDetail(); $htl_booking_data_order_id = $obj_bookin_detail->getBookingDataByOrderId(Tools::getValue('id_order')); if ($htl_booking_data_order_id) { @@ -1938,7 +1933,7 @@ class AdminOrdersControllerCore extends AdminController /*#################################################*/ /*Assigned variable to view.tpl By webkul*/ - 'total_rooms_cost' => $total_rooms_cost, + 'totalRoomsCostTE' => $totalRoomsCostTE, 'total_tax_in_order' => $total_tax, 'htl_booking_order_data' => $htl_booking_data_order_id, 'hotel_order_status' => $htl_order_status, @@ -2566,6 +2561,10 @@ class AdminOrdersControllerCore extends AdminController $obj_htl_bk_dtl->comment = $obj_cart_bk_data->comment; $obj_htl_bk_dtl->date_from = $obj_cart_bk_data->date_from; $obj_htl_bk_dtl->date_to = $obj_cart_bk_data->date_to; + $total_price = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($product_informations['product_id'], $obj_cart_bk_data->date_from, $obj_cart_bk_data->date_to); + $obj_htl_bk_dtl->total_price_tax_excl = $total_price['total_price_tax_incl']; + $obj_htl_bk_dtl->total_price_tax_incl = $total_price['total_price_tax_excl']; + $obj_htl_bk_dtl->save(); } } @@ -2719,6 +2718,29 @@ class AdminOrdersControllerCore extends AdminController ))); } + // By webkul to calculate rates of the product from hotelreservation syatem tables with feature prices.... + $hotelCartBookingData = new HotelCartBookingData(); + $totalProductPriceBeforeTE = (float) $order_detail->total_price_tax_excl; + $totalProductPriceBeforeTI = (float) $order_detail->total_price_tax_incl; + $totalProductPriceAfterTE = 0; + $totalProductPriceAfterTI = 0; + $bookedRooms = $obj_booking_detail->getBookedRoomsByIdOrderDetail((int) Tools::getValue('order_detail_id'), $id_product); + if ($bookedRooms) { + foreach ($bookedRooms as $roomInfo) { + if ($roomInfo['id_room'] == $id_room && (strtotime($roomInfo['date_from']) == strtotime($old_date_from))) { + $roomTotalPrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($roomInfo['id_product'], $new_date_from, $new_date_to); + $totalProductPriceAfterTE += (float) $roomTotalPrice['total_price_tax_excl']; + $totalProductPriceAfterTI += (float) $roomTotalPrice['total_price_tax_incl']; + } else { + $roomTotalPrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($roomInfo['id_product'], $roomInfo['date_from'], $roomInfo['date_to']); + $totalProductPriceAfterTE += (float) $roomInfo['total_price_tax_excl']; + $totalProductPriceAfterTI += (float) $roomInfo['total_price_tax_incl']; + } + } + } + // END + + /*This code is commented by webkul because in our case quantity of the product will be number of days for which room is booked*/ // If multiple product_quantity, the order details concern a product customized /*$product_quantity = 0; @@ -2736,8 +2758,11 @@ class AdminOrdersControllerCore extends AdminController $product_price_tax_incl = Tools::ps_round(Tools::getValue('product_price_tax_incl'), 2); $product_price_tax_excl = Tools::ps_round(Tools::getValue('product_price_tax_excl'), 2); // Calculate differences of price (Before / After) - $diff_price_tax_incl = $product_price_tax_incl * $qty_diff; - $diff_price_tax_excl = $product_price_tax_excl * $qty_diff; + //$diff_price_tax_incl = $product_price_tax_incl * $qty_diff; + $diff_price_tax_incl = $totalProductPriceAfterTI - $totalProductPriceBeforeTI; + //$diff_price_tax_excl = $product_price_tax_excl * $qty_diff; + $diff_price_tax_excl = $totalProductPriceAfterTE - $totalProductPriceBeforeTE; + //var_dump($order_invoice); // Apply change on OrderInvoice if (isset($order_invoice)) { // If OrderInvoice to use is different, we update the old invoice and new invoice @@ -2749,7 +2774,7 @@ class AdminOrdersControllerCore extends AdminController $old_order_invoice->total_paid_tax_excl -= $order_detail->total_price_tax_excl; $old_order_invoice->total_paid_tax_incl -= $order_detail->total_price_tax_incl; - + ddd($old_order_invoice); $res &= $old_order_invoice->update(); $order_invoice->total_products += $order_detail->total_price_tax_excl; @@ -2761,7 +2786,6 @@ class AdminOrdersControllerCore extends AdminController $order_detail->id_order_invoice = $order_invoice->id; } } - if ($diff_price_tax_incl != 0 && $diff_price_tax_excl != 0) { $order_detail->unit_price_tax_excl = $product_price_tax_excl; $order_detail->unit_price_tax_incl = $product_price_tax_incl; @@ -2950,10 +2974,21 @@ class AdminOrdersControllerCore extends AdminController /*END*/ $this->doDeleteProductLineValidation($order_detail, $order); + $bookingInfo = $obj_booking_detail->getRowByIdOrderIdProductInDateRange($id_order, $id_product, $date_from, $date_to); + $bookingPriceTaxIncl = $bookingInfo['total_price_tax_incl']; + $bookingPriceTaxExcl = $bookingInfo['total_price_tax_excl']; + /*$totalProductPriceBeforeTE = $order_detail->total_price_tax_excl; + $totalProductPriceBeforeTI = $order_detail->total_price_tax_incl;*/ + // by webkul to calculate rates of the product from hotelreservation syatem tables with feature prices.... + /* $hotelCartBookingData = new HotelCartBookingData(); + $roomTypesByIdProduct = $hotelCartBookingData->getCartInfoIdCartIdProduct($this->id, $product['id_product']);*/ /*This code below to alter the values in the order detail table*/ - $diff_products_tax_incl = $order_detail->unit_price_tax_incl * $product_quantity; - $diff_products_tax_excl = $order_detail->unit_price_tax_excl * $product_quantity; + //$diff_products_tax_incl = $order_detail->unit_price_tax_incl * $product_quantity; + //$diff_products_tax_excl = $order_detail->unit_price_tax_excl * $product_quantity; + $diff_products_tax_incl = $bookingPriceTaxIncl; + $diff_products_tax_excl = $bookingPriceTaxExcl; + $delete = false; if ($product_quantity >= $order_detail->product_quantity) { $delete = true; diff --git a/controllers/admin/AdminProductsController.php b/controllers/admin/AdminProductsController.php index 97d1493a3..ac371bfbb 100644 --- a/controllers/admin/AdminProductsController.php +++ b/controllers/admin/AdminProductsController.php @@ -174,19 +174,19 @@ class AdminProductsControllerCore extends AdminController } $this->_join .= ' - LEFT JOIN `'._DB_PREFIX_.'stock_available` sav ON (sav.`id_product` = a.`id_product` AND sav.`id_product_attribute` = 0 - '.StockAvailable::addSqlShopRestriction(null, null, 'sav').') '; + LEFT JOIN `'._DB_PREFIX_.'stock_available` sav ON (sav.`id_product` = a.`id_product` AND sav.`id_product_attribute` = 0 + '.StockAvailable::addSqlShopRestriction(null, null, 'sav').') '; $alias = 'sa'; $alias_image = 'image_shop'; $id_shop = Shop::isFeatureActive() && Shop::getContext() == Shop::CONTEXT_SHOP ? (int) $this->context->shop->id : 'a.id_shop_default'; $this->_join .= ' JOIN `'._DB_PREFIX_.'product_shop` sa ON (a.`id_product` = sa.`id_product` AND sa.id_shop = '.$id_shop.') - LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON ('.$alias.'.`id_category_default` = cl.`id_category` AND b.`id_lang` = cl.`id_lang` AND cl.id_shop = '.$id_shop.') - LEFT JOIN `'._DB_PREFIX_.'shop` shop ON (shop.id_shop = '.$id_shop.') - LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop ON (image_shop.`id_product` = a.`id_product` AND image_shop.`cover` = 1 AND image_shop.id_shop = '.$id_shop.') - LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_image` = image_shop.`id_image`) - LEFT JOIN `'._DB_PREFIX_.'product_download` pd ON (pd.`id_product` = a.`id_product`)'; + LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON ('.$alias.'.`id_category_default` = cl.`id_category` AND b.`id_lang` = cl.`id_lang` AND cl.id_shop = '.$id_shop.') + LEFT JOIN `'._DB_PREFIX_.'shop` shop ON (shop.id_shop = '.$id_shop.') + LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop ON (image_shop.`id_product` = a.`id_product` AND image_shop.`cover` = 1 AND image_shop.id_shop = '.$id_shop.') + LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_image` = image_shop.`id_image`) + LEFT JOIN `'._DB_PREFIX_.'product_download` pd ON (pd.`id_product` = a.`id_product`)'; $this->_select .= 'shop.`name` AS `shopname`, a.`id_shop_default`, '; $this->_select .= $alias_image.'.`id_image` AS `id_image`, cl.`name` AS `name_category`, '.$alias.'.`price`, 0 AS `price_final`, a.`is_virtual`, pd.`nb_downloadable`, sav.`quantity` AS `sav_quantity`, '.$alias.'.`active`, IF(sav.`quantity`<=0, 1, 0) AS `badge_danger`'; @@ -1662,14 +1662,14 @@ class AdminProductsControllerCore extends AdminController // Clean covers in image table $count_cover_image = Db::getInstance()->getValue(' - SELECT COUNT(*) FROM '._DB_PREFIX_.'image i - INNER JOIN '._DB_PREFIX_.'image_shop ish ON (i.id_image = ish.id_image AND ish.id_shop = '.(int) $id_shop.') - WHERE i.cover = 1 AND `id_product` = '.(int) $id_product); + SELECT COUNT(*) FROM '._DB_PREFIX_.'image i + INNER JOIN '._DB_PREFIX_.'image_shop ish ON (i.id_image = ish.id_image AND ish.id_shop = '.(int) $id_shop.') + WHERE i.cover = 1 AND `id_product` = '.(int) $id_product); $id_image = Db::getInstance()->getValue(' - SELECT i.`id_image` FROM '._DB_PREFIX_.'image i - INNER JOIN '._DB_PREFIX_.'image_shop ish ON (i.id_image = ish.id_image AND ish.id_shop = '.(int) $id_shop.') - WHERE `id_product` = '.(int) $id_product); + SELECT i.`id_image` FROM '._DB_PREFIX_.'image i + INNER JOIN '._DB_PREFIX_.'image_shop ish ON (i.id_image = ish.id_image AND ish.id_shop = '.(int) $id_shop.') + WHERE `id_product` = '.(int) $id_product); if ($count_cover_image < 1) { Db::getInstance()->execute('UPDATE '._DB_PREFIX_.'image i SET i.cover = 1 WHERE i.id_image = '.(int) $id_image.' AND i.`id_product` = '.(int) $id_product.' LIMIT 1'); @@ -1681,10 +1681,10 @@ class AdminProductsControllerCore extends AdminController // Clean covers in image_shop table $count_cover_image_shop = Db::getInstance()->getValue(' - SELECT COUNT(*) - FROM '._DB_PREFIX_.'image_shop ish - INNER JOIN '._DB_PREFIX_.'image i ON (i.id_image = ish.id_image AND i.`id_product` = '.(int) $id_product.') - WHERE ish.id_shop = '.(int) $id_shop.' AND ish.cover = 1'); + SELECT COUNT(*) + FROM '._DB_PREFIX_.'image_shop ish + INNER JOIN '._DB_PREFIX_.'image i ON (i.id_image = ish.id_image AND i.`id_product` = '.(int) $id_product.') + WHERE ish.id_shop = '.(int) $id_shop.' AND ish.cover = 1'); if ($count_cover_image_shop < 1) { Db::getInstance()->execute('UPDATE '._DB_PREFIX_.'image_shop ish SET ish.cover = 1 WHERE ish.id_image = '.(int) $id_image.' AND ish.id_shop = '.(int) $id_shop.' LIMIT 1'); @@ -1753,18 +1753,18 @@ class AdminProductsControllerCore extends AdminController // if deleted image was the cover, change it to the first one if (!Image::getCover($image->id_product)) { $res &= Db::getInstance()->execute(' - UPDATE `'._DB_PREFIX_.'image_shop` image_shop, '._DB_PREFIX_.'image i - SET image_shop.`cover` = 1, - i.cover = 1 - WHERE image_shop.`id_image` = (SELECT id_image FROM - (SELECT image_shop.id_image - FROM '._DB_PREFIX_.'image i'. + UPDATE `'._DB_PREFIX_.'image_shop` image_shop, '._DB_PREFIX_.'image i + SET image_shop.`cover` = 1, + i.cover = 1 + WHERE image_shop.`id_image` = (SELECT id_image FROM + (SELECT image_shop.id_image + FROM '._DB_PREFIX_.'image i'. Shop::addSqlAssociation('image', 'i').' - WHERE i.id_product ='.(int) $image->id_product.' LIMIT 1 - ) tmpImage) - AND id_shop='.(int) $this->context->shop->id.' - AND i.id_image = image_shop.id_image - '); + WHERE i.id_product ='.(int) $image->id_product.' LIMIT 1 + ) tmpImage) + AND id_shop='.(int) $this->context->shop->id.' + AND i.id_image = image_shop.id_image + '); } if (file_exists(_PS_TMP_IMG_DIR_.'product_'.$image->id_product.'.jpg')) { @@ -2725,20 +2725,20 @@ class AdminProductsControllerCore extends AdminController $level = $current['infos']['level_depth'] + 1; $content .= ' - - - - - - '.$id_category.' - - '; + + + + + + '.$id_category.' + + '; for ($i = 2; $i < $level; ++$i) { $content .= ''; } $content .= '   - - '; + + '; if ($level > 1) { $has_suite[] = ($todo == $doneC ? 0 : 1); @@ -2757,10 +2757,10 @@ class AdminProductsControllerCore extends AdminController protected function _displayDraftWarning($active) { $content = '
- '.$this->l('Your room type will be saved as a draft.').' - '.$this->l('Save and preview').' - -
'; + '.$this->l('Your room type will be saved as a draft.').' + '.$this->l('Save and preview').' + +
'; $this->tpl_form_vars['draft_warning'] = $content; } @@ -2930,7 +2930,7 @@ class AdminProductsControllerCore extends AdminController $page = (int) Tools::getValue('page'); - $this->tpl_form_vars['form_action'] = $this->context->link->getAdminLink('AdminProducts').'&'.($id_product ? 'id_product='.(int) $id_product : 'addproduct').($page > 1 ? '&page='.(int) $page : ''); + $this->tpl_form_vars['form_action'] = $this->context->link->getAdminLink('AdminProducts').'&'.($id_product ? 'updateproduct&id_product='.(int)$id_product : 'addproduct').($page > 1 ? '&page='.(int)$page : ''); $this->tpl_form_vars['id_product'] = $id_product; // Transform configuration option 'upload_max_filesize' in octets @@ -3143,8 +3143,8 @@ class AdminProductsControllerCore extends AdminController 'wholesale_price' => (float) Tools::convertPrice($price, $id_currency), ); $where = ' - a.id_product = '.(int) $product->id.' - AND a.id_product_attribute = '.(int) $attribute['id_product_attribute']; + a.id_product = '.(int) $product->id.' + AND a.id_product_attribute = '.(int) $attribute['id_product_attribute']; ObjectModel::updateMultishopTable('Combination', $data, $where); } else { $product->wholesale_price = (float) Tools::convertPrice($price, $id_currency); //converted in the default currency @@ -3264,30 +3264,40 @@ class AdminProductsControllerCore extends AdminController $data = $this->createTemplate($this->tpl_form); if ($obj->id) { if ($this->product_exists_in_shop) { - $obj_htl_info = new HotelBranchInformation(); - $htl_info = $obj_htl_info->hotelsNameAndId(); - if ($htl_info) { - $obj_room_status = new HotelRoomStatus(); - $rm_status = $obj_room_status->getAllRoomStatus(); + $objHotelInfo = new HotelBranchInformation(); + $hotelInfo = $objHotelInfo->hotelsNameAndId(); + if ($hotelInfo) { + $objRoomStatus = new HotelRoomStatus(); + $roomStatus = $objRoomStatus->getAllRoomStatus(); - $obj_room_type = new HotelRoomType(); - $htl_room_type = $obj_room_type->getRoomTypeInfoByIdProduct($obj->id); - if ($htl_room_type) { - $data->assign('htl_room_type', $htl_room_type); + $objRoomType = new HotelRoomType(); + $hotelRoomType = $objRoomType->getRoomTypeInfoByIdProduct($obj->id); + if ($hotelRoomType) { + $data->assign('htl_room_type', $hotelRoomType); - $htl_full_info = $obj_htl_info->hotelBranchInfoById($htl_room_type['id_hotel']); - $data->assign('htl_full_info', $htl_full_info); + $hotelFullInfo = $objHotelInfo->hotelBranchInfoById($hotelRoomType['id_hotel']); + $data->assign('htl_full_info', $hotelFullInfo); - $obj_room_info = new HotelRoomInformation(); - $htl_room_info = $obj_room_info->getHotelRoomInfo($obj->id, $htl_room_type['id_hotel']); - if ($htl_room_info) { - $data->assign('htl_room_info', $htl_room_info); + $objRoomInfo = new HotelRoomInformation(); + $objRoomDisableDates = new HotelRoomDisableDates(); + $hotelRoomInfo = $objRoomInfo->getHotelRoomInfo($obj->id, $hotelRoomType['id_hotel']); + if ($hotelRoomInfo) { + foreach ($hotelRoomInfo as &$room) { + if ($room['id_status'] == 3) { + $disabledDates = $objRoomDisableDates->getRoomDisableDates($room['id']); + $room['disabled_dates_json'] = Tools::jsonEncode($disabledDates); + } + } + $data->assign('htl_room_info', $hotelRoomInfo); } } + $data->assign(array( 'product' => $obj, - 'htl_info' => $htl_info, - 'rm_status' => $rm_status, + 'htl_info' => $hotelInfo, + 'rm_status' => $roomStatus, + 'datesMissing' => $this->l('Please fill all Date From and Date To'), + 'datesOverlapping' => $this->l('Some date are conflicting with each other. Please check and reselect the date ranges.'), )); } else { $this->displayWarning($this->l('Add Hotel Before configurate this product.')); @@ -3302,11 +3312,39 @@ class AdminProductsControllerCore extends AdminController $this->tpl_form_vars['custom_form'] = $data->fetch(); } + public function validateDisableDateRanges($disableDates) + { + if (count($disableDates)) { + foreach ($disableDates as $disable_key => $disableDate) { + if (!$disableDate['date_to'] && !$disableDate['date_from']) { + unset($disableDates[$disable_key]); + } elseif (!Validate::isDate($disableDate['date_from']) || !Validate::isDate($disableDate['date_to'])) { + $this->errors[] = Tools::displayError('Please fill valid date in disable date fields.'); + } elseif (($disableDate['date_from'] && !$disableDate['date_to']) || (!$disableDate['date_from'] && $disableDate['date_to'])) { + $this->errors[] = Tools::displayError('Please fill all date from and date to for disable dates fields.'); + } else { + foreach ($disableDates as $key => $disDate) { + if ($key != $disable_key) { + if ((($disableDate['date_from'] < $disDate['date_from']) && ($disableDate['date_to'] <= $disDate['date_from'])) || (($disableDate['date_from'] > $disDate['date_from']) && ($disableDate['date_from'] >= $disDate['date_to']))) { + // continue + } else { + $this->errors[] = Tools::displayError('Some date are conflicting with each other. Please check and reselect the date ranges.'); + } + } + } + } + } + } + + if (!count($disableDates)) { + $this->errors[] = Tools::displayError('Please enter disable dates for status temporary disable.'); + } + } + public function processConfiguration() { /*Check if save of configuration tab is clicked*/ $checkConfSubmit = Tools::getValue('checkConfSubmit'); - if ($checkConfSubmit) { $wk_id_room_type = Tools::getValue('wk_id_room_type'); // htl_room_type id field use only in edit case @@ -3333,53 +3371,83 @@ class AdminProductsControllerCore extends AdminController $room_num = Tools::getValue('room_num'); if ($room_num) { $room_floor = Tools::getValue('room_floor'); - $room_status = Tools::getValue('room_status'); $room_comment = Tools::getValue('room_comment'); - + $disable_dates = Tools::getValue('disableDatesJSON'); + $room_status = Tools::getValue('room_status'); + if (count($room_num) != count($room_status)) { $this->errors[] = Tools::displayError('There is some problem while setting room information'); + } else { + foreach ($room_status as $key => $status) { + if ($status == 3) { + $disableDatesArray = Tools::jsonDecode($disable_dates[$key], true); + $this->validateDisableDateRanges($disableDatesArray); + } + } } if (!count($this->errors)) { if ($wk_id_room_type) { - $obj_room_type = new HotelRoomType($wk_id_room_type); - $id_hotel = $obj_room_type->id_hotel; + $objRoomType = new HotelRoomType($wk_id_room_type); + $id_hotel = $objRoomType->id_hotel; } else { - $obj_room_type = new HotelRoomType(); - $obj_room_type->id_product = $id_product; - $obj_room_type->id_hotel = $id_hotel; + $objRoomType = new HotelRoomType(); + $objRoomType->id_product = $id_product; + $objRoomType->id_hotel = $id_hotel; } - $obj_room_type->adult = $adult; - $obj_room_type->children = $children; - $obj_room_type->save(); + $objRoomType->adult = $adult; + $objRoomType->children = $children; + $objRoomType->save(); - $id_rm_type = $obj_room_type->id; + $id_rm_type = $objRoomType->id; + + // Associate categories to Room Type + $product = new Product((int) $id_product); + $objHotelInfo = new HotelBranchInformation($id_hotel); + $hotelIdCategory = $objHotelInfo->id_category; + $category = new Category($hotelIdCategory); + $hotelCategories = $category->getParentsCategories(); + $categoryIds = array_column($hotelCategories, 'id_category'); + $product->updateCategories($categoryIds); + // Associate categories to Room Type $id_room_info = Tools::getValue('id_room_info'); - foreach ($room_num as $key => $value) { if ($value) { if ($id_room_info) { if ($key <= (count($id_room_info) - 1)) { - $obj_room_info = new HotelRoomInformation($id_room_info[$key]); + $objRoomInfo = new HotelRoomInformation($id_room_info[$key]); } else { //if any new room is added at the time of edit - - $obj_room_info = new HotelRoomInformation(); - $obj_room_info->id_product = $id_product; - $obj_room_info->id_hotel = $id_hotel; + $objRoomInfo = new HotelRoomInformation(); + $objRoomInfo->id_product = $id_product; + $objRoomInfo->id_hotel = $id_hotel; } } else { - $obj_room_info = new HotelRoomInformation(); - $obj_room_info->id_product = $id_product; - $obj_room_info->id_hotel = $id_hotel; + $objRoomInfo = new HotelRoomInformation(); + $objRoomInfo->id_product = $id_product; + $objRoomInfo->id_hotel = $id_hotel; + } + $objRoomInfo->room_num = $value; + $objRoomInfo->id_status = $room_status[$key]; + $objRoomInfo->floor = $room_floor[$key]; + $objRoomInfo->comment = $room_comment[$key]; + if ($objRoomInfo->save()) { + if ($room_status[$key] == 3) { + if ($disableDatesArray) { + $objRoomDisableDates = new HotelRoomDisableDates(); + $objRoomDisableDates->deleteRoomDisableDates($objRoomInfo->id); + foreach ($disableDatesArray as $disableDateRange) { + $objRoomDisableDates->id_room_type = $id_product; + $objRoomDisableDates->id_room = $objRoomInfo->id; + $objRoomDisableDates->date_from = $disableDateRange['date_from']; + $objRoomDisableDates->date_to = $disableDateRange['date_to']; + $objRoomDisableDates->reason = $disableDateRange['reason']; + $objRoomDisableDates->add(); + } + } + } } - - $obj_room_info->room_num = $value; - $obj_room_info->id_status = $room_status[$key]; - $obj_room_info->floor = $room_floor[$key]; - $obj_room_info->comment = $room_comment[$key]; - $obj_room_info->save(); } } } @@ -3392,8 +3460,8 @@ class AdminProductsControllerCore extends AdminController { $id_htl_info = Tools::getValue('id'); - $obj_room_info = new HotelRoomInformation(); - $return = $obj_room_info->deleteHotelRoomInfoById($id_htl_info); + $objRoomInfo = new HotelRoomInformation(); + $return = $objRoomInfo->deleteHotelRoomInfoById($id_htl_info); echo $return; } @@ -3740,6 +3808,12 @@ class AdminProductsControllerCore extends AdminController } } } + // For Feature Price Plans + if ($obj->id) { + $htlFeaturePrices = new HotelRoomTypeFeaturePricing(); + $productFeaturePrices = $htlFeaturePrices->getFeaturePricesbyIdProduct($product->id); + $data->assign('productFeaturePrices', $productFeaturePrices); + } $this->tpl_form_vars['custom_form'] = $data->fetch(); } @@ -4023,30 +4097,30 @@ class AdminProductsControllerCore extends AdminController if (!$specific_price['id_shop'] || in_array($specific_price['id_shop'], Shop::getContextListShopID())) { $content .= ' - - '.$rule_name.' - '.$attributes_name.''; + + '.$rule_name.' + '.$attributes_name.''; $can_delete_specific_prices = true; if (Shop::isFeatureActive()) { $id_shop_sp = $specific_price['id_shop']; $can_delete_specific_prices = (count($this->context->employee->getAssociatedShops()) > 1 && !$id_shop_sp) || $id_shop_sp; $content .= ' - '.($id_shop_sp ? $shops[$id_shop_sp]['name'] : $this->l('All shops')).''; + '.($id_shop_sp ? $shops[$id_shop_sp]['name'] : $this->l('All shops')).''; } $price = Tools::ps_round($specific_price['price'], 2); $fixed_price = ($price == Tools::ps_round($obj->price, 2) || $specific_price['price'] == -1) ? '--' : Tools::displayPrice($price, $current_specific_currency); $content .= ' - '.($specific_price['id_currency'] ? $currencies[$specific_price['id_currency']]['name'] : $this->l('All currencies')).' - '.($specific_price['id_country'] ? $countries[$specific_price['id_country']]['name'] : $this->l('All countries')).' - '.($specific_price['id_group'] ? $groups[$specific_price['id_group']]['name'] : $this->l('All groups')).' - '.(isset($customer_full_name) ? $customer_full_name : $this->l('All customers')).' - '.$fixed_price.' - '.$impact.' - '.$period.' - '.$specific_price['from_quantity'].' - '.((!$rule->id && $can_delete_specific_prices) ? '' : '').' - '; + '.($specific_price['id_currency'] ? $currencies[$specific_price['id_currency']]['name'] : $this->l('All currencies')).' + '.($specific_price['id_country'] ? $countries[$specific_price['id_country']]['name'] : $this->l('All countries')).' + '.($specific_price['id_group'] ? $groups[$specific_price['id_group']]['name'] : $this->l('All groups')).' + '.(isset($customer_full_name) ? $customer_full_name : $this->l('All customers')).' + '.$fixed_price.' + '.$impact.' + '.$period.' + '.$specific_price['from_quantity'].' + '.((!$rule->id && $can_delete_specific_prices) ? '' : '').' + '; ++$i; unset($customer_full_name); } @@ -4055,39 +4129,39 @@ class AdminProductsControllerCore extends AdminController if ($length_before === strlen($content)) { $content .= ' - -  '.$this->l('No specific prices.').' - '; + +  '.$this->l('No specific prices.').' + '; } $content .= ' - - -
- -
'; + + +
+ +
'; $content .= ' - - '; + + '; // Not use id_customer if ($specific_price_priorities[0] == 'id_customer') { @@ -4097,58 +4171,58 @@ class AdminProductsControllerCore extends AdminController $specific_price_priorities = array_values($specific_price_priorities); $content .= '
-

'.$this->l('Priority management').'

-
- '.$this->l('Sometimes one customer can fit into multiple price rules. Priorities allow you to define which rule applies to the customer.').' -
'; +

'.$this->l('Priority management').'

+
+ '.$this->l('Sometimes one customer can fit into multiple price rules. Priorities allow you to define which rule applies to the customer.').' +
'; $content .= ' -
- -
- - - - - - - -
-
-
-
-

- -

-
-
- -
- '; +
+ +
+ + + + + + + +
+
+
+
+

+ +

+
+
+ + + '; return $content; } @@ -4630,9 +4704,9 @@ class AdminProductsControllerCore extends AdminController $data->assign('shops', $shops); $count_images = Db::getInstance()->getValue(' - SELECT COUNT(id_product) - FROM '._DB_PREFIX_.'image - WHERE id_product = '.(int) $obj->id + SELECT COUNT(id_product) + FROM '._DB_PREFIX_.'image + WHERE id_product = '.(int) $obj->id ); $images = Image::getImages($this->context->language->id, $obj->id); @@ -5455,10 +5529,10 @@ class AdminProductsControllerCore extends AdminController protected function _displayUnavailableProductWarning() { $content = '
- '.$this->l('Your room type will be saved as a draft.').' - '.$this->l('Save and preview').' - -
'; + '.$this->l('Your room type will be saved as a draft.').' + '.$this->l('Save and preview').' + + '; $this->tpl_form_vars['warning_unavailable_product'] = $content; } @@ -5472,14 +5546,14 @@ class AdminProductsControllerCore extends AdminController $result = false; } else { $result = Db::getInstance()->executeS(' - SELECT DISTINCT pl.`name`, p.`id_product`, pl.`id_shop` - FROM `'._DB_PREFIX_.'product` p - LEFT JOIN `'._DB_PREFIX_.'product_shop` ps ON (ps.id_product = p.id_product AND ps.id_shop ='.(int) Context::getContext()->shop->id.') - LEFT JOIN `'._DB_PREFIX_.'product_lang` pl - ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = '.(int) $id_lang.') - WHERE pl.`name` LIKE "%'.pSQL($search).'%" AND ps.id_product IS NULL - GROUP BY pl.`id_product` - LIMIT '.(int) $limit); + SELECT DISTINCT pl.`name`, p.`id_product`, pl.`id_shop` + FROM `'._DB_PREFIX_.'product` p + LEFT JOIN `'._DB_PREFIX_.'product_shop` ps ON (ps.id_product = p.id_product AND ps.id_shop ='.(int) Context::getContext()->shop->id.') + LEFT JOIN `'._DB_PREFIX_.'product_lang` pl + ON (pl.`id_product` = p.`id_product` AND pl.`id_lang` = '.(int) $id_lang.') + WHERE pl.`name` LIKE "%'.pSQL($search).'%" AND ps.id_product IS NULL + GROUP BY pl.`id_product` + LIMIT '.(int) $limit); } die(Tools::jsonEncode($result)); } diff --git a/controllers/front/CategoryController.php b/controllers/front/CategoryController.php index 215b2c76b..40c93865d 100644 --- a/controllers/front/CategoryController.php +++ b/controllers/front/CategoryController.php @@ -176,6 +176,14 @@ class CategoryControllerCore extends FrontController } /*End*/ + if (isset($booking_data['rm_data']) && $booking_data['rm_data']) { + $useTax = HotelBookingDetail::useTax(); + foreach ($booking_data['rm_data'] as $key => $roomType) { + $feature_price = HotelRoomTypeFeaturePricing::getRoomTypeFeaturePricesPerDay($roomType['id_product'], $date_from, $date_to, $useTax); + $booking_data['rm_data'][$key]['feature_price'] = $feature_price; + $booking_data['rm_data'][$key]['feature_price_diff'] = (float)($roomType['price_without_reduction']-$feature_price); + } + } $this->context->smarty->assign(array( 'warning_num' => $warning_num, 'num_days' => $num_days, diff --git a/controllers/front/HistoryController.php b/controllers/front/HistoryController.php index df9b24297..72583533f 100644 --- a/controllers/front/HistoryController.php +++ b/controllers/front/HistoryController.php @@ -54,9 +54,8 @@ class HistoryControllerCore extends FrontController { parent::initContent(); - if ($is_htlInst = Module::isInstalled('hotelreservationsystem')) - { - require_once (_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); + if ($is_htlInst = Module::isInstalled('hotelreservationsystem')) { + require_once(_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); $advance_payment_active = Configuration::get('WK_ALLOW_ADVANCED_PAYMENT'); $obj_customer_adv = new HotelCustomerAdvancedPayment(); @@ -65,62 +64,54 @@ class HistoryControllerCore extends FrontController $order_refund_info = array(); - if ($advance_payment_active) + if ($advance_payment_active) { $this->context->smarty->assign('adv_active', $advance_payment_active); + } } - if ($orders = Order::getCustomerOrders($this->context->customer->id)) - { - foreach ($orders as &$order) - { + if ($orders = Order::getCustomerOrders($this->context->customer->id)) { + foreach ($orders as &$order) { $myOrder = new Order((int)$order['id_order']); - if (Validate::isLoadedObject($myOrder)) - { + if (Validate::isLoadedObject($myOrder)) { $order['virtual'] = $myOrder->isVirtual(false); } - if ($is_htlInst) - { + if ($is_htlInst) { //For Advanced Payment - if ($advance_payment_active) - { + if ($advance_payment_active) { $order_adv_dtl = $obj_customer_adv->getCstAdvPaymentDtlByIdOrder($myOrder->id); - if ($order_adv_dtl) - { + if ($order_adv_dtl) { $order['due_amount'] = $order_adv_dtl['total_order_amount'] - $order_adv_dtl['total_paid_amount']; $order['pay_currency'] = $order_adv_dtl['id_currency']; - } - else - { + } else { $order['due_amount'] = 0; } } // For order Refund $order_refund_data = $obj_ord_ref_info->getOrderRefundInforDataByOrderId((int)$order['id_order']); - if ($order_refund_data) - { + if ($order_refund_data) { $waitting = 0; $accepted = 0; $refunded = 0; $rejected = 0; - foreach ($order_refund_data as $key_ref_data => $val_ref_data) - { - if ($val_ref_data['refund_stage_id'] == 1) + foreach ($order_refund_data as $key_ref_data => $val_ref_data) { + if ($val_ref_data['refund_stage_id'] == 1) { $order_refund_info[$order['id_order']]['waitting'] = ++$waitting; - else if ($val_ref_data['refund_stage_id'] == 2) + } elseif ($val_ref_data['refund_stage_id'] == 2) { $order_refund_info[$order['id_order']]['accepted'] = ++$accepted; - else if ($val_ref_data['refund_stage_id'] == 3) + } elseif ($val_ref_data['refund_stage_id'] == 3) { $order_refund_info[$order['id_order']]['refunded'] = ++$refunded; - else if ($val_ref_data['refund_stage_id'] == 4) + } elseif ($val_ref_data['refund_stage_id'] == 4) { $order_refund_info[$order['id_order']]['rejected'] = ++$rejected; + } } } } } } $this->context->smarty->assign(array( - 'order_refund_info' => $order_refund_info,// by webkul + 'order_refund_info' => $order_refund_info, // by webkul 'orders' => $orders, 'invoiceAllowed' => (int)Configuration::get('PS_INVOICE'), 'reorderingAllowed' => !(bool)Configuration::get('PS_DISALLOW_HISTORY_REORDERING'), diff --git a/controllers/front/HotelRoomTypeFeaturePricing.php b/controllers/front/HotelRoomTypeFeaturePricing.php new file mode 100644 index 000000000..bc1a33d9b --- /dev/null +++ b/controllers/front/HotelRoomTypeFeaturePricing.php @@ -0,0 +1,487 @@ + 'htl_room_type_feature_pricing', + 'primary' => 'id', + 'fields' => array( + 'id_product' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), + 'feature_price_name' => array('type' => self::TYPE_STRING), + 'date_from' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), + 'date_to' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), + 'impact_way' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), + 'is_special_days_exists' => array('type' => self::TYPE_INT), + 'date_selection_type' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), + 'special_days' => array('type' => self::TYPE_STRING), + 'impact_type' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), + 'impact_value' => array('type' => self::TYPE_FLOAT), + 'active' => array('type' => self::TYPE_INT), + 'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), + 'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), + )); + + public function __construct($id = null, $id_lang = null, $id_shop = null) + { + $this->moduleInstance = Module::getInstanceByName('hotelreservationsystem'); + parent::__construct($id); + } + + /** + * [getRoomTypeActiveFeaturePrices returns room type active feature price plans] + * @param [int] $id_product [id of the product] + * @return [array|false] [returns array of all active feature plans of the room type if found else returns false] + */ + public static function getRoomTypeActiveFeaturePrices($id_product) + { + return Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'htl_room_type_feature_pricing` WHERE `id_product`='.(int) $id_product.' AND `active`=1'); + } + + /** + * [getRoomTypeActiveFeaturePricesByDateRange returns room type active feature price plans by supplied date Range] + * @param [int] $id_product [id of the product] + * @param [date] $date_from [start date of the date range] + * @param [date] $date_to [end date of the date range] + * @return [array|false] [returns array of all active feature plans of the room type if found else returns false] + */ + public static function getRoomTypeActiveFeaturePricesByDateRange($id_product, $date_from, $date_to) + { + return Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'htl_room_type_feature_pricing` WHERE (`id_product`=0 OR `id_product`='.(int) $id_product.') AND `active`=1 AND `date_from` <= \''.$date_to.'\' AND `date_to` >= \''.$date_from.'\''); + } + + /** + * [checkRoomTypeFeaturePriceExistance returns room type active feature price plan by supplied date Range and supplied feature price plan type else returns false] + * @param [int] $id_product [id of the product] + * @param [date] $date_from [start date of the date range] + * @param [date] $date_to [end date of the date range] + * @param [type] $type [Type of the feature price plan must be among 'specific_date', 'special_day' and 'date_range'] + * @return [array|false] [returns room type active feature price plan by supplied date Range and supplied feature price plan type else returns false] + */ + public function checkRoomTypeFeaturePriceExistance($id_product, $date_from, $date_to, $type='date_range', $current_Special_days=false, $id_feature_price=0) + { + if ($type == 'specific_date') { + return Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'htl_room_type_feature_pricing` WHERE `id_product`='.(int) $id_product.' AND `date_selection_type`=2 AND `date_from` = \''.$date_from.'\' AND `id`!='.(int)$id_feature_price); + + } else if ($type == 'special_day') { + $featurePrice = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'htl_room_type_feature_pricing` WHERE `id_product`='.(int) $id_product.' AND `is_special_days_exists`=1 AND `active`=1 AND `date_from` < \''.$date_to.'\' AND `date_to` > \''.$date_from.'\' AND `id`!='.(int)$id_feature_price); + if ($featurePrice) { + $specialDays = Tools::jsonDecode($featurePrice['special_days']); + $currentSpecialDays = Tools::jsonDecode($current_Special_days); + $commonValues = array_intersect ($specialDays , $currentSpecialDays); + if ($commonValues) { + return $featurePrice; + } + } + return false; + } else if ($type == 'date_range') { + + return Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.'htl_room_type_feature_pricing` WHERE `id_product`='.(int) $id_product.' AND `date_selection_type`=1 AND `is_special_days_exists`=0 AND `date_from` < \''.$date_to.'\' AND `date_to` > \''.$date_from.'\' AND `id`!='.(int)$id_feature_price); + } + } + + /** + * [countFeaturePriceSpecialDays returns number of special days between a date range] + * @param [array] $specialDays [array containing special days to be counted] + * @param [date] $date_from [start date of the date range] + * @param [date] $date_to [end date of the date range] + * @return [int] [number of special days] + */ + public static function countFeaturePriceSpecialDays($specialDays, $date_from, $date_to) + { + $totalDaySeconds = 24*60*60; + $specialDaysCount = 0; + + for ($date = strtotime($date_from); $date <= strtotime($date_to)-$totalDaySeconds; $date = ($date + $totalDaySeconds)) { + if (in_array(strtolower(Date('D', $date)), $specialDays)) { + $specialDaysCount++; + } + } + return $specialDaysCount; + } + + /** + * [getHotelRoomTypesRatesByDate returns hotel room types rates accrding to feature price plans] + * @param [int] $id_hotel [id of th hotel] + * @param integer $id_product [id of the product if supplied only rates of this room type will be returned] + * @param [date] $date_from [start date of the date range] + * @param [date] $date_to [end date of the date range] + * @return [array|false] [returns array containing rates of room type of a hotel if found else returns false] + */ + public function getHotelRoomTypesRatesAndInventoryByDate($id_hotel, $id_product=0, $date_from, $date_to) + { + $totalDaySeconds = 24*60*60; + $hotelRoomType = new HotelRoomType(); + $context = Context::getContext(); + $roomTypeRatesAndInventory = array(); + $hotelCartBookingData = new HotelCartBookingData(); + $objBookingDetail = new HotelBookingDetail(); + $incr = 0; + for ($date = strtotime($date_from); $date <= strtotime($date_to); $date = ($date + $totalDaySeconds)) { + $currentDate = date('Y-m-d', $date); + $nextDayDate = date('Y-m-d', strtotime($currentDate) + 86400); + if ($id_product) { + $roomTypeAvailabilityInfo = $objBookingDetail->DataForFrontSearch($currentDate, $nextDayDate, $id_hotel, $id_product, 1, 0, 0, -1, 0, 0); + if (isset($roomTypeAvailabilityInfo['stats']['num_avail'])) { + $totalAvailableRooms = $roomTypeAvailabilityInfo['stats']['num_avail']; + } else { + $totalAvailableRooms = 0; + } + + $roomTypePrice = $hotelCartBookingData->getRoomTypeTotalPrice($id_product, $currentDate, $nextDayDate); + $roomTypeRatesAndInventory[$incr]['date'] = $currentDate; + $roomTypeRatesAndInventory[$incr]['room_types'][0]['id'] = $id_product; + $roomTypeRatesAndInventory[$incr]['room_types'][0]['rates'] = $roomTypePrice; + $roomTypeRatesAndInventory[$incr]['room_types'][0]['available_rooms'] = $totalAvailableRooms; + } else { + $hotelRoomTypes = $hotelRoomType->getRoomTypeByHotelId($id_hotel, $context->language->id); + if ($hotelRoomTypes) { + $roomTypeRatesAndInventory[$incr]['date'] = $currentDate; + foreach ($hotelRoomTypes as $key => $product) { + $roomTypePrice = $hotelCartBookingData->getRoomTypeTotalPrice($product['id_product'], $currentDate, $nextDayDate); + $roomTypeAvailabilityInfo = $objBookingDetail->DataForFrontSearch($currentDate, $nextDayDate, $id_hotel, $product['id_product'], 1, 0, 0, -1, 0, 0); + if (isset($roomTypeAvailabilityInfo['stats']['num_avail'])) { + $totalAvailableRooms = $roomTypeAvailabilityInfo['stats']['num_avail']; + } else { + $totalAvailableRooms = 0; + } + $roomTypeRatesAndInventory[$incr]['room_types'][$key]['id'] = $product['id_product']; + $roomTypeRatesAndInventory[$incr]['room_types'][$key]['rates'] = $roomTypePrice; + $roomTypeRatesAndInventory[$incr]['room_types'][$key]['available_rooms'] = $totalAvailableRooms; + } + } else { + return false; + } + } + $incr++; + } + return $roomTypeRatesAndInventory; + } + + /** + * [updateRoomTypesFeaturePrices update and creates feature price plans by supplied information] + * @param [array] $featurePricePlans [feature price plans sent from channel manager] + * @return [array] [success if process is finished successfully else fasiled with errors] + * @information [if any feature price plan for the same date_from and date_to(supplied in the $featurePricePlans array) it will be updated otherwise it is added. While adding date range type rate plans if any plan already exist then feature price for all specific dates in the date range will be created (or updated if specific date feature price plan exists)] + */ + public function updateRoomTypesFeaturePricesAvailability($featurePricePlans) + { + $moduleInstance = new HotelReservationSystem(); + $this->errors = array(); + if ($featurePricePlans) { + $totalDaySeconds = 24*60*60; + if (isset($featurePricePlans['data']) && $featurePricePlans['data']) { + foreach ($featurePricePlans['data'] as $roomTypeRatesData) { + $dateFrom = date('Y-m-d', strtotime($roomTypeRatesData['dateFrom'])); + $dateTo = date('Y-m-d', strtotime($roomTypeRatesData['dateTo']) + 86400); + if ($roomTypeRatesData['roomType']) { + foreach ($roomTypeRatesData['roomType'] as $key => $roomTypeRates) { + $id_product = $key; + // feature price rates create and updates + if (isset($roomTypeRates['rate'])) { + //$productPriceTE = Product::getPriceStatic((int) $id_product, false); + $productPriceTE = 1000; + if ($productPriceTE != $roomTypeRates['rate']) { + if ($productPriceTE > $roomTypeRates['rate']) { + $priceImpactWay = 1; + $impactValue = $productPriceTE - $roomTypeRates['rate']; + } else { + $priceImpactWay = 2; + $impactValue = $roomTypeRates['rate'] - $productPriceTE; + } + $params = array(); + $params['roomTypeId'] = $id_product; + $params['featurePriceName'] = 'Test Feature Price'; + $params['dateFrom'] = $dateFrom; + $params['dateTo'] = $dateTo; + $params['priceImpactWay'] = $priceImpactWay; + $params['isSpecialDaysExists'] = 0; + $params['jsonSpecialDays'] = null; + $params['priceImpactType'] = 2; + $params['impactValue'] = $impactValue; + $params['enableFeaturePrice'] = 1; + $nextDate = date('Y-m-d', strtotime($dateFrom) + 86400); + if ($nextDate == $dateTo) { + $params['dateSelectionType'] = 2; + $featurePriceExists = $this->checkRoomTypeFeaturePriceExistance($id_product, $dateFrom, $dateTo, $type='specific_date'); + if ($featurePriceExists) { + if (!$this->saveFeaturePricePlan($featurePriceExists['id'], 2, $params)) { + $this->errors[] = $this->moduleInstance->l('Some error occured while saving Feature Price Plan Info:: Date From : ', 'HotelRoomTypeFeaturePricing').$params['dateFrom'].$this->moduleInstance->l(' Date To : ', 'HotelRoomTypeFeaturePricing').$params['dateFrom'].$this->moduleInstance->l(' Room Type Id : ', 'HotelRoomTypeFeaturePricing').$params['roomTypeId']; + } + } else { + if (!$this->saveFeaturePricePlan(0, 2, $params)) { + $this->errors[] = $this->moduleInstance->l('Some error occured while saving Feature Price Plan Info:: Date From : ', 'HotelRoomTypeFeaturePricing').$params['dateFrom'].$this->moduleInstance->l(' Date To : ', 'HotelRoomTypeFeaturePricing').$params['dateFrom'].$this->moduleInstance->l(' Room Type Id : ', 'HotelRoomTypeFeaturePricing').$params['roomTypeId']; + } + } + } else { + $params['dateSelectionType'] = 1; + $featurePriceExists = $this->checkRoomTypeFeaturePriceExistance($id_product, $dateFrom, $dateTo, $type='date_range'); + if ($featurePriceExists) { + if ($featurePriceExists['date_from'] == $dateFrom && $featurePriceExists['date_to'] == $dateTo) { + if (!$this->saveFeaturePricePlan($featurePriceExists['id'], 1, $params)) { + $this->errors[] = $this->moduleInstance->l('Some error occured while saving Feature Price Plan Info:: Date From : ', 'HotelRoomTypeFeaturePricing').$params['dateFrom'].$this->moduleInstance->l(' Date To : ', 'HotelRoomTypeFeaturePricing').$params['dateFrom'].$this->moduleInstance->l(' Room Type Id : ', 'HotelRoomTypeFeaturePricing').$params['roomTypeId']; + } + } else { + for ($date = strtotime($dateFrom); $date <= strtotime($dateTo)-$totalDaySeconds; $date = ($date + $totalDaySeconds)) { + $currentDate = date('Y-m-d', $date); + $nextDayDate = date('Y-m-d', strtotime($currentDate) + 86400); + $params['dateFrom'] = $currentDate; + $params['dateTo'] = $nextDayDate; + $params['dateSelectionType'] = 2; + $featurePriceExists = $this->checkRoomTypeFeaturePriceExistance($id_product, $currentDate, $nextDayDate, $type='specific_date'); + if ($featurePriceExists) { + if (!$this->saveFeaturePricePlan($featurePriceExists['id'], 2, $params)) { + $this->errors[] = $this->moduleInstance->l('Some error occured while saving Feature Price Plan Info:: Date From : ', 'HotelRoomTypeFeaturePricing').$params['dateFrom'].$this->moduleInstance->l(' Date To : ', 'HotelRoomTypeFeaturePricing').$params['dateFrom'].$this->moduleInstance->l(' Room Type Id : ', 'HotelRoomTypeFeaturePricing').$params['roomTypeId']; + } + } else { + if (!$this->saveFeaturePricePlan(0, 2, $params)) { + $this->errors[] = $this->moduleInstance->l('Some error occured while saving Feature Price Plan Info:: Date From : ', 'HotelRoomTypeFeaturePricing').$params['dateFrom'].$this->moduleInstance->l(' Date To : ', 'HotelRoomTypeFeaturePricing').$params['dateFrom'].$this->moduleInstance->l(' Room Type Id : ', 'HotelRoomTypeFeaturePricing').$params['roomTypeId']; + } + } + } + } + } else { + if (!$this->saveFeaturePricePlan(0, 1, $params)) { + $this->errors[] = $this->moduleInstance->l('Some error occured while saving Feature Price Plan Info:: Date From : ', 'HotelRoomTypeFeaturePricing').$params['dateFrom'].$this->moduleInstance->l(' Date To : ', 'HotelRoomTypeFeaturePricing').$params['dateFrom'].$this->moduleInstance->l(' Room Type Id : ', 'HotelRoomTypeFeaturePricing').$params['roomTypeId']; + } + } + } + } + } + + if (isset($roomTypeRates['inventory'])) { + $totalAvailableNotBooked = 0; + $totalAvailableRooms = 0; + $totalRooms = 0; + $hotelRoomType = new HotelRoomType(); + $hotelBookingDetail = new HotelBookingDetail(); + $hotelRoomInformation = new HotelRoomInformation(); + $roomTypeInfo = $hotelRoomType->getRoomTypeInfoByIdProduct($id_product); + $id_hotel = $roomTypeInfo['id_hotel']; + if ($id_hotel) { + $roomTypeAvailabilityInfo = $hotelBookingDetail->DataForFrontSearch($dateFrom, $dateTo, $id_hotel, $id_product, 1, 0, 0, -1, 0, 0); + $bookedRoomsInfo = $hotelRoomInformation->getRoomTypeBookedRoomsForDateRange($id_hotel, $id_product, $dateFrom, $dateTo); + $countBookedRooms = count($bookedRoomsInfo); + if (isset($roomTypeAvailabilityInfo['stats']['total_rooms'])) { + $totalRooms = $roomTypeAvailabilityInfo['stats']['total_rooms']; + $totalAvailableNotBooked = $roomTypeAvailabilityInfo['stats']['total_rooms'] - $countBookedRooms; + $totalAvailableRooms = $roomTypeAvailabilityInfo['stats']['num_avail']; + } + p($totalAvailableRooms); + p($roomTypeRates['inventory']); + p($totalAvailableNotBooked); + die; + if ($roomTypeRates['inventory'] <= $totalAvailableNotBooked) { + if ($roomTypeRates['inventory'] < $totalAvailableRooms) { + $numDisabledRooms = $totalAvailableRooms - $roomTypeRates['inventory']; + $availableRooms = $hotelRoomInformation->getRoomTypeAvailableRoomsForDateRange($id_hotel, $id_product, $dateFrom, $dateTo); + if ($availableRooms) { + foreach ($availableRooms as $room_k => $room) { + $disabledDates = array(); + $hotelRoomInformation = new HotelRoomInformation($room['id']); + if ($hotelRoomInformation->id_status == 3) { + $disabledDates = Tools::jsonDecode($hotelRoomInformation->disabled_dates, true); + for ($date = strtotime($dateFrom); $date <= strtotime($dateTo)-$totalDaySeconds; $date = ($date + $totalDaySeconds)) { + $currentDate = date('Y-m-d', $date); + /*if ($numDisabledRooms > 0) { + if (isset($disabledDates[$currentDate])) { + unset($disabledDates[$currentDate]); + } + }*/ + $disabledDates[$currentDate]['reason'] = 'Disabled from channel manager.'; + } + + } else { + if ($numDisabledRooms > 0) { + for ($date = strtotime($dateFrom); $date <= strtotime($dateTo)-$totalDaySeconds; $date = ($date + $totalDaySeconds)) { + $currentDate = date('Y-m-d', $date); + $disabledDates[$currentDate]['reason'] = 'Disabled from channel manager.'; + } + $hotelRoomInformation->id_status = 3; + } + } + $hotelRoomInformation->disabled_dates = Tools::jsonEncode($disabledDates); + $hotelRoomInformation->save(); + $numDisabledRooms--; + } + } + } else if ($roomTypeRates['inventory'] >= $totalAvailableRooms) { + $roomsToEnable = $roomTypeRates['inventory'] - $totalAvailableRooms; + $disabledRooms = $hotelRoomInformation->getRoomTypeDisabledRoomsForDateRange($id_hotel, $id_product, $dateFrom, $dateTo); + if ($disabledRooms) { + foreach ($disabledRooms as $k_rm => $disableRoom) { + $hotelRoomInformation = new HotelRoomInformation($disableRoom['id']); + + $disabledDates = Tools::jsonDecode($hotelRoomInformation->disabled_dates, true); + for ($date = strtotime($dateFrom); $date <= strtotime($dateTo)-$totalDaySeconds; $date = ($date + $totalDaySeconds)) { + $currentDate = date('Y-m-d', $date); + $disabledDates[$currentDate]['reason'] = 'Disabled from channel manager.'; + if ($roomsToEnable > 0) { + if (isset($disabledDates[$currentDate])) { + unset($disabledDates[$currentDate]); + } + } + } + $hotelRoomInformation->disabled_dates = Tools::jsonEncode($disabledDates); + if (!count($disabledDates)) { + $hotelRoomInformation->id_status = 1; + $hotelRoomInformation->disabled_dates = null; + } + $hotelRoomInformation->save(); + $roomsToEnable--; + } + } + } + } + } + } else { + $this->errors[] = $this->moduleInstance->l('Requested rooms inventory is not available.'); + } + } + } else { + $this->errors[] = $this->moduleInstance->l('Room Types for which Feature prices to be updated are not found.', 'HotelRoomTypeFeaturePricing'); + } + } + } else { + $this->errors[] = $this->moduleInstance->l('Update Information not found.', 'HotelRoomTypeFeaturePricing'); + } + } else { + $this->errors[] = $this->moduleInstance->l('Update Information not found.', 'HotelRoomTypeFeaturePricing'); + } + if (count($this->errors)) { + $result['status'] = 'failed'; + $result['errors'] = $this->errors; + } else { + $result['status'] = 'success'; + } + return $result; + } + + /** + * [saveFeaturePricePlan add or update feature price plan] + * @param integer $id [id of the feature price plan if 0 means to add else to update the feature price plan] + * @param [int] $dateSelectionType [date selection type 1 or 2 (date range or specific date)] + * @param [array] $params [Room type rate plan info] + * @return [bool] [returns true is successfuly added or updated else returns false] + */ + public function saveFeaturePricePlan($id=0, $dateSelectionType, $params) + { + if ($id) { + $roomTypeFeaturePricing = new HotelRoomTypeFeaturePricing($id); + } else { + $roomTypeFeaturePricing = new HotelRoomTypeFeaturePricing(); + } + $roomTypeFeaturePricing->id_product = $params['roomTypeId']; + $roomTypeFeaturePricing->feature_price_name = $params['featurePriceName']; + $roomTypeFeaturePricing->date_selection_type = $params['dateSelectionType']; + if ($dateSelectionType == 1) { + $roomTypeFeaturePricing->date_from = $params['dateFrom']; + $roomTypeFeaturePricing->date_to = $params['dateTo']; + } else { + $roomTypeFeaturePricing->date_from = $params['dateFrom']; + $roomTypeFeaturePricing->date_to = $params['dateTo']; + } + $roomTypeFeaturePricing->impact_way = $params['priceImpactWay']; + $roomTypeFeaturePricing->is_special_days_exists = $params['isSpecialDaysExists']; + $roomTypeFeaturePricing->special_days = $params['jsonSpecialDays']; + $roomTypeFeaturePricing->impact_type = $params['priceImpactType']; + $roomTypeFeaturePricing->impact_value = $params['impactValue']; + $roomTypeFeaturePricing->active = $params['enableFeaturePrice']; + return $roomTypeFeaturePricing->save(); + } + + /** + * [getRoomTypeTotalPrice Returns Total price of the room type according to supplied dates]. + * + * @param [int] $id_product [id of the room type] + * @param [date] $date_from [date from] + * @param [date] $date_to [date to] + * + * @return [float] [Returns Total price of the room type] + */ + public static function getRoomTypeTotalPrice($id_product, $date_from, $date_to) + { + $totalDaySeconds = 24 * 60 * 60; + $totalPrice = array(); + $totalPrice['total_price_tax_incl'] = 0; + $totalPrice['total_price_tax_excl'] = 0; + $featureImpactPriceTE = 0; + $featureImpactPriceTI = 0; + $productPriceTI = Product::getPriceStatic((int) $id_product, true); + $productPriceTE = Product::getPriceStatic((int) $id_product, false); + //$productPriceTI = 1000; + //$productPriceTE = 1000; + $hotelCartBookingData = new HotelCartBookingData(); + for ($date = strtotime($date_from); $date <= (strtotime($date_to)-$totalDaySeconds); $date = ($date+$totalDaySeconds)) { + $currentDate = date('Y-m-d', $date); + $featurePrice = $hotelCartBookingData->getProductFeaturePricePlanByDateByPriority($id_product, $currentDate); + if ($featurePrice) { + if ($featurePrice['impact_type'] == 1) { + //percentage + $featureImpactPriceTE = $productPriceTE * ($featurePrice['impact_value'] / 100); + $featureImpactPriceTI = $productPriceTI * ($featurePrice['impact_value'] / 100); + } else { + //Fixed Price + $featureImpactPriceTE = $featurePrice['impact_value']; + $featureImpactPriceTI = $featurePrice['impact_value']; + } + if ($featurePrice['impact_way'] == 1) { + // Decrease + $priceWithFeatureTE = ($productPriceTE - $featureImpactPriceTE); + $priceWithFeatureTI = ($productPriceTI - $featureImpactPriceTI); + } else { + // Increase + $priceWithFeatureTE = ($productPriceTE + $featureImpactPriceTE); + $priceWithFeatureTI = ($productPriceTI + $featureImpactPriceTI); + } + if ($priceWithFeatureTI < 0) { + $priceWithFeatureTI = 0; + $priceWithFeatureTE = 0; + } + $totalPrice['total_price_tax_incl'] += $priceWithFeatureTI; + $totalPrice['total_price_tax_excl'] += $priceWithFeatureTE; + } else { + $totalPrice['total_price_tax_incl'] += $productPriceTI; + $totalPrice['total_price_tax_excl'] += $productPriceTE; + } + } + + return $totalPrice; + } + + /** + * [getRoomTypeFeaturePricePerDay returns per day feature price od the Room Type] + * @param [int] $id_product [id of the product] + * @param [date] $date_from [start date] + * @param [date] $date_to [end date] + * @return [float] [returns per day feature price od the Room Type] + */ + public static function getRoomTypeFeaturePricesPerDay($id_product, $date_from, $date_to, $use_tax=true) + { + $dateFrom = date('Y-m-d', strtotime($date_from)); + $dateTo = date('Y-m-d', strtotime($date_to)); + $totalDurationPrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($id_product, $dateFrom, $dateTo); + $totalDurationPriceTE = $totalDurationPrice['total_price_tax_incl']; + $totalDurationPriceTI = $totalDurationPrice['total_price_tax_excl']; + $objHotelBookingDetail = new HotelBookingDetail(); + $numDaysInDuration = $objHotelBookingDetail->getNumberOfDays($dateFrom, $dateTo); + if ($use_tax) { + $pricePerDay = $totalDurationPriceTI/$numDaysInDuration; + } else { + $pricePerDay = $totalDurationPriceTE/$numDaysInDuration; + } + return $pricePerDay; + } + } diff --git a/controllers/front/OrderConfirmationController.php b/controllers/front/OrderConfirmationController.php index 392e9973e..240e41724 100644 --- a/controllers/front/OrderConfirmationController.php +++ b/controllers/front/OrderConfirmationController.php @@ -143,21 +143,16 @@ class OrderConfirmationControllerCore extends FrontController $cart_htl_data[$type_key]['adult'] = $rm_dtl['adult']; $cart_htl_data[$type_key]['children'] = $rm_dtl['children']; + // by webkul to calculate rates of the product from hotelreservation syatem tables with feature prices.... + + $hotelCartBookingData = new HotelCartBookingData(); + //END foreach ($order_bk_data as $data_k => $data_v) { $date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']); - /*Product price when order was created*/ $order_details_obj = new OrderDetail($data_v['id_order_detail']); - $unit_price_tax_excl = 0; - $unit_price_tax_incl = 0; - $unit_price_tax_excl = $order_details_obj->unit_price_tax_excl; - $unit_price_tax_incl = $order_details_obj->unit_price_tax_incl; $prod_ord_dtl_name = $order_details_obj->product_name; $cart_htl_data[$type_key]['name'] = $prod_ord_dtl_name; - - $cart_htl_data[$type_key]['unit_price_tax_excl'] = $unit_price_tax_excl; - $cart_htl_data[$type_key]['unit_price_tax_incl'] = $unit_price_tax_incl; - //work on entring refund data $obj_ord_ref_info = new HotelOrderRefundInfo(); $ord_refnd_info = $obj_ord_ref_info->getOderRefundInfoByIdOrderIdProductByDate($this->id_order, $type_value['product_id'], $data_v['date_from'], $data_v['date_to']); @@ -172,13 +167,13 @@ class OrderConfirmationControllerCore extends FrontController $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] += 1; $num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days']; - $vart_quant = (int) $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] * $num_days; + $var_quant = (int) $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm']; - $amount_tax_excl = $unit_price_tax_excl * $vart_quant; - $amount_tax_incl = $unit_price_tax_incl * $vart_quant; - - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $amount_tax_incl; - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $amount_tax_excl; + //// By webkul New way to calculate product prices with feature Prices + $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; + $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl']*$var_quant; + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']*$var_quant; $cart_htl_data[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; if ($data_v['is_back_order']) { $any_back_order = 1; @@ -194,11 +189,11 @@ class OrderConfirmationControllerCore extends FrontController $cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to']; $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; - $amount_tax_excl = $unit_price_tax_excl * $num_days; - $amount_tax_incl = $unit_price_tax_incl * $num_days; - - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $amount_tax_incl; - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $amount_tax_excl; + // By webkul New way to calculate product prices with feature Prices + $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; + $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl']; + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']; if ($data_v['is_back_order']) { $any_back_order = 1; } @@ -206,6 +201,13 @@ class OrderConfirmationControllerCore extends FrontController $cart_htl_data[$type_key]['date_diff'][$date_join]['stage_name'] = $stage_name; $cart_htl_data[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; } + $cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_tax_excl'] = $order_details_obj->unit_price_tax_excl; + $cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_tax_incl'] = $order_details_obj->unit_price_tax_incl; + $cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_excl'] = $order_details_obj->unit_price_tax_excl + $order_details_obj->reduction_amount_tax_excl; + $cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] = $order_details_obj->unit_price_tax_incl + $order_details_obj->reduction_amount_tax_incl; + + $feature_price_diff = (float)($cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] - $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']); + $cart_htl_data[$type_key]['date_diff'][$date_join]['feature_price_diff'] = $feature_price_diff; } } $redirect_link_terms = $this->context->link->getCMSLink(new CMS(3, $this->context->language->id), null, $this->context->language->id); diff --git a/controllers/front/OrderDetailController.php b/controllers/front/OrderDetailController.php index 5ba345c75..3af28aeb0 100644 --- a/controllers/front/OrderDetailController.php +++ b/controllers/front/OrderDetailController.php @@ -110,17 +110,19 @@ class OrderDetailControllerCore extends FrontController } if (Validate::isLoadedObject($customer)) { - Mail::Send($this->context->language->id, 'order_customer_comment', Mail::l('Message from a customer'), - array( - '{lastname}' => $customer->lastname, - '{firstname}' => $customer->firstname, - '{email}' => $customer->email, - '{id_order}' => (int) $order->id, - '{order_name}' => $order->getUniqReference(), - '{message}' => Tools::nl2br($msgText), - '{product_name}' => $product_name, - ), - $to, $toName, $customer->email, $customer->firstname.' '.$customer->lastname); + Mail::Send( + $this->context->language->id, 'order_customer_comment', Mail::l('Message from a customer'), + array( + '{lastname}' => $customer->lastname, + '{firstname}' => $customer->firstname, + '{email}' => $customer->email, + '{id_order}' => (int) $order->id, + '{order_name}' => $order->getUniqReference(), + '{message}' => Tools::nl2br($msgText), + '{product_name}' => $product_name, + ), + $to, $toName, $customer->email, $customer->firstname.' '.$customer->lastname + ); } if (Tools::getValue('ajax') != 'true') { @@ -165,18 +167,18 @@ class OrderDetailControllerCore extends FrontController $amount = Tools::getValue('amount'); $cancellation_reason = Tools::getValue('cancellation_reason'); - $obj_htl_ord_ref = new HotelOrderRefundInfo(); - $obj_htl_ord_ref->id_order = $id_order; - $obj_htl_ord_ref->id_product = $id_product; - $obj_htl_ord_ref->id_customer = $id_customer; - $obj_htl_ord_ref->id_currency = $id_currency; - $obj_htl_ord_ref->refund_stage_id = 1; - $obj_htl_ord_ref->order_amount = $amount; - $obj_htl_ord_ref->cancellation_reason = $cancellation_reason; - $obj_htl_ord_ref->num_rooms = $num_rooms; - $obj_htl_ord_ref->date_from = $date_from; - $obj_htl_ord_ref->date_to = $date_to; - $obj_htl_ord_ref->save(); + $objHtlRefundInfo = new HotelOrderRefundInfo(); + $objHtlRefundInfo->id_order = $id_order; + $objHtlRefundInfo->id_product = $id_product; + $objHtlRefundInfo->id_customer = $id_customer; + $objHtlRefundInfo->id_currency = $id_currency; + $objHtlRefundInfo->refund_stage_id = 1; + $objHtlRefundInfo->order_amount = $amount; + $objHtlRefundInfo->cancellation_reason = $cancellation_reason; + $objHtlRefundInfo->num_rooms = $num_rooms; + $objHtlRefundInfo->date_from = $date_from; + $objHtlRefundInfo->date_to = $date_to; + $objHtlRefundInfo->save(); $id_shop = Context::getContext()->shop->id; @@ -210,7 +212,7 @@ class OrderDetailControllerCore extends FrontController $temp_path = _PS_MODULE_DIR_.'hotelreservationsystem/mails/'; $template_name = 'request_processed'; - if ($obj_htl_ord_ref->id) { + if ($objHtlRefundInfo->id) { if (Mail::Send($id_lang, $template_name, Mail::l('Order Cancellation Status', $id_lang), $templateVars, $to, null, null, null, null, null, $temp_path, false, null, null)) { $mail_err = 0; } else { @@ -233,24 +235,25 @@ class OrderDetailControllerCore extends FrontController $id_order = Tools::getValue('id_order'); if (isset($total_order_data) && $total_order_data) { + $objHtlRefund = new HotelOrderRefundInfo(); foreach ($total_order_data as $data_k => $data_v) { foreach ($data_v['date_diff'] as $rm_k => $rm_v) { - $obj_htl_ord_ref = new HotelOrderRefundInfo(); - $exist_info_refund = $obj_htl_ord_ref->getOderRefundInfoByIdOrderIdProductByDate($id_order, $data_v['id_product'], $rm_v['data_form'], $rm_v['data_to']); + $exist_info_refund = $objHtlRefund->getOderRefundInfoByIdOrderIdProductByDate($id_order, $data_v['id_product'], $rm_v['data_form'], $rm_v['data_to']); - // any room existin htl_order_refund_info + // any room existing in htl_order_refund_info if (!$exist_info_refund) { - $obj_htl_ord_ref->id_order = $id_order; - $obj_htl_ord_ref->id_product = $data_v['id_product']; - $obj_htl_ord_ref->id_customer = $id_customer; - $obj_htl_ord_ref->id_currency = $id_currency; - $obj_htl_ord_ref->refund_stage_id = 1; - $obj_htl_ord_ref->order_amount = $rm_v['amount_tax_incl']; - $obj_htl_ord_ref->cancellation_reason = $cancellation_reason; - $obj_htl_ord_ref->num_rooms = $rm_v['num_rm']; - $obj_htl_ord_ref->date_from = $rm_v['data_form']; - $obj_htl_ord_ref->date_to = $rm_v['data_to']; - $obj_htl_ord_ref->save(); + $objHtlRefundInfo = new HotelOrderRefundInfo(); + $objHtlRefundInfo->id_order = $id_order; + $objHtlRefundInfo->id_product = $data_v['id_product']; + $objHtlRefundInfo->id_customer = $id_customer; + $objHtlRefundInfo->id_currency = $id_currency; + $objHtlRefundInfo->refund_stage_id = 1; + $objHtlRefundInfo->order_amount = $rm_v['amount_tax_incl']; + $objHtlRefundInfo->cancellation_reason = $cancellation_reason; + $objHtlRefundInfo->num_rooms = $rm_v['num_rm']; + $objHtlRefundInfo->date_from = $rm_v['data_form']; + $objHtlRefundInfo->date_to = $rm_v['data_to']; + $objHtlRefundInfo->save(); } } } @@ -274,16 +277,15 @@ class OrderDetailControllerCore extends FrontController $temp_path = _PS_MODULE_DIR_.'hotelreservationsystem/mails/'; $template_name = 'total_order_processed'; - if ($obj_htl_ord_ref->id) { + if ($objHtlRefundInfo->id) { if (Mail::Send($id_lang, $template_name, Mail::l('Order Cancellation Status', $id_lang), $templateVars, $to, null, null, null, null, null, $temp_path, false, null, null)) { $mail_err = 0; } else { $mail_err = 1; } - die(Tools::jsonEncode(array('status' => 'success', 'mail_err' => $mail_err))); } else { - die(Tools::jsonEncode(array('status' => 'failed', 'mail_err' => $mail_err))); + die(Tools::jsonEncode(array('status' => 'failed'))); } } //end @@ -357,20 +359,20 @@ class OrderDetailControllerCore extends FrontController $cart_htl_data[$type_key]['adult'] = $rm_dtl['adult']; $cart_htl_data[$type_key]['children'] = $rm_dtl['children']; + // by webkul to calculate rates of the product from hotelreservation syatem tables with feature prices.... + + $hotelCartBookingData = new HotelCartBookingData(); + //END foreach ($order_bk_data as $data_k => $data_v) { $date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']); /*Product price when order was created*/ $order_details_obj = new OrderDetail($data_v['id_order_detail']); - $unit_price_tax_excl = 0; - $unit_price_tax_incl = 0; - $unit_price_tax_excl = $order_details_obj->unit_price_tax_excl; - $unit_price_tax_incl = $order_details_obj->unit_price_tax_incl; $prod_ord_dtl_name = $order_details_obj->product_name; $cart_htl_data[$type_key]['name'] = $prod_ord_dtl_name; - $cart_htl_data[$type_key]['unit_price_tax_excl'] = $unit_price_tax_excl; - $cart_htl_data[$type_key]['unit_price_tax_incl'] = $unit_price_tax_incl; + $cart_htl_data[$type_key]['paid_unit_price_tax_excl'] = ($order_details_obj->total_price_tax_excl)/$order_details_obj->product_quantity; + $cart_htl_data[$type_key]['paid_unit_price_tax_incl'] = ($order_details_obj->total_price_tax_incl)/$order_details_obj->product_quantity; //work on entring refund data $obj_ord_ref_info = new HotelOrderRefundInfo(); @@ -386,13 +388,12 @@ class OrderDetailControllerCore extends FrontController $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] += 1; $num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days']; - $vart_quant = (int) $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] * $num_days; + $var_quant = (int) $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm']; - $amount_tax_excl = $unit_price_tax_excl * $vart_quant; - $amount_tax_incl = $unit_price_tax_incl * $vart_quant; - - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $amount_tax_incl; - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $amount_tax_excl; + $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; + $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl']*$var_quant; + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']*$var_quant; $cart_htl_data[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; if ($data_v['is_back_order']) { $any_back_order = 1; @@ -407,11 +408,10 @@ class OrderDetailControllerCore extends FrontController $cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to']; $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; - $amount_tax_excl = $unit_price_tax_excl * $num_days; - $amount_tax_incl = $unit_price_tax_incl * $num_days; - - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $amount_tax_incl; - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $amount_tax_excl; + $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_excl'] = $data_v['total_price_tax_excl']/$num_days; + $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl'] = $data_v['total_price_tax_incl']/$num_days; + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_incl'] = $data_v['total_price_tax_incl']; + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount_tax_excl'] = $data_v['total_price_tax_excl']; $cart_htl_data[$type_key]['date_diff'][$date_join]['is_backorder'] = $data_v['is_back_order']; if ($data_v['is_back_order']) { $any_back_order = 1; @@ -419,6 +419,14 @@ class OrderDetailControllerCore extends FrontController //refund_stage $cart_htl_data[$type_key]['date_diff'][$date_join]['stage_name'] = $stage_name; } + + $cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_tax_excl'] = $order_details_obj->unit_price_tax_excl; + $cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_tax_incl'] = $order_details_obj->unit_price_tax_incl; + $cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_excl'] = $order_details_obj->unit_price_tax_excl + $order_details_obj->reduction_amount_tax_excl; + $cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] = $order_details_obj->unit_price_tax_incl + $order_details_obj->reduction_amount_tax_incl; + + $feature_price_diff = (float)($cart_htl_data[$type_key]['date_diff'][$date_join]['product_price_without_reduction_tax_incl'] - $cart_htl_data[$type_key]['date_diff'][$date_join]['paid_unit_price_tax_incl']); + $cart_htl_data[$type_key]['date_diff'][$date_join]['feature_price_diff'] = $feature_price_diff; } } $redirect_link_terms = $this->context->link->getCMSLink(new CMS(3, $this->context->language->id), null, $this->context->language->id); diff --git a/controllers/front/OrderOpcController.php b/controllers/front/OrderOpcController.php index 8692b796f..1497fee20 100644 --- a/controllers/front/OrderOpcController.php +++ b/controllers/front/OrderOpcController.php @@ -26,172 +26,171 @@ class OrderOpcControllerCore extends ParentOrderController { - public $php_self = 'order-opc'; - public $isLogged; + public $php_self = 'order-opc'; + public $isLogged; - protected $ajax_refresh = false; + protected $ajax_refresh = false; - /** - * Initialize order opc controller - * @see FrontController::init() - */ - public function init() - { - parent::init(); + /** + * Initialize order opc controller + * @see FrontController::init() + */ + public function init() + { + parent::init(); - if ($this->nbProducts) - $this->context->smarty->assign('virtual_cart', $this->context->cart->isVirtualCart()); + if ($this->nbProducts) { + $this->context->smarty->assign('virtual_cart', $this->context->cart->isVirtualCart()); + } - $this->context->smarty->assign('is_multi_address_delivery', $this->context->cart->isMultiAddressDelivery() || ((int)Tools::getValue('multi-shipping') == 1)); - $this->context->smarty->assign('open_multishipping_fancybox', (int)Tools::getValue('multi-shipping') == 1); + $this->context->smarty->assign('is_multi_address_delivery', $this->context->cart->isMultiAddressDelivery() || ((int)Tools::getValue('multi-shipping') == 1)); + $this->context->smarty->assign('open_multishipping_fancybox', (int)Tools::getValue('multi-shipping') == 1); - if ($this->context->cart->nbProducts()) - { - if (Tools::isSubmit('ajax')) - { - if (Tools::isSubmit('method')) - { - switch (Tools::getValue('method')) - { - case 'updateMessage': - if (Tools::isSubmit('message')) - { - $txt_message = urldecode(Tools::getValue('message')); - $this->_updateMessage($txt_message); - if (count($this->errors)) - $this->ajaxDie('{"hasError" : true, "errors" : ["'.implode('\',\'', $this->errors).'"]}'); - $this->ajaxDie(true); - } - break; + if ($this->context->cart->nbProducts()) { + if (Tools::isSubmit('ajax')) { + if (Tools::isSubmit('method')) { + switch (Tools::getValue('method')) { + case 'updateMessage': + if (Tools::isSubmit('message')) { + $txt_message = urldecode(Tools::getValue('message')); + $this->_updateMessage($txt_message); + if (count($this->errors)) { + $this->ajaxDie('{"hasError" : true, "errors" : ["'.implode('\',\'', $this->errors).'"]}'); + } + $this->ajaxDie(true); + } + break; - case 'updateCarrierAndGetPayments': - if ((Tools::isSubmit('delivery_option') || Tools::isSubmit('id_carrier')) && Tools::isSubmit('recyclable') && Tools::isSubmit('gift') && Tools::isSubmit('gift_message')) - { - $this->_assignWrappingAndTOS(); - if ($this->_processCarrier()) - { - $carriers = $this->context->cart->simulateCarriersOutput(); - $return = array_merge(array( - 'HOOK_TOP_PAYMENT' => Hook::exec('displayPaymentTop'), - 'HOOK_PAYMENT' => $this->_getPaymentMethods(), - 'carrier_data' => $this->_getCarrierList(), - 'HOOK_BEFORECARRIER' => Hook::exec('displayBeforeCarrier', array('carriers' => $carriers)) - ), - $this->getFormatedSummaryDetail() - ); - Cart::addExtraCarriers($return); - $this->ajaxDie(Tools::jsonEncode($return)); - } - else - $this->errors[] = Tools::displayError('An error occurred while updating the cart.'); - if (count($this->errors)) - $this->ajaxDie('{"hasError" : true, "errors" : ["'.implode('\',\'', $this->errors).'"]}'); - exit; - } - break; + case 'updateCarrierAndGetPayments': + if ((Tools::isSubmit('delivery_option') || Tools::isSubmit('id_carrier')) && Tools::isSubmit('recyclable') && Tools::isSubmit('gift') && Tools::isSubmit('gift_message')) { + $this->_assignWrappingAndTOS(); + if ($this->_processCarrier()) { + $carriers = $this->context->cart->simulateCarriersOutput(); + $return = array_merge(array( + 'HOOK_TOP_PAYMENT' => Hook::exec('displayPaymentTop'), + 'HOOK_PAYMENT' => $this->_getPaymentMethods(), + 'carrier_data' => $this->_getCarrierList(), + 'HOOK_BEFORECARRIER' => Hook::exec('displayBeforeCarrier', array('carriers' => $carriers)) + ), + $this->getFormatedSummaryDetail() + ); + Cart::addExtraCarriers($return); + $this->ajaxDie(Tools::jsonEncode($return)); + } else { + $this->errors[] = Tools::displayError('An error occurred while updating the cart.'); + } + if (count($this->errors)) { + $this->ajaxDie('{"hasError" : true, "errors" : ["'.implode('\',\'', $this->errors).'"]}'); + } + exit; + } + break; - case 'updateTOSStatusAndGetPayments': - if (Tools::isSubmit('checked')) - { - $this->context->cookie->checkedTOS = (int)Tools::getValue('checked'); - $this->ajaxDie(Tools::jsonEncode(array( - 'HOOK_TOP_PAYMENT' => Hook::exec('displayPaymentTop'), - 'HOOK_PAYMENT' => $this->_getPaymentMethods() - ))); - } - break; + case 'updateTOSStatusAndGetPayments': + if (Tools::isSubmit('checked')) { + $this->context->cookie->checkedTOS = (int)Tools::getValue('checked'); + $this->ajaxDie(Tools::jsonEncode(array( + 'HOOK_TOP_PAYMENT' => Hook::exec('displayPaymentTop'), + 'HOOK_PAYMENT' => $this->_getPaymentMethods() + ))); + } + break; - case 'getCarrierList': - $this->ajaxDie(Tools::jsonEncode($this->_getCarrierList())); - break; + case 'getCarrierList': + $this->ajaxDie(Tools::jsonEncode($this->_getCarrierList())); + break; - case 'editCustomer': - if (!$this->isLogged || !$this->context->customer->is_guest) - exit; + case 'editCustomer': + if (!$this->isLogged || !$this->context->customer->is_guest) { + exit; + } - if (Validate::isEmail($email = Tools::getValue('email')) && !empty($email)) - if (Customer::customerExists($email)) - $this->errors[] = Tools::displayError('An account using this email address has already been registered.', false); + if (Validate::isEmail($email = Tools::getValue('email')) && !empty($email)) { + if (Customer::customerExists($email)) { + $this->errors[] = Tools::displayError('An account using this email address has already been registered.', false); + } + } - if (Tools::getValue('years')) - $this->context->customer->birthday = (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'); + if (Tools::getValue('years')) { + $this->context->customer->birthday = (int)Tools::getValue('years').'-'.(int)Tools::getValue('months').'-'.(int)Tools::getValue('days'); + } - $_POST['lastname'] = $_POST['customer_lastname']; - $_POST['firstname'] = $_POST['customer_firstname']; - $this->errors = array_merge($this->errors, $this->context->customer->validateController()); - $this->context->customer->newsletter = (int)Tools::isSubmit('newsletter'); - $this->context->customer->optin = (int)Tools::isSubmit('optin'); - $this->context->customer->is_guest = (Tools::isSubmit('is_new_customer') ? !Tools::getValue('is_new_customer', 1) : 0); - $return = array( - 'hasError' => !empty($this->errors), - 'errors' => $this->errors, - 'id_customer' => (int)$this->context->customer->id, - 'token' => Tools::getToken(false) - ); - if (!count($this->errors)) - $return['isSaved'] = (bool)$this->context->customer->update(); - else - $return['isSaved'] = false; - $this->ajaxDie(Tools::jsonEncode($return)); - break; + $_POST['lastname'] = $_POST['customer_lastname']; + $_POST['firstname'] = $_POST['customer_firstname']; + $this->errors = array_merge($this->errors, $this->context->customer->validateController()); + $this->context->customer->newsletter = (int)Tools::isSubmit('newsletter'); + $this->context->customer->optin = (int)Tools::isSubmit('optin'); + $this->context->customer->is_guest = (Tools::isSubmit('is_new_customer') ? !Tools::getValue('is_new_customer', 1) : 0); + $return = array( + 'hasError' => !empty($this->errors), + 'errors' => $this->errors, + 'id_customer' => (int)$this->context->customer->id, + 'token' => Tools::getToken(false) + ); + if (!count($this->errors)) { + $return['isSaved'] = (bool)$this->context->customer->update(); + } else { + $return['isSaved'] = false; + } + $this->ajaxDie(Tools::jsonEncode($return)); + break; - case 'getAddressBlockAndCarriersAndPayments': - if ($this->context->customer->isLogged() || $this->context->customer->isGuest()) - { - // check if customer have addresses - if (!Customer::getAddressesTotalById($this->context->customer->id)) - $this->ajaxDie(Tools::jsonEncode(array('no_address' => 1))); - if (file_exists(_PS_MODULE_DIR_.'blockuserinfo/blockuserinfo.php')) - { - include_once(_PS_MODULE_DIR_.'blockuserinfo/blockuserinfo.php'); - $block_user_info = new BlockUserInfo(); - } - $this->context->smarty->assign('isVirtualCart', $this->context->cart->isVirtualCart()); - $this->_processAddressFormat(); - $this->_assignAddress(); + case 'getAddressBlockAndCarriersAndPayments': + if ($this->context->customer->isLogged() || $this->context->customer->isGuest()) { + // check if customer have addresses + if (!Customer::getAddressesTotalById($this->context->customer->id)) { + $this->ajaxDie(Tools::jsonEncode(array('no_address' => 1))); + } + if (file_exists(_PS_MODULE_DIR_.'blockuserinfo/blockuserinfo.php')) { + include_once(_PS_MODULE_DIR_.'blockuserinfo/blockuserinfo.php'); + $block_user_info = new BlockUserInfo(); + } + $this->context->smarty->assign('isVirtualCart', $this->context->cart->isVirtualCart()); + $this->_processAddressFormat(); + $this->_assignAddress(); - if (!($formated_address_fields_values_list = $this->context->smarty->getTemplateVars('formatedAddressFieldsValuesList'))) - $formated_address_fields_values_list = array(); + if (!($formated_address_fields_values_list = $this->context->smarty->getTemplateVars('formatedAddressFieldsValuesList'))) { + $formated_address_fields_values_list = array(); + } - // Wrapping fees - $wrapping_fees = $this->context->cart->getGiftWrappingPrice(false); - $wrapping_fees_tax_inc = $this->context->cart->getGiftWrappingPrice(); - $is_adv_api = Tools::getValue('isAdvApi'); + // Wrapping fees + $wrapping_fees = $this->context->cart->getGiftWrappingPrice(false); + $wrapping_fees_tax_inc = $this->context->cart->getGiftWrappingPrice(); + $is_adv_api = Tools::getValue('isAdvApi'); - if ($is_adv_api) - { - $tpl = 'order-address-advanced.tpl'; - $this->context->smarty->assign( - array('products' => $this->context->cart->getProducts()) - ); - } - else - $tpl = 'order-address.tpl'; + if ($is_adv_api) { + $tpl = 'order-address-advanced.tpl'; + $this->context->smarty->assign( + array('products' => $this->context->cart->getProducts()) + ); + } else { + $tpl = 'order-address.tpl'; + } - $return = array_merge(array( - 'order_opc_adress' => $this->context->smarty->fetch(_PS_THEME_DIR_.$tpl), - 'block_user_info' => '', - // 'block_user_info_nav' => (isset($block_user_info) ? $block_user_info->hookDisplayTop(array()) : ''), //changed to below line - 'block_user_info_nav' => (isset($block_user_info) ? $block_user_info->displayUserInfo(array()) : ''), - 'formatedAddressFieldsValuesList' => $formated_address_fields_values_list, - 'carrier_data' => ($is_adv_api ? '' : $this->_getCarrierList()), - 'HOOK_TOP_PAYMENT' => ($is_adv_api ? '' : Hook::exec('displayPaymentTop')), - 'HOOK_PAYMENT' => ($is_adv_api ? '' : $this->_getPaymentMethods()), - 'no_address' => 0, - 'gift_price' => Tools::displayPrice(Tools::convertPrice( - Product::getTaxCalculationMethod() == 1 ? $wrapping_fees : $wrapping_fees_tax_inc, - new Currency((int)$this->context->cookie->id_currency))) - ), - $this->getFormatedSummaryDetail() - ); - $this->ajaxDie(Tools::jsonEncode($return)); - } - die(Tools::displayError()); - break; + $return = array_merge(array( + 'order_opc_adress' => $this->context->smarty->fetch(_PS_THEME_DIR_.$tpl), + 'block_user_info' => '', + // 'block_user_info_nav' => (isset($block_user_info) ? $block_user_info->hookDisplayTop(array()) : ''), //changed to below line + 'block_user_info_nav' => (isset($block_user_info) ? $block_user_info->displayUserInfo(array()) : ''), + 'formatedAddressFieldsValuesList' => $formated_address_fields_values_list, + 'carrier_data' => ($is_adv_api ? '' : $this->_getCarrierList()), + 'HOOK_TOP_PAYMENT' => ($is_adv_api ? '' : Hook::exec('displayPaymentTop')), + 'HOOK_PAYMENT' => ($is_adv_api ? '' : $this->_getPaymentMethods()), + 'no_address' => 0, + 'gift_price' => Tools::displayPrice(Tools::convertPrice( + Product::getTaxCalculationMethod() == 1 ? $wrapping_fees : $wrapping_fees_tax_inc, + new Currency((int)$this->context->cookie->id_currency))) + ), + $this->getFormatedSummaryDetail() + ); + $this->ajaxDie(Tools::jsonEncode($return)); + } + die(Tools::displayError()); + break; - case 'makeFreeOrder': - /* Bypass payment step if total is 0 */ - if (($id_order = $this->_checkFreeOrder()) && $id_order) { + case 'makeFreeOrder': + /* Bypass payment step if total is 0 */ + if (($id_order = $this->_checkFreeOrder()) && $id_order) { $order = new Order((int)$id_order); $email = $this->context->customer->email; if ($this->context->customer->is_guest) { @@ -199,784 +198,723 @@ class OrderOpcControllerCore extends ParentOrderController } // If guest we clear the cookie for security reason $this->ajaxDie('freeorder:'.$order->reference.':'.$email); } - exit; - break; - - case 'updateAddressesSelected': - if ($this->context->customer->isLogged(true)) - { - $address_delivery = new Address((int)Tools::getValue('id_address_delivery')); - $this->context->smarty->assign('isVirtualCart', $this->context->cart->isVirtualCart()); - $address_invoice = ((int)Tools::getValue('id_address_delivery') == (int)Tools::getValue('id_address_invoice') ? $address_delivery : new Address((int)Tools::getValue('id_address_invoice'))); - if ($address_delivery->id_customer != $this->context->customer->id || $address_invoice->id_customer != $this->context->customer->id) - $this->errors[] = Tools::displayError('This address is not yours.'); - elseif (!Address::isCountryActiveById((int)Tools::getValue('id_address_delivery'))) - $this->errors[] = Tools::displayError('This address is not in a valid area.'); - elseif (!Validate::isLoadedObject($address_delivery) || !Validate::isLoadedObject($address_invoice) || $address_invoice->deleted || $address_delivery->deleted) - $this->errors[] = Tools::displayError('This address is invalid.'); - else - { - $this->context->cart->id_address_delivery = (int)Tools::getValue('id_address_delivery'); - $this->context->cart->id_address_invoice = Tools::isSubmit('same') ? $this->context->cart->id_address_delivery : (int)Tools::getValue('id_address_invoice'); - if (!$this->context->cart->update()) - $this->errors[] = Tools::displayError('An error occurred while updating your cart.'); - - $infos = Address::getCountryAndState((int)$this->context->cart->id_address_delivery); - if (isset($infos['id_country']) && $infos['id_country']) - { - $country = new Country((int)$infos['id_country']); - $this->context->country = $country; - } - - // Address has changed, so we check if the cart rules still apply - $cart_rules = $this->context->cart->getCartRules(); - CartRule::autoRemoveFromCart($this->context); - CartRule::autoAddToCart($this->context); - if ((int)Tools::getValue('allow_refresh')) - { - // If the cart rules has changed, we need to refresh the whole cart - $cart_rules2 = $this->context->cart->getCartRules(); - if (count($cart_rules2) != count($cart_rules)) - $this->ajax_refresh = true; - else - { - $rule_list = array(); - foreach ($cart_rules2 as $rule) - $rule_list[] = $rule['id_cart_rule']; - foreach ($cart_rules as $rule) - if (!in_array($rule['id_cart_rule'], $rule_list)) - { - $this->ajax_refresh = true; - break; - } - } - } - - if (!$this->context->cart->isMultiAddressDelivery()) - $this->context->cart->setNoMultishipping(); // As the cart is no multishipping, set each delivery address lines with the main delivery address - - if (!count($this->errors)) - { - $result = $this->_getCarrierList(); - // Wrapping fees - $wrapping_fees = $this->context->cart->getGiftWrappingPrice(false); - $wrapping_fees_tax_inc = $this->context->cart->getGiftWrappingPrice(); - $result = array_merge($result, array( - 'HOOK_TOP_PAYMENT' => Hook::exec('displayPaymentTop'), - 'HOOK_PAYMENT' => $this->_getPaymentMethods(), - 'gift_price' => Tools::displayPrice(Tools::convertPrice(Product::getTaxCalculationMethod() == 1 ? $wrapping_fees : $wrapping_fees_tax_inc, new Currency((int)$this->context->cookie->id_currency))), - 'carrier_data' => $this->_getCarrierList(), - 'refresh' => (bool)$this->ajax_refresh), - $this->getFormatedSummaryDetail() - ); - $this->ajaxDie(Tools::jsonEncode($result)); - } - } - if (count($this->errors)) - $this->ajaxDie(Tools::jsonEncode(array( - 'hasError' => true, - 'errors' => $this->errors - ))); - } - die(Tools::displayError()); - break; - - case 'multishipping': - $this->_assignSummaryInformations(); - $this->context->smarty->assign('product_list', $this->context->cart->getProducts()); - - if ($this->context->customer->id) - $this->context->smarty->assign('address_list', $this->context->customer->getAddresses($this->context->language->id)); - else - $this->context->smarty->assign('address_list', array()); - $this->setTemplate(_PS_THEME_DIR_.'order-address-multishipping-products.tpl'); - $this->display(); - $this->ajaxDie(); - break; - - case 'cartReload': - $this->_assignSummaryInformations(); - if ($this->context->customer->id) - $this->context->smarty->assign('address_list', $this->context->customer->getAddresses($this->context->language->id)); - else - $this->context->smarty->assign('address_list', array()); - $this->context->smarty->assign('opc', true); - $this->setTemplate(_PS_THEME_DIR_.'shopping-cart.tpl'); - $this->display(); - $this->ajaxDie(); - break; - - case 'noMultiAddressDelivery': - $this->context->cart->setNoMultishipping(); - $this->ajaxDie(); - break; - - default: - throw new PrestaShopException('Unknown method "'.Tools::getValue('method').'"'); - } - } - else - throw new PrestaShopException('Method is not defined'); - } - } - elseif (Tools::isSubmit('ajax')) - { - $this->errors[] = Tools::displayError('There is no product in your cart.'); - $this->ajaxDie('{"hasError" : true, "errors" : ["'.implode('\',\'', $this->errors).'"]}'); - } - } - - public function setMedia() - { - parent::setMedia(); - - if (!$this->useMobileTheme()) - { - // Adding CSS style sheet - $this->addCSS(_THEME_CSS_DIR_.'order-opc.css'); - // Adding JS files - $this->addJS(_THEME_JS_DIR_.'order-opc.js'); - $this->addJqueryPlugin('scrollTo'); - } - else - $this->addJS(_THEME_MOBILE_JS_DIR_.'opc.js'); - - $this->addJS(array( - _THEME_JS_DIR_.'tools/vatManagement.js', - _THEME_JS_DIR_.'tools/statesManagement.js', - _THEME_JS_DIR_.'order-carrier.js', - _PS_JS_DIR_.'validate.js' - )); - } - - /** - * Assign template vars related to page content - * @see FrontController::initContent() - */ - public function initContent() - { - parent::initContent(); - - /* id_carrier is not defined in database before choosing a carrier, set it to a default one to match a potential cart _rule */ - if (empty($this->context->cart->id_carrier)) - { - $checked = $this->context->cart->simulateCarrierSelectedOutput(); - $checked = ((int)Cart::desintifier($checked)); - $this->context->cart->id_carrier = $checked; - $this->context->cart->update(); - CartRule::autoRemoveFromCart($this->context); - CartRule::autoAddToCart($this->context); - } - - // SHOPPING CART - $this->_assignSummaryInformations(); - // WRAPPING AND TOS - $this->_assignWrappingAndTOS(); - - if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES')) - $countries = Carrier::getDeliveredCountries($this->context->language->id, true, true); - else - $countries = Country::getCountries($this->context->language->id, true); - - // If a rule offer free-shipping, force hidding shipping prices - $free_shipping = false; - foreach ($this->context->cart->getCartRules() as $rule) - if ($rule['free_shipping'] && !$rule['carrier_restriction']) - { - $free_shipping = true; - break; - } - - $this->context->smarty->assign(array( - 'free_shipping' => $free_shipping, - 'isGuest' => isset($this->context->cookie->is_guest) ? $this->context->cookie->is_guest : 0, - 'countries' => $countries, - 'sl_country' => (int)Tools::getCountry(), - 'PS_GUEST_CHECKOUT_ENABLED' => Configuration::get('PS_GUEST_CHECKOUT_ENABLED'), - 'errorCarrier' => Tools::displayError('You must choose a carrier.', false), - 'errorTOS' => Tools::displayError('You must accept the Terms of Service.', false), - 'isPaymentStep' => isset($_GET['isPaymentStep']) && $_GET['isPaymentStep'], - 'genders' => Gender::getGenders(), - 'one_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), - 'HOOK_CREATE_ACCOUNT_FORM' => Hook::exec('displayCustomerAccountForm'), - 'HOOK_CREATE_ACCOUNT_TOP' => Hook::exec('displayCustomerAccountFormTop') - )); - $years = Tools::dateYears(); - $months = Tools::dateMonths(); - $days = Tools::dateDays(); - $this->context->smarty->assign(array( - 'years' => $years, - 'months' => $months, - 'days' => $days, - )); - - /* Load guest informations */ - if ($this->isLogged && $this->context->cookie->is_guest) - $this->context->smarty->assign('guestInformations', $this->_getGuestInformations()); - // ADDRESS - if ($this->isLogged) - $this->_assignAddress(); - // CARRIER - $this->_assignCarrier(); - // PAYMENT - $this->_assignPayment(); - Tools::safePostVars(); - - $newsletter = Configuration::get('PS_CUSTOMER_NWSL') || (Module::isInstalled('blocknewsletter') && Module::getInstanceByName('blocknewsletter')->active); - $this->context->smarty->assign('newsletter', $newsletter); - $this->context->smarty->assign('optin', (bool)Configuration::get('PS_CUSTOMER_OPTIN')); - $this->context->smarty->assign('field_required', $this->context->customer->validateFieldsRequiredDatabase()); - - $this->_processAddressFormat(); - - $link = new Link(); - - if (Tools::getValue('deleteFromOrderLine')) - { - $id_product = Tools::getValue('id_product'); - $date_from = Tools::getValue('date_from'); - $date_to = Tools::getValue('date_to'); - - $obj_cart_bk_data = new HotelCartBookingData(); - $cart_data_dlt = $obj_cart_bk_data->deleteRoomDataFromOrderLine($this->context->cart->id, $this->context->cart->id_guest, $id_product, $date_from, $date_to); - - if ($cart_data_dlt) - { - Tools::redirect($link->getPageLink('order-opc', null, $this->context->language->id)); - } - } - - if ((bool)Configuration::get('PS_ADVANCED_PAYMENT_API')) - { - $this->addJS(_THEME_JS_DIR_ . 'advanced-payment-api.js'); - $this->setTemplate(_PS_THEME_DIR_ . 'order-opc-advanced.tpl'); - } - else - { - if (Module::isInstalled('hotelreservationsystem')) - { - require_once (_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); - - $obj_cart_bk_data = new HotelCartBookingData(); - $obj_htl_bk_dtl = new HotelBookingDetail(); - $obj_rm_type = new HotelRoomType(); - - $htl_rm_types = $this->context->cart->getProducts(); - if (!empty($htl_rm_types)) - { - // For Cart Lock - $cartChanged = false; - foreach ($htl_rm_types as $t_key => $t_value) - { - $rm_dtl = $obj_rm_type->getRoomTypeInfoByIdProduct($t_value['id_product']); - $cart_bk_data = $obj_cart_bk_data->getOnlyCartBookingData($this->context->cart->id, $this->context->cart->id_guest, $t_value['id_product']); - - $cart_data = array(); - foreach ($cart_bk_data as $cd_key => $cd_val) - { - $date_join = strtotime($cd_val['date_from']).strtotime($cd_val['date_to']); - - $cart_data[$date_join]['date_from'] = $cd_val['date_from']; - $cart_data[$date_join]['date_to'] = $cd_val['date_to']; - $cart_data[$date_join]['id_rms'][] = $cd_val['id_room']; - } - - foreach ($cart_data as $cl_key => $cl_val) - { - $avai_rm = $obj_htl_bk_dtl->DataForFrontSearch($cl_val['date_from'], $cl_val['date_to'], $rm_dtl['id_hotel'], $t_value['id_product'], 1); - - if (count($avai_rm['rm_data'][0]['data']['available']) < count($cl_val['id_rms'])) - { - $cartChanged = true; - - foreach ($cl_val['id_rms'] as $cr_key => $cr_val) - { - $isRmBooked = $obj_htl_bk_dtl->chechRoomBooked($cr_val, $cl_val['date_from'], $cl_val['date_to']); - if ($isRmBooked) - { - $cartData = array('id_cart' => $this->context->cart->id, - 'id_product' => $t_value['id_product'], - 'id_order' => 0, - 'id_room' => $cr_val, - 'date_from' => $cl_val['date_from'], - 'date_to' => $cl_val['date_to'], - ); - $iscartdlt = $obj_cart_bk_data->deleteRowByCartBookingData($cartData); - if ($iscartdlt) - { - $nbDays = $obj_htl_bk_dtl->getNumberOfDays($cl_val['date_from'], $cl_val['date_to']); - $this->context->cart->updateQty($nbDays, $t_value['id_product'], null, false, 'down'); - } - } - } - } - } - } - $this->context->smarty->assign('cartChanged', $cartChanged); - - foreach ($htl_rm_types as $type_key => $type_value) - { - $cart_bk_data = $obj_cart_bk_data->getOnlyCartBookingData($this->context->cart->id, $this->context->cart->id_guest, $type_value['id_product']); - if ($cart_bk_data) - { - $product = new Product($type_value['id_product'], false, $this->context->language->id); - $cover_image_arr = $product->getCover($type_value['id_product']); - - if(!empty($cover_image_arr)) - $cover_img = $this->context->link->getImageLink($product->link_rewrite, $product->id.'-'.$cover_image_arr['id_image'], 'small_default'); - else - $cover_img = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code."-default", 'small_default'); - - $unit_price = Tools::ps_round(Product::getPriceStatic($type_value['id_product'], HotelBookingDetail::useTax()), 2); - - $rm_dtl = $obj_rm_type->getRoomTypeInfoByIdProduct($type_value['id_product']); - - $cart_htl_data[$type_key]['id_product'] = $type_value['id_product']; - $cart_htl_data[$type_key]['cover_img'] = $cover_img; - $cart_htl_data[$type_key]['name'] = $product->name; - $cart_htl_data[$type_key]['unit_price'] = $unit_price; - $cart_htl_data[$type_key]['adult'] = $rm_dtl['adult']; - $cart_htl_data[$type_key]['children'] = $rm_dtl['children']; - - foreach ($cart_bk_data as $data_k => $data_v) - { - $date_join = strtotime($data_v['date_from']).strtotime($data_v['date_to']); - - if (isset($cart_htl_data[$type_key]['date_diff'][$date_join])) - { - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] += 1; - - $num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days']; - $vart_quant = (int)$cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] * $num_days; - - $amount = Product::getPriceStatic($type_value['id_product'], HotelBookingDetail::useTax()); - $amount *= $vart_quant; - - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = Tools::ps_round($amount, 2); - } - else - { - $num_days = $obj_htl_bk_dtl->getNumberOfDays($data_v['date_from'], $data_v['date_to']); - - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] = 1; - $cart_htl_data[$type_key]['date_diff'][$date_join]['data_form'] = $data_v['date_from']; - $cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = $data_v['date_to']; - $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; - $amount = Product::getPriceStatic($type_value['id_product'], HotelBookingDetail::useTax()); - $amount *= $num_days; - - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = Tools::ps_round($amount, 2); - - $cart_htl_data[$type_key]['date_diff'][$date_join]['link'] = $link->getPageLink('order-opc', null, $this->context->language->id, "id_product=".$type_value['id_product']."&deleteFromOrderLine=1&date_from=".$data_v['date_from']."&date_to=".$data_v['date_to']); - } - } - } - } - if ($cart_htl_data) - $this->context->smarty->assign('cart_htl_data', $cart_htl_data); - - // For Advanced Payment - $advance_payment_active = Configuration::get('WK_ALLOW_ADVANCED_PAYMENT'); - if ($advance_payment_active) - { - $obj_adv_pmt = new HotelAdvancedPayment(); - - // $adv_amount = Tools::ps_round($obj_adv_pmt->getMinAdvPaymentAmount(), 2); - $adv_amount = $obj_adv_pmt->getMinAdvPaymentAmount(); - - if (Tools::isSubmit('submitAdvPayment')) - { - $id_customer_adv = Tools::getValue('id_customer_adv'); - if ($id_customer_adv) { - $obj_customer_adv = new HotelCustomerAdvancedPayment($id_customer_adv); - } else { - $obj_customer_adv = new HotelCustomerAdvancedPayment(); - } - - $payment_type = Tools::getValue('payment_type'); - if ($payment_type == 2) - { - $obj_customer_adv->id_cart = $this->context->cart->id; - $obj_customer_adv->id_guest = $this->context->cart->id_guest; - $obj_customer_adv->id_customer = $this->context->customer->id ? $this->context->customer->id : ''; - $obj_customer_adv->id_currency = $this->context->cart->id_currency; - $obj_customer_adv->total_paid_amount = $adv_amount; - $obj_customer_adv->total_order_amount = $this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS); - $obj_customer_adv->save(); - } - else - { - if ($id_customer_adv) { - $obj_customer_adv->delete(); - } - } - - Tools::redirect($this->context->link->getPageLink('order-opc')); - } - - $obj_customer_adv = new HotelCustomerAdvancedPayment(); - $customer_adv_dtl = $obj_customer_adv->getClientAdvPaymentDtl($this->context->cart->id, $this->context->cart->id_guest); - if ($customer_adv_dtl) - { - if (Tools::ps_round($customer_adv_dtl['total_paid_amount'], 2) != Tools::ps_round($adv_amount, 2)) // If More rooms are added in cart after selecting Advanced payment - { - $obj_customer_adv = new HotelCustomerAdvancedPayment($customer_adv_dtl['id']); - $obj_customer_adv->id_currency = $this->context->cart->id_currency; - $obj_customer_adv->total_paid_amount = $adv_amount; - $obj_customer_adv->total_order_amount = $this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS); - $obj_customer_adv->save(); - - Tools::redirect($this->context->link->getPageLink('order-opc')); - } - - $due_amount = $this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS) - $customer_adv_dtl['total_paid_amount']; - $customer_adv_dtl['due_amount'] = $due_amount; - - $cart_rules = $this->context->cart->getCartRules(); - $total_discount = 0; - if ($cart_rules) { - foreach ($cart_rules as $discount) { - if ($discount['reduction_currency'] != $this->context->cart->id_currency) { - $discount['reduction_amount'] = Tools::convertPriceFull($discount['reduction_amount'], new Currency($discount['reduction_currency']), $this->context->currency); - } - $total_discount += $discount['reduction_amount']; - } - } - $customer_adv_dtl['total_to_be_paid'] = ($customer_adv_dtl['total_paid_amount'] - $total_discount) > 0 ? ($customer_adv_dtl['total_paid_amount'] - $total_discount) : 0; - $this->context->smarty->assign('customer_adv_dtl', $customer_adv_dtl); - } - - $this->context->smarty->assign('adv_amount', $adv_amount); - $this->context->smarty->assign('advance_payment_active', $advance_payment_active); - } - } - } - /*Check Order restrict condition before Payment by the customer*/ - if (Module::isInstalled('hotelreservationsystem') && Module::isEnabled('hotelreservationsystem')) { - $error = false; - require_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php'; - $cart_products = $this->context->cart->getProducts(); - $order_restrict_error = HotelOrderRestrictDate::validateOrderRestrictDateOnPayment($this); - } - /*END*/ - $this->setTemplate(_PS_THEME_DIR_.'order-opc.tpl'); - } - } - - protected function _getGuestInformations() - { - $customer = $this->context->customer; - $address_delivery = new Address($this->context->cart->id_address_delivery); - - $id_address_invoice = $this->context->cart->id_address_invoice != $this->context->cart->id_address_delivery ? (int)$this->context->cart->id_address_invoice : 0; - $address_invoice = new Address($id_address_invoice); - - if ($customer->birthday) - $birthday = explode('-', $customer->birthday); - else - $birthday = array('0', '0', '0'); - - return array( - 'id_customer' => (int)$customer->id, - 'email' => Tools::htmlentitiesUTF8($customer->email), - 'customer_lastname' => Tools::htmlentitiesUTF8($customer->lastname), - 'customer_firstname' => Tools::htmlentitiesUTF8($customer->firstname), - 'newsletter' => (int)$customer->newsletter, - 'optin' => (int)$customer->optin, - 'id_address_delivery' => (int)$this->context->cart->id_address_delivery, - 'company' => Tools::htmlentitiesUTF8($address_delivery->company), - 'lastname' => Tools::htmlentitiesUTF8($address_delivery->lastname), - 'firstname' => Tools::htmlentitiesUTF8($address_delivery->firstname), - 'vat_number' => Tools::htmlentitiesUTF8($address_delivery->vat_number), - 'dni' => Tools::htmlentitiesUTF8($address_delivery->dni), - 'address1' => Tools::htmlentitiesUTF8($address_delivery->address1), - 'postcode' => Tools::htmlentitiesUTF8($address_delivery->postcode), - 'city' => Tools::htmlentitiesUTF8($address_delivery->city), - 'phone' => Tools::htmlentitiesUTF8($address_delivery->phone), - 'phone_mobile' => Tools::htmlentitiesUTF8($address_delivery->phone_mobile), - 'id_country' => (int)$address_delivery->id_country, - 'id_state' => (int)$address_delivery->id_state, - 'id_gender' => (int)$customer->id_gender, - 'sl_year' => $birthday[0], - 'sl_month' => $birthday[1], - 'sl_day' => $birthday[2], - 'company_invoice' => Tools::htmlentitiesUTF8($address_invoice->company), - 'lastname_invoice' => Tools::htmlentitiesUTF8($address_invoice->lastname), - 'firstname_invoice' => Tools::htmlentitiesUTF8($address_invoice->firstname), - 'vat_number_invoice' => Tools::htmlentitiesUTF8($address_invoice->vat_number), - 'dni_invoice' => Tools::htmlentitiesUTF8($address_invoice->dni), - 'address1_invoice' => Tools::htmlentitiesUTF8($address_invoice->address1), - 'address2_invoice' => Tools::htmlentitiesUTF8($address_invoice->address2), - 'postcode_invoice' => Tools::htmlentitiesUTF8($address_invoice->postcode), - 'city_invoice' => Tools::htmlentitiesUTF8($address_invoice->city), - 'phone_invoice' => Tools::htmlentitiesUTF8($address_invoice->phone), - 'phone_mobile_invoice' => Tools::htmlentitiesUTF8($address_invoice->phone_mobile), - 'id_country_invoice' => (int)$address_invoice->id_country, - 'id_state_invoice' => (int)$address_invoice->id_state, - 'id_address_invoice' => $id_address_invoice, - 'invoice_company' => Tools::htmlentitiesUTF8($address_invoice->company), - 'invoice_lastname' => Tools::htmlentitiesUTF8($address_invoice->lastname), - 'invoice_firstname' => Tools::htmlentitiesUTF8($address_invoice->firstname), - 'invoice_vat_number' => Tools::htmlentitiesUTF8($address_invoice->vat_number), - 'invoice_dni' => Tools::htmlentitiesUTF8($address_invoice->dni), - 'invoice_address' => $this->context->cart->id_address_invoice !== $this->context->cart->id_address_delivery, - 'invoice_address1' => Tools::htmlentitiesUTF8($address_invoice->address1), - 'invoice_address2' => Tools::htmlentitiesUTF8($address_invoice->address2), - 'invoice_postcode' => Tools::htmlentitiesUTF8($address_invoice->postcode), - 'invoice_city' => Tools::htmlentitiesUTF8($address_invoice->city), - 'invoice_phone' => Tools::htmlentitiesUTF8($address_invoice->phone), - 'invoice_phone_mobile' => Tools::htmlentitiesUTF8($address_invoice->phone_mobile), - 'invoice_id_country' => (int)$address_invoice->id_country, - 'invoice_id_state' => (int)$address_invoice->id_state, - ); - } - - protected function _assignCarrier() - { - if (!$this->isLogged) - { - $carriers = $this->context->cart->simulateCarriersOutput(); - $old_message = Message::getMessageByCartId((int)$this->context->cart->id); - $this->context->smarty->assign(array( - 'HOOK_EXTRACARRIER' => null, - 'HOOK_EXTRACARRIER_ADDR' => null, - 'oldMessage' => isset($old_message['message'])? $old_message['message'] : '', - 'HOOK_BEFORECARRIER' => Hook::exec('displayBeforeCarrier', array( - 'carriers' => $carriers, - 'checked' => $this->context->cart->simulateCarrierSelectedOutput(), - 'delivery_option_list' => $this->context->cart->getDeliveryOptionList(), - 'delivery_option' => $this->context->cart->getDeliveryOption(null, true) - )) - )); - } - else - parent::_assignCarrier(); - } - - protected function _assignPayment() - { - if ((bool)Configuration::get('PS_ADVANCED_PAYMENT_API')) { - $this->context->smarty->assign(array( - 'HOOK_TOP_PAYMENT' => ($this->isLogged ? Hook::exec('displayPaymentTop') : ''), - 'HOOK_PAYMENT' => $this->_getPaymentMethods(), - 'HOOK_ADVANCED_PAYMENT' => Hook::exec('advancedPaymentOptions', array(), null, true), - 'link_conditions' => $this->link_conditions - )); - } else { - $this->context->smarty->assign(array( - 'HOOK_TOP_PAYMENT' => ($this->isLogged ? Hook::exec('displayPaymentTop') : ''), - 'HOOK_PAYMENT' => $this->_getPaymentMethods() - )); - } - } - - protected function _getPaymentMethods() - { - if (!$this->isLogged) - return '

'.Tools::displayError('Please sign in to see payment methods.').'

'; - if ($this->context->cart->OrderExists()) - return '

'.Tools::displayError('Error: This order has already been validated.').'

'; - if (!$this->context->cart->id_customer || !Customer::customerIdExistsStatic($this->context->cart->id_customer) || Customer::isBanned($this->context->cart->id_customer)) - return '

'.Tools::displayError('Error: No customer.').'

'; - $address_delivery = new Address($this->context->cart->id_address_delivery); - $address_invoice = ($this->context->cart->id_address_delivery == $this->context->cart->id_address_invoice ? $address_delivery : new Address($this->context->cart->id_address_invoice)); - if (!$this->context->cart->id_address_delivery || !$this->context->cart->id_address_invoice || !Validate::isLoadedObject($address_delivery) || !Validate::isLoadedObject($address_invoice) || $address_invoice->deleted || $address_delivery->deleted) - return '

'.Tools::displayError('Error: Please select an address.').'

'; - if (count($this->context->cart->getDeliveryOptionList()) == 0 && !$this->context->cart->isVirtualCart()) - { - if ($this->context->cart->isMultiAddressDelivery()) - return '

'.Tools::displayError('Error: None of your chosen carriers deliver to some of the addresses you have selected.').'

'; - else - return '

'.Tools::displayError('Error: None of your chosen carriers deliver to the address you have selected.').'

'; - } - if (!$this->context->cart->getDeliveryOption(null, false) && !$this->context->cart->isVirtualCart()) - return '

'.Tools::displayError('Error: Please choose a carrier.').'

'; - if (!$this->context->cart->id_currency) - return '

'.Tools::displayError('Error: No currency has been selected.').'

'; - if (!$this->context->cookie->checkedTOS && Configuration::get('PS_CONDITIONS')) - return '

'.Tools::displayError('Please accept the Terms of Service.').'

'; - - /* If some products have disappear */ - if (is_array($product = $this->context->cart->checkQuantities(true))) - return '

'.sprintf(Tools::displayError('An item (%s) in your cart is no longer available in this quantity. You cannot proceed with your order until the quantity is adjusted.'), $product['name']).'

'; - - if ((int)$id_product = $this->context->cart->checkProductsAccess()) - return '

'.sprintf(Tools::displayError('An item in your cart is no longer available (%s). You cannot proceed with your order.'), Product::getProductName((int)$id_product)).'

'; - - /* Check minimal amount */ - $currency = Currency::getCurrency((int)$this->context->cart->id_currency); - - $minimal_purchase = Tools::convertPrice((float)Configuration::get('PS_PURCHASE_MINIMUM'), $currency); - if ($this->context->cart->getOrderTotal(false, Cart::ONLY_PRODUCTS) < $minimal_purchase) - return '

'.sprintf( - Tools::displayError('A minimum purchase total of %1s (tax excl.) is required to validate your order, current purchase total is %2s (tax excl.).'), - Tools::displayPrice($minimal_purchase, $currency), Tools::displayPrice($this->context->cart->getOrderTotal(false, Cart::ONLY_PRODUCTS), $currency) - ).'

'; - - - // For Advanced Payment (when advance paid amount will be zero when voucher will be applied) + exit; + break; + + case 'updateAddressesSelected': + if ($this->context->customer->isLogged(true)) { + $address_delivery = new Address((int)Tools::getValue('id_address_delivery')); + $this->context->smarty->assign('isVirtualCart', $this->context->cart->isVirtualCart()); + $address_invoice = ((int)Tools::getValue('id_address_delivery') == (int)Tools::getValue('id_address_invoice') ? $address_delivery : new Address((int)Tools::getValue('id_address_invoice'))); + if ($address_delivery->id_customer != $this->context->customer->id || $address_invoice->id_customer != $this->context->customer->id) { + $this->errors[] = Tools::displayError('This address is not yours.'); + } elseif (!Address::isCountryActiveById((int)Tools::getValue('id_address_delivery'))) { + $this->errors[] = Tools::displayError('This address is not in a valid area.'); + } elseif (!Validate::isLoadedObject($address_delivery) || !Validate::isLoadedObject($address_invoice) || $address_invoice->deleted || $address_delivery->deleted) { + $this->errors[] = Tools::displayError('This address is invalid.'); + } else { + $this->context->cart->id_address_delivery = (int)Tools::getValue('id_address_delivery'); + $this->context->cart->id_address_invoice = Tools::isSubmit('same') ? $this->context->cart->id_address_delivery : (int)Tools::getValue('id_address_invoice'); + if (!$this->context->cart->update()) { + $this->errors[] = Tools::displayError('An error occurred while updating your cart.'); + } + + $infos = Address::getCountryAndState((int)$this->context->cart->id_address_delivery); + if (isset($infos['id_country']) && $infos['id_country']) { + $country = new Country((int)$infos['id_country']); + $this->context->country = $country; + } + + // Address has changed, so we check if the cart rules still apply + $cart_rules = $this->context->cart->getCartRules(); + CartRule::autoRemoveFromCart($this->context); + CartRule::autoAddToCart($this->context); + if ((int)Tools::getValue('allow_refresh')) { + // If the cart rules has changed, we need to refresh the whole cart + $cart_rules2 = $this->context->cart->getCartRules(); + if (count($cart_rules2) != count($cart_rules)) { + $this->ajax_refresh = true; + } else { + $rule_list = array(); + foreach ($cart_rules2 as $rule) { + $rule_list[] = $rule['id_cart_rule']; + } + foreach ($cart_rules as $rule) { + if (!in_array($rule['id_cart_rule'], $rule_list)) { + $this->ajax_refresh = true; + break; + } + } + } + } + + if (!$this->context->cart->isMultiAddressDelivery()) { + $this->context->cart->setNoMultishipping(); + } // As the cart is no multishipping, set each delivery address lines with the main delivery address + + if (!count($this->errors)) { + $result = $this->_getCarrierList(); + // Wrapping fees + $wrapping_fees = $this->context->cart->getGiftWrappingPrice(false); + $wrapping_fees_tax_inc = $this->context->cart->getGiftWrappingPrice(); + $result = array_merge($result, array( + 'HOOK_TOP_PAYMENT' => Hook::exec('displayPaymentTop'), + 'HOOK_PAYMENT' => $this->_getPaymentMethods(), + 'gift_price' => Tools::displayPrice(Tools::convertPrice(Product::getTaxCalculationMethod() == 1 ? $wrapping_fees : $wrapping_fees_tax_inc, new Currency((int)$this->context->cookie->id_currency))), + 'carrier_data' => $this->_getCarrierList(), + 'refresh' => (bool)$this->ajax_refresh), + $this->getFormatedSummaryDetail() + ); + $this->ajaxDie(Tools::jsonEncode($result)); + } + } + if (count($this->errors)) { + $this->ajaxDie(Tools::jsonEncode(array( + 'hasError' => true, + 'errors' => $this->errors + ))); + } + } + die(Tools::displayError()); + break; + + case 'multishipping': + $this->_assignSummaryInformations(); + $this->context->smarty->assign('product_list', $this->context->cart->getProducts()); + + if ($this->context->customer->id) { + $this->context->smarty->assign('address_list', $this->context->customer->getAddresses($this->context->language->id)); + } else { + $this->context->smarty->assign('address_list', array()); + } + $this->setTemplate(_PS_THEME_DIR_.'order-address-multishipping-products.tpl'); + $this->display(); + $this->ajaxDie(); + break; + + case 'cartReload': + $this->_assignSummaryInformations(); + if ($this->context->customer->id) { + $this->context->smarty->assign('address_list', $this->context->customer->getAddresses($this->context->language->id)); + } else { + $this->context->smarty->assign('address_list', array()); + } + $this->context->smarty->assign('opc', true); + $this->setTemplate(_PS_THEME_DIR_.'shopping-cart.tpl'); + $this->display(); + $this->ajaxDie(); + break; + + case 'noMultiAddressDelivery': + $this->context->cart->setNoMultishipping(); + $this->ajaxDie(); + break; + + default: + throw new PrestaShopException('Unknown method "'.Tools::getValue('method').'"'); + } + } else { + throw new PrestaShopException('Method is not defined'); + } + } + } elseif (Tools::isSubmit('ajax')) { + $this->errors[] = Tools::displayError('There is no product in your cart.'); + $this->ajaxDie('{"hasError" : true, "errors" : ["'.implode('\',\'', $this->errors).'"]}'); + } + } + + public function setMedia() + { + parent::setMedia(); + + if (!$this->useMobileTheme()) { + // Adding CSS style sheet + $this->addCSS(_THEME_CSS_DIR_.'order-opc.css'); + // Adding JS files + $this->addJS(_THEME_JS_DIR_.'order-opc.js'); + $this->addJqueryPlugin('scrollTo'); + } else { + $this->addJS(_THEME_MOBILE_JS_DIR_.'opc.js'); + } + + $this->addJS(array( + _THEME_JS_DIR_.'tools/vatManagement.js', + _THEME_JS_DIR_.'tools/statesManagement.js', + _THEME_JS_DIR_.'order-carrier.js', + _PS_JS_DIR_.'validate.js' + )); + } + + /** + * Assign template vars related to page content + * @see FrontController::initContent() + */ + public function initContent() + { + parent::initContent(); + + /* id_carrier is not defined in database before choosing a carrier, set it to a default one to match a potential cart _rule */ + if (empty($this->context->cart->id_carrier)) { + $checked = $this->context->cart->simulateCarrierSelectedOutput(); + $checked = ((int)Cart::desintifier($checked)); + $this->context->cart->id_carrier = $checked; + $this->context->cart->update(); + CartRule::autoRemoveFromCart($this->context); + CartRule::autoAddToCart($this->context); + } + + // SHOPPING CART + $this->_assignSummaryInformations(); + // WRAPPING AND TOS + $this->_assignWrappingAndTOS(); + + if (Configuration::get('PS_RESTRICT_DELIVERED_COUNTRIES')) { + $countries = Carrier::getDeliveredCountries($this->context->language->id, true, true); + } else { + $countries = Country::getCountries($this->context->language->id, true); + } + + // If a rule offer free-shipping, force hidding shipping prices + $free_shipping = false; + foreach ($this->context->cart->getCartRules() as $rule) { + if ($rule['free_shipping'] && !$rule['carrier_restriction']) { + $free_shipping = true; + break; + } + } + + $this->context->smarty->assign(array( + 'free_shipping' => $free_shipping, + 'isGuest' => isset($this->context->cookie->is_guest) ? $this->context->cookie->is_guest : 0, + 'countries' => $countries, + 'sl_country' => (int)Tools::getCountry(), + 'PS_GUEST_CHECKOUT_ENABLED' => Configuration::get('PS_GUEST_CHECKOUT_ENABLED'), + 'errorCarrier' => Tools::displayError('You must choose a carrier.', false), + 'errorTOS' => Tools::displayError('You must accept the Terms of Service.', false), + 'isPaymentStep' => isset($_GET['isPaymentStep']) && $_GET['isPaymentStep'], + 'genders' => Gender::getGenders(), + 'one_phone_at_least' => (int)Configuration::get('PS_ONE_PHONE_AT_LEAST'), + 'HOOK_CREATE_ACCOUNT_FORM' => Hook::exec('displayCustomerAccountForm'), + 'HOOK_CREATE_ACCOUNT_TOP' => Hook::exec('displayCustomerAccountFormTop') + )); + $years = Tools::dateYears(); + $months = Tools::dateMonths(); + $days = Tools::dateDays(); + $this->context->smarty->assign(array( + 'years' => $years, + 'months' => $months, + 'days' => $days, + )); + + /* Load guest informations */ + if ($this->isLogged && $this->context->cookie->is_guest) { + $this->context->smarty->assign('guestInformations', $this->_getGuestInformations()); + } + // ADDRESS + if ($this->isLogged) { + $this->_assignAddress(); + } + // CARRIER + $this->_assignCarrier(); + // PAYMENT + $this->_assignPayment(); + Tools::safePostVars(); + + $newsletter = Configuration::get('PS_CUSTOMER_NWSL') || (Module::isInstalled('blocknewsletter') && Module::getInstanceByName('blocknewsletter')->active); + $this->context->smarty->assign('newsletter', $newsletter); + $this->context->smarty->assign('optin', (bool)Configuration::get('PS_CUSTOMER_OPTIN')); + $this->context->smarty->assign('field_required', $this->context->customer->validateFieldsRequiredDatabase()); + + $this->_processAddressFormat(); + + $link = new Link(); + + if (Tools::getValue('deleteFromOrderLine')) { + $id_product = Tools::getValue('id_product'); + $date_from = Tools::getValue('date_from'); + $date_to = Tools::getValue('date_to'); + + $obj_cart_bk_data = new HotelCartBookingData(); + $cart_data_dlt = $obj_cart_bk_data->deleteRoomDataFromOrderLine($this->context->cart->id, $this->context->cart->id_guest, $id_product, $date_from, $date_to); + + if ($cart_data_dlt) { + Tools::redirect($link->getPageLink('order-opc', null, $this->context->language->id)); + } + } + + if ((bool)Configuration::get('PS_ADVANCED_PAYMENT_API')) { + $this->addJS(_THEME_JS_DIR_ . 'advanced-payment-api.js'); + $this->setTemplate(_PS_THEME_DIR_ . 'order-opc-advanced.tpl'); + } else { + if (Module::isInstalled('hotelreservationsystem')) { + require_once(_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); + + $obj_cart_bk_data = new HotelCartBookingData(); + $obj_htl_bk_dtl = new HotelBookingDetail(); + $obj_rm_type = new HotelRoomType(); + + $htl_rm_types = $this->context->cart->getProducts(); + if (!empty($htl_rm_types)) { + // For Cart Lock + $cartChanged = false; + foreach ($htl_rm_types as $t_key => $t_value) { + $rm_dtl = $obj_rm_type->getRoomTypeInfoByIdProduct($t_value['id_product']); + $cart_bk_data = $obj_cart_bk_data->getOnlyCartBookingData($this->context->cart->id, $this->context->cart->id_guest, $t_value['id_product']); + + $cart_data = array(); + foreach ($cart_bk_data as $cd_key => $cd_val) { + $date_join = strtotime($cd_val['date_from']).strtotime($cd_val['date_to']); + + $cart_data[$date_join]['date_from'] = $cd_val['date_from']; + $cart_data[$date_join]['date_to'] = $cd_val['date_to']; + $cart_data[$date_join]['id_rms'][] = $cd_val['id_room']; + } + + foreach ($cart_data as $cl_key => $cl_val) { + $avai_rm = $obj_htl_bk_dtl->DataForFrontSearch($cl_val['date_from'], $cl_val['date_to'], $rm_dtl['id_hotel'], $t_value['id_product'], 1); + + if (count($avai_rm['rm_data'][0]['data']['available']) < count($cl_val['id_rms'])) { + $cartChanged = true; + + foreach ($cl_val['id_rms'] as $cr_key => $cr_val) { + $isRmBooked = $obj_htl_bk_dtl->chechRoomBooked($cr_val, $cl_val['date_from'], $cl_val['date_to']); + if ($isRmBooked) { + $cartData = array( + 'id_cart' => $this->context->cart->id, + 'id_product' => $t_value['id_product'], + 'id_order' => 0, + 'id_room' => $cr_val, + 'date_from' => $cl_val['date_from'], + 'date_to' => $cl_val['date_to'], + ); + $iscartdlt = $obj_cart_bk_data->deleteRowByCartBookingData($cartData); + if ($iscartdlt) { + $nbDays = $obj_htl_bk_dtl->getNumberOfDays($cl_val['date_from'], $cl_val['date_to']); + $this->context->cart->updateQty($nbDays, $t_value['id_product'], null, false, 'down'); + } + } + } + } + } + } + $this->context->smarty->assign('cartChanged', $cartChanged); + $cart_htl_data = HotelCartBookingData::getHotelCartBookingData(); + if ($cart_htl_data) { + $this->context->smarty->assign('cart_htl_data', $cart_htl_data); + } + + // For Advanced Payment + $advance_payment_active = Configuration::get('WK_ALLOW_ADVANCED_PAYMENT'); + if ($advance_payment_active) { + $obj_adv_pmt = new HotelAdvancedPayment(); + + // $adv_amount = Tools::ps_round($obj_adv_pmt->getMinAdvPaymentAmount(), 2); + $adv_amount = $obj_adv_pmt->getMinAdvPaymentAmount(); + if (Tools::isSubmit('submitAdvPayment')) { + $id_customer_adv = Tools::getValue('id_customer_adv'); + if ($id_customer_adv) { + $obj_customer_adv = new HotelCustomerAdvancedPayment($id_customer_adv); + } else { + $obj_customer_adv = new HotelCustomerAdvancedPayment(); + } + + $payment_type = Tools::getValue('payment_type'); + if ($payment_type == 2) { + $obj_customer_adv->id_cart = $this->context->cart->id; + $obj_customer_adv->id_guest = $this->context->cart->id_guest; + $obj_customer_adv->id_customer = $this->context->customer->id ? $this->context->customer->id : ''; + $obj_customer_adv->id_currency = $this->context->cart->id_currency; + $obj_customer_adv->total_paid_amount = $adv_amount; + $obj_customer_adv->total_order_amount = $this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS); + $obj_customer_adv->save(); + } else { + if ($id_customer_adv) { + $obj_customer_adv->delete(); + } + } + + Tools::redirect($this->context->link->getPageLink('order-opc')); + } + + $obj_customer_adv = new HotelCustomerAdvancedPayment(); + $customer_adv_dtl = $obj_customer_adv->getClientAdvPaymentDtl($this->context->cart->id, $this->context->cart->id_guest); + if ($customer_adv_dtl) { + if (Tools::ps_round($customer_adv_dtl['total_paid_amount'], 2) != Tools::ps_round($adv_amount, 2)) { + // If More rooms are added in cart after selecting Advanced payment + + $obj_customer_adv = new HotelCustomerAdvancedPayment($customer_adv_dtl['id']); + $obj_customer_adv->id_currency = $this->context->cart->id_currency; + $obj_customer_adv->total_paid_amount = $adv_amount; + $obj_customer_adv->total_order_amount = $this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS); + $obj_customer_adv->save(); + + Tools::redirect($this->context->link->getPageLink('order-opc')); + } + + $due_amount = $this->context->cart->getOrderTotal(true, Cart::ONLY_PRODUCTS) - $customer_adv_dtl['total_paid_amount']; + $customer_adv_dtl['due_amount'] = $due_amount; + + $cart_rules = $this->context->cart->getCartRules(); + $total_discount = 0; + if ($cart_rules) { + foreach ($cart_rules as $discount) { + if ($discount['reduction_currency'] != $this->context->cart->id_currency) { + $discount['reduction_amount'] = Tools::convertPriceFull($discount['reduction_amount'], new Currency($discount['reduction_currency']), $this->context->currency); + } + $total_discount += $discount['reduction_amount']; + } + } + $customer_adv_dtl['total_to_be_paid'] = ($customer_adv_dtl['total_paid_amount'] - $total_discount) > 0 ? ($customer_adv_dtl['total_paid_amount'] - $total_discount) : 0; + $this->context->smarty->assign('customer_adv_dtl', $customer_adv_dtl); + } + + $this->context->smarty->assign('adv_amount', $adv_amount); + $this->context->smarty->assign('advance_payment_active', $advance_payment_active); + } + } + } + /*Check Order restrict condition before Payment by the customer*/ + if (Module::isInstalled('hotelreservationsystem') && Module::isEnabled('hotelreservationsystem')) { + $error = false; + require_once _PS_MODULE_DIR_.'hotelreservationsystem/define.php'; + $cart_products = $this->context->cart->getProducts(); + $order_restrict_error = HotelOrderRestrictDate::validateOrderRestrictDateOnPayment($this); + } + /*END*/ + $this->setTemplate(_PS_THEME_DIR_.'order-opc.tpl'); + } + } + + protected function _getGuestInformations() + { + $customer = $this->context->customer; + $address_delivery = new Address($this->context->cart->id_address_delivery); + + $id_address_invoice = $this->context->cart->id_address_invoice != $this->context->cart->id_address_delivery ? (int)$this->context->cart->id_address_invoice : 0; + $address_invoice = new Address($id_address_invoice); + + if ($customer->birthday) { + $birthday = explode('-', $customer->birthday); + } else { + $birthday = array('0', '0', '0'); + } + + return array( + 'id_customer' => (int)$customer->id, + 'email' => Tools::htmlentitiesUTF8($customer->email), + 'customer_lastname' => Tools::htmlentitiesUTF8($customer->lastname), + 'customer_firstname' => Tools::htmlentitiesUTF8($customer->firstname), + 'newsletter' => (int)$customer->newsletter, + 'optin' => (int)$customer->optin, + 'id_address_delivery' => (int)$this->context->cart->id_address_delivery, + 'company' => Tools::htmlentitiesUTF8($address_delivery->company), + 'lastname' => Tools::htmlentitiesUTF8($address_delivery->lastname), + 'firstname' => Tools::htmlentitiesUTF8($address_delivery->firstname), + 'vat_number' => Tools::htmlentitiesUTF8($address_delivery->vat_number), + 'dni' => Tools::htmlentitiesUTF8($address_delivery->dni), + 'address1' => Tools::htmlentitiesUTF8($address_delivery->address1), + 'postcode' => Tools::htmlentitiesUTF8($address_delivery->postcode), + 'city' => Tools::htmlentitiesUTF8($address_delivery->city), + 'phone' => Tools::htmlentitiesUTF8($address_delivery->phone), + 'phone_mobile' => Tools::htmlentitiesUTF8($address_delivery->phone_mobile), + 'id_country' => (int)$address_delivery->id_country, + 'id_state' => (int)$address_delivery->id_state, + 'id_gender' => (int)$customer->id_gender, + 'sl_year' => $birthday[0], + 'sl_month' => $birthday[1], + 'sl_day' => $birthday[2], + 'company_invoice' => Tools::htmlentitiesUTF8($address_invoice->company), + 'lastname_invoice' => Tools::htmlentitiesUTF8($address_invoice->lastname), + 'firstname_invoice' => Tools::htmlentitiesUTF8($address_invoice->firstname), + 'vat_number_invoice' => Tools::htmlentitiesUTF8($address_invoice->vat_number), + 'dni_invoice' => Tools::htmlentitiesUTF8($address_invoice->dni), + 'address1_invoice' => Tools::htmlentitiesUTF8($address_invoice->address1), + 'address2_invoice' => Tools::htmlentitiesUTF8($address_invoice->address2), + 'postcode_invoice' => Tools::htmlentitiesUTF8($address_invoice->postcode), + 'city_invoice' => Tools::htmlentitiesUTF8($address_invoice->city), + 'phone_invoice' => Tools::htmlentitiesUTF8($address_invoice->phone), + 'phone_mobile_invoice' => Tools::htmlentitiesUTF8($address_invoice->phone_mobile), + 'id_country_invoice' => (int)$address_invoice->id_country, + 'id_state_invoice' => (int)$address_invoice->id_state, + 'id_address_invoice' => $id_address_invoice, + 'invoice_company' => Tools::htmlentitiesUTF8($address_invoice->company), + 'invoice_lastname' => Tools::htmlentitiesUTF8($address_invoice->lastname), + 'invoice_firstname' => Tools::htmlentitiesUTF8($address_invoice->firstname), + 'invoice_vat_number' => Tools::htmlentitiesUTF8($address_invoice->vat_number), + 'invoice_dni' => Tools::htmlentitiesUTF8($address_invoice->dni), + 'invoice_address' => $this->context->cart->id_address_invoice !== $this->context->cart->id_address_delivery, + 'invoice_address1' => Tools::htmlentitiesUTF8($address_invoice->address1), + 'invoice_address2' => Tools::htmlentitiesUTF8($address_invoice->address2), + 'invoice_postcode' => Tools::htmlentitiesUTF8($address_invoice->postcode), + 'invoice_city' => Tools::htmlentitiesUTF8($address_invoice->city), + 'invoice_phone' => Tools::htmlentitiesUTF8($address_invoice->phone), + 'invoice_phone_mobile' => Tools::htmlentitiesUTF8($address_invoice->phone_mobile), + 'invoice_id_country' => (int)$address_invoice->id_country, + 'invoice_id_state' => (int)$address_invoice->id_state, + ); + } + + protected function _assignCarrier() + { + if (!$this->isLogged) { + $carriers = $this->context->cart->simulateCarriersOutput(); + $old_message = Message::getMessageByCartId((int)$this->context->cart->id); + $this->context->smarty->assign(array( + 'HOOK_EXTRACARRIER' => null, + 'HOOK_EXTRACARRIER_ADDR' => null, + 'oldMessage' => isset($old_message['message'])? $old_message['message'] : '', + 'HOOK_BEFORECARRIER' => Hook::exec('displayBeforeCarrier', array( + 'carriers' => $carriers, + 'checked' => $this->context->cart->simulateCarrierSelectedOutput(), + 'delivery_option_list' => $this->context->cart->getDeliveryOptionList(), + 'delivery_option' => $this->context->cart->getDeliveryOption(null, true) + )) + )); + } else { + parent::_assignCarrier(); + } + } + + protected function _assignPayment() + { + if ((bool)Configuration::get('PS_ADVANCED_PAYMENT_API')) { + $this->context->smarty->assign(array( + 'HOOK_TOP_PAYMENT' => ($this->isLogged ? Hook::exec('displayPaymentTop') : ''), + 'HOOK_PAYMENT' => $this->_getPaymentMethods(), + 'HOOK_ADVANCED_PAYMENT' => Hook::exec('advancedPaymentOptions', array(), null, true), + 'link_conditions' => $this->link_conditions + )); + } else { + $this->context->smarty->assign(array( + 'HOOK_TOP_PAYMENT' => ($this->isLogged ? Hook::exec('displayPaymentTop') : ''), + 'HOOK_PAYMENT' => $this->_getPaymentMethods() + )); + } + } + + protected function _getPaymentMethods() + { + if (!$this->isLogged) { + return '

'.Tools::displayError('Please sign in to see payment methods.').'

'; + } + if ($this->context->cart->OrderExists()) { + return '

'.Tools::displayError('Error: This order has already been validated.').'

'; + } + if (!$this->context->cart->id_customer || !Customer::customerIdExistsStatic($this->context->cart->id_customer) || Customer::isBanned($this->context->cart->id_customer)) { + return '

'.Tools::displayError('Error: No customer.').'

'; + } + $address_delivery = new Address($this->context->cart->id_address_delivery); + $address_invoice = ($this->context->cart->id_address_delivery == $this->context->cart->id_address_invoice ? $address_delivery : new Address($this->context->cart->id_address_invoice)); + if (!$this->context->cart->id_address_delivery || !$this->context->cart->id_address_invoice || !Validate::isLoadedObject($address_delivery) || !Validate::isLoadedObject($address_invoice) || $address_invoice->deleted || $address_delivery->deleted) { + return '

'.Tools::displayError('Error: Please select an address.').'

'; + } + if (count($this->context->cart->getDeliveryOptionList()) == 0 && !$this->context->cart->isVirtualCart()) { + if ($this->context->cart->isMultiAddressDelivery()) { + return '

'.Tools::displayError('Error: None of your chosen carriers deliver to some of the addresses you have selected.').'

'; + } else { + return '

'.Tools::displayError('Error: None of your chosen carriers deliver to the address you have selected.').'

'; + } + } + if (!$this->context->cart->getDeliveryOption(null, false) && !$this->context->cart->isVirtualCart()) { + return '

'.Tools::displayError('Error: Please choose a carrier.').'

'; + } + if (!$this->context->cart->id_currency) { + return '

'.Tools::displayError('Error: No currency has been selected.').'

'; + } + if (!$this->context->cookie->checkedTOS && Configuration::get('PS_CONDITIONS')) { + return '

'.Tools::displayError('Please accept the Terms of Service.').'

'; + } + + /* If some products have disappear */ + if (is_array($product = $this->context->cart->checkQuantities(true))) { + return '

'.sprintf(Tools::displayError('An item (%s) in your cart is no longer available in this quantity. You cannot proceed with your order until the quantity is adjusted.'), $product['name']).'

'; + } + + if ((int)$id_product = $this->context->cart->checkProductsAccess()) { + return '

'.sprintf(Tools::displayError('An item in your cart is no longer available (%s). You cannot proceed with your order.'), Product::getProductName((int)$id_product)).'

'; + } + + /* Check minimal amount */ + $currency = Currency::getCurrency((int)$this->context->cart->id_currency); + + $minimal_purchase = Tools::convertPrice((float)Configuration::get('PS_PURCHASE_MINIMUM'), $currency); + if ($this->context->cart->getOrderTotal(false, Cart::ONLY_PRODUCTS) < $minimal_purchase) { + return '

'.sprintf( + Tools::displayError('A minimum purchase total of %1s (tax excl.) is required to validate your order, current purchase total is %2s (tax excl.).'), + Tools::displayPrice($minimal_purchase, $currency), Tools::displayPrice($this->context->cart->getOrderTotal(false, Cart::ONLY_PRODUCTS), $currency) + ).'

'; + } + + + // For Advanced Payment (when advance paid amount will be zero when voucher will be applied) $freeAdvancePaymentOrder = false; - if (Module::isInstalled('hotelreservationsystem')) - { - require_once (_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); + if (Module::isInstalled('hotelreservationsystem')) { + require_once(_PS_MODULE_DIR_.'hotelreservationsystem/define.php'); $obj_adv_pmt = new HotelAdvancedPayment(); $freeAdvancePaymentOrder = $obj_adv_pmt->_checkFreeAdvancePaymentOrder(); } - /* Bypass payment step if total is 0 */ - if ($this->context->cart->getOrderTotal() <= 0 || $freeAdvancePaymentOrder) - return '

'; + /* Bypass payment step if total is 0 */ + if ($this->context->cart->getOrderTotal() <= 0 || $freeAdvancePaymentOrder) { + return '

'; + } - $return = Hook::exec('displayPayment'); - if (!$return) - return '

'.Tools::displayError('No payment method is available for use at this time. ').'

'; - return $return; - } + $return = Hook::exec('displayPayment'); + if (!$return) { + return '

'.Tools::displayError('No payment method is available for use at this time. ').'

'; + } + return $return; + } - protected function _getCarrierList() - { - $address_delivery = new Address($this->context->cart->id_address_delivery); + protected function _getCarrierList() + { + $address_delivery = new Address($this->context->cart->id_address_delivery); - $cms = new CMS(Configuration::get('PS_CONDITIONS_CMS_ID'), $this->context->language->id); - $link_conditions = $this->context->link->getCMSLink($cms, $cms->link_rewrite, Configuration::get('PS_SSL_ENABLED')); - if (!strpos($link_conditions, '?')) - $link_conditions .= '?content_only=1'; - else - $link_conditions .= '&content_only=1'; + $cms = new CMS(Configuration::get('PS_CONDITIONS_CMS_ID'), $this->context->language->id); + $link_conditions = $this->context->link->getCMSLink($cms, $cms->link_rewrite, Configuration::get('PS_SSL_ENABLED')); + if (!strpos($link_conditions, '?')) { + $link_conditions .= '?content_only=1'; + } else { + $link_conditions .= '&content_only=1'; + } - $carriers = $this->context->cart->simulateCarriersOutput(); - $delivery_option = $this->context->cart->getDeliveryOption(null, false, false); + $carriers = $this->context->cart->simulateCarriersOutput(); + $delivery_option = $this->context->cart->getDeliveryOption(null, false, false); - $wrapping_fees = $this->context->cart->getGiftWrappingPrice(false); - $wrapping_fees_tax_inc = $this->context->cart->getGiftWrappingPrice(); - $old_message = Message::getMessageByCartId((int)$this->context->cart->id); + $wrapping_fees = $this->context->cart->getGiftWrappingPrice(false); + $wrapping_fees_tax_inc = $this->context->cart->getGiftWrappingPrice(); + $old_message = Message::getMessageByCartId((int)$this->context->cart->id); - $free_shipping = false; - foreach ($this->context->cart->getCartRules() as $rule) - { - if ($rule['free_shipping'] && !$rule['carrier_restriction']) - { - $free_shipping = true; - break; - } - } + $free_shipping = false; + foreach ($this->context->cart->getCartRules() as $rule) { + if ($rule['free_shipping'] && !$rule['carrier_restriction']) { + $free_shipping = true; + break; + } + } - $this->context->smarty->assign('isVirtualCart', $this->context->cart->isVirtualCart()); + $this->context->smarty->assign('isVirtualCart', $this->context->cart->isVirtualCart()); - $vars = array( - 'advanced_payment_api' => (bool)Configuration::get('PS_ADVANCED_PAYMENT_API'), - 'free_shipping' => $free_shipping, - 'checkedTOS' => (int)$this->context->cookie->checkedTOS, - 'recyclablePackAllowed' => (int)Configuration::get('PS_RECYCLABLE_PACK'), - 'giftAllowed' => (int)Configuration::get('PS_GIFT_WRAPPING'), - 'cms_id' => (int)Configuration::get('PS_CONDITIONS_CMS_ID'), - 'conditions' => (int)Configuration::get('PS_CONDITIONS'), - 'link_conditions' => $link_conditions, - 'recyclable' => (int)$this->context->cart->recyclable, - 'gift_wrapping_price' => (float)$wrapping_fees, - 'total_wrapping_cost' => Tools::convertPrice($wrapping_fees_tax_inc, $this->context->currency), - 'total_wrapping_tax_exc_cost' => Tools::convertPrice($wrapping_fees, $this->context->currency), - 'delivery_option_list' => $this->context->cart->getDeliveryOptionList(), - 'carriers' => $carriers, - 'checked' => $this->context->cart->simulateCarrierSelectedOutput(), - 'delivery_option' => $delivery_option, - 'address_collection' => $this->context->cart->getAddressCollection(), - 'opc' => true, - 'oldMessage' => isset($old_message['message'])? $old_message['message'] : '', - 'HOOK_BEFORECARRIER' => Hook::exec('displayBeforeCarrier', array( - 'carriers' => $carriers, - 'delivery_option_list' => $this->context->cart->getDeliveryOptionList(), - 'delivery_option' => $delivery_option - )) - ); + $vars = array( + 'advanced_payment_api' => (bool)Configuration::get('PS_ADVANCED_PAYMENT_API'), + 'free_shipping' => $free_shipping, + 'checkedTOS' => (int)$this->context->cookie->checkedTOS, + 'recyclablePackAllowed' => (int)Configuration::get('PS_RECYCLABLE_PACK'), + 'giftAllowed' => (int)Configuration::get('PS_GIFT_WRAPPING'), + 'cms_id' => (int)Configuration::get('PS_CONDITIONS_CMS_ID'), + 'conditions' => (int)Configuration::get('PS_CONDITIONS'), + 'link_conditions' => $link_conditions, + 'recyclable' => (int)$this->context->cart->recyclable, + 'gift_wrapping_price' => (float)$wrapping_fees, + 'total_wrapping_cost' => Tools::convertPrice($wrapping_fees_tax_inc, $this->context->currency), + 'total_wrapping_tax_exc_cost' => Tools::convertPrice($wrapping_fees, $this->context->currency), + 'delivery_option_list' => $this->context->cart->getDeliveryOptionList(), + 'carriers' => $carriers, + 'checked' => $this->context->cart->simulateCarrierSelectedOutput(), + 'delivery_option' => $delivery_option, + 'address_collection' => $this->context->cart->getAddressCollection(), + 'opc' => true, + 'oldMessage' => isset($old_message['message'])? $old_message['message'] : '', + 'HOOK_BEFORECARRIER' => Hook::exec('displayBeforeCarrier', array( + 'carriers' => $carriers, + 'delivery_option_list' => $this->context->cart->getDeliveryOptionList(), + 'delivery_option' => $delivery_option + )) + ); - Cart::addExtraCarriers($vars); + Cart::addExtraCarriers($vars); - $this->context->smarty->assign($vars); + $this->context->smarty->assign($vars); - if (!Address::isCountryActiveById((int)$this->context->cart->id_address_delivery) && $this->context->cart->id_address_delivery != 0) - $this->errors[] = Tools::displayError('This address is not in a valid area.'); - elseif ((!Validate::isLoadedObject($address_delivery) || $address_delivery->deleted) && $this->context->cart->id_address_delivery != 0) - $this->errors[] = Tools::displayError('This address is invalid.'); - else - { - $result = array( - 'HOOK_BEFORECARRIER' => Hook::exec('displayBeforeCarrier', array( - 'carriers' => $carriers, - 'delivery_option_list' => $this->context->cart->getDeliveryOptionList(), - 'delivery_option' => $this->context->cart->getDeliveryOption(null, true) - )), - 'carrier_block' => $this->context->smarty->fetch(_PS_THEME_DIR_.'order-carrier.tpl') - ); + if (!Address::isCountryActiveById((int)$this->context->cart->id_address_delivery) && $this->context->cart->id_address_delivery != 0) { + $this->errors[] = Tools::displayError('This address is not in a valid area.'); + } elseif ((!Validate::isLoadedObject($address_delivery) || $address_delivery->deleted) && $this->context->cart->id_address_delivery != 0) { + $this->errors[] = Tools::displayError('This address is invalid.'); + } else { + $result = array( + 'HOOK_BEFORECARRIER' => Hook::exec('displayBeforeCarrier', array( + 'carriers' => $carriers, + 'delivery_option_list' => $this->context->cart->getDeliveryOptionList(), + 'delivery_option' => $this->context->cart->getDeliveryOption(null, true) + )), + 'carrier_block' => $this->context->smarty->fetch(_PS_THEME_DIR_.'order-carrier.tpl') + ); - Cart::addExtraCarriers($result); - return $result; - } - if (count($this->errors)) - return array( - 'hasError' => true, - 'errors' => $this->errors, - 'carrier_block' => $this->context->smarty->fetch(_PS_THEME_DIR_.'order-carrier.tpl') - ); - } + Cart::addExtraCarriers($result); + return $result; + } + if (count($this->errors)) { + return array( + 'hasError' => true, + 'errors' => $this->errors, + 'carrier_block' => $this->context->smarty->fetch(_PS_THEME_DIR_.'order-carrier.tpl') + ); + } + } - protected function _processAddressFormat() - { - $address_delivery = new Address((int)$this->context->cart->id_address_delivery); - $address_invoice = new Address((int)$this->context->cart->id_address_invoice); + protected function _processAddressFormat() + { + $address_delivery = new Address((int)$this->context->cart->id_address_delivery); + $address_invoice = new Address((int)$this->context->cart->id_address_invoice); - $inv_adr_fields = AddressFormat::getOrderedAddressFields((int)$address_delivery->id_country, false, true); - $dlv_adr_fields = AddressFormat::getOrderedAddressFields((int)$address_invoice->id_country, false, true); - $require_form_fields_list = AddressFormat::getFieldsRequired(); + $inv_adr_fields = AddressFormat::getOrderedAddressFields((int)$address_delivery->id_country, false, true); + $dlv_adr_fields = AddressFormat::getOrderedAddressFields((int)$address_invoice->id_country, false, true); + $require_form_fields_list = AddressFormat::getFieldsRequired(); - // Add missing require fields for a new user susbscription form - foreach ($require_form_fields_list as $field_name) - if (!in_array($field_name, $dlv_adr_fields)) - $dlv_adr_fields[] = trim($field_name); + // Add missing require fields for a new user susbscription form + foreach ($require_form_fields_list as $field_name) { + if (!in_array($field_name, $dlv_adr_fields)) { + $dlv_adr_fields[] = trim($field_name); + } + } - foreach ($require_form_fields_list as $field_name) - if (!in_array($field_name, $inv_adr_fields)) - $inv_adr_fields[] = trim($field_name); + foreach ($require_form_fields_list as $field_name) { + if (!in_array($field_name, $inv_adr_fields)) { + $inv_adr_fields[] = trim($field_name); + } + } - $inv_all_fields = array(); - $dlv_all_fields = array(); + $inv_all_fields = array(); + $dlv_all_fields = array(); - foreach (array('inv', 'dlv') as $adr_type) - { - foreach (${$adr_type.'_adr_fields'} as $fields_line) - foreach (explode(' ', $fields_line) as $field_item) - ${$adr_type.'_all_fields'}[] = trim($field_item); + foreach (array('inv', 'dlv') as $adr_type) { + foreach (${$adr_type.'_adr_fields'} as $fields_line) { + foreach (explode(' ', $fields_line) as $field_item) { + ${$adr_type.'_all_fields'}[] = trim($field_item); + } + } - ${$adr_type.'_adr_fields'} = array_unique(${$adr_type.'_adr_fields'}); - ${$adr_type.'_all_fields'} = array_unique(${$adr_type.'_all_fields'}); + ${$adr_type.'_adr_fields'} = array_unique(${$adr_type.'_adr_fields'}); + ${$adr_type.'_all_fields'} = array_unique(${$adr_type.'_all_fields'}); - $this->context->smarty->assign(array( - $adr_type.'_adr_fields' => ${$adr_type.'_adr_fields'}, - $adr_type.'_all_fields' => ${$adr_type.'_all_fields'}, - 'required_fields' => $require_form_fields_list - )); - } - } + $this->context->smarty->assign(array( + $adr_type.'_adr_fields' => ${$adr_type.'_adr_fields'}, + $adr_type.'_all_fields' => ${$adr_type.'_all_fields'}, + 'required_fields' => $require_form_fields_list + )); + } + } - protected function getFormatedSummaryDetail() - { - $result = array('summary' => $this->context->cart->getSummaryDetails(), - 'customizedDatas' => Product::getAllCustomizedDatas($this->context->cart->id, null, true)); + protected function getFormatedSummaryDetail() + { + $result = array('summary' => $this->context->cart->getSummaryDetails(), + 'customizedDatas' => Product::getAllCustomizedDatas($this->context->cart->id, null, true)); - foreach ($result['summary']['products'] as $key => &$product) - { - $product['quantity_without_customization'] = $product['quantity']; - if ($result['customizedDatas']) - { - if (isset($result['customizedDatas'][(int)$product['id_product']][(int)$product['id_product_attribute']])) - foreach ($result['customizedDatas'][(int)$product['id_product']][(int)$product['id_product_attribute']] as $addresses) - foreach ($addresses as $customization) - $product['quantity_without_customization'] -= (int)$customization['quantity']; - } - } - - if ($result['customizedDatas']) - Product::addCustomizationPrice($result['summary']['products'], $result['customizedDatas']); - return $result; - } + foreach ($result['summary']['products'] as $key => &$product) { + $product['quantity_without_customization'] = $product['quantity']; + if ($result['customizedDatas']) { + if (isset($result['customizedDatas'][(int)$product['id_product']][(int)$product['id_product_attribute']])) { + foreach ($result['customizedDatas'][(int)$product['id_product']][(int)$product['id_product_attribute']] as $addresses) { + foreach ($addresses as $customization) { + $product['quantity_without_customization'] -= (int)$customization['quantity']; + } + } + } + } + } + if ($result['customizedDatas']) { + Product::addCustomizationPrice($result['summary']['products'], $result['customizedDatas']); + } + return $result; + } } diff --git a/controllers/front/ProductController.php b/controllers/front/ProductController.php index e16b84b33..d91d00ce6 100644 --- a/controllers/front/ProductController.php +++ b/controllers/front/ProductController.php @@ -276,21 +276,35 @@ class ProductControllerCore extends FrontController if ($hotel_room_data) { if ($total_available_rooms >= $quantity) { - $priceDisplay = Group::getPriceDisplayMethod(Group::getCurrent()->id); - if (!$priceDisplay || $priceDisplay == 2) { - $price_tax = true; - } elseif ($priceDisplay == 1) { - $price_tax = false; - } + $useTax = HotelBookingDetail::useTax(); + $product = new Product($id_product); + $productPriceWithoutReduction = $product->getPriceWithoutReduct(!$useTax); $obj_booking_detail = new HotelBookingDetail(); $num_days = $obj_booking_detail->getNumberOfDays($date_from, $date_to); - $price_tax_incl = Product::getPriceStatic($id_product, $price_tax); - $total_price = $price_tax_incl * $num_days * $quantity; + $roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($id_product, $date_from, $date_to); + + if ($useTax) { + $priceProduct = Product::getPriceStatic($id_product, true); + $feature_price = HotelRoomTypeFeaturePricing::getRoomTypeFeaturePricesPerDay($id_product, $date_from, $date_to, true); + $roomTypeDateRangePrice = $roomTypeDateRangePrice['total_price_tax_incl']; + } else { + $priceProduct = Product::getPriceStatic($id_product, false); + $feature_price = HotelRoomTypeFeaturePricing::getRoomTypeFeaturePricesPerDay($id_product, $date_from, $date_to, false); + $roomTypeDateRangePrice = $roomTypeDateRangePrice['total_price_tax_excl']; + } + $feature_price_diff = (float)($productPriceWithoutReduction - $feature_price); + + //$price_tax_incl = Product::getPriceStatic($id_product, $price_tax); + $total_price = $roomTypeDateRangePrice * $quantity; $result['msg'] = 'success'; $result['total_price'] = $total_price; $result['num_days'] = $num_days; $result['avail_rooms'] = $total_available_rooms; + $result['original_product_price'] = $priceProduct; + $result['feature_price'] = $feature_price; + $result['feature_price_diff'] = $feature_price_diff; + return Tools::jsonEncode($result); } else { $result['msg'] = 'unavailable_quantity'; @@ -326,7 +340,6 @@ class ProductControllerCore extends FrontController public function initContent() { parent::initContent(); - if (!$this->errors) { if (Pack::isPack((int) $this->product->id) && !Pack::isInStock((int) $this->product->id)) { $this->product->quantity = 0; @@ -423,6 +436,7 @@ class ProductControllerCore extends FrontController $obj_hotel_room_type = new HotelRoomType(); $room_info_by_product_id = $obj_hotel_room_type->getRoomTypeInfoByIdProduct($this->product->id); $hotel_id = $room_info_by_product_id['id_hotel']; + $useTax = HotelBookingDetail::useTax(); if (isset($hotel_id) && $hotel_id) { $obj_hotel_branch = new HotelBranchInformation(); $hotel_info_by_id = $obj_hotel_branch->hotelBranchInfoById($hotel_id); @@ -454,15 +468,23 @@ class ProductControllerCore extends FrontController $date_to = date('Y-m-d', strtotime($date_from) + 86400); } + $obj_htl_cart_booking_data = new HotelCartBookingData(); $obj_booking_detail = new HotelBookingDetail(); $num_days = $obj_booking_detail->getNumberOfDays($date_from, $date_to); - $price_tax_incl = Product::getPriceStatic($this->product->id, HotelBookingDetail::useTax()); - $total_price = $price_tax_incl * $num_days; - + //$price_tax_incl = Product::getPriceStatic($this->product->id, HotelBookingDetail::useTax()); + //$total_price = $price_tax_incl * $num_days; + // + //// By webkul New way to calculate product prices with feature Prices + $roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($this->product->id, $date_from, $date_to); + if ($useTax) { + $total_price = $roomTypeDateRangePrice['total_price_tax_incl']; + } else { + $total_price = $roomTypeDateRangePrice['total_price_tax_excl']; + } + //END $obj_booking_dtl = new HotelBookingDetail(); $hotel_room_data = $obj_booking_dtl->DataForFrontSearch($date_from, $date_to, $hotel_id, $this->product->id, 1); - $obj_htl_cart_booking_data = new HotelCartBookingData(); if ($hotel_room_data) { $total_available_rooms = $hotel_room_data['stats']['num_avail']; @@ -511,7 +533,6 @@ class ProductControllerCore extends FrontController ); } $this->context->smarty->assign(array( - 'booking_date_to' => $date_to, 'max_order_date' => $max_order_date, 'warning_num' => $warning_num, 'ratting_img_path' => _MODULE_DIR_.'hotelreservationsystem/views/img/Slices/icons-sprite.png', @@ -521,8 +542,8 @@ class ProductControllerCore extends FrontController 'total_price' => $total_price, 'product_controller_url' => $this->context->link->getPageLink('product'), 'num_days' => $num_days, - 'date_from' => date('d-m-Y', strtotime($date_from)), - 'date_to' => date('d-m-Y', strtotime($date_to)), + 'date_from' => $date_from, + 'date_to' => $date_to, 'hotel_location' => $hotel_location, 'hotel_name' => $hotel_name, 'hotel_policies' => $hotel_policies, @@ -530,10 +551,24 @@ class ProductControllerCore extends FrontController 'ftr_img_src' => _PS_IMG_.'rf/', 'search_data' => $search_data, )); + // product price after imposing feature prices... + if ($useTax) { + $priceProduct = Product::getPriceStatic($this->product->id, true); + $feature_price = HotelRoomTypeFeaturePricing::getRoomTypeFeaturePricesPerDay($this->product->id, $date_from, $date_to, true); + } else { + $priceProduct = Product::getPriceStatic($this->product->id, false); + $feature_price = HotelRoomTypeFeaturePricing::getRoomTypeFeaturePricesPerDay($this->product->id, $date_from, $date_to, false); + } + $productPriceWithoutReduction = $this->product->getPriceWithoutReduct(!$useTax); + $feature_price_diff = (float)($productPriceWithoutReduction - $feature_price); + $this->context->smarty->assign('feature_price', $feature_price); + $this->context->smarty->assign('feature_price_diff', $feature_price_diff); + + //END } + $this->context->smarty->assign('product_id_hotel', $hotel_id); $this->context->smarty->assign(array( - 'stock_management' => Configuration::get('PS_STOCK_MANAGEMENT'), 'customizationFields' => $customization_fields, 'id_customization' => empty($customization_datas) ? null : $customization_datas[0]['id_customization'], diff --git a/img/favicon.ico b/img/favicon.ico index 9be6932f9e4be5f5d1a438a1559962e90f9f748c..dc53898c6557dfd14f3c2f1b426b2a7f584acd46 100644 GIT binary patch literal 32038 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 m*yh$uJj`P_V~;I~@mdf|yvC>@YAlEi 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 diff --git a/img/logo.jpg b/img/logo.jpg index be36692725e9e243aa2ecec2f39efcd5e50ac222..bfc09223fdf069fc0e2319df60dbd954c4a68d96 100644 GIT binary patch literal 3098 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 literal 11566 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 diff --git a/img/logo_invoice.jpg b/img/logo_invoice.jpg index be36692725e9e243aa2ecec2f39efcd5e50ac222..fb3d599b54b2a7bdca86fc994156c7326e3feb9f 100644 GIT binary patch literal 2979 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 Z{s%~~X1hw4&wBs>002ovPDHLkV1nt2vS|PS literal 11566 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 Z{s%~~X1hw4&wBs>002ovPDHLkV1nt2vS|PS literal 0 HcmV?d00001 diff --git a/img/logo_stores.gif b/img/logo_stores.gif new file mode 100644 index 0000000000000000000000000000000000000000..45c75a3399b373c1118f851af1a58ae966625998 GIT binary patch literal 613 zcmV-r0-F6tNk%v~VIBY;0M!5h1Ofzvf`r7v#6&_wBqAiFqNL>Fg;T4Y#bUKoSK~6+T1)kJiNNR z{QCTSdVEYuOk7@E1O^0zhJ?h%#3Uvpq^6|g=Hz5%WE2(@l$Mm#*3>jMG_EUd1q?C$JrZfqPL9Gsq<+}_+gK0Lg>y!`(Be13dPPD}s* z00000EC2ui03HAy000L5z@2b7EEQ^=+~C0zaEQ?8P|yQduh$c=Lfl{k(uxa9#=cO( z2!OzaDlTOZ!3H908ZE#D7nQuQG8hI!93l>X0}Uns5Ghe52v;u!QbIHdEQDAhkUUmYLcsyS zN~|a~t|;800nvwE{xM01Y+}&Mh}noMJ2> zIz%PL7z%}3ib1$=w1ev0tWp$&c(B062n{AEkR|e~W!cxBKU97#s(|brK>z?dS7Y$i literal 0 HcmV?d00001 diff --git a/img/logo_stores.png b/img/logo_stores.png deleted file mode 100644 index 1f247bb513e03633df92ed1551a833841064926d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2962 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 JVoUFszX4=!9rXYJ diff --git a/img/prestashop@2x.png b/img/prestashop@2x.png index e6a3b461ed9aa78fffe76cc3c5a33499fc92b2cc..900212e65d1316a08628976ec16e9f01cd3c8ff8 100644 GIT binary patch literal 1150 zcmV-^1cCdBP)}Ns%C>cN%K@A2<>}fFRKa`{HvF$9Wmg z%=+#E=WxY!OcB}MnP+!r-n;hW^*rexEL(m zW+xn=GXnk$`^)I1&Pq!@J*K=Qz{RmW20tC#8JMV7J5CS|R5Rh3||ng6yXbRiA)tpOq>j z@JnWjx#nd~T>2NpOvs_jMexp#R2=UIvle3v8G_Z=`t5lZ~PZly>)^@s2# z$C-Rty45%bPLa35Z^(930{&pmY2HXdeAI0{(#hKb=ghTj9k{Zq4OZ(sN9pR0(ytt` zr)u42_{t&h37d`wKvghR4sU5xRZrSlEoV*^9;`tL3-|fM;0{@v5y0 zMGBqZ8o@AzPqW((V-j^ zvS8s;@ti*k;qB2mm(v^cu0~QM zpAn74bl$c)kBFn6d=ok7g%w(49qC*Rg6oNlX@zP(b0QC$+F-(a(L3~p!eten^p>u! zkc=fd$M9{Pd7UFrv8!d1Mwfj1KLS?eJX^fNMp$SJ4_wZj?TRl&5OXyB1*@avcT0`} zFHk>c>@sIsx87wqX5D<<_H*{VFRLryP1WSj^Ij8QTulI~SF;(O6ahVg2TtrJdZE7I z^{5T;6x42+D0~WHZ}}zHixfkN;JasZW{LPBzN-;3SO5S3 literal 6315 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 diff --git a/img/preston-login-wink@2x.png b/img/preston-login-wink@2x.png index 66fe03e8e8ead074d1501fe95a14cb4591211ecb..d6507dabc31e1115925aa17de153ce093e7b670a 100644 GIT binary patch literal 1939 zcmV;E2WP)U3N!osw)w5O-1b#--WYHC+kSNi(;QBhIy^77u^-inHfgM))*Wo0cbEv&4p zdU|?zczAbrcci4GQ&Usq^E?Fr000?uQchC<1qcll0}>AkV;TG7-f6Uy=jOAoo|W|T zb0zGQ000IONklr!a92@?pTkoGgL&x~^;{DcB|HiaYjP0@E+j@bH^J2@lVQ3TT@fz2{ zYihE74{pLlHvL<;Hn#kmRD?Fj)3>-b-aMsELPh*9agDt6&qX$U?@*wJ_AfP99nJE7 zNJj&&e49*!gz9tT46Cqus$CR3C*e93AtCaZ=dtuRaE5PbF7oU#36hxz-{^=3GeM4p zNC=!G^cxX949*eO7wLeLbmSr$IEf|~0cY_ z8BfHFCt}7ES%T45PJ68)+p$b06TvB8)+>@CFUeJlRF8Yxtz@#*4dlY>6S=JHp&;EF zDQgj_9!=21X<(+33x&SMorw{x56wcSMqbKp@s4FZy2=2_YpFhXts| zSspqId1M7$GiLR#ut+>hK1ei3-<4M{qOxq7tw}sE2l)fsHi(22MM>7l%c)tU9Ibb= z+ehd9_&r1}SmMgdJbF+YkhhX4SQj&E^E!!h5=W(_MOw7BZxJ8VV^D)S5{^tFSN(oJ zVHAnR@D8EQaw27R!qBo(G{q@xDJ@8kvH9CPlFy=<;CLyKb6UBe9<6jh;~qnL1#XjK zj}H(_MK1Tyf}3ST=#fNda7|Nba@MzMcXpv6G{jjYM1GV?CEhjpGqmK(5+bKaVCTel zBuvg#QmnDua>!04n(#96U{w#%nsnQ?NSKx@?DtsQw#raTv0m;NGG0P1a*i?zO}ipR z<2h43rM1Y-4>WFu3a#zRM8Xl{t}_P{6a?&woX~O~7{_QN1T$`FwIdU$^Sa)vPJ=#r zAQFmVLqz2FqPXk`VtJk-XuT{Ei3jn{O(jeHDiJVzJB+T(1wkdK&6Hf;?10x5<^Di&qQ{0+P`rS3=!)fh|?x2)b80eIh!KTHD*BO zR*3C_fu9lD@G_C?JXkf$2fYnDA|lD_MG%~fKya}OClQQ{$yurQU|F>n9$jCTQ(dTH7%HwENwaoZx|rz5v2+@Z;`H#3ooC@~a7&Wtr2!7?Js z4l-QBcm=Q0{I<&?f<&ph!eHa%}_@QH<61#O5$-^UUqy$8K4Yd zA{U7tq7{07`4J`CL~#yv+BYx@f- zS$d@tCK3@!v2`~*D)B!U@GaGoI47N{RDmK)6p0AqB$eP1b*=pA5P10K=sXap9JiaS zZZzqt^cooDn1`6uVzd$nT#xfB8H;Bo)WZdjNr*{Eb;a|Va8GsHgCkGG6QOt_W;_uy zo`@Mw#Ed6m#uG8)iJ0+3%>0icO>h!TE>Z?3>HGupYg{wq$Tf4YTr(@pJ@fQ1JpyMK zr7cB1Bd6=gTu$CEd literal 12041 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 CQ)i_B diff --git a/img/preston-login@2x.png b/img/preston-login@2x.png index 452fc3c3e9ca0c4e0072cbcee2ab461a6c3b790e..d6507dabc31e1115925aa17de153ce093e7b670a 100644 GIT binary patch literal 1939 zcmV;E2WP)U3N!osw)w5O-1b#--WYHC+kSNi(;QBhIy^77u^-inHfgM))*Wo0cbEv&4p zdU|?zczAbrcci4GQ&Usq^E?Fr000?uQchC<1qcll0}>AkV;TG7-f6Uy=jOAoo|W|T zb0zGQ000IONklr!a92@?pTkoGgL&x~^;{DcB|HiaYjP0@E+j@bH^J2@lVQ3TT@fz2{ zYihE74{pLlHvL<;Hn#kmRD?Fj)3>-b-aMsELPh*9agDt6&qX$U?@*wJ_AfP99nJE7 zNJj&&e49*!gz9tT46Cqus$CR3C*e93AtCaZ=dtuRaE5PbF7oU#36hxz-{^=3GeM4p zNC=!G^cxX949*eO7wLeLbmSr$IEf|~0cY_ z8BfHFCt}7ES%T45PJ68)+p$b06TvB8)+>@CFUeJlRF8Yxtz@#*4dlY>6S=JHp&;EF zDQgj_9!=21X<(+33x&SMorw{x56wcSMqbKp@s4FZy2=2_YpFhXts| zSspqId1M7$GiLR#ut+>hK1ei3-<4M{qOxq7tw}sE2l)fsHi(22MM>7l%c)tU9Ibb= z+ehd9_&r1}SmMgdJbF+YkhhX4SQj&E^E!!h5=W(_MOw7BZxJ8VV^D)S5{^tFSN(oJ zVHAnR@D8EQaw27R!qBo(G{q@xDJ@8kvH9CPlFy=<;CLyKb6UBe9<6jh;~qnL1#XjK zj}H(_MK1Tyf}3ST=#fNda7|Nba@MzMcXpv6G{jjYM1GV?CEhjpGqmK(5+bKaVCTel zBuvg#QmnDua>!04n(#96U{w#%nsnQ?NSKx@?DtsQw#raTv0m;NGG0P1a*i?zO}ipR z<2h43rM1Y-4>WFu3a#zRM8Xl{t}_P{6a?&woX~O~7{_QN1T$`FwIdU$^Sa)vPJ=#r zAQFmVLqz2FqPXk`VtJk-XuT{Ei3jn{O(jeHDiJVzJB+T(1wkdK&6Hf;?10x5<^Di&qQ{0+P`rS3=!)fh|?x2)b80eIh!KTHD*BO zR*3C_fu9lD@G_C?JXkf$2fYnDA|lD_MG%~fKya}OClQQ{$yurQU|F>n9$jCTQ(dTH7%HwENwaoZx|rz5v2+@Z;`H#3ooC@~a7&Wtr2!7?Js z4l-QBcm=Q0{I<&?f<&ph!eHa%}_@QH<61#O5$-^UUqy$8K4Yd zA{U7tq7{07`4J`CL~#yv+BYx@f- zS$d@tCK3@!v2`~*D)B!U@GaGoI47N{RDmK)6p0AqB$eP1b*=pA5P10K=sXap9JiaS zZZzqt^cooDn1`6uVzd$nT#xfB8H;Bo)WZdjNr*{Eb;a|Va8GsHgCkGG6QOt_W;_uy zo`@Mw#Ed6m#uG8)iJ0+3%>0icO>h!TE>Z?3>HGupYg{wq$Tf4YTr(@pJ@fQ1JpyMK zr7cB1Bd6=gTu$CEd literal 12316 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'/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 16:33:52 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 16:34:49 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 16:38:57 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 16:39:00 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 16:39:49 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 16:42:55 Asia/Kolkata] PHP Warning: array_key_exists() expects parameter 2 to be array, null given in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/Language.php on line 645 -[02-Nov-2015 16:47:33 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 16:48:15 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 16:48:21 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 16:55:26 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 16:56:06 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 16:56:09 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 16:56:14 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 17:24:01 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 17:24:15 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 17:25:10 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 17:45:47 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 17:47:06 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 17:47:12 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 19:27:54 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 19:28:01 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 19:28:07 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 20:02:41 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 20:03:09 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 20:03:40 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 20:49:38 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 20:49:41 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 20:49:44 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 20:50:08 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[02-Nov-2015 20:50:24 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[03-Nov-2015 18:57:23 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[03-Nov-2015 18:57:27 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[03-Nov-2015 18:58:08 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[03-Nov-2015 08:29:58 US/Eastern] PHP Warning: Invalid argument supplied for foreach() in /home/sumit/public_html/html/ps-hotel-reservation-system/modules/hotelreservationsystem/hotelreservationsystem.php on line 299 -[03-Nov-2015 08:29:58 US/Eastern] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelBranchInformation->state_id is not valid' in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/modules/hotelreservationsystem/hotelreservationsystem.php(322): ObjectModelCore->save() -#4 /home/sumit/public_html/html/ps-hotel-reservation-system/modules/hotelreservationsystem/hotelreservationsystem.php(499): HotelReservationSystem->createDummyDataForProject() -#5 /home/sumit/public_html/html/ps-hotel-reservation-system/install/models/install.php(687): HotelReservationSystem->inst in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[03-Nov-2015 19:07:43 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[03-Nov-2015 19:07:47 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[03-Nov-2015 19:07:49 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[03-Nov-2015 08:39:40 US/Eastern] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelBranchInformation->state_id is not valid' in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/modules/hotelreservationsystem/hotelreservationsystem.php(322): ObjectModelCore->save() -#4 /home/sumit/public_html/html/ps-hotel-reservation-system/modules/hotelreservationsystem/hotelreservationsystem.php(499): HotelReservationSystem->createDummyDataForProject() -#5 /home/sumit/public_html/html/ps-hotel-reservation-system/install/models/install.php(687): HotelReservationSystem->inst in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[03-Nov-2015 19:11:01 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[03-Nov-2015 08:42:53 US/Eastern] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelBranchInformation->state_id is not valid' in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/modules/hotelreservationsystem/hotelreservationsystem.php(322): ObjectModelCore->save() -#4 /home/sumit/public_html/html/ps-hotel-reservation-system/modules/hotelreservationsystem/hotelreservationsystem.php(500): HotelReservationSystem->createDummyDataForProject() -#5 /home/sumit/public_html/html/ps-hotel-reservation-system/install/models/install.php(687): HotelReservationSystem->inst in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[03-Nov-2015 19:13:41 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[03-Nov-2015 19:15:07 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[03-Nov-2015 08:46:39 US/Eastern] PHP Parse error: syntax error, unexpected ';' in /home/sumit/public_html/html/ps-hotel-reservation-system/modules/hotelreservationsystem/hotelreservationsystem.php on line 319 -[03-Nov-2015 19:17:10 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[03-Nov-2015 19:18:22 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 13:51:51 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 13:53:18 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 13:53:22 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 03:25:30 US/Eastern] PHP Warning: Function getDefaultCountryId() is deprecated in /home/sumit/public_html/html/ps-hotel-reservation-system/modules/hotelreservationsystem/hotelreservationsystem.php on line 305
in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/Tools.php on line 2699 -[05-Nov-2015 15:53:36 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 15:54:15 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 15:54:21 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 15:54:49 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 15:54:57 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 15:55:10 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 15:55:45 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 16:35:37 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 16:35:41 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Nov-2015 16:36:47 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[16-Nov-2015 18:25:41 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[16-Nov-2015 18:25:44 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[16-Nov-2015 18:25:48 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[16-Nov-2015 18:27:02 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[16-Nov-2015 18:27:34 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[16-Nov-2015 19:45:57 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[16-Nov-2015 19:46:35 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[16-Nov-2015 19:46:40 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[16-Nov-2015 19:58:24 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[16-Nov-2015 19:58:29 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[16-Nov-2015 19:58:33 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/ps-hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/p in /home/sumit/public_html/html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[17-Nov-2015 15:35:55 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/rjain/public_html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/rjain/pub...') -#1 /home/rjain/public_html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/rjain/public_html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/rjain/public_html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/rjain/pub...') -#4 /home/rjain/public_html/hotel-reservation-system/install/inde in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[17-Nov-2015 15:35:58 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/rjain/public_html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/rjain/pub...') -#1 /home/rjain/public_html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/rjain/public_html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/rjain/public_html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/rjain/pub...') -#4 /home/rjain/public_html/hotel-reservation-system/install/inde in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[17-Nov-2015 15:36:02 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/rjain/public_html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/rjain/pub...') -#1 /home/rjain/public_html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/rjain/public_html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/rjain/public_html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/rjain/pub...') -#4 /home/rjain/public_html/hotel-reservation-system/install/inde in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[17-Nov-2015 15:36:46 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/rjain/public_html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/rjain/pub...') -#1 /home/rjain/public_html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/rjain/public_html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/rjain/public_html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/rjain/pub...') -#4 /home/rjain/public_html/hotel-reservation-system/install/inde in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[17-Nov-2015 15:37:26 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/rjain/public_html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/rjain/pub...') -#1 /home/rjain/public_html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/rjain/public_html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/rjain/public_html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/rjain/pub...') -#4 /home/rjain/public_html/hotel-reservation-system/install/inde in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[30-Dec-2015 18:28:20 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/rjain/public_html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/rjain/pub...') -#1 /home/rjain/public_html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/rjain/public_html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/rjain/public_html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/rjain/pub...') -#4 /home/rjain/public_html/hotel-reservation-system/install/inde in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[30-Dec-2015 18:28:23 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/rjain/public_html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/rjain/pub...') -#1 /home/rjain/public_html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/rjain/public_html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/rjain/public_html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/rjain/pub...') -#4 /home/rjain/public_html/hotel-reservation-system/install/inde in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[30-Dec-2015 18:28:30 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/rjain/public_html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/rjain/pub...') -#1 /home/rjain/public_html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/rjain/public_html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/rjain/public_html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/rjain/pub...') -#4 /home/rjain/public_html/hotel-reservation-system/install/inde in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[30-Dec-2015 18:28:58 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/rjain/public_html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/rjain/pub...') -#1 /home/rjain/public_html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/rjain/public_html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/rjain/public_html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/rjain/pub...') -#4 /home/rjain/public_html/hotel-reservation-system/install/inde in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[30-Dec-2015 18:29:25 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/rjain/public_html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/rjain/pub...') -#1 /home/rjain/public_html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/rjain/public_html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/rjain/public_html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/rjain/pub...') -#4 /home/rjain/public_html/hotel-reservation-system/install/inde in /home/rjain/public_html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Jan-2016 18:45:21 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/ho in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Jan-2016 18:45:24 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/ho in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Jan-2016 18:45:28 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/ho in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Jan-2016 18:46:02 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/ho in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[05-Jan-2016 18:46:18 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/ho in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[07-Jan-2016 10:35:28 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/ho in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[07-Jan-2016 10:35:33 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/ho in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[07-Jan-2016 10:35:36 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/ho in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[07-Jan-2016 10:36:01 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/ho in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[07-Jan-2016 10:36:39 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotel-reservation-system/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotel-reservation-system/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotel-reservation-system/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/ho in /home/sumit/public_html/html/hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 15:44:54 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 15:45:06 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 15:45:11 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 15:45:35 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 15:46:13 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 19:19:45 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 19:20:46 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 19:20:55 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 20:52:57 Asia/Bangkok] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property Category->name is empty' in /home/sumit/public_html/html/hotelcommerce-master/classes/ObjectModel.php:954 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/classes/ObjectModel.php(295): ObjectModelCore->validateFieldsLang() -#1 /home/sumit/public_html/html/hotelcommerce-master/classes/ObjectModel.php(511): ObjectModelCore->getFieldsLang() -#2 /home/sumit/public_html/html/hotelcommerce-master/classes/Category.php(157): ObjectModelCore->add(true, false) -#3 /home/sumit/public_html/html/hotelcommerce-master/modules/hotelreservationsystem/hotelreservationsystem.php(678): CategoryCore->add() -#4 /home/sumit/public_html/html/hotelcommerce-master/modules/hotelreservationsystem/hotelreservationsystem.php(521): HotelReservationSystem->addCategory(NULL, '12', Array) -#5 /home/sumit/public_html/html/hotelcommerce-master/modules/hotelreservationsystem/hotelreservationsystem.php(734): HotelReservationSystem->createDummyDataForProject() -#6 /home/sum in /home/sumit/public_html/html/hotelcommerce-master/classes/ObjectModel.php on line 954 -[29-Jan-2016 20:02:09 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 21:17:03 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 21:17:21 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 21:18:08 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 21:28:34 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 21:29:12 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 21:29:17 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 21:36:31 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 21:37:12 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 21:37:18 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 21:49:39 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 21:49:51 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[29-Jan-2016 21:50:26 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce-master/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce-master/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce-master/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce-master/insta in /home/sumit/public_html/html/hotelcommerce-master/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 11:25:26 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 11:26:17 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 11:26:22 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 11:26:58 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 11:27:01 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 11:27:21 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 11:27:41 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 11:29:35 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 11:33:32 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 11:36:05 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 02:06:46 US/Eastern] PHP Fatal error: Using $this when not in object context in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 968 -[11-Jul-2016 11:37:53 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 13:10:14 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 13:10:18 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 13:10:22 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 13:14:59 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 03:45:41 US/Eastern] PHP Fatal error: Non-abstract method LanguageCore::replaceCustomizedMailFiles() must contain body in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 985 -[11-Jul-2016 13:20:54 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 03:51:36 US/Eastern] PHP Fatal error: Non-abstract method LanguageCore::replaceCustomizedMailFiles() must contain body in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 986 -[11-Jul-2016 13:22:15 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 03:52:56 US/Eastern] PHP Fatal error: Non-abstract method LanguageCore::replaceCustomizedMailFiles() must contain body in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 986 -[11-Jul-2016 13:23:26 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 03:54:10 US/Eastern] PHP Fatal error: Using $this when not in object context in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 979 -[11-Jul-2016 13:26:53 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 03:57:37 US/Eastern] PHP Fatal error: Using $this when not in object context in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 979 -[11-Jul-2016 13:28:28 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 03:59:12 US/Eastern] PHP Warning: copy(): The second argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 997 -[11-Jul-2016 03:59:12 US/Eastern] PHP Warning: copy(): The first argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 997 -[11-Jul-2016 03:59:12 US/Eastern] PHP Warning: copy(): The second argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 997 -[11-Jul-2016 03:59:12 US/Eastern] PHP Warning: copy(): The second argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 997 -[11-Jul-2016 03:59:12 US/Eastern] PHP Warning: copy(): The second argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 997 -[11-Jul-2016 03:59:12 US/Eastern] PHP Warning: copy(): The first argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 997 -[11-Jul-2016 13:41:09 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 04:11:53 US/Eastern] PHP Warning: copy(): The first argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 997 -[11-Jul-2016 04:11:53 US/Eastern] PHP Warning: copy(): The first argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 997 -[11-Jul-2016 13:48:25 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 04:19:10 US/Eastern] PHP Warning: copy(): The first argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 997 -[11-Jul-2016 04:19:10 US/Eastern] PHP Warning: copy(): The first argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 997 -[11-Jul-2016 13:53:07 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 04:23:47 US/Eastern] PHP Parse error: syntax error, unexpected ';' in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 996 -[11-Jul-2016 13:54:10 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 04:24:55 US/Eastern] PHP Warning: copy(): The first argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 998 -[11-Jul-2016 04:24:55 US/Eastern] PHP Warning: copy(): The first argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 998 -[11-Jul-2016 20:21:39 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 20:21:42 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 20:21:47 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 20:22:09 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 20:22:50 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 10:53:38 US/Eastern] PHP Warning: copy(): The first argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 998 -[11-Jul-2016 10:53:38 US/Eastern] PHP Warning: copy(): The first argument to copy() function cannot be a directory in /home/sumit/public_html/html/hotelcommerce/classes/Language.php on line 998 -[11-Jul-2016 20:34:13 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 20:38:59 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 21:19:33 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 21:20:09 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 21:20:13 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 21:26:26 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 21:27:55 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 21:27:59 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 22:18:02 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 22:18:05 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 -[11-Jul-2016 22:18:41 Asia/Calcutta] PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'RecursiveDirectoryIterator::__construct(/home/sumit/public_html/html/hotelcommerce/themes/hotel-theme/): failed to open dir: No such file or directory' in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php:68 -Stack trace: -#0 /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php(68): RecursiveDirectoryIterator->__construct('/home/sumit/pub...') -#1 /home/sumit/public_html/html/hotelcommerce/tools/smarty/Smarty.class.php(1440): Smarty_Internal_Utility::compileAllTemplates('.tpl', false, 0, NULL, Object(SmartyCustom)) -#2 /home/sumit/public_html/html/hotelcommerce/install/controllers/http/smarty_compile.php(42): Smarty->compileAllTemplates('.tpl', false) -#3 /home/sumit/public_html/html/hotelcommerce/install/classes/controllerHttp.php(96): require_once('/home/sumit/pub...') -#4 /home/sumit/public_html/html/hotelcommerce/install/index.php(31): InstallControllerHttp::execute( in /home/sumit/public_html/html/hotelcommerce/tools/smarty/sysplugins/smarty_internal_utility.php on line 68 diff --git a/install/models/install.php b/install/models/install.php index 6146796aa..5ea473b14 100644 --- a/install/models/install.php +++ b/install/models/install.php @@ -602,6 +602,47 @@ class InstallModelInstall extends InstallAbstractModel Configuration::updateGlobalValue('PS_REWRITING_SETTINGS', 0); } + $qloData = [ + 'shopDomain' => Tools::getHttpHost(), + 'shopDomainSsl' => Tools::getHttpHost(), + 'physicalUri' => __PS_BASE_URI__, + 'email' => $data['admin_email'], + 'firstname' => Tools::ucfirst($data['admin_firstname']), + 'lastname' => Tools::ucfirst($data['admin_lastname']), + 'countryCode' => $data['shop_country'], + ]; + + // Qlo Notification + $this->setNotification($qloData); + + return true; + } + + public function setNotification($notificationData) + { + if (function_exists('curl_version')) { + $params = [ + 'url' => 'https://prestashop.webkul.com/hotel-reservation-clients/getNotification.php', + 'method' => 'POST', + 'headers' => 'Content-Type: application/json', + 'postdata' => json_encode($notificationData), + ]; + + $curlInit = curl_init(); + curl_setopt($curlInit, CURLOPT_URL, $params['url']); + curl_setopt($curlInit, CURLOPT_HTTPAUTH, CURLAUTH_ANY); + curl_setopt($curlInit, CURLOPT_HTTPHEADER,$params['headers']); + curl_setopt($curlInit, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curlInit, CURLOPT_CUSTOMREQUEST, $params['method']); + curl_setopt($curlInit, CURLOPT_RETURNTRANSFER, 1); + if (isset($params['postdata'])) { + curl_setopt( $curlInit, CURLOPT_POSTFIELDS, $params['postdata']); + } + $response = curl_exec($curlInit); + } else { + // Mail Code + } + return true; } diff --git a/install/theme/img/logo.png b/install/theme/img/logo.png index 4023f84cc5a692ac03ec769b6b74b2c5d3760c8b..98132803e8895bead4eccb3ad123fd421ae69099 100644 GIT binary patch literal 2373 zcmd5;`#aN*A6@3wkRlUZFh=UFu*l^TCB(*ZYlhL*B)5uLH>8xy_SuMGZq-VYOJr7T zMabO76edcVB$v&li|8s}pa0@}&hwmeemc+VdHr;#Ug#rg5M2le1X6Q%bM^s&)O==|l+ z((F(BJxW_t<)-?hOdaXN8dt2hcOaYVxhw{pO~y;k=#ox>K*}(8=R2{s#k-Xw9Bx%nEt_^w2B zlz?fO_O%q*7F0dB=S*yczHwB7RHj)UVRNlV*4-|1bIw9b)}f4e#N;hKW9_XB@GgOi zUiFJ9yPtM?uLrEk@7gw*F#mBGEQxn9Ja(v$5?DvLt6jQDyrs2T!bWSo(s`*mmcm@0~H3)-)A?8>_V+#XJ}fKk}v z(ta2k#bdaeX<>l~pF%{sTO|0VLtpkQOM4@C`w5hCkwkS51yXDs*+l5-l{qou0gqy0 zpMO)66%xv4J)(Tl#QbaJS?9a4}Ve>9A+^hB2c=^8tTYsWs5|O4^ke- z#$wS(>j{{d(taVK`Z-vggI&Cd1WXmIZg8%fodLbp@h^<4gYcGggbdL#|pZ0Sq79m zs~Np<>bS6C*l7Vb`*RnQLFoJNQ6I>D94iJBs#IvL*U%%zzk{lU-JM0)^2~f7QczAv z-=e@AQP-at^3svK8ccg+cBzMqa2(1RR_#m5GW9<4Dx#lm=5c2G9YjSj)2jRH4GoUU8SN+pB*=jIcwQ@ zQ4{rCbRZy*-`M_`w)?$vWsq$hF^nig$+P>jNVu`$izdtl-)Ll}LszR)n(Z@V)eT}p z42y_fP5pbDX0?>uPZ>Pp|AJY-S&x* zwvsaDkq(Mbd z=dFmb@mT3VUQ>xU^(d;GAKea%zI$Z{_uw>U>~931l3$-?yg(Rx`R7kjV(8GnlR_v& zc^79$;Fyv6>&P5U&Vufg+*WegXrTViP)A#!^f$3zRf4+NIy)t3dgB(&I1j{aJxe%d zEn7Zc#bbX-Al^0F60o7h%e|KHp+`Ij%-^_t2{0XaOth^#jHv2X6WcRZ3$V>TvD~BZ zuW}DVi1^XBGuwG9dDsc)?N9aJnL6^l%QI$;3;8;Ym}otq;;$N5p^hLIvj0U{>)edW zW5RmyuvrzpJ#aA?d%|ysO5An-On~JfkGMGMp{1b(nX<@Wm=YF$%N;^V%2;P1EJtFh z6p@8|>L%VvZia^~n2?iPmTg@NL(Wk*={~zUJeRZ?lHcY+#*f#3<~s;saQg%r-Q%Ly z9iP+M>z#4Ip68t72=9G5lQP&@pnv_{e5Qg#1@9E7;TFfe8oLi@+etB@B87Dw)}KW> z%EhWUXeGC|uAJ_@q*PpX(ewH2?>qAF>AvL2M?FE^8z0~#j8832xA$_`Jh)YHo7B^1 z`xAlojswRs<)D#(t;Y#EJSy2Hrwj2`OkoAjK&D!a!JVT?COrI)L{~G-zQJk4He9mZ zr&dd5y;05R0-MY>ws(aYC+48&2F8km2d4?!9{q|$SD$VF5CdfdexjtU&xQ`h%py&F zH}w2kD-)d!+Qr-LGT&AF`-qmgpfrI+xp&WtPCpD?F;A69g81}si!zMIeTa+5Ed~Dd zPM5kRy3e1}#}e%Hk_R@x9-Kbq2i|-bngFbQ(t%bb4}&^Ya)vMy;!Ub~Y#yzG@|o4!O(h3YPYJ}hxF@BIh5j*S60IDSOT>s<{E+2K|* zBv=uyel~u(1b*aXus(&jzCzMgV*YZryWiR*^2B-!S+^C*l)ZO;%V}vNJ^#CsVdL-r z!S%aE`2`6zRqniRbfYH9s7_tU=yxh#WX%DIi+(O!##t|6Q&gS=W64PGLGwB!)|{iI z0yN_relbxdOz8pZx`MgdwqEao82?ydB}sHz69%EdLY`}&bQ)q|*;CO5k9yZVO@@ES z%^G|US7_*x#~To%TFzRM3CVAI1GeVQ_LsGkQd9Yfr8^}~8A@>Yk39#>`a%Zlxjghr+%KwN2YreB0N?2FTq7?flRQf9-#S^2Y%H literal 5512 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 diff --git a/install/theme/view.css b/install/theme/view.css index 6e566917d..9b6599fa8 100644 --- a/install/theme/view.css +++ b/install/theme/view.css @@ -333,7 +333,7 @@ div.field { float:left; margin:5px 0 0 10px; height: 51px; - width: 192px; + width: 278px; text-indent: -5000px; background:transparent url(img/logo.png) no-repeat 0 0; } diff --git a/install/theme/views/welcome.phtml b/install/theme/views/welcome.phtml index f43f9ba1a..b357571a9 100644 --- a/install/theme/views/welcome.phtml +++ b/install/theme/views/welcome.phtml @@ -1,20 +1,20 @@ displayTemplate('header') ?> -
l('PrestaShop requires at least 32 MB of memory to run: please check the memory_limit directive in your php.ini file or contact your host provider about this.'); ?>
+
l('QloApps requires at least 32 MB of memory to run: please check the memory_limit directive in your php.ini file or contact your host provider about this.'); ?>
can_upgrade): ?>
-

l('Welcome to the PrestaShop %s Installer', _PS_INSTALL_VERSION_) ?>

-

l('Installing PrestaShop is quick and easy. In just a few moments, you will become part of a community consisting of more than 250,000 merchants. You are on the way to creating your own unique online store that you can manage easily every day.') ?>

+

l('Welcome to the QloApps %s Installer', _PS_INSTALL_VERSION_) ?>

+

l('Installing QloApps is quick and easy. In just a few moments, you will become part of a community consisting of more than 250,000 merchants. You are on the way to creating your own unique online store that you can manage easily every day.') ?>

l('If you need help, do not hesitate to watch this short tutorial, or check our documentation.', $this->getTutorialLink(), $this->getDocumentationLink()) ?>

diff --git a/js/admin/dashboard.js b/js/admin/dashboard.js index 2f2537c27..ff907b913 100644 --- a/js/admin/dashboard.js +++ b/js/admin/dashboard.js @@ -1,26 +1,26 @@ /* -* -* NOTICE OF LICENSE -* -* This source file is subject to the Open Software License (OSL 3.0) -* that is bundled with this package in the file LICENSE.txt. -* It is also available through the world-wide-web at this URL: -* http://opensource.org/licenses/osl-3.0.php -* If you did not receive a copy of the license and are unable to -* obtain it through the world-wide-web, please send an email -* to license@prestashop.com so we can send you a copy immediately. -* -* DISCLAIMER -* -* Do not edit or add to this file if you wish to upgrade PrestaShop to newer -* versions in the future. If you wish to customize PrestaShop for your -* needs please refer to http://www.prestashop.com for more information. -* -* @author PrestaShop SA -* @copyright 2007-2015 PrestaShop SA -* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) -* International Registered Trademark & Property of PrestaShop SA -*/ + * + * NOTICE OF LICENSE + * + * This source file is subject to the Open Software License (OSL 3.0) + * that is bundled with this package in the file LICENSE.txt. + * It is also available through the world-wide-web at this URL: + * http://opensource.org/licenses/osl-3.0.php + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to http://www.prestashop.com for more information. + * + * @author PrestaShop SA + * @copyright 2007-2015 PrestaShop SA + * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) + * International Registered Trademark & Property of PrestaShop SA + */ // This variables are defined in the dashboard view.tpl // dashboard_ajax_url @@ -30,295 +30,280 @@ // read_more function refreshDashboard(module_name, use_push, extra) { - var module_list = []; - this.getWidget = function(module_id) { - $.ajax({ - url : dashboard_ajax_url, - data : { - ajax: true, - action:'refreshDashboard', - module: module_list[module_id], - dashboard_use_push: Number(use_push), - extra: extra - }, - // Ensure to get fresh data - headers: { "cache-control": "no-cache" }, - cache: false, - global: false, - dataType: 'json', - success : function(widgets){ - for (var widget_name in widgets) { - for (var data_type in widgets[widget_name]) { - window[data_type](widget_name, widgets[widget_name][data_type]); - } - } - if (parseInt(dashboard_use_push) === 1) { - refreshDashboard(false, true); - } - }, - contentType: 'application/json' - }); - }; - if (module_name === false) { - $('.widget').each( function () { - module_list.push($(this).attr('id')); - if (!use_push) { - $(this).addClass('loading'); - } - }); - } - else { - module_list.push(module_name); - if (!use_push) { - $('#'+module_name+' section').each( function (){ - $(this).addClass('loading'); - }); - } - } - for (var module_id in module_list) { - if (use_push && !$('#'+module_list[module_id]).hasClass('allow_push')) { - continue; - } - this.getWidget(module_id); - } + var module_list = []; + this.getWidget = function(module_id) { + $.ajax({ + url: dashboard_ajax_url, + data: { + ajax: true, + action: 'refreshDashboard', + module: module_list[module_id], + dashboard_use_push: Number(use_push), + extra: extra + }, + // Ensure to get fresh data + headers: { "cache-control": "no-cache" }, + cache: false, + global: false, + dataType: 'json', + success: function(widgets) { + for (var widget_name in widgets) { + for (var data_type in widgets[widget_name]) { + window[data_type](widget_name, widgets[widget_name][data_type]); + } + } + if (parseInt(dashboard_use_push) === 1) { + refreshDashboard(false, true); + } + }, + contentType: 'application/json' + }); + }; + if (module_name === false) { + $('.widget').each(function() { + module_list.push($(this).attr('id')); + if (!use_push) { + $(this).addClass('loading'); + } + }); + } else { + module_list.push(module_name); + if (!use_push) { + $('#' + module_name + ' section').each(function() { + $(this).addClass('loading'); + }); + } + } + for (var module_id in module_list) { + if (use_push && !$('#' + module_list[module_id]).hasClass('allow_push')) { + continue; + } + this.getWidget(module_id); + } } function setDashboardDateRange(action) { - $('#datepickerFrom, #datepickerTo').parent('.input-group').removeClass('has-error'); - var data = 'ajax=true&action=setDashboardDateRange&submitDatePicker=true&'+$('#calendar_form').serialize()+'&'+action+'=1'; - $.ajax({ - url : adminstats_ajax_url, - data : data, - dataType: 'json', - type: 'POST', - success : function(jsonData){ - if (!jsonData.has_errors) { - refreshDashboard(false, false); - $('#datepickerFrom').val(jsonData.date_from); - $('#datepickerTo').val(jsonData.date_to); - } - else { - $('#datepickerFrom, #datepickerTo').parent('.input-group').addClass('has-error'); - } - } - }); + $('#datepickerFrom, #datepickerTo').parent('.input-group').removeClass('has-error'); + var data = 'ajax=true&action=setDashboardDateRange&submitDatePicker=true&' + $('#calendar_form').serialize() + '&' + action + '=1'; + $.ajax({ + url: adminstats_ajax_url, + data: data, + dataType: 'json', + type: 'POST', + success: function(jsonData) { + if (!jsonData.has_errors) { + refreshDashboard(false, false); + $('#datepickerFrom').val(jsonData.date_from); + $('#datepickerTo').val(jsonData.date_to); + } else { + $('#datepickerFrom, #datepickerTo').parent('.input-group').addClass('has-error'); + } + } + }); } function data_value(widget_name, data) { - for (var data_id in data) { - $('#'+data_id+' ').html(data[data_id]); - $('#'+data_id+', #'+widget_name).closest('section').removeClass('loading'); - } + for (var data_id in data) { + $('#' + data_id + ' ').html(data[data_id]); + $('#' + data_id + ', #' + widget_name).closest('section').removeClass('loading'); + } } function data_trends(widget_name, data) { - for (var data_id in data) { - this.el = $('#'+data_id); - this.el.html(data[data_id].value); - if (data[data_id].way === 'up') { - this.el.parent().removeClass('dash_trend_down').removeClass('dash_trend_right').addClass('dash_trend_up'); - } - else if (data[data_id].way === 'down') { - this.el.parent().removeClass('dash_trend_up').removeClass('dash_trend_right').addClass('dash_trend_down'); - } - else { - this.el.parent().removeClass('dash_trend_down').removeClass('dash_trend_up').addClass('dash_trend_right'); - } - this.el.closest('section').removeClass('loading'); - } + for (var data_id in data) { + this.el = $('#' + data_id); + this.el.html(data[data_id].value); + if (data[data_id].way === 'up') { + this.el.parent().removeClass('dash_trend_down').removeClass('dash_trend_right').addClass('dash_trend_up'); + } else if (data[data_id].way === 'down') { + this.el.parent().removeClass('dash_trend_up').removeClass('dash_trend_right').addClass('dash_trend_down'); + } else { + this.el.parent().removeClass('dash_trend_down').removeClass('dash_trend_up').addClass('dash_trend_right'); + } + this.el.closest('section').removeClass('loading'); + } } function data_table(widget_name, data) { - for (var data_id in data) { - //fill header - var tr = ''; - for (var header in data[data_id].header) { - var head = data[data_id].header[header]; - var th = ''; - th += (head.wrapper_start ? ' '+head.wrapper_start+' ' : '' ); - th += head.title; - th += (head.wrapper_stop ? ' '+head.wrapper_stop+' ' : '' ); - th += ''; - tr += th; - } - tr += ''; - $('#'+data_id+' thead').html(tr); + for (var data_id in data) { + //fill header + var tr = ''; + for (var header in data[data_id].header) { + var head = data[data_id].header[header]; + var th = ''; + th += (head.wrapper_start ? ' ' + head.wrapper_start + ' ' : ''); + th += head.title; + th += (head.wrapper_stop ? ' ' + head.wrapper_stop + ' ' : ''); + th += ''; + tr += th; + } + tr += ''; + $('#' + data_id + ' thead').html(tr); - //fill body - $('#'+data_id+' tbody').html(''); + //fill body + $('#' + data_id + ' tbody').html(''); - if(typeof data[data_id].body === 'string') { - $('#'+data_id+' tbody').html('
'+data[data_id].body+''); - } - else if (data[data_id].body.length) { - for (var body_content_id in data[data_id].body) { - tr = ''; - for (var body_content in data[data_id].body[body_content_id]) { - var body = data[data_id].body[body_content_id][body_content]; - var td = ''; - td += (body.wrapper_start ? ' '+body.wrapper_start+' ' : '' ); - td += body.value; - td += (body.wrapper_stop ? ' '+body.wrapper_stop+' ' : '' ); - td += ''; - tr += td; - } - tr += ''; - $('#'+data_id+' tbody').append(tr); - } - } - else { - $('#'+data_id+' tbody').html(''+no_results_translation+''); - } - } + if (typeof data[data_id].body === 'string') { + $('#' + data_id + ' tbody').html('
' + data[data_id].body + ''); + } else if (data[data_id].body.length) { + for (var body_content_id in data[data_id].body) { + tr = ''; + for (var body_content in data[data_id].body[body_content_id]) { + var body = data[data_id].body[body_content_id][body_content]; + var td = ''; + td += (body.wrapper_start ? ' ' + body.wrapper_start + ' ' : ''); + td += body.value; + td += (body.wrapper_stop ? ' ' + body.wrapper_stop + ' ' : ''); + td += ''; + tr += td; + } + tr += ''; + $('#' + data_id + ' tbody').append(tr); + } + } else { + $('#' + data_id + ' tbody').html('' + no_results_translation + ''); + } + } } function data_chart(widget_name, charts) { - for (var chart_id in charts) { - window[charts[chart_id].chart_type](widget_name, charts[chart_id]); - } + for (var chart_id in charts) { + window[charts[chart_id].chart_type](widget_name, charts[chart_id]); + } } function data_list_small(widget_name, data) { - for (var data_id in data) - { - $('#'+data_id).html(''); - for (var item in data[data_id]) { - $('#'+data_id).append('
  • '+item+''+data[data_id][item]+'
  • '); - } - $('#'+data_id+', #'+widget_name).closest('section').removeClass('loading'); - } + for (var data_id in data) { + $('#' + data_id).html(''); + for (var item in data[data_id]) { + $('#' + data_id).append('
  • ' + item + '' + data[data_id][item] + '
  • '); + } + $('#' + data_id + ', #' + widget_name).closest('section').removeClass('loading'); + } } function getBlogRss() { - $.ajax({ - url : dashboard_ajax_url, - data : { - ajax:true, - action:'getBlogRss' - }, - dataType: 'json', - success : function(jsonData) { - if (typeof jsonData !== 'undefined' && jsonData !== null && !jsonData.has_errors) { - for (var article in jsonData.rss) { - var article_html = '
    '; - $('.dash_news .dash_news_content').append(article_html); - } - } - else { - $('.dash_news').hide(); - } - } - }); + $.ajax({ + url: dashboard_ajax_url, + data: { + ajax: true, + action: 'getBlogRss' + }, + dataType: 'json', + success: function(jsonData) { + if (typeof jsonData !== 'undefined' && jsonData !== null && !jsonData.has_errors) { + for (var article in jsonData.rss) { + var article_html = '
    '; + $('.dash_news .dash_news_content').append(article_html); + } + } else { + $('.dash_news').hide(); + } + } + }); } function toggleDashConfig(widget) { - var func_name = widget + '_toggleDashConfig'; - if ($('#'+widget+' section.dash_config').hasClass('hide')) - { - $('#'+widget+' section').not('.dash_config').slideUp(500, function () { - $('#'+widget+' section.dash_config').fadeIn(500).removeClass('hide'); - if (window[func_name] != undefined) - window[func_name](); - }); - } - else - { - $('#'+widget+' section.dash_config').slideUp(500, function () { - $('#'+widget+' section').not('.dash_config').slideDown(500).removeClass('hide'); - $('#'+widget+' section.dash_config').addClass('hide'); - if (window[func_name] != undefined) - window[func_name](); - }); - } + var func_name = widget + '_toggleDashConfig'; + if ($('#' + widget + ' section.dash_config').hasClass('hide')) { + $('#' + widget + ' section').not('.dash_config').slideUp(500, function() { + $('#' + widget + ' section.dash_config').fadeIn(500).removeClass('hide'); + if (window[func_name] != undefined) + window[func_name](); + }); + } else { + $('#' + widget + ' section.dash_config').slideUp(500, function() { + $('#' + widget + ' section').not('.dash_config').slideDown(500).removeClass('hide'); + $('#' + widget + ' section.dash_config').addClass('hide'); + if (window[func_name] != undefined) + window[func_name](); + }); + } } function bindSubmitDashConfig() { - $('.submit_dash_config').on('click', function () { - saveDashConfig($(this).closest('section.widget').attr('id')); - return false; - }); + $('.submit_dash_config').on('click', function() { + saveDashConfig($(this).closest('section.widget').attr('id')); + return false; + }); } function bindCancelDashConfig() { - $('.cancel_dash_config').on('click', function () { - toggleDashConfig($(this).closest('section.widget').attr('id')); - return false; - }); + $('.cancel_dash_config').on('click', function() { + toggleDashConfig($(this).closest('section.widget').attr('id')); + return false; + }); } function saveDashConfig(widget_name) { - $('section#'+widget_name+' .form-group').removeClass('has-error'); - $('#'+widget_name+'_errors').remove(); - configs = ''; + $('section#' + widget_name + ' .form-group').removeClass('has-error'); + $('#' + widget_name + '_errors').remove(); + configs = ''; - $('#'+widget_name+' form input, #'+widget_name+' form textarea , #'+widget_name+' form select').each( function () { - if ($(this).attr('type') === 'radio' && !$(this).attr('checked')) { - return; - } - configs += '&configs['+$(this).attr('name')+']='+$(this).val(); - }); + $('#' + widget_name + ' form input, #' + widget_name + ' form textarea , #' + widget_name + ' form select').each(function() { + if ($(this).attr('type') === 'radio' && !$(this).attr('checked')) { + return; + } + configs += '&configs[' + $(this).attr('name') + ']=' + $(this).val(); + }); - data = 'ajax=true&action=saveDashConfig&module='+widget_name+configs+'&hook='+$('#'+widget_name).closest('[id^=hook]').attr('id'); + data = 'ajax=true&action=saveDashConfig&module=' + widget_name + configs + '&hook=' + $('#' + widget_name).closest('[id^=hook]').attr('id'); - $.ajax({ - url : dashboard_ajax_url, - data : data, - dataType: 'json', - error: function(XMLHttpRequest, textStatus, errorThrown) { - jAlert("TECHNICAL ERROR: \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus); - }, - success : function(jsonData){ + $.ajax({ + url: dashboard_ajax_url, + data: data, + dataType: 'json', + error: function(XMLHttpRequest, textStatus, errorThrown) { + jAlert("TECHNICAL ERROR: \n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus); + }, + success: function(jsonData) { - if (!jsonData.has_errors) - { - $('#'+widget_name).find('section').not('.dash_config').remove(); - $('#'+widget_name).append($(jsonData.widget_html).find('section').not('.dash_config')); - refreshDashboard(widget_name); - toggleDashConfig(widget_name); - } - else - { - errors_str = '
    '; - for (error in jsonData.errors) - { - errors_str += jsonData.errors[error]+'
    '; - $('#'+error).closest('.form-group').addClass('has-error'); - } - errors_str += '
    '; - $('section#'+widget_name+'_config header').after(errors_str); - errors_str += ''; - } - } - }); + if (!jsonData.has_errors) { + $('#' + widget_name).find('section').not('.dash_config').remove(); + $('#' + widget_name).append($(jsonData.widget_html).find('section').not('.dash_config')); + refreshDashboard(widget_name); + toggleDashConfig(widget_name); + } else { + errors_str = '
    '; + for (error in jsonData.errors) { + errors_str += jsonData.errors[error] + '
    '; + $('#' + error).closest('.form-group').addClass('has-error'); + } + errors_str += '
    '; + $('section#' + widget_name + '_config header').after(errors_str); + errors_str += ''; + } + } + }); } -$(document).ready( function () { - $('#calendar_form input[type="submit"]').on('click', function(elt) { - elt.preventDefault(); - setDashboardDateRange(elt.currentTarget.name); - }); +$(document).ready(function() { + $('#calendar_form input[type="submit"]').on('click', function(elt) { + elt.preventDefault(); + setDashboardDateRange(elt.currentTarget.name); + }); - refreshDashboard(false, false); - getBlogRss(); - bindSubmitDashConfig(); - bindCancelDashConfig(); + refreshDashboard(false, false); + getBlogRss(); + bindSubmitDashConfig(); + bindCancelDashConfig(); - $('#page-header-desc-configuration-switch_demo').tooltip().click(function(e) { - $.ajax({ - url : dashboard_ajax_url, - data : { - ajax:true, - action:'setSimulationMode', - PS_DASHBOARD_SIMULATION: $(this).find('i').hasClass('process-icon-toggle-on') ? 0 : 1 - }, - success : function(result) { - if ($('#page-header-desc-configuration-switch_demo i').hasClass('process-icon-toggle-on')) { - $('#page-header-desc-configuration-switch_demo i').removeClass('process-icon-toggle-on').addClass('process-icon-toggle-off'); - } else { - $('#page-header-desc-configuration-switch_demo i').removeClass('process-icon-toggle-off').addClass('process-icon-toggle-on'); - } - refreshDashboard(false, false); - } - }); - }); -}); + $('#page-header-desc-configuration-switch_demo').tooltip().click(function(e) { + $.ajax({ + url: dashboard_ajax_url, + data: { + ajax: true, + action: 'setSimulationMode', + PS_DASHBOARD_SIMULATION: $(this).find('i').hasClass('process-icon-toggle-on') ? 0 : 1 + }, + success: function(result) { + if ($('#page-header-desc-configuration-switch_demo i').hasClass('process-icon-toggle-on')) { + $('#page-header-desc-configuration-switch_demo i').removeClass('process-icon-toggle-on').addClass('process-icon-toggle-off'); + } else { + $('#page-header-desc-configuration-switch_demo i').removeClass('process-icon-toggle-off').addClass('process-icon-toggle-on'); + } + refreshDashboard(false, false); + } + }); + }); +}); \ No newline at end of file diff --git a/js/admin/orders.js b/js/admin/orders.js index 1f6f92a9a..df898850d 100644 --- a/js/admin/orders.js +++ b/js/admin/orders.js @@ -389,8 +389,8 @@ function init() $('#add_product_product_price_tax_excl').val(data.price_tax_excl); //Added by webkul to set curent date in the date fields by default - var date_in = $.datepicker.formatDate('d M yy', new Date()); - var date_out = $.datepicker.formatDate('d M yy', new Date(new Date().getTime()+24*60*60*1000)); + var date_in = $.datepicker.formatDate('dd-mm-yy', new Date()); + var date_out = $.datepicker.formatDate('dd-mm-yy', new Date(new Date().getTime()+24*60*60*1000)); var tr_product = $(this).closest('#new_product'); tr_product.find("input.add_product_date_from").val(date_in); tr_product.find("input.add_product_date_to").val(date_out); @@ -894,23 +894,23 @@ function init() { showOtherMonths: true, dateFormat: 'dd-mm-yy', - onClose: function( selectedDate ) - { - var selectedDate = new Date(selectedDate); - selectedDate.setDate(selectedDate.getDate()+1); - $( ".add_product_date_to" ).datepicker( "option", "minDate", selectedDate ); - } + onSelect: function(selectedDate) { + var date_format = selectedDate.split("-"); + var selectedDate = new Date($.datepicker.formatDate('yy-mm-dd', new Date(date_format[2], date_format[1] - 1, date_format[0]))); + selectedDate.setDate(selectedDate.getDate() + 1); + $(".add_product_date_to").datepicker("option", "minDate", selectedDate); + }, }); $(".add_product_date_to").datepicker( { showOtherMonths: true, dateFormat: 'dd-mm-yy', - onClose: function( selectedDate ) - { - var selectedDate = new Date(selectedDate); + onSelect: function(selectedDate) { + var date_format = selectedDate.split("-"); + var selectedDate = new Date($.datepicker.formatDate('yy-mm-dd', new Date(date_format[2], date_format[1] - 1, date_format[0]))); selectedDate.setDate(selectedDate.getDate() - 1); - $( ".add_product_date_from" ).datepicker( "option", "maxDate", selectedDate ); + $(".add_product_date_from").datepicker("option", "maxDate", selectedDate); } }); /*End*/ diff --git a/mails/en/advanced-book-data.tpl b/mails/en/advanced-book-data.tpl new file mode 100644 index 000000000..84ecd5775 --- /dev/null +++ b/mails/en/advanced-book-data.tpl @@ -0,0 +1,59 @@ +{if !empty($list)} + + + + + + + + +
      + + Total Paid + +  
    + + + + + + + + +
      + + {$list['total_paid_amount']} + +  
    + + + + + + + + + + + +
      + + Total Due + +  
    + + + + + + + + +
      + + {$list['total_due_amount']} + +  
    + + +{/if} \ No newline at end of file diff --git a/mails/en/advanced-book-data.txt b/mails/en/advanced-book-data.txt new file mode 100644 index 000000000..869c0fd65 --- /dev/null +++ b/mails/en/advanced-book-data.txt @@ -0,0 +1,11 @@ +{if !empty($list)} + +TOTAL PAID + +{$list['total_paid_amount']} + +TOTAL DUE + +{$list['total_due_amount']} + +{/if} \ No newline at end of file diff --git a/mails/fr/advanced-book-data.tpl b/mails/fr/advanced-book-data.tpl new file mode 100644 index 000000000..84ecd5775 --- /dev/null +++ b/mails/fr/advanced-book-data.tpl @@ -0,0 +1,59 @@ +{if !empty($list)} + + + + + + + + +
      + + Total Paid + +  
    + + + + + + + + +
      + + {$list['total_paid_amount']} + +  
    + + + + + + + + + + + +
      + + Total Due + +  
    + + + + + + + + +
      + + {$list['total_due_amount']} + +  
    + + +{/if} \ No newline at end of file diff --git a/mails/fr/advanced-book-data.txt b/mails/fr/advanced-book-data.txt new file mode 100644 index 000000000..869c0fd65 --- /dev/null +++ b/mails/fr/advanced-book-data.txt @@ -0,0 +1,11 @@ +{if !empty($list)} + +TOTAL PAID + +{$list['total_paid_amount']} + +TOTAL DUE + +{$list['total_due_amount']} + +{/if} \ No newline at end of file diff --git a/modules/bankwire/bankwire.php b/modules/bankwire/bankwire.php index 4e55f4c4d..b9f3a8c7a 100644 --- a/modules/bankwire/bankwire.php +++ b/modules/bankwire/bankwire.php @@ -24,258 +24,273 @@ * International Registered Trademark & Property of PrestaShop SA */ -if (!defined('_PS_VERSION_')) - exit; - -class BankWire extends PaymentModule -{ - protected $_html = ''; - protected $_postErrors = array(); - - public $details; - public $owner; - public $address; - public $extra_mail_vars; - public function __construct() - { - $this->name = 'bankwire'; - $this->tab = 'payments_gateways'; - $this->version = '1.1.0'; - $this->author = 'PrestaShop'; - $this->controllers = array('payment', 'validation'); - $this->is_eu_compatible = 1; - - $this->currencies = true; - $this->currencies_mode = 'checkbox'; - - $config = Configuration::getMultiple(array('BANK_WIRE_DETAILS', 'BANK_WIRE_OWNER', 'BANK_WIRE_ADDRESS')); - if (!empty($config['BANK_WIRE_OWNER'])) - $this->owner = $config['BANK_WIRE_OWNER']; - if (!empty($config['BANK_WIRE_DETAILS'])) - $this->details = $config['BANK_WIRE_DETAILS']; - if (!empty($config['BANK_WIRE_ADDRESS'])) - $this->address = $config['BANK_WIRE_ADDRESS']; - - $this->bootstrap = true; - parent::__construct(); - - $this->displayName = $this->l('Bank wire'); - $this->description = $this->l('Accept payments for your products via bank wire transfer.'); - $this->confirmUninstall = $this->l('Are you sure about removing these details?'); - if (!isset($this->owner) || !isset($this->details) || !isset($this->address)) - $this->warning = $this->l('Account owner and account details must be configured before using this module.'); - if (!count(Currency::checkPaymentCurrencies($this->id))) - $this->warning = $this->l('No currency has been set for this module.'); - - $this->extra_mail_vars = array( - '{bankwire_owner}' => Configuration::get('BANK_WIRE_OWNER'), - '{bankwire_details}' => nl2br(Configuration::get('BANK_WIRE_DETAILS')), - '{bankwire_address}' => nl2br(Configuration::get('BANK_WIRE_ADDRESS')) - ); - } - - public function install() - { - if (!parent::install() || !$this->registerHook('payment') || ! $this->registerHook('displayPaymentEU') || !$this->registerHook('paymentReturn')) - return false; - return true; - } - - public function uninstall() - { - if (!Configuration::deleteByName('BANK_WIRE_DETAILS') - || !Configuration::deleteByName('BANK_WIRE_OWNER') - || !Configuration::deleteByName('BANK_WIRE_ADDRESS') - || !parent::uninstall()) - return false; - return true; - } - - protected function _postValidation() - { - if (Tools::isSubmit('btnSubmit')) - { - if (!Tools::getValue('BANK_WIRE_DETAILS')) - $this->_postErrors[] = $this->l('Account details are required.'); - elseif (!Tools::getValue('BANK_WIRE_OWNER')) - $this->_postErrors[] = $this->l('Account owner is required.'); - } - } - - protected function _postProcess() - { - if (Tools::isSubmit('btnSubmit')) - { - Configuration::updateValue('BANK_WIRE_DETAILS', Tools::getValue('BANK_WIRE_DETAILS')); - Configuration::updateValue('BANK_WIRE_OWNER', Tools::getValue('BANK_WIRE_OWNER')); - Configuration::updateValue('BANK_WIRE_ADDRESS', Tools::getValue('BANK_WIRE_ADDRESS')); - } - $this->_html .= $this->displayConfirmation($this->l('Settings updated')); - } - - protected function _displayBankWire() - { - return $this->display(__FILE__, 'infos.tpl'); - } - - public function getContent() - { - if (Tools::isSubmit('btnSubmit')) - { - $this->_postValidation(); - if (!count($this->_postErrors)) - $this->_postProcess(); - else - foreach ($this->_postErrors as $err) - $this->_html .= $this->displayError($err); - } - else - $this->_html .= '
    '; - - $this->_html .= $this->_displayBankWire(); - $this->_html .= $this->renderForm(); - - return $this->_html; - } - - public function hookPayment($params) - { - if (!$this->active) - return; - if (!$this->checkCurrency($params['cart'])) - return; - - $this->smarty->assign(array( - 'this_path' => $this->_path, - 'this_path_bw' => $this->_path, - 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/' - )); - return $this->display(__FILE__, 'payment.tpl'); - } - - public function hookDisplayPaymentEU($params) - { - if (!$this->active) - return; - - if (!$this->checkCurrency($params['cart'])) - return; - - $payment_options = array( - 'cta_text' => $this->l('Pay by Bank Wire'), - 'logo' => Media::getMediaPath(dirname(__FILE__).'/bankwire.jpg'), - 'action' => $this->context->link->getModuleLink($this->name, 'validation', array(), true) - ); - - return $payment_options; - } - - public function hookPaymentReturn($params) - { - if (!$this->active) - return; - - $state = $params['objOrder']->getCurrentState(); - if (in_array($state, array(Configuration::get('PS_OS_BANKWIRE'), Configuration::get('PS_OS_OUTOFSTOCK'), Configuration::get('PS_OS_OUTOFSTOCK_UNPAID')))) - { - if (Configuration::get('WK_ALLOW_ADVANCED_PAYMENT')) - { - $obj_customer_adv = new HotelCustomerAdvancedPayment(); - $order_total = $obj_customer_adv->getOrdertTotal(0, 0, $params['objOrder']->id); - } - else - $order_total = $params['total_to_pay']; - - $this->smarty->assign(array( - 'total_to_pay' => Tools::displayPrice($order_total, $params['currencyObj'], false), - 'bankwireDetails' => Tools::nl2br($this->details), - 'bankwireAddress' => Tools::nl2br($this->address), - 'bankwireOwner' => $this->owner, - 'status' => 'ok', - 'id_order' => $params['objOrder']->id - )); - if (isset($params['objOrder']->reference) && !empty($params['objOrder']->reference)) - $this->smarty->assign('reference', $params['objOrder']->reference); - } - else - $this->smarty->assign('status', 'failed'); - return $this->display(__FILE__, 'payment_return.tpl'); - } - - public function checkCurrency($cart) - { - $currency_order = new Currency($cart->id_currency); - $currencies_module = $this->getCurrency($cart->id_currency); - - if (is_array($currencies_module)) - foreach ($currencies_module as $currency_module) - if ($currency_order->id == $currency_module['id_currency']) - return true; - return false; - } - - public function renderForm() - { - $fields_form = array( - 'form' => array( - 'legend' => array( - 'title' => $this->l('Contact details'), - 'icon' => 'icon-envelope' - ), - 'input' => array( - array( - 'type' => 'text', - 'label' => $this->l('Account owner'), - 'name' => 'BANK_WIRE_OWNER', - 'required' => true - ), - array( - 'type' => 'textarea', - 'label' => $this->l('Details'), - 'name' => 'BANK_WIRE_DETAILS', - 'desc' => $this->l('Such as bank branch, IBAN number, BIC, etc.'), - 'required' => true - ), - array( - 'type' => 'textarea', - 'label' => $this->l('Bank address'), - 'name' => 'BANK_WIRE_ADDRESS', - 'required' => true - ), - ), - 'submit' => array( - 'title' => $this->l('Save'), - ) - ), - ); - - $helper = new HelperForm(); - $helper->show_toolbar = false; - $helper->table = $this->table; - $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); - $helper->default_form_language = $lang->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; - $this->fields_form = array(); - $helper->id = (int)Tools::getValue('id_carrier'); - $helper->identifier = $this->identifier; - $helper->submit_action = 'btnSubmit'; - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->tpl_vars = array( - 'fields_value' => $this->getConfigFieldsValues(), - 'languages' => $this->context->controller->getLanguages(), - 'id_language' => $this->context->language->id - ); - - return $helper->generateForm(array($fields_form)); - } - - public function getConfigFieldsValues() - { - return array( - 'BANK_WIRE_DETAILS' => Tools::getValue('BANK_WIRE_DETAILS', Configuration::get('BANK_WIRE_DETAILS')), - 'BANK_WIRE_OWNER' => Tools::getValue('BANK_WIRE_OWNER', Configuration::get('BANK_WIRE_OWNER')), - 'BANK_WIRE_ADDRESS' => Tools::getValue('BANK_WIRE_ADDRESS', Configuration::get('BANK_WIRE_ADDRESS')), - ); - } +if (!defined('_PS_VERSION_')) { + exit; +} + +class bankwire extends PaymentModule +{ + protected $_html = ''; + protected $_postErrors = array(); + + public $details; + public $owner; + public $address; + public $extra_mail_vars; + public function __construct() + { + $this->name = 'bankwire'; + $this->tab = 'payments_gateways'; + $this->version = '1.1.0'; + $this->author = 'PrestaShop'; + $this->controllers = array('payment', 'validation'); + $this->is_eu_compatible = 1; + + $this->currencies = true; + $this->currencies_mode = 'checkbox'; + + $config = Configuration::getMultiple(array('BANK_WIRE_DETAILS', 'BANK_WIRE_OWNER', 'BANK_WIRE_ADDRESS')); + if (!empty($config['BANK_WIRE_OWNER'])) { + $this->owner = $config['BANK_WIRE_OWNER']; + } + if (!empty($config['BANK_WIRE_DETAILS'])) { + $this->details = $config['BANK_WIRE_DETAILS']; + } + if (!empty($config['BANK_WIRE_ADDRESS'])) { + $this->address = $config['BANK_WIRE_ADDRESS']; + } + + $this->bootstrap = true; + parent::__construct(); + + $this->displayName = $this->l('Bank wire'); + $this->description = $this->l('Accept payments for your products via bank wire transfer.'); + $this->confirmUninstall = $this->l('Are you sure about removing these details?'); + if (!isset($this->owner) || !isset($this->details) || !isset($this->address)) { + $this->warning = $this->l('Account owner and account details must be configured before using this module.'); + } + if (!count(Currency::checkPaymentCurrencies($this->id))) { + $this->warning = $this->l('No currency has been set for this module.'); + } + + $this->extra_mail_vars = array( + '{bankwire_owner}' => Configuration::get('BANK_WIRE_OWNER'), + '{bankwire_details}' => nl2br(Configuration::get('BANK_WIRE_DETAILS')), + '{bankwire_address}' => nl2br(Configuration::get('BANK_WIRE_ADDRESS')) + ); + } + + public function install() + { + if (!parent::install() || !$this->registerHook('payment') || ! $this->registerHook('displayPaymentEU') || !$this->registerHook('paymentReturn')) { + return false; + } + return true; + } + + public function uninstall() + { + if (!Configuration::deleteByName('BANK_WIRE_DETAILS') + || !Configuration::deleteByName('BANK_WIRE_OWNER') + || !Configuration::deleteByName('BANK_WIRE_ADDRESS') + || !parent::uninstall()) { + return false; + } + return true; + } + + protected function _postValidation() + { + if (Tools::isSubmit('btnSubmit')) { + if (!Tools::getValue('BANK_WIRE_DETAILS')) { + $this->_postErrors[] = $this->l('Account details are required.'); + } elseif (!Tools::getValue('BANK_WIRE_OWNER')) { + $this->_postErrors[] = $this->l('Account owner is required.'); + } + } + } + + protected function _postProcess() + { + if (Tools::isSubmit('btnSubmit')) { + Configuration::updateValue('BANK_WIRE_DETAILS', Tools::getValue('BANK_WIRE_DETAILS')); + Configuration::updateValue('BANK_WIRE_OWNER', Tools::getValue('BANK_WIRE_OWNER')); + Configuration::updateValue('BANK_WIRE_ADDRESS', Tools::getValue('BANK_WIRE_ADDRESS')); + } + $this->_html .= $this->displayConfirmation($this->l('Settings updated')); + } + + protected function _displayBankWire() + { + return $this->display(__FILE__, 'infos.tpl'); + } + + public function getContent() + { + if (Tools::isSubmit('btnSubmit')) { + $this->_postValidation(); + if (!count($this->_postErrors)) { + $this->_postProcess(); + } else { + foreach ($this->_postErrors as $err) { + $this->_html .= $this->displayError($err); + } + } + } else { + $this->_html .= '
    '; + } + + $this->_html .= $this->_displayBankWire(); + $this->_html .= $this->renderForm(); + + return $this->_html; + } + + public function hookPayment($params) + { + if (!$this->active) { + return; + } + if (!$this->checkCurrency($params['cart'])) { + return; + } + + $this->smarty->assign(array( + 'this_path' => $this->_path, + 'this_path_bw' => $this->_path, + 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/' + )); + return $this->display(__FILE__, 'payment.tpl'); + } + + public function hookDisplayPaymentEU($params) + { + if (!$this->active) { + return; + } + + if (!$this->checkCurrency($params['cart'])) { + return; + } + + $payment_options = array( + 'cta_text' => $this->l('Pay by Bank Wire'), + 'logo' => Media::getMediaPath(dirname(__FILE__).'/bankwire.jpg'), + 'action' => $this->context->link->getModuleLink($this->name, 'validation', array(), true) + ); + + return $payment_options; + } + + public function hookPaymentReturn($params) + { + if (!$this->active) { + return; + } + + $state = $params['objOrder']->getCurrentState(); + if (in_array($state, array(Configuration::get('PS_OS_BANKWIRE'), Configuration::get('PS_OS_OUTOFSTOCK'), Configuration::get('PS_OS_OUTOFSTOCK_UNPAID')))) { + if (Configuration::get('WK_ALLOW_ADVANCED_PAYMENT')) { + $obj_customer_adv = new HotelCustomerAdvancedPayment(); + $order_total = $obj_customer_adv->getOrdertTotal(0, 0, $params['objOrder']->id); + } else { + $order_total = $params['total_to_pay']; + } + + $this->smarty->assign(array( + 'total_to_pay' => Tools::displayPrice($order_total, $params['currencyObj'], false), + 'bankwireDetails' => Tools::nl2br($this->details), + 'bankwireAddress' => Tools::nl2br($this->address), + 'bankwireOwner' => $this->owner, + 'status' => 'ok', + 'id_order' => $params['objOrder']->id + )); + if (isset($params['objOrder']->reference) && !empty($params['objOrder']->reference)) { + $this->smarty->assign('reference', $params['objOrder']->reference); + } + } else { + $this->smarty->assign('status', 'failed'); + } + return $this->display(__FILE__, 'payment_return.tpl'); + } + + public function checkCurrency($cart) + { + $currency_order = new Currency($cart->id_currency); + $currencies_module = $this->getCurrency($cart->id_currency); + + if (is_array($currencies_module)) { + foreach ($currencies_module as $currency_module) { + if ($currency_order->id == $currency_module['id_currency']) { + return true; + } + } + } + return false; + } + + public function renderForm() + { + $fields_form = array( + 'form' => array( + 'legend' => array( + 'title' => $this->l('Contact details'), + 'icon' => 'icon-envelope' + ), + 'input' => array( + array( + 'type' => 'text', + 'label' => $this->l('Account owner'), + 'name' => 'BANK_WIRE_OWNER', + 'required' => true + ), + array( + 'type' => 'textarea', + 'label' => $this->l('Details'), + 'name' => 'BANK_WIRE_DETAILS', + 'desc' => $this->l('Such as bank branch, IBAN number, BIC, etc.'), + 'required' => true + ), + array( + 'type' => 'textarea', + 'label' => $this->l('Bank address'), + 'name' => 'BANK_WIRE_ADDRESS', + 'required' => true + ), + ), + 'submit' => array( + 'title' => $this->l('Save'), + ) + ), + ); + + $helper = new HelperForm(); + $helper->show_toolbar = false; + $helper->table = $this->table; + $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); + $helper->default_form_language = $lang->id; + $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; + $this->fields_form = array(); + $helper->id = (int)Tools::getValue('id_carrier'); + $helper->identifier = $this->identifier; + $helper->submit_action = 'btnSubmit'; + $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; + $helper->token = Tools::getAdminTokenLite('AdminModules'); + $helper->tpl_vars = array( + 'fields_value' => $this->getConfigFieldsValues(), + 'languages' => $this->context->controller->getLanguages(), + 'id_language' => $this->context->language->id + ); + + return $helper->generateForm(array($fields_form)); + } + + public function getConfigFieldsValues() + { + return array( + 'BANK_WIRE_DETAILS' => Tools::getValue('BANK_WIRE_DETAILS', Configuration::get('BANK_WIRE_DETAILS')), + 'BANK_WIRE_OWNER' => Tools::getValue('BANK_WIRE_OWNER', Configuration::get('BANK_WIRE_OWNER')), + 'BANK_WIRE_ADDRESS' => Tools::getValue('BANK_WIRE_ADDRESS', Configuration::get('BANK_WIRE_ADDRESS')), + ); + } } diff --git a/modules/bankwire/config.xml b/modules/bankwire/config.xml new file mode 100644 index 000000000..a1daccf6f --- /dev/null +++ b/modules/bankwire/config.xml @@ -0,0 +1,13 @@ + + + bankwire + + + + + + + 1 + 1 + + \ No newline at end of file diff --git a/modules/blockadvertising/config.xml b/modules/blockadvertising/config.xml new file mode 100644 index 000000000..715d2c80a --- /dev/null +++ b/modules/blockadvertising/config.xml @@ -0,0 +1,12 @@ + + + blockadvertising + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockbanner/config.xml b/modules/blockbanner/config.xml new file mode 100644 index 000000000..ac6ae82a1 --- /dev/null +++ b/modules/blockbanner/config.xml @@ -0,0 +1,12 @@ + + + blockbanner + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockbestsellers/config.xml b/modules/blockbestsellers/config.xml new file mode 100644 index 000000000..cf79f9af5 --- /dev/null +++ b/modules/blockbestsellers/config.xml @@ -0,0 +1,12 @@ + + + blockbestsellers + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockcart/blockcart.php b/modules/blockcart/blockcart.php index a3fe2c2e7..b5d5a6eb9 100644 --- a/modules/blockcart/blockcart.php +++ b/modules/blockcart/blockcart.php @@ -100,20 +100,16 @@ class blockcart extends Module foreach ($products as $key => &$product) { if ($product['id_product'] == $cart_rule['gift_product'] && $product['id_product_attribute'] == $cart_rule['gift_product_attribute']) { - $product['total_wt'] = Tools::ps_round($product['total_wt'] - $product['price_wt'], - (int) $currency->decimals * _PS_PRICE_DISPLAY_PRECISION_); - $product['total'] = Tools::ps_round($product['total'] - $product['price'], - (int) $currency->decimals * _PS_PRICE_DISPLAY_PRECISION_); + $product['total_wt'] = Tools::ps_round($product['total_wt'] - $product['price_wt'], (int) $currency->decimals * _PS_PRICE_DISPLAY_PRECISION_); + $product['total'] = Tools::ps_round($product['total'] - $product['price'], (int) $currency->decimals * _PS_PRICE_DISPLAY_PRECISION_); if ($product['cart_quantity'] > 1) { array_splice($products, $key, 0, array($product)); $products[$key]['cart_quantity'] = $product['cart_quantity'] - 1; $product['cart_quantity'] = 1; } $product['is_gift'] = 1; - $cart_rule['value_real'] = Tools::ps_round($cart_rule['value_real'] - $product['price_wt'], - (int) $currency->decimals * _PS_PRICE_DISPLAY_PRECISION_); - $cart_rule['value_tax_exc'] = Tools::ps_round($cart_rule['value_tax_exc'] - $product['price'], - (int) $currency->decimals * _PS_PRICE_DISPLAY_PRECISION_); + $cart_rule['value_real'] = Tools::ps_round($cart_rule['value_real'] - $product['price_wt'], (int) $currency->decimals * _PS_PRICE_DISPLAY_PRECISION_); + $cart_rule['value_tax_exc'] = Tools::ps_round($cart_rule['value_tax_exc'] - $product['price'],(int) $currency->decimals * _PS_PRICE_DISPLAY_PRECISION_); } } } @@ -185,8 +181,7 @@ class blockcart extends Module public function install() { - if ( - parent::install() == false + if (parent::install() == false || $this->registerHook('top') == false || $this->registerHook('header') == false || $this->registerHook('actionCartListOverride') == false @@ -210,9 +205,10 @@ class blockcart extends Module $cart_htl_data = $result['cart_htl_data']; $total_rooms = $result['total_rooms_in_cart']; $this->smarty->assign(array( - 'cart_htl_data' => $cart_htl_data, - 'total_rooms_in_cart' => $total_rooms, - )); + 'cart_htl_data' => $cart_htl_data, + 'total_rooms_in_cart' => $total_rooms, + ) + ); } $warning_num = Configuration::get('WK_ROOM_LEFT_WARNING_NUMBER'); @@ -274,8 +270,7 @@ class blockcart extends Module $res['cart_booking_data'] = $result['cart_htl_data']; $res['total_rooms_in_cart'] = $result['total_rooms_in_cart']; if (is_array($res) && ($id_product = Tools::getValue('id_product')) && Configuration::get('PS_BLOCK_CART_SHOW_CROSSSELLING')) { - $this->smarty->assign('orderProducts', OrderDetail::getCrossSells($id_product, $this->context->language->id, - Configuration::get('PS_BLOCK_CART_XSELL_LIMIT'))); + $this->smarty->assign('orderProducts', OrderDetail::getCrossSells($id_product, $this->context->language->id, Configuration::get('PS_BLOCK_CART_XSELL_LIMIT'))); $res['crossSelling'] = $this->display(__FILE__, 'crossselling.tpl'); } @@ -473,12 +468,18 @@ class blockcart extends Module $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] += 1; $total_rooms += 1; $num_days = $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days']; - $vart_quant = (int) $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm'] * $num_days; + $vart_quant = (int) $cart_htl_data[$type_key]['date_diff'][$date_join]['num_rm']; - $amount = Product::getPriceStatic($type_value['id_product'], $price_tax, null, 6, null, false, true, 1); - $amount *= $vart_quant; + //// By webkul New way to calculate product prices with feature Prices + $roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($type_value['id_product'], $data_v['date_from'], $data_v['date_to']); + if (!$price_tax) { + $amount = $roomTypeDateRangePrice['total_price_tax_excl']; + } else { + $amount = $roomTypeDateRangePrice['total_price_tax_incl']; + } + //END - $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $amount; + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $amount * $vart_quant; } else { $num_days = $obj_htl_bk_dtl->getNumberOfDays($data_v['date_from'], $data_v['date_to']); $total_rooms += 1; @@ -486,8 +487,16 @@ class blockcart extends Module $cart_htl_data[$type_key]['date_diff'][$date_join]['data_form'] = date('Y-m-d', strtotime($data_v['date_from'])); $cart_htl_data[$type_key]['date_diff'][$date_join]['data_to'] = date('Y-m-d', strtotime($data_v['date_to'])); $cart_htl_data[$type_key]['date_diff'][$date_join]['num_days'] = $num_days; - $amount = Product::getPriceStatic($type_value['id_product'], $price_tax, null, 6, null, false, true, 1); - $amount *= $num_days; + + // By webkul New way to calculate product prices with feature Prices + $roomTypeDateRangePrice = HotelRoomTypeFeaturePricing::getRoomTypeTotalPrice($type_value['id_product'], $data_v['date_from'], $data_v['date_to']); + if (!$price_tax) { + $amount = $roomTypeDateRangePrice['total_price_tax_excl']; + } else { + $amount = $roomTypeDateRangePrice['total_price_tax_incl']; + } + // END + $cart_htl_data[$type_key]['date_diff'][$date_join]['amount'] = $amount; } } @@ -498,7 +507,6 @@ class blockcart extends Module } } } - return array('cart_htl_data' => $cart_htl_data, 'total_rooms_in_cart' => $total_rooms); } } diff --git a/modules/blockcart/config.xml b/modules/blockcart/config.xml new file mode 100644 index 000000000..91edd511f --- /dev/null +++ b/modules/blockcart/config.xml @@ -0,0 +1,12 @@ + + + blockcart + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockcart/error_log b/modules/blockcart/error_log index fe824fbc5..e69de29bb 100644 --- a/modules/blockcart/error_log +++ b/modules/blockcart/error_log @@ -1,284 +0,0 @@ -[08-Oct-2015 19:25:47 Asia/Kolkata] PHP Notice: Trying to get property of non-object in /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php on line 31 -[08-Oct-2015 19:25:47 Asia/Kolkata] PHP Fatal error: Uncaught You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND `id_product` = 8 AND `date_from` = '2015-10-08' AND `date_to` = '2015-10-09'' at line 1

    SELECT Count(`id`) FROM `ps_htl_cart_booking_data` WHERE `id_cart` =  AND `id_product` = 8 AND `date_from` = '2015-10-08' AND `date_to` = '2015-10-09' LIMIT 1
    - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/db/Db.php on line 765 -[08-Oct-2015 19:25:49 Asia/Kolkata] PHP Notice: Trying to get property of non-object in /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php on line 31 -[08-Oct-2015 19:25:49 Asia/Kolkata] PHP Fatal error: Uncaught You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND `id_product` = 8 AND `date_from` = '2015-10-08' AND `date_to` = '2015-10-09'' at line 1

    SELECT Count(`id`) FROM `ps_htl_cart_booking_data` WHERE `id_cart` =  AND `id_product` = 8 AND `date_from` = '2015-10-08' AND `date_to` = '2015-10-09' LIMIT 1
    - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/db/Db.php on line 765 -[08-Oct-2015 19:25:51 Asia/Kolkata] PHP Notice: Trying to get property of non-object in /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php on line 31 -[08-Oct-2015 19:25:51 Asia/Kolkata] PHP Fatal error: Uncaught You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND `id_product` = 8 AND `date_from` = '2015-10-08' AND `date_to` = '2015-10-09'' at line 1

    SELECT Count(`id`) FROM `ps_htl_cart_booking_data` WHERE `id_cart` =  AND `id_product` = 8 AND `date_from` = '2015-10-08' AND `date_to` = '2015-10-09' LIMIT 1
    - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/db/Db.php on line 765 -[09-Oct-2015 12:29:00 Asia/Kolkata] PHP Notice: Trying to get property of non-object in /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php on line 31 -[09-Oct-2015 12:29:00 Asia/Kolkata] PHP Fatal error: Uncaught You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND `id_product` = 8 AND `date_from` = '2015-10-09' AND `date_to` = '2015-10-10'' at line 1

    SELECT Count(`id`) FROM `ps_htl_cart_booking_data` WHERE `id_cart` =  AND `id_product` = 8 AND `date_from` = '2015-10-09' AND `date_to` = '2015-10-10' LIMIT 1
    - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/db/Db.php on line 765 -[09-Oct-2015 12:29:11 Asia/Kolkata] PHP Notice: Trying to get property of non-object in /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php on line 31 -[09-Oct-2015 12:29:11 Asia/Kolkata] PHP Fatal error: Uncaught You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND `id_product` = 10 AND `date_from` = '2015-10-09' AND `date_to` = '2015-10-10' at line 1

    SELECT Count(`id`) FROM `ps_htl_cart_booking_data` WHERE `id_cart` =  AND `id_product` = 10 AND `date_from` = '2015-10-09' AND `date_to` = '2015-10-10' LIMIT 1
    - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/db/Db.php on line 765 -[09-Oct-2015 12:29:42 Asia/Kolkata] PHP Notice: Trying to get property of non-object in /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php on line 31 -[09-Oct-2015 12:29:42 Asia/Kolkata] PHP Fatal error: Uncaught You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND `id_product` = 10 AND `date_from` = '2016-05-13' AND `date_to` = '2016-05-14' at line 1

    SELECT Count(`id`) FROM `ps_htl_cart_booking_data` WHERE `id_cart` =  AND `id_product` = 10 AND `date_from` = '2016-05-13' AND `date_to` = '2016-05-14' LIMIT 1
    - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/db/Db.php on line 765 -[09-Oct-2015 15:45:59 Asia/Kolkata] PHP Fatal error: Uncaught Unknown column 'undefined' in 'where clause'

    SELECT Count(`id`) FROM `ps_htl_cart_booking_data` WHERE `id_cart` = undefined AND `id_product` = 10 AND `date_from` = '2015-10-09' AND `date_to` = '2015-10-10' LIMIT 1
    - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/db/Db.php on line 765 -[09-Oct-2015 15:56:46 Asia/Kolkata] PHP Fatal error: Uncaught Unknown column 'undefined' in 'where clause'

    SELECT Count(`id`) FROM `ps_htl_cart_booking_data` WHERE `id_cart` = undefined AND `id_product` = 9 AND `date_from` = '2015-10-10' AND `date_to` = '2015-10-15' LIMIT 1
    - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/db/Db.php on line 765 -[15-Oct-2015 19:38:15 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[15-Oct-2015 19:39:58 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[15-Oct-2015 19:40:02 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[15-Oct-2015 19:40:06 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[15-Oct-2015 19:57:50 Asia/Kolkata] PHP Fatal error: Uncaught You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'd code on line 143
    -
    -Notice: Trying to get propert' at line 1

    SELECT Count(`id`) FROM `ps_htl_cart_booking_data` WHERE `id_cart` = 11 AND `id_product` = 8 AND `date_from` = '2015-10-15' AND `date_to` = '
    -Notice: Undefined index: booking_to_from in /home/rjain/public_html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_templatebase.php(171) : eval()'d code on line 143
    -
    -Notice: Trying to get property of non-object in /home/rjain/public_html/ps-hotel-reservation-system/tools/smarty/sysplugins/smarty_internal_templatebase.php(171) : eval()'d code on line 143
    -' LIMIT 1
    - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/db/Db.php on line 791 -[15-Oct-2015 19:58:13 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_to is not valid' in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[15-Oct-2015 19:58:18 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_to is not valid' in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[15-Oct-2015 19:59:08 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[15-Oct-2015 19:59:09 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[15-Oct-2015 19:59:20 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[15-Oct-2015 19:59:48 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[17-Nov-2015 03:19:30 US/Eastern] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->id_currency is empty' in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[17-Nov-2015 03:19:46 US/Eastern] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->id_currency is empty' in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[17-Nov-2015 03:21:15 US/Eastern] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->id_currency is empty' in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[17-Nov-2015 03:21:54 US/Eastern] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->id_currency is empty' in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/sumit/public_html/html/ps-hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(61): ObjectModelCore->save() -#4 {main} - thrown in /home/sumit/public_html/html/ps-hotel-reservation-system/classes/ObjectModel.php on line 909 -[17-Nov-2015 16:28:29 Asia/Calcutta] PHP Parse error: syntax error, unexpected ';' in /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php on line 62 -[17-Nov-2015 16:28:51 Asia/Calcutta] PHP Parse error: syntax error, unexpected ';' in /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php on line 62 -[03-Dec-2015 16:41:09 Asia/Calcutta] PHP Parse error: syntax error, unexpected end of file in /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php on line 152 -[03-Dec-2015 23:27:36 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[03-Dec-2015 23:35:21 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[03-Dec-2015 23:37:04 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[03-Dec-2015 23:37:35 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[03-Dec-2015 23:37:58 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[03-Dec-2015 23:38:56 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[03-Dec-2015 23:40:25 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[03-Dec-2015 23:45:07 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[03-Dec-2015 23:47:47 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[03-Dec-2015 23:48:21 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[04-Dec-2015 11:43:49 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[04-Dec-2015 11:46:49 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[04-Dec-2015 11:53:57 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[07-Dec-2015 19:21:14 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[07-Dec-2015 19:24:11 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->date_from is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[14-Dec-2015 11:36:37 Asia/Kolkata] PHP Notice: Undefined variable: total_available_rooms in /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php on line 111 -[30-Dec-2015 17:23:43 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->id_cart is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[30-Dec-2015 17:23:58 Asia/Kolkata] PHP Fatal error: Uncaught exception 'PrestaShopException' with message 'Property HotelCartBookingData->id_cart is not valid' in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php:909 -Stack trace: -#0 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(246): ObjectModelCore->validateFields() -#1 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(487): ObjectModelCore->getFields() -#2 /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php(445): ObjectModelCore->add(true, false) -#3 /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php(65): ObjectModelCore->save() -#4 {main} - thrown in /home/rjain/public_html/hotel-reservation-system/classes/ObjectModel.php on line 909 -[31-Dec-2015 16:45:22 Asia/Calcutta] PHP Fatal error: Class 'FrontController' not found in /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php on line 3 -[31-Dec-2015 16:46:41 Asia/Calcutta] PHP Fatal error: Class 'FrontController' not found in /home/rjain/public_html/hotel-reservation-system/modules/blockcart/checkroomavailabilityajaxprocess.php on line 3 diff --git a/modules/blockcategories/config.xml b/modules/blockcategories/config.xml new file mode 100644 index 000000000..aebb976f0 --- /dev/null +++ b/modules/blockcategories/config.xml @@ -0,0 +1,12 @@ + + + blockcategories + + + + + + 1 + 1 + + \ No newline at end of file diff --git a/modules/blockcms/config.xml b/modules/blockcms/config.xml new file mode 100644 index 000000000..52a80dbfb --- /dev/null +++ b/modules/blockcms/config.xml @@ -0,0 +1,12 @@ + + + blockcms + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockcmsinfo/config.xml b/modules/blockcmsinfo/config.xml new file mode 100644 index 000000000..3c7c6224b --- /dev/null +++ b/modules/blockcmsinfo/config.xml @@ -0,0 +1,12 @@ + + + blockcmsinfo + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockcontact/config.xml b/modules/blockcontact/config.xml new file mode 100644 index 000000000..655f63557 --- /dev/null +++ b/modules/blockcontact/config.xml @@ -0,0 +1,12 @@ + + + blockcontact + + + + + + 1 + 1 + + \ No newline at end of file diff --git a/modules/blockcontactinfos/config.xml b/modules/blockcontactinfos/config.xml new file mode 100644 index 000000000..f804a94e2 --- /dev/null +++ b/modules/blockcontactinfos/config.xml @@ -0,0 +1,12 @@ + + + blockcontactinfos + + + + + + 1 + 1 + + \ No newline at end of file diff --git a/modules/blockcurrencies/config.xml b/modules/blockcurrencies/config.xml new file mode 100644 index 000000000..44a3ddac6 --- /dev/null +++ b/modules/blockcurrencies/config.xml @@ -0,0 +1,12 @@ + + + blockcurrencies + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/blockcustomerprivacy/config.xml b/modules/blockcustomerprivacy/config.xml new file mode 100644 index 000000000..441335c2f --- /dev/null +++ b/modules/blockcustomerprivacy/config.xml @@ -0,0 +1,12 @@ + + + blockcustomerprivacy + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockfacebook/config.xml b/modules/blockfacebook/config.xml new file mode 100644 index 000000000..2bbadf31e --- /dev/null +++ b/modules/blockfacebook/config.xml @@ -0,0 +1,12 @@ + + + blockfacebook + + + + + + 1 + 1 + + \ No newline at end of file diff --git a/modules/blocklanguages/config.xml b/modules/blocklanguages/config.xml new file mode 100644 index 000000000..b7dc87b64 --- /dev/null +++ b/modules/blocklanguages/config.xml @@ -0,0 +1,12 @@ + + + blocklanguages + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/blocklayered/config.xml b/modules/blocklayered/config.xml new file mode 100644 index 000000000..b8f86fb5e --- /dev/null +++ b/modules/blocklayered/config.xml @@ -0,0 +1,12 @@ + + + blocklayered + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blocklink/config.xml b/modules/blocklink/config.xml new file mode 100644 index 000000000..69b09d7ec --- /dev/null +++ b/modules/blocklink/config.xml @@ -0,0 +1,13 @@ + + + blocklink + + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockmanufacturer/config.xml b/modules/blockmanufacturer/config.xml new file mode 100644 index 000000000..7d92a4a5e --- /dev/null +++ b/modules/blockmanufacturer/config.xml @@ -0,0 +1,12 @@ + + + blockmanufacturer + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockmyaccount/config.xml b/modules/blockmyaccount/config.xml new file mode 100644 index 000000000..4c6f2d9e1 --- /dev/null +++ b/modules/blockmyaccount/config.xml @@ -0,0 +1,12 @@ + + + blockmyaccount + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/blockmyaccountfooter/config.xml b/modules/blockmyaccountfooter/config.xml new file mode 100644 index 000000000..929688464 --- /dev/null +++ b/modules/blockmyaccountfooter/config.xml @@ -0,0 +1,12 @@ + + + blockmyaccountfooter + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/blocknavigationmenu/config.xml b/modules/blocknavigationmenu/config.xml new file mode 100644 index 000000000..3599b40a2 --- /dev/null +++ b/modules/blocknavigationmenu/config.xml @@ -0,0 +1,12 @@ + + + blocknavigationmenu + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/blocknewproducts/config.xml b/modules/blocknewproducts/config.xml new file mode 100644 index 000000000..9efea5d91 --- /dev/null +++ b/modules/blocknewproducts/config.xml @@ -0,0 +1,12 @@ + + + blocknewproducts + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blocknewsletter/config.xml b/modules/blocknewsletter/config.xml new file mode 100644 index 000000000..e7c7b1ec0 --- /dev/null +++ b/modules/blocknewsletter/config.xml @@ -0,0 +1,13 @@ + + + blocknewsletter + + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockpaymentlogo/config.xml b/modules/blockpaymentlogo/config.xml new file mode 100644 index 000000000..e7f6d4740 --- /dev/null +++ b/modules/blockpaymentlogo/config.xml @@ -0,0 +1,12 @@ + + + blockpaymentlogo + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockpermanentlinks/config.xml b/modules/blockpermanentlinks/config.xml new file mode 100644 index 000000000..d24b395fb --- /dev/null +++ b/modules/blockpermanentlinks/config.xml @@ -0,0 +1,12 @@ + + + blockpermanentlinks + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/blockreinsurance/config.xml b/modules/blockreinsurance/config.xml new file mode 100644 index 000000000..5479e9fc9 --- /dev/null +++ b/modules/blockreinsurance/config.xml @@ -0,0 +1,12 @@ + + + blockreinsurance + + + + + + 1 + 1 + + \ No newline at end of file diff --git a/modules/blockrss/config.xml b/modules/blockrss/config.xml new file mode 100644 index 000000000..0ec644bfb --- /dev/null +++ b/modules/blockrss/config.xml @@ -0,0 +1,12 @@ + + + blockrss + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blocksearch/config.xml b/modules/blocksearch/config.xml new file mode 100644 index 000000000..3700edd90 --- /dev/null +++ b/modules/blocksearch/config.xml @@ -0,0 +1,12 @@ + + + blocksearch + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/blocksharefb/config.xml b/modules/blocksharefb/config.xml new file mode 100644 index 000000000..3a7133225 --- /dev/null +++ b/modules/blocksharefb/config.xml @@ -0,0 +1,12 @@ + + + blocksharefb + + + + + + 0 + 1 + + \ No newline at end of file diff --git a/modules/blocksocial/config.xml b/modules/blocksocial/config.xml new file mode 100644 index 000000000..8c5a3293b --- /dev/null +++ b/modules/blocksocial/config.xml @@ -0,0 +1,12 @@ + + + blocksocial + + + + + + 1 + 1 + + \ No newline at end of file diff --git a/modules/blockspecials/config.xml b/modules/blockspecials/config.xml new file mode 100644 index 000000000..be4ff91c4 --- /dev/null +++ b/modules/blockspecials/config.xml @@ -0,0 +1,12 @@ + + + blockspecials + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockstore/config.xml b/modules/blockstore/config.xml new file mode 100644 index 000000000..f03f9d37b --- /dev/null +++ b/modules/blockstore/config.xml @@ -0,0 +1,12 @@ + + + blockstore + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blocksupplier/config.xml b/modules/blocksupplier/config.xml new file mode 100644 index 000000000..c49a440c5 --- /dev/null +++ b/modules/blocksupplier/config.xml @@ -0,0 +1,12 @@ + + + blocksupplier + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blocktags/config.xml b/modules/blocktags/config.xml new file mode 100644 index 000000000..07f3c3f3f --- /dev/null +++ b/modules/blocktags/config.xml @@ -0,0 +1,12 @@ + + + blocktags + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blocktopmenu/config.xml b/modules/blocktopmenu/config.xml new file mode 100644 index 000000000..a8a4183ac --- /dev/null +++ b/modules/blocktopmenu/config.xml @@ -0,0 +1,12 @@ + + + blocktopmenu + + + + + + 1 + 1 + + \ No newline at end of file diff --git a/modules/blockuserinfo/config.xml b/modules/blockuserinfo/config.xml new file mode 100644 index 000000000..b44688b55 --- /dev/null +++ b/modules/blockuserinfo/config.xml @@ -0,0 +1,12 @@ + + + blockuserinfo + + + + + + 0 + 0 + + \ No newline at end of file diff --git a/modules/blockviewed/config.xml b/modules/blockviewed/config.xml new file mode 100644 index 000000000..f65f3b14a --- /dev/null +++ b/modules/blockviewed/config.xml @@ -0,0 +1,12 @@ + + + blockviewed + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/blockwishlist/config.xml b/modules/blockwishlist/config.xml new file mode 100644 index 000000000..f9d441d49 --- /dev/null +++ b/modules/blockwishlist/config.xml @@ -0,0 +1,12 @@ + + + blockwishlist + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/cashondelivery/CHANGELOG.txt b/modules/cashondelivery/CHANGELOG.txt new file mode 100644 index 000000000..51939af1b --- /dev/null +++ b/modules/cashondelivery/CHANGELOG.txt @@ -0,0 +1,7 @@ +2014-04-22 15:05:15 +0200 // cashondelivery: wrong word + typography. +2014-04-17 11:47:55 +0200 // Fixed indent +2014-04-17 11:45:29 +0200 // Fix config.xml indent +2014-04-17 11:42:08 +0200 [-] MO : cashondelivery - Fix 1.5 ps_version_compliancy issue +2014-04-07 15:10:41 +0200 // cashondelivery: string easier to translate. +2014-03-24 18:26:00 +0100 / MO cashondelivery : ps_versions_compliancy added +2014-03-21 10:53:57 +0100 Initial commit diff --git a/modules/cashondelivery/Readme.md b/modules/cashondelivery/Readme.md new file mode 100644 index 000000000..87bea21c1 --- /dev/null +++ b/modules/cashondelivery/Readme.md @@ -0,0 +1,37 @@ +# Cash on delivery (COD) + +## About + +Accept cash on delivery payments + +## Contributing + +PrestaShop modules are open-source extensions to the PrestaShop e-commerce solution. Everyone is welcome and even encouraged to contribute with their own improvements. + +### Requirements + +Contributors **must** follow the following rules: + +* **Make your Pull Request on the "dev" branch**, NOT the "master" branch. +* Do not update the module's version number. +* Follow [the coding standards][1]. + +### Process in details + +Contributors wishing to edit a module's files should follow the following process: + +1. Create your GitHub account, if you do not have one already. +2. Fork the cashondelivery project to your GitHub account. +3. Clone your fork to your local machine in the ```/modules``` directory of your PrestaShop installation. +4. Create a branch in your local clone of the module for your changes. +5. Change the files in your branch. Be sure to follow [the coding standards][1]! +6. Push your changed branch to your fork in your GitHub account. +7. Create a pull request for your changes **on the _'dev'_ branch** of the module's project. Be sure to follow [the commit message norm][2] in your pull request. If you need help to make a pull request, read the [Github help page about creating pull requests][3]. +8. Wait for one of the core developers either to include your change in the codebase, or to comment on possible improvements you should make to your code. + +That's it: you have contributed to this open-source project! Congratulations! + +[1]: http://doc.prestashop.com/display/PS16/Coding+Standards +[2]: http://doc.prestashop.com/display/PS16/How+to+write+a+commit+message +[3]: https://help.github.com/articles/using-pull-requests + diff --git a/modules/cashondelivery/cashondelivery.gif b/modules/cashondelivery/cashondelivery.gif new file mode 100644 index 0000000000000000000000000000000000000000..926ce1d7c56ef4e7bc8cb160f0c74a6cbf737e74 GIT binary patch literal 2391 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 jKjRUbZX_JX7IV*5K*U0@x{|oFX|6326PBD +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +if (!defined('_PS_VERSION_')) + exit; + +class CashOnDelivery extends PaymentModule +{ + public function __construct() + { + $this->name = 'cashondelivery'; + $this->tab = 'payments_gateways'; + $this->version = '1.0.0'; + $this->author = 'PrestaShop'; + $this->need_instance = 1; + $this->controllers = array('validation'); + $this->is_eu_compatible = 1; + + $this->currencies = false; + + parent::__construct(); + + $this->displayName = $this->l('Cash on delivery (COD)'); + $this->description = $this->l('Accept cash on delivery payments'); + + /* For 1.4.3 and less compatibility */ + $updateConfig = array('PS_OS_CHEQUE', 'PS_OS_PAYMENT', 'PS_OS_PREPARATION', 'PS_OS_SHIPPING', 'PS_OS_CANCELED', 'PS_OS_REFUND', 'PS_OS_ERROR', 'PS_OS_OUTOFSTOCK', 'PS_OS_BANKWIRE', 'PS_OS_PAYPAL', 'PS_OS_WS_PAYMENT'); + if (!Configuration::get('PS_OS_PAYMENT')) + foreach ($updateConfig as $u) + if (!Configuration::get($u) && defined('_'.$u.'_')) + Configuration::updateValue($u, constant('_'.$u.'_')); + } + + public function install() + { + if (!parent::install() OR !$this->registerHook('payment') OR ! $this->registerHook('displayPaymentEU') OR !$this->registerHook('paymentReturn')) + return false; + return true; + } + + public function hasProductDownload($cart) + { + foreach ($cart->getProducts() AS $product) + { + $pd = ProductDownload::getIdFromIdProduct((int)($product['id_product'])); + if ($pd AND Validate::isUnsignedInt($pd)) + return true; + } + return false; + } + + public function hookPayment($params) + { + if (!$this->active) + return ; + + global $smarty; + + // Check if cart has product download + if ($this->hasProductDownload($params['cart'])) + return false; + + + $smarty->assign(array( + 'this_path' => $this->_path, //keep for retro compat + 'this_path_cod' => $this->_path, + 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->name.'/' + )); + return $this->display(__FILE__, 'payment.tpl'); + } + + public function hookDisplayPaymentEU($params) + { + if (!$this->active) + return ; + + // Check if cart has product download + if ($this->hasProductDownload($params['cart'])) + return false; + + return array( + 'cta_text' => $this->l('Pay with cash on delivery (COD)'), + 'logo' => Media::getMediaPath(dirname(__FILE__).'/cashondelivery.jpg'), + 'action' => $this->context->link->getModuleLink($this->name, 'validation', array('confirm' => true), true) + ); + } + + public function hookPaymentReturn($params) + { + if (!$this->active) + return ; + + return $this->display(__FILE__, 'confirmation.tpl'); + } +} diff --git a/modules/cashondelivery/composer.json b/modules/cashondelivery/composer.json new file mode 100644 index 000000000..552e30ba4 --- /dev/null +++ b/modules/cashondelivery/composer.json @@ -0,0 +1,19 @@ +{ + "name": "prestashop/cashondelivery", + "description": "PrestaShop module cashondelivery", + "homepage": "https://github.com/PrestaShop/cashondelivery", + "license": "AFL - Academic Free License (AFL 3.0)", + "authors": [ + { + "name": "PrestaShop SA", + "email": "contact@prestashop.com" + } + ], + "require": { + "php": ">=5.3.2" + }, + "config": { + "preferred-install": "dist" + }, + "type": "prestashop-module" +} diff --git a/modules/cashondelivery/config.xml b/modules/cashondelivery/config.xml new file mode 100644 index 000000000..816033591 --- /dev/null +++ b/modules/cashondelivery/config.xml @@ -0,0 +1,12 @@ + + +cashondelivery + + + + + + 0 + 1 + + diff --git a/modules/cashondelivery/controllers/front/index.php b/modules/cashondelivery/controllers/front/index.php new file mode 100644 index 000000000..e5064df41 --- /dev/null +++ b/modules/cashondelivery/controllers/front/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +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; \ No newline at end of file diff --git a/modules/cashondelivery/controllers/front/validation.php b/modules/cashondelivery/controllers/front/validation.php new file mode 100644 index 000000000..955e47b8b --- /dev/null +++ b/modules/cashondelivery/controllers/front/validation.php @@ -0,0 +1,80 @@ + +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +/** + * @since 1.5.0 + */ +class CashondeliveryValidationModuleFrontController extends ModuleFrontController +{ + public $ssl = true; + public $display_column_left = false; + + public function postProcess() + { + if ($this->context->cart->id_customer == 0 || $this->context->cart->id_address_delivery == 0 || $this->context->cart->id_address_invoice == 0 || !$this->module->active) + Tools::redirectLink(__PS_BASE_URI__.'order.php?step=1'); + + // Check that this payment option is still available in case the customer changed his address just before the end of the checkout process + $authorized = false; + foreach (Module::getPaymentModules() as $module) + if ($module['name'] == 'cashondelivery') + { + $authorized = true; + break; + } + if (!$authorized) + die(Tools::displayError('This payment method is not available.')); + + $customer = new Customer($this->context->cart->id_customer); + if (!Validate::isLoadedObject($customer)) + Tools::redirectLink(__PS_BASE_URI__.'order.php?step=1'); + + if (Tools::getValue('confirm')) + { + $customer = new Customer((int)$this->context->cart->id_customer); + $total = $this->context->cart->getOrderTotal(true, Cart::BOTH); + $this->module->validateOrder((int)$this->context->cart->id, Configuration::get('PS_OS_PREPARATION'), $total, $this->module->displayName, null, array(), null, false, $customer->secure_key); + Tools::redirectLink(__PS_BASE_URI__.'order-confirmation.php?key='.$customer->secure_key.'&id_cart='.(int)$this->context->cart->id.'&id_module='.(int)$this->module->id.'&id_order='.(int)$this->module->currentOrder); + } + } + + /** + * @see FrontController::initContent() + */ + public function initContent() + { + parent::initContent(); + + $this->context->smarty->assign(array( + 'total' => $this->context->cart->getOrderTotal(true, Cart::BOTH), + 'this_path' => $this->module->getPathUri(),//keep for retro compat + 'this_path_cod' => $this->module->getPathUri(), + 'this_path_ssl' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.'modules/'.$this->module->name.'/' + )); + + $this->setTemplate('validation.tpl'); + } +} diff --git a/modules/cashondelivery/controllers/index.php b/modules/cashondelivery/controllers/index.php new file mode 100644 index 000000000..e5064df41 --- /dev/null +++ b/modules/cashondelivery/controllers/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +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; \ No newline at end of file diff --git a/modules/cashondelivery/index.php b/modules/cashondelivery/index.php new file mode 100644 index 000000000..e5064df41 --- /dev/null +++ b/modules/cashondelivery/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +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; \ No newline at end of file diff --git a/modules/cashondelivery/logo.gif b/modules/cashondelivery/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..a082499446067f528398020a42a7f6491bd6fa6f GIT binary patch literal 425 zcmV;a0apG;Nk%w1VGsZi0M!5hD1QQ{%a7NuO^CN@@ZiF3qc`i=qQr+O-MDD=(0A+1 zgHe|u|Mb^;u2j;ZSKYaJ`s~j7wPjnMJLtYg`}Xcj zl{28liT>Y|%9AnLtWS@-b91Ur&YM2oymI8QOYqQ(``m-z#eMAAvH$kn|Nr)^&6EG- zr1s^$A^8LW2LL<(EC2ui01yBW000KYK%Q_&QshX(g$3HWU;E6Dup3j-44VCMF#P4GT63Fan&NA_ck=4FNM28nqWY86vqo$N@4g zAR`AgH9y2Y6Fo8mDcKb&06aP|V-OPo0WK~n6(AN;m^48W;w1q!n)sqokQWjKL;6c;`OR7LLVlvzk6uF70 z5CT{_cG@YWm+9Qj**?sfX{SIfP|}sG$xhB>|KC|_?X}Jptu>Qrib*yZ4+NZ3J?+17QEQWqxM*%=z?QIZfBKJayFu_0=X? zj}0IKiJm-NJsx#cCQ}}q&DFEVcw)sd2gr^Gz&^gYDKn#aITGIsN+F`?N@n@DGfjQ1 zL$tvi24Pq@-kB!RondN&OI?kP);{g79ko9qqWBOgOq6>bRL=U7Js&`p=s60G6*Rb ze>^k$jh*=CJ_Srr21A2clHL9E_hm?@vs8p#s%k2zua8hXKq8Px^m8qlA~l%Cb!{T| zIn>lf2!(C%Js^*IbTy~9Eu(4GsS-pHz&^31DKqE&gY@iQPH%69WLH0_RE|*Cp<#Lr zwY8OmDjc-dfm4iz4vBo&nctAkVC_^~2dtD0< zG66?>9%ke7bbZwfhBKTQJ<;7pgO{Q1rGsd1Er4Sdx}k>bb;JrGhD)*WOt@(utrTRh z7vD~qMMRzL!?0{H?0X7;^3mD8QdrDVvT}VW(<(4c5P$#@2x)YoF^L7azG8s{0D$&V zD9Zt5|IdgRzqqLkY%u`HY7fuP7aEk88Xh>sze}zkWdsqJ004#H8aA^JZD&@*=8IWN zu}y=Vr;*%1Nkf%*bqX;o#4vBm4a34PZOqYb*^5&^;uVnlwpPFUex&2s91ku^j$To||U3sZO z5u(PG0wsc}EIvNd%AWRiM2~8Q66~ZwluOIpm)Ub-7oYsTm$lOtVv1Q_12BYPSm<$n zBpIT>v}ygPoz{0gqc7KnFuHy;T6-v6%^&eyES|TF){{F~e|RfPrE(ZRL_lXzwvE;@ z&Nf>BP{2^GnzctcCuvN>$IKT&bEB*C;-z#-0=A8UlbS)N?_3I z0BfvyPyo}wg`O{YX68&b|8=$mppygM;S=BPdD_2?sbiq16bsXU6df4Ott&_S#kv7) zX885OS^Pd?fHr~ja~~al8>k)Gn8s;V^9J_ij5tpCCIA|I4f)`6)HL8yI~@3#SZo9D z0%-|ELx6h+9q9gN*RVZQ$-?4Wmg#HA=i#+i3hT?4;in&o#Wt`4xB~RvZOe-Q4~`K% zYtef4EnfzIpN9kA6N_yuiC+Ue^DY5~g3S`Qh+dUpz@;m2validation_ea9cf7e47ff33b2be14e6dd07cbcefc6'] = 'Shipping'; +$_MODULE['<{cashondelivery}prestashop>validation_f1d3b424cd68795ecaa552883759aceb'] = 'Order summary'; +$_MODULE['<{cashondelivery}prestashop>validation_d538c5b86e9a71455ba27412f4e9ab51'] = 'Cash on delivery (COD) payment'; +$_MODULE['<{cashondelivery}prestashop>validation_ad2f6328c24caa7d25dd34bfc3e7e25a'] = 'You have chosen the Cash on Delivery method.'; +$_MODULE['<{cashondelivery}prestashop>validation_e2867a925cba382f1436d1834bb52a1c'] = 'The total amount of your order is'; +$_MODULE['<{cashondelivery}prestashop>validation_1f87346a16cf80c372065de3c54c86d9'] = '(tax incl.)'; +$_MODULE['<{cashondelivery}prestashop>validation_52f64bc0164b0e79deaeaaaa7e93f98f'] = 'Please confirm your order by clicking \'I confirm my order\'.'; +$_MODULE['<{cashondelivery}prestashop>validation_569fd05bdafa1712c4f6be5b153b8418'] = 'Other payment methods'; +$_MODULE['<{cashondelivery}prestashop>validation_46b9e3665f187c739c55983f757ccda0'] = 'I confirm my order'; +$_MODULE['<{cashondelivery}prestashop>confirmation_2e2117b7c81aa9ea6931641ea2c6499f'] = 'Your order on'; +$_MODULE['<{cashondelivery}prestashop>confirmation_75fbf512d744977d62599cc3f0ae2bb4'] = 'is complete.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_8861c5d3fa54b330d1f60ba50fcc4aab'] = 'You have chosen the cash on delivery method.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_e6dc7945b557a1cd949bea92dd58963e'] = 'Your order will be sent very soon.'; +$_MODULE['<{cashondelivery}prestashop>confirmation_0db71da7150c27142eef9d22b843b4a9'] = 'For any questions or for further information, please contact our'; +$_MODULE['<{cashondelivery}prestashop>confirmation_64430ad2835be8ad60c59e7d44e4b0b1'] = 'customer support'; +$_MODULE['<{cashondelivery}prestashop>payment_b7ada96a0da7ee7fb5371cca0b036d5c'] = 'Pay with cash on delivery (COD)'; +$_MODULE['<{cashondelivery}prestashop>payment_536dc7424180872c8c2488ae0286fb53'] = 'You pay for the merchandise upon delivery'; + + +return $_MODULE; diff --git a/modules/cashondelivery/translations/fr.php b/modules/cashondelivery/translations/fr.php new file mode 100644 index 000000000..9b30d925b --- /dev/null +++ b/modules/cashondelivery/translations/fr.php @@ -0,0 +1,8 @@ + +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +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; \ No newline at end of file diff --git a/modules/cashondelivery/views/index.php b/modules/cashondelivery/views/index.php new file mode 100644 index 000000000..e5064df41 --- /dev/null +++ b/modules/cashondelivery/views/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +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; \ No newline at end of file diff --git a/modules/cashondelivery/views/templates/front/index.php b/modules/cashondelivery/views/templates/front/index.php new file mode 100644 index 000000000..e5064df41 --- /dev/null +++ b/modules/cashondelivery/views/templates/front/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +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; \ No newline at end of file diff --git a/modules/cashondelivery/views/templates/front/validation.tpl b/modules/cashondelivery/views/templates/front/validation.tpl new file mode 100644 index 000000000..b712dd7b7 --- /dev/null +++ b/modules/cashondelivery/views/templates/front/validation.tpl @@ -0,0 +1,60 @@ +{* +* 2007-2016 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +{capture name=path} + {l s='Checkout' mod='cashondelivery'}{$navigationPipe}{l s='Cash on delivery (COD) payment' mod='cashondelivery'} +{/capture} + +{include file="$tpl_dir./breadcrumb.tpl"} + +

    {l s='Order summary' mod='cashondelivery'}

    + +{assign var='current_step' value='payment'} +{include file="$tpl_dir./order-steps.tpl"} + +

    {l s='Cash on delivery (COD) payment' mod='cashondelivery'}

    + +
    + +

    + {l s='Cash on delivery (COD) payment' mod='cashondelivery'} + {l s='You have chosen the Cash on Delivery method.' mod='cashondelivery'} +

    + {l s='The total amount of your order is' mod='cashondelivery'} + {convertPrice price=$total} + {if $use_taxes == 1} + {l s='(tax incl.)' mod='cashondelivery'} + {/if} +

    +

    +

    +

    + {l s='Please confirm your order by clicking \'I confirm my order\'.' mod='cashondelivery'} +

    +

    + {l s='Other payment methods' mod='cashondelivery'} + +

    +
    diff --git a/modules/cashondelivery/views/templates/hook/confirmation.tpl b/modules/cashondelivery/views/templates/hook/confirmation.tpl new file mode 100644 index 000000000..341cd7895 --- /dev/null +++ b/modules/cashondelivery/views/templates/hook/confirmation.tpl @@ -0,0 +1,31 @@ +{* +* 2007-2016 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    {l s='Your order on %s is complete.' sprintf=$shop_name mod='cashondelivery'} +

    + {l s='You have chosen the cash on delivery method.' mod='cashondelivery'} +

    {l s='Your order will be sent very soon.' mod='cashondelivery'} +

    {l s='For any questions or for further information, please contact our' mod='cashondelivery'} {l s='customer support' mod='cashondelivery'}. +

    diff --git a/modules/cashondelivery/views/templates/hook/index.php b/modules/cashondelivery/views/templates/hook/index.php new file mode 100644 index 000000000..e5064df41 --- /dev/null +++ b/modules/cashondelivery/views/templates/hook/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +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; \ No newline at end of file diff --git a/modules/cashondelivery/views/templates/hook/payment.tpl b/modules/cashondelivery/views/templates/hook/payment.tpl new file mode 100644 index 000000000..321e40c2c --- /dev/null +++ b/modules/cashondelivery/views/templates/hook/payment.tpl @@ -0,0 +1,33 @@ +{* +* 2007-2016 PrestaShop +* +* NOTICE OF LICENSE +* +* This source file is subject to the Academic Free License (AFL 3.0) +* that is bundled with this package in the file LICENSE.txt. +* It is also available through the world-wide-web at this URL: +* http://opensource.org/licenses/afl-3.0.php +* If you did not receive a copy of the license and are unable to +* obtain it through the world-wide-web, please send an email +* to license@prestashop.com so we can send you a copy immediately. +* +* DISCLAIMER +* +* Do not edit or add to this file if you wish to upgrade PrestaShop to newer +* versions in the future. If you wish to customize PrestaShop for your +* needs please refer to http://www.prestashop.com for more information. +* +* @author PrestaShop SA +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*} + +

    + + {l s='Pay with cash on delivery (COD)' mod='cashondelivery'} +
    {l s='Pay with cash on delivery (COD)' mod='cashondelivery'} +
    {l s='You pay for the merchandise upon delivery' mod='cashondelivery'} +
    +
    +

    \ No newline at end of file diff --git a/modules/cashondelivery/views/templates/index.php b/modules/cashondelivery/views/templates/index.php new file mode 100644 index 000000000..e5064df41 --- /dev/null +++ b/modules/cashondelivery/views/templates/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +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; \ No newline at end of file diff --git a/modules/cheque/config.xml b/modules/cheque/config.xml new file mode 100644 index 000000000..909c3c73b --- /dev/null +++ b/modules/cheque/config.xml @@ -0,0 +1,13 @@ + + + cheque + + + + + + + 1 + 1 + + \ No newline at end of file diff --git a/modules/cronjobs/classes/CronJobsForms.php b/modules/cronjobs/classes/CronJobsForms.php index 3063b7a59..f889a0de9 100644 --- a/modules/cronjobs/classes/CronJobsForms.php +++ b/modules/cronjobs/classes/CronJobsForms.php @@ -24,337 +24,337 @@ * International Registered Trademark & Property of PrestaShop SA */ -if (!defined('_PS_VERSION_')) - exit; +if (!defined('_PS_VERSION_')) { + exit; +} class CronJobsForms { - protected static $module = false; + protected static $module = false; - public static function init($module) - { - if (self::$module == false) - self::$module = $module; + public static function init($module) + { + if (self::$module == false) { + self::$module = $module; + } - return self::$module; - } + return self::$module; + } - public static function getJobForm($title = 'New cron task', $update = false) - { - $form = array( - array( - 'form' => array( - 'legend' => array( - 'title' => self::$module->l($title), - 'icon' => 'icon-plus', - ), - 'input' => array(), - 'submit' => array('title' => self::$module->l('Save', 'CronJobsForms'), 'type' => 'submit', 'class' => 'btn btn-default pull-right'), - ), - ), - ); + public static function getJobForm($title = 'New cron task', $update = false) + { + $form = array( + array( + 'form' => array( + 'legend' => array( + 'title' => self::$module->l($title), + 'icon' => 'icon-plus', + ), + 'input' => array(), + 'submit' => array('title' => self::$module->l('Save', 'CronJobsForms'), 'type' => 'submit', 'class' => 'btn btn-default pull-right'), + ), + ), + ); - $id_shop = (int)Context::getContext()->shop->id; - $id_shop_group = (int)Context::getContext()->shop->id_shop_group; + $id_shop = (int)Context::getContext()->shop->id; + $id_shop_group = (int)Context::getContext()->shop->id_shop_group; - $currencies_cron_url = Tools::getShopDomain(true, true).__PS_BASE_URI__.basename(_PS_ADMIN_DIR_); - $currencies_cron_url .= '/cron_currency_rates.php?secure_key='.md5(_COOKIE_KEY_.Configuration::get('PS_SHOP_NAME')); + $currencies_cron_url = Tools::getShopDomain(true, true).__PS_BASE_URI__.basename(_PS_ADMIN_DIR_); + $currencies_cron_url .= '/cron_currency_rates.php?secure_key='.md5(_COOKIE_KEY_.Configuration::get('PS_SHOP_NAME')); - if (($update == true) && (Tools::isSubmit('id_cronjob'))) - { - $id_cronjob = (int)Tools::getValue('id_cronjob'); - $id_module = (int)Db::getInstance()->getValue('SELECT `id_module` FROM `'._DB_PREFIX_.self::$module->name.'` - WHERE `id_cronjob` = \''.(int)$id_cronjob.'\' - AND `id_shop` = \''.$id_shop.'\' AND `id_shop_group` = \''.$id_shop_group.'\''); + if (($update == true) && (Tools::isSubmit('id_cronjob'))) { + $id_cronjob = (int)Tools::getValue('id_cronjob'); + $id_module = (int)Db::getInstance()->getValue('SELECT `id_module` FROM `'._DB_PREFIX_.bqSQL(self::$module->name).'` + WHERE `id_cronjob` = \''.(int)$id_cronjob.'\' + AND `id_shop` = \''.$id_shop.'\' AND `id_shop_group` = \''.$id_shop_group.'\''); - if ((bool)$id_module == true) - { - $form[0]['form']['input'][] = array( - 'type' => 'free', - 'name' => 'description', - 'label' => self::$module->l('Task description', 'CronJobsForms'), - 'placeholder' => self::$module->l('Update my currencies', 'CronJobsForms'), - ); + if ((bool)$id_module == true) { + $form[0]['form']['input'][] = array( + 'type' => 'free', + 'name' => 'description', + 'label' => self::$module->l('Task description', 'CronJobsForms'), + 'placeholder' => self::$module->l('Update my currencies', 'CronJobsForms'), + ); - $form[0]['form']['input'][] = array( - 'type' => 'free', - 'name' => 'task', - 'label' => self::$module->l('Target link', 'CronJobsForms'), - ); - } - else - { - $form[0]['form']['input'][] = array( - 'type' => 'text', - 'name' => 'description', - 'label' => self::$module->l('Task description', 'CronJobsForms'), - 'desc' => self::$module->l('Enter a description for this task.', 'CronJobsForms'), - 'placeholder' => self::$module->l('Update my currencies', 'CronJobsForms'), - ); + $form[0]['form']['input'][] = array( + 'type' => 'free', + 'name' => 'task', + 'label' => self::$module->l('Target link', 'CronJobsForms'), + ); + } else { + $form[0]['form']['input'][] = array( + 'type' => 'text', + 'name' => 'description', + 'label' => self::$module->l('Task description', 'CronJobsForms'), + 'desc' => self::$module->l('Enter a description for this task.', 'CronJobsForms'), + 'placeholder' => self::$module->l('Update my currencies', 'CronJobsForms'), + ); - $form[0]['form']['input'][] = array( - 'type' => 'text', - 'name' => 'task', - 'label' => self::$module->l('Target link', 'CronJobsForms'), - 'desc' => self::$module->l('Set the link of your cron task.', 'CronJobsForms'), - 'placeholder' => $currencies_cron_url, - ); - } - } - else - { - $form[0]['form']['input'][] = array( - 'type' => 'text', - 'name' => 'description', - 'label' => self::$module->l('Task description', 'CronJobsForms'), - 'desc' => self::$module->l('Enter a description for this task.', 'CronJobsForms'), - 'placeholder' => self::$module->l('Update my currencies', 'CronJobsForms'), - ); + $form[0]['form']['input'][] = array( + 'type' => 'text', + 'name' => 'task', + 'label' => self::$module->l('Target link', 'CronJobsForms'), + 'desc' => self::$module->l('Set the link of your cron task.', 'CronJobsForms'), + 'placeholder' => $currencies_cron_url, + ); + } + } else { + $form[0]['form']['input'][] = array( + 'type' => 'text', + 'name' => 'description', + 'label' => self::$module->l('Task description', 'CronJobsForms'), + 'desc' => self::$module->l('Enter a description for this task.', 'CronJobsForms'), + 'placeholder' => self::$module->l('Update my currencies', 'CronJobsForms'), + ); - $form[0]['form']['input'][] = array( - 'type' => 'text', - 'name' => 'task', - 'label' => self::$module->l('Target link', 'CronJobsForms'), - 'desc' => self::$module->l('Do not forget to use an absolute URL to make it valid! The link also has to be on the same domain as the shop.', 'CronJobsForms'), - 'placeholder' => $currencies_cron_url, - ); - } + $form[0]['form']['input'][] = array( + 'type' => 'text', + 'name' => 'task', + 'label' => self::$module->l('Target link', 'CronJobsForms'), + 'desc' => self::$module->l('Do not forget to use an absolute URL to make it valid! The link also has to be on the same domain as the shop.', 'CronJobsForms'), + 'placeholder' => $currencies_cron_url, + ); + } - $form[0]['form']['input'][] = array( - 'type' => 'select', - 'name' => 'hour', - 'label' => self::$module->l('Task frequency', 'CronJobsForms'), - 'desc' => self::$module->l('At what time should this task be executed?', 'CronJobsForms'), - 'options' => array( - 'query' => self::getHoursFormOptions(), - 'id' => 'id', 'name' => 'name' - ), - ); - $form[0]['form']['input'][] = array( - 'type' => 'select', - 'name' => 'day', - 'desc' => self::$module->l('On which day of the month should this task be executed?', 'CronJobsForms'), - 'options' => array( - 'query' => self::getDaysFormOptions(), - 'id' => 'id', 'name' => 'name' - ), - ); - $form[0]['form']['input'][] = array( - 'type' => 'select', - 'name' => 'month', - 'desc' => self::$module->l('On what month should this task be executed?', 'CronJobsForms'), - 'options' => array( - 'query' => self::getMonthsFormOptions(), - 'id' => 'id', 'name' => 'name' - ), - ); - $form[0]['form']['input'][] = array( - 'type' => 'select', - 'name' => 'day_of_week', - 'desc' => self::$module->l('On which day of the week should this task be executed?', 'CronJobsForms'), - 'options' => array( - 'query' => self::getDaysofWeekFormOptions(), - 'id' => 'id', 'name' => 'name' - ), - ); + $form[0]['form']['input'][] = array( + 'type' => 'select', + 'name' => 'hour', + 'label' => self::$module->l('Task frequency', 'CronJobsForms'), + 'desc' => self::$module->l('At what time should this task be executed?', 'CronJobsForms'), + 'options' => array( + 'query' => self::getHoursFormOptions(), + 'id' => 'id', 'name' => 'name' + ), + ); + $form[0]['form']['input'][] = array( + 'type' => 'select', + 'name' => 'day', + 'desc' => self::$module->l('On which day of the month should this task be executed?', 'CronJobsForms'), + 'options' => array( + 'query' => self::getDaysFormOptions(), + 'id' => 'id', 'name' => 'name' + ), + ); + $form[0]['form']['input'][] = array( + 'type' => 'select', + 'name' => 'month', + 'desc' => self::$module->l('On what month should this task be executed?', 'CronJobsForms'), + 'options' => array( + 'query' => self::getMonthsFormOptions(), + 'id' => 'id', 'name' => 'name' + ), + ); + $form[0]['form']['input'][] = array( + 'type' => 'select', + 'name' => 'day_of_week', + 'desc' => self::$module->l('On which day of the week should this task be executed?', 'CronJobsForms'), + 'options' => array( + 'query' => self::getDaysofWeekFormOptions(), + 'id' => 'id', 'name' => 'name' + ), + ); - return $form; - } + return $form; + } - public static function getForm() - { - $form = array( - 'form' => array( - 'legend' => array( - 'title' => self::$module->l('Settings', 'CronJobsForms'), - 'icon' => 'icon-cog', - ), - 'input' => array( - array( - 'type' => 'radio', - 'name' => 'cron_mode', - 'label' => self::$module->l('Cron mode', 'CronJobsForms'), - 'values' => array( - array('id' => 'webservice', 'value' => 'webservice', 'label' => self::$module->l('Basic', 'CronJobsForms'), - 'p' => self::$module->l('Use the PrestaShop cron tasks webservice to execute your tasks.', 'CronJobsForms')), - array('id' => 'advanced', 'value' => 'advanced', 'label' => self::$module->l('Advanced', 'CronJobsForms'), - 'p' => self::$module->l('For advanced users only: use your own crontab manager instead of PrestaShop cron tasks service.', 'CronJobsForms')) - ), - ), - ), - 'submit' => array('title' => self::$module->l('Save', 'CronJobsForms'), 'type' => 'submit', 'class' => 'btn btn-default pull-right'), - ), - ); + public static function getForm() + { + $form = array( + 'form' => array( + 'legend' => array( + 'title' => self::$module->l('Settings', 'CronJobsForms'), + 'icon' => 'icon-cog', + ), + 'input' => array( + array( + 'type' => 'radio', + 'name' => 'cron_mode', + 'label' => self::$module->l('Cron mode', 'CronJobsForms'), + 'values' => array( + array('id' => 'webservice', 'value' => 'webservice', 'label' => self::$module->l('Basic', 'CronJobsForms'), + 'p' => self::$module->l('Use the PrestaShop cron tasks webservice to execute your tasks.', 'CronJobsForms')), + array('id' => 'advanced', 'value' => 'advanced', 'label' => self::$module->l('Advanced', 'CronJobsForms'), + 'p' => self::$module->l('For advanced users only: use your own crontab manager instead of PrestaShop cron tasks service.', 'CronJobsForms')) + ), + ), + ), + 'submit' => array('title' => self::$module->l('Save', 'CronJobsForms'), 'type' => 'submit', 'class' => 'btn btn-default pull-right'), + ), + ); - if (Configuration::get('CRONJOBS_MODE') == 'advanced') - $form['form']['input'][] = array('type' => 'free', 'name' => 'advanced_help', 'col' => 9, 'offset' => 0); + if (Configuration::get('CRONJOBS_MODE') == 'advanced') { + $form['form']['input'][] = array('type' => 'free', 'name' => 'advanced_help', 'col' => 9, 'offset' => 0); + } - return array($form); - } + return array($form); + } - public static function getFormValues() - { - $token = Configuration::get('CRONJOBS_EXECUTION_TOKEN', null, 0, 0); - $admin_folder = str_replace(_PS_ROOT_DIR_.'/', null, basename(_PS_ADMIN_DIR_)); - $path = Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.$admin_folder.'/'; - $curl_url = $path.Context::getContext()->link->getAdminLink('AdminCronJobs', false); - $curl_url .= '&token='.$token; + public static function getFormValues() + { + $token = Configuration::get('CRONJOBS_EXECUTION_TOKEN', null, 0, 0); + $admin_folder = str_replace(_PS_ROOT_DIR_.'/', null, basename(_PS_ADMIN_DIR_)); + if (version_compare(_PS_VERSION_, '1.7', '<') == true) { + $path = Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.$admin_folder.'/'; + $curl_url = $path.Context::getContext()->link->getAdminLink('AdminCronJobs', false); + $curl_url .= '&token='.$token; + } else { + $curl_url = Context::getContext()->link->getAdminLink('AdminCronJobs', false); + $curl_url .= '&token='.$token; + } - return array( - 'cron_mode' => Configuration::get('CRONJOBS_MODE'), - 'advanced_help' => - '
    -

    ' - .self::$module->l('The Advanced mode enables you to use your own cron tasks manager instead of PrestaShop cron tasks webservice.', 'CronJobsForms').' ' - .self::$module->l('First of all, make sure the \'curl\' library is installed on your server.', 'CronJobsForms') - .'
    '.self::$module->l('To execute your cron tasks, please insert the following line in your cron tasks manager:', 'CronJobsForms').' -

    -
    -
      -
    • 0 * * * * curl '.(Configuration::get('PS_SSL_ENABLED') ? '-k ' : null).'"'.$curl_url.'"
    • -
    -
    ' - ); - } + return array( + 'cron_mode' => Configuration::get('CRONJOBS_MODE'), + 'advanced_help' => + '
    +

    ' + .self::$module->l('The Advanced mode enables you to use your own cron tasks manager instead of PrestaShop cron tasks webservice.', 'CronJobsForms').' ' + .self::$module->l('First of all, make sure the \'curl\' library is installed on your server.', 'CronJobsForms') + .'
    '.self::$module->l('To execute your cron tasks, please insert the following line in your cron tasks manager:', 'CronJobsForms').' +

    +
    +
      +
    • 0 * * * * curl '.(Configuration::get('PS_SSL_ENABLED') ? '-k ' : null).'"'.$curl_url.'"
    • +
    +
    ' + ); + } - public static function getTasksList() - { - return array( - 'description' => array('title' => self::$module->l('Task description', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), - 'task' => array('title' => self::$module->l('Target link', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), - 'hour' => array('title' => self::$module->l('Hour', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), - 'day' => array('title' => self::$module->l('Day', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), - 'month' => array('title' => self::$module->l('Month', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), - 'day_of_week' => array('title' => self::$module->l('Day of week', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), - 'updated_at' => array('title' => self::$module->l('Last execution', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), - 'one_shot' => array('title' => self::$module->l('One shot', 'CronJobsForms'), 'active' => 'oneshot', 'type' => 'bool', 'align' => 'center'), - 'active' => array('title' => self::$module->l('Active', 'CronJobsForms'), 'active' => 'status', 'type' => 'bool', 'align' => 'center', 'orderby' => false), - ); - } + public static function getTasksList() + { + return array( + 'description' => array('title' => self::$module->l('Task description', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), + 'task' => array('title' => self::$module->l('Target link', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), + 'hour' => array('title' => self::$module->l('Hour', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), + 'day' => array('title' => self::$module->l('Day', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), + 'month' => array('title' => self::$module->l('Month', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), + 'day_of_week' => array('title' => self::$module->l('Day of week', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), + 'updated_at' => array('title' => self::$module->l('Last execution', 'CronJobsForms'), 'type' => 'text', 'orderby' => false), + 'one_shot' => array('title' => self::$module->l('One shot', 'CronJobsForms'), 'active' => 'oneshot', 'type' => 'bool', 'align' => 'center'), + 'active' => array('title' => self::$module->l('Active', 'CronJobsForms'), 'active' => 'status', 'type' => 'bool', 'align' => 'center', 'orderby' => false), + ); + } - public static function getNewJobFormValues() - { - return array( - 'description' => Tools::safeOutput(Tools::getValue('description', null)), - 'task' => Tools::safeOutput(Tools::getValue('task', null)), - 'hour' => (int)Tools::getValue('hour', -1), - 'day' => (int)Tools::getValue('day', -1), - 'month' => (int)Tools::getValue('month', -1), - 'day_of_week' => (int)Tools::getValue('day_of_week', -1), - ); - } + public static function getNewJobFormValues() + { + return array( + 'description' => Tools::safeOutput(Tools::getValue('description', null)), + 'task' => Tools::safeOutput(Tools::getValue('task', null)), + 'hour' => (int)Tools::getValue('hour', -1), + 'day' => (int)Tools::getValue('day', -1), + 'month' => (int)Tools::getValue('month', -1), + 'day_of_week' => (int)Tools::getValue('day_of_week', -1), + ); + } - public static function getUpdateJobFormValues() - { - $id_shop = (int)Context::getContext()->shop->id; - $id_shop_group = (int)Context::getContext()->shop->id_shop_group; + public static function getUpdateJobFormValues() + { + $id_shop = (int)Context::getContext()->shop->id; + $id_shop_group = (int)Context::getContext()->shop->id_shop_group; - $id_cronjob = (int)Tools::getValue('id_cronjob'); - $cron = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.self::$module->name.'` - WHERE `id_cronjob` = \''.$id_cronjob.'\' - AND `id_shop` = \''.$id_shop.'\' AND `id_shop_group` = \''.$id_shop_group.'\''); + $id_cronjob = (int)Tools::getValue('id_cronjob'); + $cron = Db::getInstance()->getRow('SELECT * FROM `'._DB_PREFIX_.bqSQL(self::$module->name).'` + WHERE `id_cronjob` = \''.$id_cronjob.'\' + AND `id_shop` = \''.$id_shop.'\' AND `id_shop_group` = \''.$id_shop_group.'\''); - if ((bool)$cron['id_module'] == false) - { - $description = Tools::safeOutput(Tools::getValue('description', $cron['description'])); - $task = urldecode(Tools::getValue('task', $cron['task'])); - } - else - { - $module_name = Db::getInstance()->getValue('SELECT `name` FROM `'._DB_PREFIX_.'module` WHERE `id_module` = \''.(int)$cron['id_module'].'\''); - $description = '

    '.Tools::safeOutput(Module::getModuleName($module_name)).'

    '; - $task = '

    '.self::$module->l('Module - Hook', 'CronJobsForms').'

    '; - } + if ((bool)$cron['id_module'] == false) { + $description = Tools::safeOutput(Tools::getValue('description', $cron['description'])); + $task = urldecode(Tools::getValue('task', $cron['task'])); + } else { + $module_name = Db::getInstance()->getValue('SELECT `name` FROM `'._DB_PREFIX_.'module` WHERE `id_module` = \''.(int)$cron['id_module'].'\''); + $description = '

    '.Tools::safeOutput(Module::getModuleName($module_name)).'

    '; + $task = '

    '.self::$module->l('Module - Hook', 'CronJobsForms').'

    '; + } - return array( - 'description' => $description, - 'task' => $task, - 'hour' => (int)Tools::getValue('hour', $cron['hour']), - 'day' => (int)Tools::getValue('day', $cron['day']), - 'month' => (int)Tools::getValue('month', $cron['month']), - 'day_of_week' => (int)Tools::getValue('day_of_week', $cron['day_of_week']), - ); - } + return array( + 'description' => $description, + 'task' => $task, + 'hour' => (int)Tools::getValue('hour', $cron['hour']), + 'day' => (int)Tools::getValue('day', $cron['day']), + 'month' => (int)Tools::getValue('month', $cron['month']), + 'day_of_week' => (int)Tools::getValue('day_of_week', $cron['day_of_week']), + ); + } - public static function getTasksListValues() - { - $id_shop = (int)Context::getContext()->shop->id; - $id_shop_group = (int)Context::getContext()->shop->id_shop_group; + public static function getTasksListValues() + { + $id_shop = (int)Context::getContext()->shop->id; + $id_shop_group = (int)Context::getContext()->shop->id_shop_group; - self::$module->addNewModulesTasks(); - $crons = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.self::$module->name.'` WHERE `id_shop` = \''.$id_shop.'\' AND `id_shop_group` = \''.$id_shop_group.'\''); + self::$module->addNewModulesTasks(); + $crons = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.bqSQL(self::$module->name).'` WHERE `id_shop` = \''.$id_shop.'\' AND `id_shop_group` = \''.$id_shop_group.'\''); - foreach ($crons as $key => &$cron) - { - if (empty($cron['id_module']) == false) - { - $module = Module::getInstanceById((int)$cron['id_module']); + foreach ($crons as $key => &$cron) { + if (empty($cron['id_module']) == false) { + $module = Module::getInstanceById((int)$cron['id_module']); - if ($module == false) - { - Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.self::$module->name.' WHERE `id_cronjob` = \''.(int)$cron['id_cronjob'].'\''); - unset($crons[$key]); - break; - } + if ($module == false) { + Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.bqSQL(self::$module->name).' WHERE `id_cronjob` = \''.(int)$cron['id_cronjob'].'\''); + unset($crons[$key]); + break; + } - $query = 'SELECT `name` FROM `'._DB_PREFIX_.'module` WHERE `id_module` = \''.(int)$cron['id_module'].'\''; - $module_name = Db::getInstance()->getValue($query); + $query = 'SELECT `name` FROM `'._DB_PREFIX_.'module` WHERE `id_module` = \''.(int)$cron['id_module'].'\''; + $module_name = Db::getInstance()->getValue($query); - $cron['description'] = Tools::safeOutput(Module::getModuleName($module_name)); - $cron['task'] = self::$module->l('Module - Hook', 'CronJobsForms'); - } - else - $cron['task'] = urldecode($cron['task']); + $cron['description'] = Tools::safeOutput(Module::getModuleName($module_name)); + $cron['task'] = self::$module->l('Module - Hook', 'CronJobsForms'); + } else { + $cron['task'] = urldecode($cron['task']); + } - $cron['hour'] = ($cron['hour'] == -1) ? self::$module->l('Every hour', 'CronJobsForms') : date('H:i', mktime((int)$cron['hour'], 0, 0, 0, 1)); - $cron['day'] = ($cron['day'] == -1) ? self::$module->l('Every day', 'CronJobsForms') : (int)$cron['day']; - $cron['month'] = ($cron['month'] == -1) ? self::$module->l('Every month', 'CronJobsForms') : self::$module->l(date('F', mktime(0, 0, 0, (int)$cron['month'], 1))); - $cron['day_of_week'] = ($cron['day_of_week'] == -1) ? self::$module->l('Every day of the week', 'CronJobsForms') : self::$module->l(date('l', mktime(0, 0, 0, 0, (int)$cron['day_of_week']))); - $cron['updated_at'] = ($cron['updated_at'] == 0) ? self::$module->l('Never', 'CronJobsForms') : date('Y-m-d H:i:s', strtotime($cron['updated_at'])); - $cron['one_shot'] = (bool)$cron['one_shot']; - $cron['active'] = (bool)$cron['active']; - } + $cron['hour'] = ($cron['hour'] == -1) ? self::$module->l('Every hour', 'CronJobsForms') : date('H:i', mktime((int)$cron['hour'], 0, 0, 0, 1)); + $cron['day'] = ($cron['day'] == -1) ? self::$module->l('Every day', 'CronJobsForms') : (int)$cron['day']; + $cron['month'] = ($cron['month'] == -1) ? self::$module->l('Every month', 'CronJobsForms') : self::$module->l(date('F', mktime(0, 0, 0, (int)$cron['month'], 1))); + $cron['day_of_week'] = ($cron['day_of_week'] == -1) ? self::$module->l('Every day of the week', 'CronJobsForms') : self::$module->l(date('l', mktime(0, 0, 0, 0, (int)$cron['day_of_week']))); + $cron['updated_at'] = ($cron['updated_at'] == 0) ? self::$module->l('Never', 'CronJobsForms') : date('Y-m-d H:i:s', strtotime($cron['updated_at'])); + $cron['one_shot'] = (bool)$cron['one_shot']; + $cron['active'] = (bool)$cron['active']; + } - return $crons; - } + return $crons; + } - protected static function getHoursFormOptions() - { - $data = array(array('id' => '-1', 'name' => self::$module->l('Every hour', 'CronJobsForms'))); + protected static function getHoursFormOptions() + { + $data = array(array('id' => '-1', 'name' => self::$module->l('Every hour', 'CronJobsForms'))); - for ($hour = 0; $hour < 24; $hour += 1) - $data[] = array('id' => $hour, 'name' => date('H:i', mktime($hour, 0, 0, 0, 1))); + for ($hour = 0; $hour < 24; $hour += 1) { + $data[] = array('id' => $hour, 'name' => date('H:i', mktime($hour, 0, 0, 0, 1))); + } - return $data; - } + return $data; + } - protected static function getDaysFormOptions() - { - $data = array(array('id' => '-1', 'name' => self::$module->l('Every day of the month', 'CronJobsForms'))); + protected static function getDaysFormOptions() + { + $data = array(array('id' => '-1', 'name' => self::$module->l('Every day of the month', 'CronJobsForms'))); - for ($day = 1; $day <= 31; $day += 1) - $data[] = array('id' => $day, 'name' => $day); + for ($day = 1; $day <= 31; $day += 1) { + $data[] = array('id' => $day, 'name' => $day); + } - return $data; - } + return $data; + } - protected static function getMonthsFormOptions() - { - $data = array(array('id' => '-1', 'name' => self::$module->l('Every month', 'CronJobsForms'))); + protected static function getMonthsFormOptions() + { + $data = array(array('id' => '-1', 'name' => self::$module->l('Every month', 'CronJobsForms'))); - for ($month = 1; $month <= 12; $month += 1) - $data[] = array('id' => $month, 'name' => self::$module->l(date('F', mktime(0, 0, 0, $month, 1)))); + for ($month = 1; $month <= 12; $month += 1) { + $data[] = array('id' => $month, 'name' => self::$module->l(date('F', mktime(0, 0, 0, $month, 1)))); + } - return $data; - } + return $data; + } - protected static function getDaysofWeekFormOptions() - { - $data = array(array('id' => '-1', 'name' => self::$module->l('Every day of the week', 'CronJobsForms'))); + protected static function getDaysofWeekFormOptions() + { + $data = array(array('id' => '-1', 'name' => self::$module->l('Every day of the week', 'CronJobsForms'))); - for ($day = 1; $day <= 7; $day += 1) - $data[] = array('id' => $day, 'name' => self::$module->l(date('l', strtotime('Sunday +' . $day . ' days')))); + for ($day = 1; $day <= 7; $day += 1) { + $data[] = array('id' => $day, 'name' => self::$module->l(date('l', strtotime('Sunday +' . $day . ' days')))); + } - return $data; - } + return $data; + } } diff --git a/modules/cronjobs/config.xml b/modules/cronjobs/config.xml new file mode 100644 index 000000000..ca5ff3abd --- /dev/null +++ b/modules/cronjobs/config.xml @@ -0,0 +1,12 @@ + + + cronjobs + + + + + + 1 + 1 + + diff --git a/modules/cronjobs/controllers/admin/AdminCronJobsController.php b/modules/cronjobs/controllers/admin/AdminCronJobsController.php index 035f9a5dd..6e1d1309b 100644 --- a/modules/cronjobs/controllers/admin/AdminCronJobsController.php +++ b/modules/cronjobs/controllers/admin/AdminCronJobsController.php @@ -26,87 +26,79 @@ class AdminCronJobsController extends ModuleAdminController { - public function __construct() - { - if (Tools::getValue('token') != Configuration::getGlobalValue('CRONJOBS_EXECUTION_TOKEN')) - die('Invalid token'); + public function __construct() + { + if (Tools::getValue('token') != Configuration::getGlobalValue('CRONJOBS_EXECUTION_TOKEN')) { + die('Invalid token'); + } - parent::__construct(); + parent::__construct(); - $this->postProcess(); + $this->postProcess(); - die; - } + die; + } - public function postProcess() - { - $this->module->sendCallback(); + public function postProcess() + { + $this->module->sendCallback(); - ob_start(); + ob_start(); - $this->runModulesCrons(); - $this->runTasksCrons(); + $this->runModulesCrons(); + $this->runTasksCrons(); - ob_end_clean(); - } + ob_end_clean(); + } - protected function runModulesCrons() - { - $query = 'SELECT * FROM '._DB_PREFIX_.$this->module->name.' WHERE `active` = 1 AND `id_module` IS NOT NULL'; - $crons = Db::getInstance()->executeS($query); + protected function runModulesCrons() + { + $query = 'SELECT * FROM '._DB_PREFIX_.bqSQL($this->module->name).' WHERE `active` = 1 AND `id_module` IS NOT NULL'; + $crons = Db::getInstance()->executeS($query); - if (is_array($crons) && (count($crons) > 0)) - { - foreach ($crons as &$cron) - { - $module = Module::getInstanceById((int)$cron['id_module']); + if (is_array($crons) && (count($crons) > 0)) { + foreach ($crons as &$cron) { + $module = Module::getInstanceById((int)$cron['id_module']); - if ($module == false) - { - Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.$this->module->name.' WHERE `id_cronjob` = \''.(int)$cron['id_cronjob'].'\''); - break; - } - elseif ($this->shouldBeExecuted($cron) == true) - { - Hook::exec('actionCronJob', array(), $cron['id_module']); - $query = 'UPDATE '._DB_PREFIX_.$this->module->name.' SET `updated_at` = NOW(), `active` = IF (`one_shot` = TRUE, FALSE, `active`) WHERE `id_cronjob` = \''.$cron['id_cronjob'].'\''; - Db::getInstance()->execute($query); - } - } - } - } + if ($module == false) { + Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.bqSQL($this->module->name).' WHERE `id_cronjob` = \''.(int)$cron['id_cronjob'].'\''); + break; + } elseif ($this->shouldBeExecuted($cron) == true) { + Hook::exec('actionCronJob', array(), $cron['id_module']); + $query = 'UPDATE '._DB_PREFIX_.bqSQL($this->module->name).' SET `updated_at` = NOW(), `active` = IF (`one_shot` = TRUE, FALSE, `active`) WHERE `id_cronjob` = \''.(int)$cron['id_cronjob'].'\''; + Db::getInstance()->execute($query); + } + } + } + } - protected function runTasksCrons() - { - $query = 'SELECT * FROM '._DB_PREFIX_.$this->module->name.' WHERE `active` = 1 AND `id_module` IS NULL'; - $crons = Db::getInstance()->executeS($query); + protected function runTasksCrons() + { + $query = 'SELECT * FROM '._DB_PREFIX_.bqSQL($this->module->name).' WHERE `active` = 1 AND `id_module` IS NULL'; + $crons = Db::getInstance()->executeS($query); - if (is_array($crons) && (count($crons) > 0)) - { - foreach ($crons as &$cron) - { - if ($this->shouldBeExecuted($cron) == true) - { - Tools::file_get_contents(urldecode($cron['task']), false); - $query = 'UPDATE '._DB_PREFIX_.$this->module->name.' SET `updated_at` = NOW(), `active` = IF (`one_shot` = TRUE, FALSE, `active`) WHERE `id_cronjob` = \''.$cron['id_cronjob'].'\''; - Db::getInstance()->execute($query); - } - } - } - } + if (is_array($crons) && (count($crons) > 0)) { + foreach ($crons as &$cron) { + if ($this->shouldBeExecuted($cron) == true) { + Tools::file_get_contents(urldecode($cron['task']), false); + $query = 'UPDATE '._DB_PREFIX_.bqSQL($this->module->name).' SET `updated_at` = NOW(), `active` = IF (`one_shot` = TRUE, FALSE, `active`) WHERE `id_cronjob` = \''.(int)$cron['id_cronjob'].'\''; + Db::getInstance()->execute($query); + } + } + } + } - protected function shouldBeExecuted($cron) - { - $hour = ($cron['hour'] == -1) ? date('H') : $cron['hour']; - $day = ($cron['day'] == -1) ? date('d') : $cron['day']; - $month = ($cron['month'] == -1) ? date('m') : $cron['month']; - $day_of_week = ($cron['day_of_week'] == -1) ? date('D') : date('D', strtotime('Sunday +' . $cron['day_of_week'] . ' days')); + protected function shouldBeExecuted($cron) + { + $hour = ($cron['hour'] == -1) ? date('H') : $cron['hour']; + $day = ($cron['day'] == -1) ? date('d') : $cron['day']; + $month = ($cron['month'] == -1) ? date('m') : $cron['month']; + $day_of_week = ($cron['day_of_week'] == -1) ? date('D') : date('D', strtotime('Sunday +' . $cron['day_of_week'] . ' days')); - $day = date('Y').'-'.str_pad($month, 2, '0', STR_PAD_LEFT).'-'.str_pad($day, 2, '0', STR_PAD_LEFT); - $execution = $day_of_week.' '.$day.' '.str_pad($hour, 2, '0', STR_PAD_LEFT); - $now = date('D Y-m-d H'); - - return !(bool)strcmp($now, $execution); - } + $day = date('Y').'-'.str_pad($month, 2, '0', STR_PAD_LEFT).'-'.str_pad($day, 2, '0', STR_PAD_LEFT); + $execution = $day_of_week.' '.$day.' '.str_pad($hour, 2, '0', STR_PAD_LEFT); + $now = date('D Y-m-d H'); + return !(bool)strcmp($now, $execution); + } } diff --git a/modules/cronjobs/controllers/front/callback.php b/modules/cronjobs/controllers/front/callback.php index 2cef21c40..e3d76cca3 100644 --- a/modules/cronjobs/controllers/front/callback.php +++ b/modules/cronjobs/controllers/front/callback.php @@ -26,11 +26,9 @@ class CronjobsCallbackModuleFrontController extends ModuleFrontController { - - public function postProcess() - { - $this->module->sendCallback(); - die; - } - + public function postProcess() + { + $this->module->sendCallback(); + die; + } } diff --git a/modules/cronjobs/cronjobs.php b/modules/cronjobs/cronjobs.php index ab368e902..0ca7f2642 100644 --- a/modules/cronjobs/cronjobs.php +++ b/modules/cronjobs/cronjobs.php @@ -24,716 +24,729 @@ * International Registered Trademark & Property of PrestaShop SA */ -if (!defined('_PS_VERSION_')) - exit; +if (!defined('_PS_VERSION_')) { + exit; +} -if (defined('_PS_ADMIN_DIR_') === false) - define('_PS_ADMIN_DIR_', _PS_ROOT_DIR_.'/admin/'); +if (defined('_PS_ADMIN_DIR_') === false) { + define('_PS_ADMIN_DIR_', _PS_ROOT_DIR_.'/admin/'); +} require_once(dirname(__FILE__).'/classes/CronJobsForms.php'); class CronJobs extends Module { - const EACH = -1; + const EACH = -1; - protected $_successes; - protected $_warnings; + protected $_successes; + protected $_warnings; - public $webservice_url = 'http://webcron.prestashop.com/crons'; + public $webservice_url = 'http://webcron.prestashop.com/crons'; - public function __construct() - { - $this->name = 'cronjobs'; - $this->tab = 'administration'; - $this->version = '1.3.4'; - $this->module_key = ''; + public function __construct() + { + $this->name = 'cronjobs'; + $this->tab = 'administration'; + $this->version = '1.4.0'; + $this->module_key = ''; - $this->controllers = array('callback'); + $this->controllers = array('callback'); - $this->author = 'PrestaShop'; - $this->need_instance = true; + $this->author = 'PrestaShop'; + $this->need_instance = true; - $this->bootstrap = true; - $this->display = 'view'; + $this->bootstrap = true; + $this->display = 'view'; - parent::__construct(); + parent::__construct(); - if ($this->id) - $this->init(); + if ($this->id) { + $this->init(); + } - $this->displayName = $this->l('Cron tasks manager'); - $this->description = $this->l('Manage all your automated web tasks from a single interface.'); + $this->displayName = $this->l('Cron tasks manager'); + $this->description = $this->l('Manage all your automated web tasks from a single interface.'); - if (function_exists('curl_init') == false) - $this->warning = $this->l('To be able to use this module, please activate cURL (PHP extension).'); - } + if (function_exists('curl_init') == false) { + $this->warning = $this->l('To be able to use this module, please activate cURL (PHP extension).'); + } + } - public function install() - { - Configuration::updateValue('CRONJOBS_ADMIN_DIR', Tools::encrypt($this->getAdminDir())); - Configuration::updateValue('CRONJOBS_MODE', 'webservice'); - Configuration::updateValue('CRONJOBS_MODULE_VERSION', $this->version); - Configuration::updateValue('CRONJOBS_WEBSERVICE_ID', 0); + public function install() + { + Configuration::updateValue('CRONJOBS_ADMIN_DIR', Tools::encrypt($this->getAdminDir())); + Configuration::updateValue('CRONJOBS_MODE', 'webservice'); + Configuration::updateValue('CRONJOBS_MODULE_VERSION', $this->version); + Configuration::updateValue('CRONJOBS_WEBSERVICE_ID', 0); - $token = Tools::encrypt(Tools::getShopDomainSsl().time()); - Configuration::updateGlobalValue('CRONJOBS_EXECUTION_TOKEN', $token); + $token = Tools::encrypt(Tools::getShopDomainSsl().time()); + Configuration::updateGlobalValue('CRONJOBS_EXECUTION_TOKEN', $token); - if (parent::install()) - { - $this->updateWebservice(true); + if (parent::install()) { + $this->updateWebservice(true); - return $this->installDb() && $this->installTab() && - $this->registerHook('actionModuleRegisterHookAfter') && - $this->registerHook('actionModuleUnRegisterHookAfter') && - $this->registerHook('backOfficeHeader'); - } + return $this->installDb() && $this->installTab() && + $this->registerHook('actionModuleRegisterHookAfter') && + $this->registerHook('actionModuleUnRegisterHookAfter') && + $this->registerHook('backOfficeHeader'); + } - return false; - } + return false; + } - protected function getAdminDir() - { - return basename(_PS_ADMIN_DIR_); - } + protected function getAdminDir() + { + return basename(_PS_ADMIN_DIR_); + } - protected function init() - { - $new_admin_dir = (Tools::encrypt($this->getAdminDir()) != Configuration::get('CRONJOBS_ADMIN_DIR')); - $new_module_version = version_compare($this->version, Configuration::get('CRONJOBS_MODULE_VERSION'), '!='); + protected function init() + { + $new_admin_dir = (Tools::encrypt($this->getAdminDir()) != Configuration::get('CRONJOBS_ADMIN_DIR')); + $new_module_version = version_compare($this->version, Configuration::get('CRONJOBS_MODULE_VERSION'), '!='); - if ($new_admin_dir || $new_module_version) - { - Configuration::updateValue('CRONJOBS_MODULE_VERSION', $this->version); - Configuration::updateValue('CRONJOBS_ADMIN_DIR', Tools::encrypt($this->getAdminDir())); + if ($new_admin_dir || $new_module_version) { + Configuration::updateValue('CRONJOBS_MODULE_VERSION', $this->version); + Configuration::updateValue('CRONJOBS_ADMIN_DIR', Tools::encrypt($this->getAdminDir())); - if (Configuration::get('CRONJOBS_MODE') == 'webservice') - { + if (Configuration::get('CRONJOBS_MODE') == 'webservice') { $this->updateWebservice(true); - return $this->enableWebservice(); + return $this->enableWebservice(); } - return $this->disableWebservice(); - } - } + return $this->disableWebservice(); + } + } - public function uninstall() - { - Configuration::deleteByName('CRONJOBS_MODE'); + public function uninstall() + { + Configuration::deleteByName('CRONJOBS_MODE'); - $this->disableWebservice(); + $this->disableWebservice(); - return $this->uninstallDb() && - $this->uninstallTab() && - parent::uninstall(); - } + return $this->uninstallDb() && + $this->uninstallTab() && + parent::uninstall(); + } - public function installDb() - { - return Db::getInstance()->execute(' - CREATE TABLE IF NOT EXISTS '._DB_PREFIX_.$this->name.' ( - `id_cronjob` INTEGER(10) NOT NULL AUTO_INCREMENT, - `id_module` INTEGER(10) DEFAULT NULL, - `description` TEXT DEFAULT NULL, - `task` TEXT DEFAULT NULL, - `hour` INTEGER DEFAULT \'-1\', - `day` INTEGER DEFAULT \'-1\', - `month` INTEGER DEFAULT \'-1\', - `day_of_week` INTEGER DEFAULT \'-1\', - `updated_at` DATETIME DEFAULT NULL, - `one_shot` BOOLEAN NOT NULL DEFAULT 0, - `active` BOOLEAN DEFAULT FALSE, - `id_shop` INTEGER DEFAULT \'0\', - `id_shop_group` INTEGER DEFAULT \'0\', - PRIMARY KEY(`id_cronjob`), - INDEX (`id_module`)) - ENGINE='._MYSQL_ENGINE_.' default CHARSET=utf8' - ); - } + public function installDb() + { + return Db::getInstance()->execute( + 'CREATE TABLE IF NOT EXISTS '._DB_PREFIX_.bqSQL($this->name).' ( + `id_cronjob` INTEGER(10) NOT NULL AUTO_INCREMENT, + `id_module` INTEGER(10) DEFAULT NULL, + `description` TEXT DEFAULT NULL, + `task` TEXT DEFAULT NULL, + `hour` INTEGER DEFAULT \'-1\', + `day` INTEGER DEFAULT \'-1\', + `month` INTEGER DEFAULT \'-1\', + `day_of_week` INTEGER DEFAULT \'-1\', + `updated_at` DATETIME DEFAULT NULL, + `one_shot` BOOLEAN NOT NULL DEFAULT 0, + `active` BOOLEAN DEFAULT FALSE, + `id_shop` INTEGER DEFAULT \'0\', + `id_shop_group` INTEGER DEFAULT \'0\', + PRIMARY KEY(`id_cronjob`), + INDEX (`id_module`)) + ENGINE='._MYSQL_ENGINE_.' default CHARSET=utf8' + ); + } - public function uninstallDb() - { - return Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.$this->name); - } + public function uninstallDb() + { + return Db::getInstance()->execute('DROP TABLE IF EXISTS '._DB_PREFIX_.bqSQL($this->name)); + } - public function installTab() - { - $tab = new Tab(); - $tab->active = 1; - $tab->name = array(); - $tab->class_name = 'AdminCronJobs'; + public function installTab() + { + $tab = new Tab(); + $tab->active = 1; + $tab->name = array(); + $tab->class_name = 'AdminCronJobs'; - foreach (Language::getLanguages(true) as $lang) - $tab->name[$lang['id_lang']] = 'Cron Jobs'; + foreach (Language::getLanguages(true) as $lang) { + $tab->name[$lang['id_lang']] = 'Cron Jobs'; + } - $tab->id_parent = -1; - $tab->module = $this->name; + $tab->id_parent = -1; + $tab->module = $this->name; - return $tab->add(); - } + return $tab->add(); + } - public function uninstallTab() - { - $id_tab = (int)Tab::getIdFromClassName('AdminCronJobs'); + public function uninstallTab() + { + $id_tab = (int)Tab::getIdFromClassName('AdminCronJobs'); - if ($id_tab) - { - $tab = new Tab($id_tab); - return $tab->delete(); - } + if ($id_tab) { + $tab = new Tab($id_tab); + return $tab->delete(); + } - return false; - } + return false; + } - public function hookActionModuleRegisterHookAfter($params) - { - $hook_name = $params['hook_name']; + public function hookActionModuleRegisterHookAfter($params) + { + $hook_name = $params['hook_name']; - if ($hook_name == 'actionCronJob') - { - $module = $params['object']; - $this->registerModuleHook($module->id); - $this->updateWebservice(Configuration::get('CRONJOBS_MODE') == 'webservice'); - } - } + if ($hook_name == 'actionCronJob') { + $module = $params['object']; + $this->registerModuleHook($module->id); + $this->updateWebservice(Configuration::get('CRONJOBS_MODE') == 'webservice'); + } + } - public function hookActionModuleUnRegisterHookAfter($params) - { - $hook_name = $params['hook_name']; + public function hookActionModuleUnRegisterHookAfter($params) + { + $hook_name = $params['hook_name']; - if ($hook_name == 'actionCronJob') - { - $module = $params['object']; - $this->unregisterModuleHook($module->id); - $this->updateWebservice(Configuration::get('CRONJOBS_MODE') == 'webservice'); - } - } + if ($hook_name == 'actionCronJob') { + $module = $params['object']; + $this->unregisterModuleHook($module->id); + $this->updateWebservice(Configuration::get('CRONJOBS_MODE') == 'webservice'); + } + } - public function hookBackOfficeHeader() - { - if (Tools::getValue('configure') == $this->name) - { - if (version_compare(_PS_VERSION_, '1.6', '<') == true) - { - $this->context->controller->addCSS($this->_path.'css/bootstrap.min.css'); - $this->context->controller->addCSS($this->_path.'css/configure-ps-15.css'); - } - else - $this->context->controller->addCSS($this->_path.'css/configure-ps-16.css'); - } - } + public function hookBackOfficeHeader() + { + if (Tools::getValue('configure') == $this->name) { + if (version_compare(_PS_VERSION_, '1.6', '<') == true) { + $this->context->controller->addCSS($this->_path.'views/css/bootstrap.min.css'); + $this->context->controller->addCSS($this->_path.'views/css/configure-ps-15.css'); + } else { + $this->context->controller->addCSS($this->_path.'views/css/configure-ps-16.css'); + } + } + } - public function getContent() - { - $output = null; - CronJobsForms::init($this); - $this->checkLocalEnvironment(); + public function getContent() + { + $output = null; + CronJobsForms::init($this); + $this->checkLocalEnvironment(); - if (Tools::isSubmit('submitCronJobs')) - $this->postProcessConfiguration(); - elseif (Tools::isSubmit('submitNewCronJob')) - $submit_cron = $this->postProcessNewJob(); - elseif (Tools::isSubmit('submitUpdateCronJob')) - $submit_cron = $this->postProcessUpdateJob(); + if (Tools::isSubmit('submitCronJobs')) { + $this->postProcessConfiguration(); + } elseif (Tools::isSubmit('submitNewCronJob')) { + $submit_cron = $this->postProcessNewJob(); + } elseif (Tools::isSubmit('submitUpdateCronJob')) { + $submit_cron = $this->postProcessUpdateJob(); + } - $this->context->smarty->assign(array( - 'module_dir' => $this->_path, - 'module_local_dir' => $this->local_path, - )); + $this->context->smarty->assign(array( + 'module_dir' => $this->_path, + 'module_local_dir' => $this->local_path, + )); - $this->context->smarty->assign('form_errors', $this->_errors); - $this->context->smarty->assign('form_infos', $this->_warnings); - $this->context->smarty->assign('form_successes', $this->_successes); + $this->context->smarty->assign('form_errors', $this->_errors); + $this->context->smarty->assign('form_infos', $this->_warnings); + $this->context->smarty->assign('form_successes', $this->_successes); - if ((Tools::isSubmit('submitNewCronJob') || Tools::isSubmit('newcronjobs') || Tools::isSubmit('updatecronjobs')) && - ((isset($submit_cron) == false) || ($submit_cron === false))) - { - $back_url = $this->context->link->getAdminLink('AdminModules', false) - .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name - .'&token='.Tools::getAdminTokenLite('AdminModules'); - } + if ((Tools::isSubmit('submitNewCronJob') || Tools::isSubmit('newcronjobs') || Tools::isSubmit('updatecronjobs')) && + ((isset($submit_cron) == false) || ($submit_cron === false))) { + $back_url = $this->context->link->getAdminLink('AdminModules', false) + .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name + .'&token='.Tools::getAdminTokenLite('AdminModules'); + } - $output = $output.$this->context->smarty->fetch($this->local_path.'views/templates/admin/configure.tpl'); + $output = $output.$this->context->smarty->fetch($this->local_path.'views/templates/admin/configure.tpl'); - if (Tools::isSubmit('newcronjobs') || ((isset($submit_cron) == true) && ($submit_cron === false))) - $output = $output.$this->renderForm(CronJobsForms::getJobForm(), CronJobsForms::getNewJobFormValues(), 'submitNewCronJob', true, $back_url); - elseif (Tools::isSubmit('updatecronjobs') && Tools::isSubmit('id_cronjob')) - { - $form_structure = CronJobsForms::getJobForm('Update cron task', true); - $form = $this->renderForm($form_structure, CronJobsForms::getUpdateJobFormValues(), 'submitUpdateCronJob', true, $back_url, true); - $output = $output.$form; - } - elseif (Tools::isSubmit('deletecronjobs') && Tools::isSubmit('id_cronjob')) - $this->postProcessDeleteCronJob((int)Tools::getValue('id_cronjob')); - elseif (Tools::isSubmit('oneshotcronjobs')) - $this->postProcessUpdateJobOneShot(); - elseif (Tools::isSubmit('statuscronjobs')) - $this->postProcessUpdateJobStatus(); - elseif (defined('_PS_HOST_MODE_') == false) - $output = $output.$this->renderForm(CronJobsForms::getForm(), CronJobsForms::getFormValues(), 'submitCronJobs'); + if (Tools::isSubmit('newcronjobs') || ((isset($submit_cron) == true) && ($submit_cron === false))) { + $output = $output.$this->renderForm(CronJobsForms::getJobForm(), CronJobsForms::getNewJobFormValues(), 'submitNewCronJob', true, $back_url); + } elseif (Tools::isSubmit('updatecronjobs') && Tools::isSubmit('id_cronjob')) { + $form_structure = CronJobsForms::getJobForm('Update cron task', true); + $form = $this->renderForm($form_structure, CronJobsForms::getUpdateJobFormValues(), 'submitUpdateCronJob', true, $back_url, true); + $output = $output.$form; + } elseif (Tools::isSubmit('deletecronjobs') && Tools::isSubmit('id_cronjob')) { + $this->postProcessDeleteCronJob((int)Tools::getValue('id_cronjob')); + } elseif (Tools::isSubmit('oneshotcronjobs')) { + $this->postProcessUpdateJobOneShot(); + } elseif (Tools::isSubmit('statuscronjobs')) { + $this->postProcessUpdateJobStatus(); + } elseif (defined('_PS_HOST_MODE_') == false) { + $output = $output.$this->renderForm(CronJobsForms::getForm(), CronJobsForms::getFormValues(), 'submitCronJobs'); + } - return $output.$this->renderTasksList(); - } + return $output.$this->renderTasksList(); + } - public function sendCallback() - { - ignore_user_abort(true); - set_time_limit(0); + public function sendCallback() + { + ignore_user_abort(true); + set_time_limit(0); - ob_start(); - echo $this->name.'_prestashop'; - header('Connection: close'); - header('Content-Length: '.ob_get_length()); - ob_end_flush(); - ob_flush(); - flush(); + ob_start(); + echo $this->name.'_prestashop'; + header('Connection: close'); + header('Content-Length: '.ob_get_length()); + ob_end_flush(); + ob_flush(); + flush(); - if (function_exists('fastcgi_finish_request')) - fastcgi_finish_request(); - } + if (function_exists('fastcgi_finish_request')) { + fastcgi_finish_request(); + } + } - public static function isActive($id_module) - { - $module = Module::getInstanceByName('cronjobs'); + public static function isActive($id_module) + { + $module = Module::getInstanceByName('cronjobs'); - if (($module == false) || ($module->active == false)) - return false; + if (($module == false) || ($module->active == false)) { + return false; + } - $query = 'SELECT `active` FROM '._DB_PREFIX_.'cronjobs WHERE `id_module` = \''.(int)$id_module.'\''; - return (bool)Db::getInstance()->getValue($query); - } + $query = 'SELECT `active` FROM '._DB_PREFIX_.'cronjobs WHERE `id_module` = \''.(int)$id_module.'\''; + return (bool)Db::getInstance()->getValue($query); + } - /** - * $taks should be a valid URL - */ - public static function addOneShotTask($task, $description, $execution = array()) - { - if (self::isTaskURLValid($task) == false) - return false; + /** + * $taks should be a valid URL + */ + public static function addOneShotTask($task, $description, $execution = array()) + { + if (self::isTaskURLValid($task) == false) { + return false; + } - $id_shop = (int)Context::getContext()->shop->id; - $id_shop_group = (int)Context::getContext()->shop->id_shop_group; + $id_shop = (int)Context::getContext()->shop->id; + $id_shop_group = (int)Context::getContext()->shop->id_shop_group; - $query = 'SELECT `active` FROM '._DB_PREFIX_.'cronjobs - WHERE `task` = \''.urlencode($task).'\' AND `updated_at` IS NULL - AND `one_shot` IS TRUE - AND `id_shop` = \''.$id_shop.'\' AND `id_shop_group` = \''.$id_shop_group.'\''; + $query = 'SELECT `active` FROM '._DB_PREFIX_.'cronjobs + WHERE `task` = \''.urlencode($task).'\' AND `updated_at` IS NULL + AND `one_shot` IS TRUE + AND `id_shop` = \''.$id_shop.'\' AND `id_shop_group` = \''.$id_shop_group.'\''; - if ((bool)Db::getInstance()->getValue($query) == true) - return true; + if ((bool)Db::getInstance()->getValue($query) == true) { + return true; + } - if (count($execution) == 0) - { - $query = 'INSERT INTO '._DB_PREFIX_.'cronjobs - (`description`, `task`, `hour`, `day`, `month`, `day_of_week`, `updated_at`, `one_shot`, `active`, `id_shop`, `id_shop_group`) - VALUES (\''. Db::getInstance()->escape($description) .'\', \'' . + if (count($execution) == 0) { + $query = 'INSERT INTO '._DB_PREFIX_.'cronjobs + (`description`, `task`, `hour`, `day`, `month`, `day_of_week`, `updated_at`, `one_shot`, `active`, `id_shop`, `id_shop_group`) + VALUES (\''. Db::getInstance()->escape($description) .'\', \'' . urlencode($task) . '\', \'0\', \''.CronJobs::EACH.'\', \''.CronJobs::EACH.'\', \''.CronJobs::EACH.'\', - NULL, TRUE, TRUE, '.$id_shop.', '.$id_shop_group.')'; + NULL, TRUE, TRUE, '.$id_shop.', '.$id_shop_group.')'; - return Db::getInstance()->execute($query); - } - else - { - $is_frequency_valid = true; - $hour = (int)$execution['hour']; - $day = (int)$execution['day']; - $month = (int)$execution['month']; - $day_of_week = (int)$execution['day_of_week']; + return Db::getInstance()->execute($query); + } else { + $is_frequency_valid = true; + $hour = (int)$execution['hour']; + $day = (int)$execution['day']; + $month = (int)$execution['month']; + $day_of_week = (int)$execution['day_of_week']; - $is_frequency_valid = (($hour >= -1) && ($hour < 24) && $is_frequency_valid); - $is_frequency_valid = (($day >= -1) && ($day <= 31) && $is_frequency_valid); - $is_frequency_valid = (($month >= -1) && ($month <= 31) && $is_frequency_valid); - $is_frequency_valid = (($day_of_week >= -1) && ($day_of_week < 7) && $is_frequency_valid); + $is_frequency_valid = (($hour >= -1) && ($hour < 24) && $is_frequency_valid); + $is_frequency_valid = (($day >= -1) && ($day <= 31) && $is_frequency_valid); + $is_frequency_valid = (($month >= -1) && ($month <= 31) && $is_frequency_valid); + $is_frequency_valid = (($day_of_week >= -1) && ($day_of_week < 7) && $is_frequency_valid); - if ($is_frequency_valid == true) - { - $query = 'INSERT INTO '._DB_PREFIX_.'cronjobs - (`description`, `task`, `hour`, `day`, `month`, `day_of_week`, `updated_at`, `one_shot`, `active`, `id_shop`, `id_shop_group`) - VALUES (\''. Db::getInstance()->escape($description) .'\', \'' . + if ($is_frequency_valid == true) { + $query = 'INSERT INTO '._DB_PREFIX_.'cronjobs + (`description`, `task`, `hour`, `day`, `month`, `day_of_week`, `updated_at`, `one_shot`, `active`, `id_shop`, `id_shop_group`) + VALUES (\''. Db::getInstance()->escape($description) .'\', \'' . urlencode($task) . '\', \''.$hour.'\', \''.$day.'\', \''.$month.'\', \''.$day_of_week.'\', - NULL, TRUE, TRUE, '.$id_shop.', '.$id_shop_group.')'; - - return Db::getInstance()->execute($query); - } - } - - return false; - } - - protected function checkLocalEnvironment() - { - if ($this->isLocalEnvironment() == true) - $this->setWarningMessage('You are using the Cron jobs module on a local installation: - you will not be able to use the Basic mode or reliably call remote cron tasks in your current environment. - To use this module at its best, you should switch to an online installation.'); - } - - protected function isLocalEnvironment() - { - if (isset($_SERVER['REMOTE_ADDR']) === false) - return true; - - return in_array(Tools::getRemoteAddr(), array('127.0.0.1', '::1')) || preg_match('/^172\.16\.|^192\.168\.|^10\.|^127\.|^localhost|\.local$/', Configuration::get('PS_SHOP_DOMAIN')); - } - - protected function renderForm($form, $form_values, $action, $cancel = false, $back_url = false, $update = false) - { - $helper = new HelperForm(); - - $helper->show_toolbar = false; - $helper->module = $this; - $helper->default_form_language = $this->context->language->id; - $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG', 0); - - $helper->identifier = $this->identifier; - $helper->submit_action = $action; - - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false) - .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - - if ($update == true) - $helper->currentIndex .= '&id_cronjob='.(int)Tools::getValue('id_cronjob'); - - $helper->token = Tools::getAdminTokenLite('AdminModules'); - - $helper->tpl_vars = array( - 'fields_value' => $form_values, - 'id_language' => $this->context->language->id, - 'languages' => $this->context->controller->getLanguages(), - 'back_url' => $back_url, - 'show_cancel_button' => $cancel, - ); - - return $helper->generateForm($form); - } - - protected function renderTasksList() - { - $helper = new HelperList(); - - $helper->title = $this->l('Cron tasks'); - $helper->table = $this->name; - $helper->no_link = true; - $helper->shopLinkType = ''; - $helper->identifier = 'id_cronjob'; - $helper->actions = array('edit', 'delete'); - - $values = CronJobsForms::getTasksListValues(); - $helper->listTotal = count($values); - $helper->tpl_vars = array('show_filters' => false); - - $helper->toolbar_btn['new'] = array( - 'href' => $this->context->link->getAdminLink('AdminModules', false) - .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name - .'&newcronjobs=1&token='.Tools::getAdminTokenLite('AdminModules'), - 'desc' => $this->l('Add new task') - ); - - $helper->token = Tools::getAdminTokenLite('AdminModules'); - $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false) - .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; - - return $helper->generateList($values, CronJobsForms::getTasksList()); - } - - protected function postProcessConfiguration() - { - if (Tools::isSubmit('cron_mode') == true) - { - if (Tools::getValue('cron_mode') == 'advanced') - return $this->disableWebservice(); - return $this->enableWebservice(); - } - } - - protected function postProcessNewJob() - { - if ($this->isNewJobValid() == true) - { - $description = Db::getInstance()->escape(Tools::getValue('description')); - $task = urlencode(Tools::getValue('task')); - $hour = (int)Tools::getValue('hour'); - $day = (int)Tools::getValue('day'); - $month = (int)Tools::getValue('month'); - $day_of_week = (int)Tools::getValue('day_of_week'); - - $result = Db::getInstance()->getRow('SELECT id_cronjob FROM '._DB_PREFIX_.$this->name.' - WHERE `task` = \''.$task.'\' AND `hour` = \''.$hour.'\' AND `day` = \''.$day.'\' - AND `month` = \''.$month.'\' AND `day_of_week` = \''.$day_of_week.'\''); - - if ($result == false) - { - $id_shop = (int)Context::getContext()->shop->id; - $id_shop_group = (int)Context::getContext()->shop->id_shop_group; - - $query = 'INSERT INTO '._DB_PREFIX_.$this->name.' - (`description`, `task`, `hour`, `day`, `month`, `day_of_week`, `updated_at`, `active`, `id_shop`, `id_shop_group`) - VALUES (\''.$description.'\', \''.$task.'\', \''.$hour.'\', \''.$day.'\', \''.$month.'\', \''.$day_of_week.'\', NULL, TRUE, '.$id_shop.', '.$id_shop_group.')'; - - if (($result = Db::getInstance()->execute($query)) != false) - return $this->setSuccessMessage('The task has been successfully added.'); - return $this->setErrorMessage('An error happened: the task could not be added.'); - } - - return $this->setErrorMessage('This cron task already exists.'); - } - - return false; - } - - protected function postProcessUpdateJob() - { - if (Tools::isSubmit('id_cronjob') == false) - return false; - - $description = Db::getInstance()->escape(Tools::getValue('description')); - $task = urlencode(Tools::getValue('task')); - $hour = (int)Tools::getValue('hour'); - $day = (int)Tools::getValue('day'); - $month = (int)Tools::getValue('month'); - $day_of_week = (int)Tools::getValue('day_of_week'); - $id_cronjob = (int)Tools::getValue('id_cronjob'); - - $id_shop = (int)Context::getContext()->shop->id; - $id_shop_group = (int)Context::getContext()->shop->id_shop_group; - - $query = 'UPDATE '._DB_PREFIX_.$this->name.' - SET `description` = \''.$description.'\', - `task` = \''.$task.'\', - `hour` = \''.$hour.'\', - `day` = \''.$day.'\', - `month` = \''.$month.'\', - `day_of_week` = \''.$day_of_week.'\' - WHERE `id_cronjob` = \''.(int)$id_cronjob.'\''; - - if (($result = Db::getInstance()->execute($query)) != false) - return $this->setSuccessMessage('The task has been updated.'); - return $this->setErrorMessage('The task has not been updated'); - } - - public function addNewModulesTasks() - { - $crons = Hook::getHookModuleExecList('actionCronJob'); - - if ($crons == false) - return false; - - $id_shop = (int)Context::getContext()->shop->id; - $id_shop_group = (int)Context::getContext()->shop->id_shop_group; - - foreach ($crons as $cron) - { - $id_module = (int)$cron['id_module']; - $module = Module::getInstanceById((int)$cron['id_module']); - - if ($module == false) - { - Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.$this->name.' WHERE `id_cronjob` = \''.(int)$cron['id_cronjob'].'\''); - break; - } - - $cronjob = (bool)Db::getInstance()->getValue('SELECT `id_cronjob` FROM `'._DB_PREFIX_.$this->name.'` - WHERE `id_module` = \''.$id_module.'\' AND `id_shop` = \''.$id_shop.'\' AND `id_shop_group` = \''.$id_shop_group.'\''); - - if ($cronjob == false) - $this->registerModuleHook($id_module); - } - } - - protected function postProcessUpdateJobOneShot() - { - if (Tools::isSubmit('id_cronjob') == false) - return false; - - $id_cronjob = (int)Tools::getValue('id_cronjob'); - $id_shop = (int)Context::getContext()->shop->id; - $id_shop_group = (int)Context::getContext()->shop->id_shop_group; - - Db::getInstance()->execute('UPDATE '._DB_PREFIX_.$this->name.' - SET `one_shot` = IF (`one_shot`, 0, 1) WHERE `id_cronjob` = \''.(int)$id_cronjob.'\''); - - Tools::redirectAdmin($this->context->link->getAdminLink('AdminModules', false) - .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name - .'&token='.Tools::getAdminTokenLite('AdminModules')); - } - - protected function postProcessUpdateJobStatus() - { - if (Tools::isSubmit('id_cronjob') == false) - return false; - - $id_cronjob = (int)Tools::getValue('id_cronjob'); - $id_shop = (int)Context::getContext()->shop->id; - $id_shop_group = (int)Context::getContext()->shop->id_shop_group; - - Db::getInstance()->execute('UPDATE '._DB_PREFIX_.$this->name.' - SET `active` = IF (`active`, 0, 1) WHERE `id_cronjob` = \''.(int)$id_cronjob.'\''); - - Tools::redirectAdmin($this->context->link->getAdminLink('AdminModules', false) - .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name - .'&token='.Tools::getAdminTokenLite('AdminModules')); - } - - protected function isNewJobValid() - { - if ((Tools::isSubmit('description') == true) && - (Tools::isSubmit('task') == true) && - (Tools::isSubmit('hour') == true) && - (Tools::isSubmit('day') == true) && - (Tools::isSubmit('month') == true) && - (Tools::isSubmit('day_of_week') == true)) - { - if (self::isTaskURLValid(Tools::getValue('task')) == false) - return $this->setErrorMessage('The target link you entered is not valid. It should be an absolute URL, on the same domain as your shop.'); - - $hour = Tools::getValue('hour'); - $day = Tools::getValue('day'); - $month = Tools::getValue('month'); - $day_of_week = Tools::getValue('day_of_week'); - - return $this->isFrequencyValid($hour, $day, $month, $day_of_week); - } - - return false; - } - - protected function isFrequencyValid($hour, $day, $month, $day_of_week) - { - $success = true; - - if ((($hour >= -1) && ($hour < 24)) == false) - $success &= $this->setErrorMessage('The value you chose for the hour is not valid. It should be between 00:00 and 23:59.'); - if ((($day >= -1) && ($day <= 31)) == false) - $success &= $this->setErrorMessage('The value you chose for the day is not valid.'); - if ((($month >= -1) && ($month <= 31)) == false) - $success &= $this->setErrorMessage('The value you chose for the month is not valid.'); - if ((($day_of_week >= -1) && ($day_of_week < 7)) == false) - $success &= $this->setErrorMessage('The value you chose for the day of the week is not valid.'); - - return $success; - } - - protected static function isTaskURLValid($task) - { - $task = urlencode($task); - $shop_url = urlencode(Tools::getShopDomain(true, true).__PS_BASE_URI__); - $shop_url_ssl = urlencode(Tools::getShopDomainSsl(true, true).__PS_BASE_URI__); - - return ((strpos($task, $shop_url) === 0) || (strpos($task, $shop_url_ssl) === 0)); - } - - protected function setErrorMessage($message) - { - $this->_errors[] = $this->l($message); - return false; - } - - protected function setSuccessMessage($message) - { - $this->_successes[] = $this->l($message); - return true; - } - - protected function setWarningMessage($message) - { - $this->_warnings[] = $this->l($message); - return false; - } - - protected function enableWebservice() - { - Configuration::updateValue('CRONJOBS_MODE', 'webservice'); - $this->updateWebservice(true); - } - - protected function disableWebservice() - { - Configuration::updateValue('CRONJOBS_MODE', 'advanced'); - $this->updateWebservice(false); - } - - protected function updateWebservice($use_webservice) - { - if ($this->isLocalEnvironment() == true) { - return true; - } - - $link = new Link(); - $admin_folder = $this->getAdminDir(); - $path = Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.$admin_folder; - $cron_url = $path.'/'.$link->getAdminLink('AdminCronJobs', false); - - $webservice_id = Configuration::get('CRONJOBS_WEBSERVICE_ID') ? '/'.Configuration::get('CRONJOBS_WEBSERVICE_ID') : null; - - $data = array( - 'callback' => $link->getModuleLink($this->name, 'callback'), - 'domain' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__, - 'cronjob' => $cron_url.'&token='.Configuration::getGlobalValue('CRONJOBS_EXECUTION_TOKEN'), - 'cron_token' => Configuration::getGlobalValue('CRONJOBS_EXECUTION_TOKEN'), - 'active' => (bool)$use_webservice - ); - - $context_options = array('http' => array( - 'method' => (is_null($webservice_id) == true) ? 'POST' : 'PUT', - 'header' => 'Content-type: application/x-www-form-urlencoded', - 'content' => http_build_query($data) - )); - - $result = Tools::file_get_contents($this->webservice_url.$webservice_id, false, stream_context_create($context_options)); - - if ($result != false) - Configuration::updateValue('CRONJOBS_WEBSERVICE_ID', (int)$result); - - if (((Tools::isSubmit('install') == true) || (Tools::isSubmit('reset') == true)) && ((bool)$result == false)) - return true; - elseif (((Tools::isSubmit('install') == false) || (Tools::isSubmit('reset') == false)) && ((bool)$result == false)) - return $this->setErrorMessage('An error occurred while trying to contact PrestaShop\'s cron tasks webservice.'); - - if ((bool)$use_webservice == true) - return $this->setSuccessMessage('Your cron tasks have been successfully added to PrestaShop\'s cron tasks webservice.'); - return $this->setSuccessMessage('Your cron tasks have been successfully registered using the Advanced mode.'); - } - - protected function postProcessDeleteCronJob($id_cronjob) - { - $id_cronjob = Tools::getValue('id_cronjob'); - $id_module = Db::getInstance()->getValue('SELECT `id_module` FROM '._DB_PREFIX_.$this->name.' WHERE `id_cronjob` = \''.(int)$id_cronjob.'\''); - - if ((bool)$id_module == false) - Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.$this->name.' WHERE `id_cronjob` = \''.(int)$id_cronjob.'\''); - else - Db::getInstance()->execute('UPDATE '._DB_PREFIX_.$this->name.' SET `active` = FALSE WHERE `id_cronjob` = \''.(int)$id_cronjob.'\''); - - return Tools::redirectAdmin($this->context->link->getAdminLink('AdminModules', false) - .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name - .'&token='.Tools::getAdminTokenLite('AdminModules')); - } - - protected function registerModuleHook($id_module) - { - $module = Module::getInstanceById($id_module); - $id_shop = (int)Context::getContext()->shop->id; - $id_shop_group = (int)Context::getContext()->shop->id_shop_group; - - if (is_callable(array($module, 'getCronFrequency')) == true) - { - $frequency = $module->getCronFrequency(); - - $query = 'INSERT INTO '._DB_PREFIX_.$this->name.' - (`id_module`, `hour`, `day`, `month`, `day_of_week`, `active`, `id_shop`, `id_shop_group`) - VALUES (\''.$id_module.'\', \''.$frequency['hour'].'\', \''.$frequency['day'].'\', - \''.$frequency['month'].'\', \''.$frequency['day_of_week'].'\', - TRUE, '.$id_shop.', '.$id_shop_group.')'; - } - else - $query = 'INSERT INTO '._DB_PREFIX_.$this->name.' - (`id_module`, `active`, `id_shop`, `id_shop_group`) - VALUES ('.$id_module.', FALSE, '.$id_shop.', '.$id_shop_group.')'; - - return Db::getInstance()->execute($query); - } - - protected function unregisterModuleHook($id_module) - { - return Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.$this->name.' WHERE `id_module` = \''.(int)$id_module.'\''); - } + NULL, TRUE, TRUE, '.$id_shop.', '.$id_shop_group.')'; + + return Db::getInstance()->execute($query); + } + } + + return false; + } + + protected function checkLocalEnvironment() + { + if ($this->isLocalEnvironment() == true) { + $this->setWarningMessage('You are using the Cron jobs module on a local installation: + you will not be able to use the Basic mode or reliably call remote cron tasks in your current environment. + To use this module at its best, you should switch to an online installation.'); + } + } + + protected function isLocalEnvironment() + { + if (isset($_SERVER['REMOTE_ADDR']) === false) { + return true; + } + + return in_array(Tools::getRemoteAddr(), array('127.0.0.1', '::1')) || preg_match('/^172\.16\.|^192\.168\.|^10\.|^127\.|^localhost|\.local$/', Configuration::get('PS_SHOP_DOMAIN')); + } + + protected function renderForm($form, $form_values, $action, $cancel = false, $back_url = false, $update = false) + { + $helper = new HelperForm(); + + $helper->show_toolbar = false; + $helper->module = $this; + $helper->default_form_language = $this->context->language->id; + $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG', 0); + + $helper->identifier = $this->identifier; + $helper->submit_action = $action; + + $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false) + .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; + + if ($update == true) { + $helper->currentIndex .= '&id_cronjob='.(int)Tools::getValue('id_cronjob'); + } + + $helper->token = Tools::getAdminTokenLite('AdminModules'); + + $helper->tpl_vars = array( + 'fields_value' => $form_values, + 'id_language' => $this->context->language->id, + 'languages' => $this->context->controller->getLanguages(), + 'back_url' => $back_url, + 'show_cancel_button' => $cancel, + ); + + return $helper->generateForm($form); + } + + protected function renderTasksList() + { + $helper = new HelperList(); + + $helper->title = $this->l('Cron tasks'); + $helper->table = $this->name; + $helper->no_link = true; + $helper->shopLinkType = ''; + $helper->identifier = 'id_cronjob'; + $helper->actions = array('edit', 'delete'); + + $values = CronJobsForms::getTasksListValues(); + $helper->listTotal = count($values); + $helper->tpl_vars = array('show_filters' => false); + + $helper->toolbar_btn['new'] = array( + 'href' => $this->context->link->getAdminLink('AdminModules', false) + .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name + .'&newcronjobs=1&token='.Tools::getAdminTokenLite('AdminModules'), + 'desc' => $this->l('Add new task') + ); + + $helper->token = Tools::getAdminTokenLite('AdminModules'); + $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false) + .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; + + return $helper->generateList($values, CronJobsForms::getTasksList()); + } + + protected function postProcessConfiguration() + { + if (Tools::isSubmit('cron_mode') == true) { + if (Tools::getValue('cron_mode') == 'advanced') { + return $this->disableWebservice(); + } + return $this->enableWebservice(); + } + } + + protected function postProcessNewJob() + { + if ($this->isNewJobValid() == true) { + $description = Db::getInstance()->escape(Tools::getValue('description')); + $task = urlencode(Tools::getValue('task')); + $hour = (int)Tools::getValue('hour'); + $day = (int)Tools::getValue('day'); + $month = (int)Tools::getValue('month'); + $day_of_week = (int)Tools::getValue('day_of_week'); + + $result = Db::getInstance()->getRow('SELECT id_cronjob FROM '._DB_PREFIX_.bqSQL($this->name).' + WHERE `task` = \''.$task.'\' AND `hour` = \''.$hour.'\' AND `day` = \''.$day.'\' + AND `month` = \''.$month.'\' AND `day_of_week` = \''.$day_of_week.'\''); + + if ($result == false) { + $id_shop = (int)Context::getContext()->shop->id; + $id_shop_group = (int)Context::getContext()->shop->id_shop_group; + + $query = 'INSERT INTO '._DB_PREFIX_.bqSQL($this->name).' + (`description`, `task`, `hour`, `day`, `month`, `day_of_week`, `updated_at`, `active`, `id_shop`, `id_shop_group`) + VALUES (\''.$description.'\', \''.$task.'\', \''.$hour.'\', \''.$day.'\', \''.$month.'\', \''.$day_of_week.'\', NULL, TRUE, '.$id_shop.', '.$id_shop_group.')'; + + if (($result = Db::getInstance()->execute($query)) != false) { + return $this->setSuccessMessage('The task has been successfully added.'); + } + return $this->setErrorMessage('An error happened: the task could not be added.'); + } + + return $this->setErrorMessage('This cron task already exists.'); + } + + return false; + } + + protected function postProcessUpdateJob() + { + if (Tools::isSubmit('id_cronjob') == false) { + return false; + } + + $description = Db::getInstance()->escape(Tools::getValue('description')); + $task = urlencode(Tools::getValue('task')); + $hour = (int)Tools::getValue('hour'); + $day = (int)Tools::getValue('day'); + $month = (int)Tools::getValue('month'); + $day_of_week = (int)Tools::getValue('day_of_week'); + $id_cronjob = (int)Tools::getValue('id_cronjob'); + + // $id_shop = (int)Context::getContext()->shop->id; + // $id_shop_group = (int)Context::getContext()->shop->id_shop_group; + + $query = 'UPDATE '._DB_PREFIX_.bqSQL($this->name).' + SET `description` = \''.$description.'\', + `task` = \''.$task.'\', + `hour` = \''.$hour.'\', + `day` = \''.$day.'\', + `month` = \''.$month.'\', + `day_of_week` = \''.$day_of_week.'\' + WHERE `id_cronjob` = \''.(int)$id_cronjob.'\''; + + if ((Db::getInstance()->execute($query)) != false) { + return $this->setSuccessMessage('The task has been updated.'); + } + return $this->setErrorMessage('The task has not been updated'); + } + + public function addNewModulesTasks() + { + $crons = Hook::getHookModuleExecList('actionCronJob'); + + if ($crons == false) { + return false; + } + + $id_shop = (int)Context::getContext()->shop->id; + $id_shop_group = (int)Context::getContext()->shop->id_shop_group; + + foreach ($crons as $cron) { + $id_module = (int)$cron['id_module']; + $module = Module::getInstanceById((int)$cron['id_module']); + + if ($module == false) { + Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.bqSQL($this->name).' WHERE `id_cronjob` = \''.(int)$cron['id_cronjob'].'\''); + break; + } + + $cronjob = (bool)Db::getInstance()->getValue('SELECT `id_cronjob` FROM `'._DB_PREFIX_.bqSQL($this->name).'` + WHERE `id_module` = \''.$id_module.'\' AND `id_shop` = \''.$id_shop.'\' AND `id_shop_group` = \''.$id_shop_group.'\''); + + if ($cronjob == false) { + $this->registerModuleHook($id_module); + } + } + } + + protected function postProcessUpdateJobOneShot() + { + if (Tools::isSubmit('id_cronjob') == false) { + return false; + } + + $id_cronjob = (int)Tools::getValue('id_cronjob'); + // $id_shop = (int)Context::getContext()->shop->id; + // $id_shop_group = (int)Context::getContext()->shop->id_shop_group; + + Db::getInstance()->execute('UPDATE '._DB_PREFIX_.bqSQL($this->name).' + SET `one_shot` = IF (`one_shot`, 0, 1) WHERE `id_cronjob` = \''.(int)$id_cronjob.'\''); + + Tools::redirectAdmin($this->context->link->getAdminLink('AdminModules', false) + .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name + .'&token='.Tools::getAdminTokenLite('AdminModules')); + } + + protected function postProcessUpdateJobStatus() + { + if (Tools::isSubmit('id_cronjob') == false) { + return false; + } + + $id_cronjob = (int)Tools::getValue('id_cronjob'); + // $id_shop = (int)Context::getContext()->shop->id; + // $id_shop_group = (int)Context::getContext()->shop->id_shop_group; + + Db::getInstance()->execute('UPDATE '._DB_PREFIX_.bqSQL($this->name).' + SET `active` = IF (`active`, 0, 1) WHERE `id_cronjob` = \''.(int)$id_cronjob.'\''); + + Tools::redirectAdmin($this->context->link->getAdminLink('AdminModules', false) + .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name + .'&token='.Tools::getAdminTokenLite('AdminModules')); + } + + protected function isNewJobValid() + { + if ((Tools::isSubmit('description') == true) && + (Tools::isSubmit('task') == true) && + (Tools::isSubmit('hour') == true) && + (Tools::isSubmit('day') == true) && + (Tools::isSubmit('month') == true) && + (Tools::isSubmit('day_of_week') == true)) { + if (self::isTaskURLValid(Tools::getValue('task')) == false) { + return $this->setErrorMessage('The target link you entered is not valid. It should be an absolute URL, on the same domain as your shop.'); + } + + $hour = Tools::getValue('hour'); + $day = Tools::getValue('day'); + $month = Tools::getValue('month'); + $day_of_week = Tools::getValue('day_of_week'); + + return $this->isFrequencyValid($hour, $day, $month, $day_of_week); + } + + return false; + } + + protected function isFrequencyValid($hour, $day, $month, $day_of_week) + { + $success = true; + + if ((($hour >= -1) && ($hour < 24)) == false) { + $success &= $this->setErrorMessage('The value you chose for the hour is not valid. It should be between 00:00 and 23:59.'); + } + if ((($day >= -1) && ($day <= 31)) == false) { + $success &= $this->setErrorMessage('The value you chose for the day is not valid.'); + } + if ((($month >= -1) && ($month <= 31)) == false) { + $success &= $this->setErrorMessage('The value you chose for the month is not valid.'); + } + if ((($day_of_week >= -1) && ($day_of_week < 7)) == false) { + $success &= $this->setErrorMessage('The value you chose for the day of the week is not valid.'); + } + + return $success; + } + + protected static function isTaskURLValid($task) + { + $task = urlencode($task); + $shop_url = urlencode(Tools::getShopDomain(true, true).__PS_BASE_URI__); + $shop_url_ssl = urlencode(Tools::getShopDomainSsl(true, true).__PS_BASE_URI__); + + return ((strpos($task, $shop_url) === 0) || (strpos($task, $shop_url_ssl) === 0)); + } + + protected function setErrorMessage($message) + { + $this->_errors[] = $this->l($message); + return false; + } + + protected function setSuccessMessage($message) + { + $this->_successes[] = $this->l($message); + return true; + } + + protected function setWarningMessage($message) + { + $this->_warnings[] = $this->l($message); + return false; + } + + protected function enableWebservice() + { + Configuration::updateValue('CRONJOBS_MODE', 'webservice'); + $this->updateWebservice(true); + } + + protected function disableWebservice() + { + Configuration::updateValue('CRONJOBS_MODE', 'advanced'); + $this->updateWebservice(false); + } + + protected function updateWebservice($use_webservice) + { + if ($this->isLocalEnvironment() == true) { + return true; + } + + $link = new Link(); + $admin_folder = $this->getAdminDir(); + if (version_compare(_PS_VERSION_, '1.7', '<') == true) { + $path = Tools::getShopDomainSsl(true, true).__PS_BASE_URI__.$admin_folder; + $cron_url = $path.'/'.$link->getAdminLink('AdminCronJobs', false); + } else { + $cron_url = $link->getAdminLink('AdminCronJobs', false); + } + + $webservice_id = Configuration::get('CRONJOBS_WEBSERVICE_ID') ? '/'.Configuration::get('CRONJOBS_WEBSERVICE_ID') : null; + + $data = array( + 'callback' => $link->getModuleLink($this->name, 'callback'), + 'domain' => Tools::getShopDomainSsl(true, true).__PS_BASE_URI__, + 'cronjob' => $cron_url.'&token='.Configuration::getGlobalValue('CRONJOBS_EXECUTION_TOKEN'), + 'cron_token' => Configuration::getGlobalValue('CRONJOBS_EXECUTION_TOKEN'), + 'active' => (bool)$use_webservice + ); + + $context_options = array('http' => array( + 'method' => (is_null($webservice_id) == true) ? 'POST' : 'PUT', + 'header' => 'Content-type: application/x-www-form-urlencoded', + 'content' => http_build_query($data) + )); + + $result = Tools::file_get_contents($this->webservice_url.$webservice_id, false, stream_context_create($context_options)); + + if ($result != false) { + Configuration::updateValue('CRONJOBS_WEBSERVICE_ID', (int)$result); + } + + if (((Tools::isSubmit('install') == true) || (Tools::isSubmit('reset') == true)) && ((bool)$result == false)) { + return true; + } elseif (((Tools::isSubmit('install') == false) || (Tools::isSubmit('reset') == false)) && ((bool)$result == false)) { + return $this->setErrorMessage('An error occurred while trying to contact PrestaShop\'s cron tasks webservice.'); + } + + if ((bool)$use_webservice == true) { + return $this->setSuccessMessage('Your cron tasks have been successfully added to PrestaShop\'s cron tasks webservice.'); + } + return $this->setSuccessMessage('Your cron tasks have been successfully registered using the Advanced mode.'); + } + + protected function postProcessDeleteCronJob($id_cronjob) + { + $id_cronjob = Tools::getValue('id_cronjob'); + $id_module = Db::getInstance()->getValue('SELECT `id_module` FROM '._DB_PREFIX_.bqSQL($this->name).' WHERE `id_cronjob` = \''.(int)$id_cronjob.'\''); + + if ((bool)$id_module == false) { + Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.bqSQL($this->name).' WHERE `id_cronjob` = \''.(int)$id_cronjob.'\''); + } else { + Db::getInstance()->execute('UPDATE '._DB_PREFIX_.bqSQL($this->name).' SET `active` = FALSE WHERE `id_cronjob` = \''.(int)$id_cronjob.'\''); + } + + return Tools::redirectAdmin($this->context->link->getAdminLink('AdminModules', false) + .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name + .'&token='.Tools::getAdminTokenLite('AdminModules')); + } + + protected function registerModuleHook($id_module) + { + $module = Module::getInstanceById($id_module); + $id_shop = (int)Context::getContext()->shop->id; + $id_shop_group = (int)Context::getContext()->shop->id_shop_group; + + if (is_callable(array($module, 'getCronFrequency')) == true) { + $frequency = $module->getCronFrequency(); + + $query = 'INSERT INTO '._DB_PREFIX_.bqSQL($this->name).' + (`id_module`, `hour`, `day`, `month`, `day_of_week`, `active`, `id_shop`, `id_shop_group`) + VALUES (\''.$id_module.'\', \''.$frequency['hour'].'\', \''.$frequency['day'].'\', + \''.$frequency['month'].'\', \''.$frequency['day_of_week'].'\', + TRUE, '.$id_shop.', '.$id_shop_group.')'; + } else { + $query = 'INSERT INTO '._DB_PREFIX_.bqSQL($this->name).' + (`id_module`, `active`, `id_shop`, `id_shop_group`) + VALUES ('.$id_module.', FALSE, '.$id_shop.', '.$id_shop_group.')'; + } + + return Db::getInstance()->execute($query); + } + + protected function unregisterModuleHook($id_module) + { + return Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.bqSQL($this->name).' WHERE `id_module` = \''.(int)$id_module.'\''); + } } diff --git a/modules/cronjobs/translations/fr.php b/modules/cronjobs/translations/fr.php index 0c0931906..7ea298168 100644 --- a/modules/cronjobs/translations/fr.php +++ b/modules/cronjobs/translations/fr.php @@ -2,7 +2,25 @@ global $_MODULE; $_MODULE = array(); - +$_MODULE['<{cronjobs}prestashop>cronjobs_682ee2e41e510efdbced967430173c66'] = 'Éditeur de tâches cron'; +$_MODULE['<{cronjobs}prestashop>cronjobs_c75e110ddb05aea61563c50d7baf0ae0'] = 'Gérez toutes vos tâches web automatisées depuis une interface unique.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_4093808c9781fb6ca2ed5ade71deff4d'] = 'Pour pouvoir utiliser ce module, veuillez activer cURL (extension PHP).'; +$_MODULE['<{cronjobs}prestashop>cronjobs_3fb6877089c15977e1607e8fbd9c3904'] = 'Vous utilisez le module de tâches cron sur une installation locale: vous ne serez pas en mesure d\'utiliser le mode Basique ou d\'appeler des tâches distantes sur votre environnement actuel. Pour utiliser ce module correctement, vous devez basculer sur une installation en ligne.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_035d5cdab2c65ad42b303f8125025160'] = 'Tâches cron'; +$_MODULE['<{cronjobs}prestashop>cronjobs_6588952424b58b4c9fc9df026b668991'] = 'Ajouter une nouvelle tâche'; +$_MODULE['<{cronjobs}prestashop>cronjobs_d5b84f71f6ffd3152bfcae304f4cf324'] = 'La tâche a été ajoutée.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_b4a8f8cb0f74430af046c34a8f4a7dd4'] = 'Une erreur est survenue : La tâche n\'a pas pu être ajoutée.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_e038cce99ccc9a523aa201e3e27de0fc'] = 'Cette tâche existe déjà'; +$_MODULE['<{cronjobs}prestashop>cronjobs_b85ec3d68e176d94b0f2a9405ddee24b'] = 'La tâche a été mise à jour.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_f2b5e497885cc7d0b841f49dbc07754e'] = 'La tâche n\'a pas été mise à jour.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_90439f18c853bd247f49e6a1e883da8e'] = 'Le lien cible que vous avez rentré n\'est pas valide. L\'URL doit-être absolue, sur le même domaine que votre boutique.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_33eadad95aebb60e67cfccb2fcfa9a9a'] = 'L\'heure choisie n\'est pas valide. La valeur doit-être comprise entre 00:00 et 23:59.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_e7dfc672f114367a17143973fcbe8851'] = 'Le jour choisi n\'est pas valide.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_dccd5ec41d43db379974d6b25493c9c4'] = 'Le mois choisi n\'est pas valide.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_4914bbffb06f6299a6ef641873a818e3'] = 'Le jour de la semaine choisi n\'est pas valide.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_0903ea99179b93dfb6e36014d57e10ea'] = 'Une erreur est survenue lors de la connexion avec le web service de gestion des tâches cron de PrestaShop.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_c5cc9ba8f1da1e9421f06d0bb56e5784'] = 'Votre tâche cron a bien été enregistrée sur le web service de gestion des tâches cron de PrestaShop.'; +$_MODULE['<{cronjobs}prestashop>cronjobs_fe1386ceb6d00ab7ad97cb86a27c00f9'] = 'Votre tâche cron a bien été enregistrée avec le mode Avancé.'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_c9cc8cce247e49bae79f15173ce97354'] = 'Enregistrer'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_d4169d52732e9ae8df56d2cbcad81a94'] = 'Description de la tâche'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_70d4968bea9a6e76c0333904b9d385e4'] = 'Mettre à jour mes devises'; @@ -11,10 +29,10 @@ $_MODULE['<{cronjobs}prestashop>cronjobsforms_07045abc579615634804f42bc0b2b4bb'] $_MODULE['<{cronjobs}prestashop>cronjobsforms_43773e69610c99be6c15daa4a2036443'] = 'Définissez le lien de votre tâche cron.'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_3a21e2309e8e6aa3759e466154508f2c'] = 'N\'oubliez pas d\'utiliser une URL absolue pour qu\'il soit valide ! Le lien doit également être sur le même domaine que la boutique.'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_be938fb8c5582085599dfa95368fb489'] = 'Fréquence de la tâche'; -$_MODULE['<{cronjobs}prestashop>cronjobsforms_b3364fad867d47ca61265fd315e4071e'] = 'A quel moment cette tâche doit-elle être exécutée ?'; -$_MODULE['<{cronjobs}prestashop>cronjobsforms_6c5d30049c4d8d644bd35650be4ac13a'] = 'Quel jour du mois cette tâche doit-elle être exécutée ?'; -$_MODULE['<{cronjobs}prestashop>cronjobsforms_a1457ee25ec20fa032d37509b5a90a4e'] = 'Quel mois de l\'année cette tâche doit-elle être exécutée ?'; -$_MODULE['<{cronjobs}prestashop>cronjobsforms_65f768d204a3118f426c756056bef1e1'] = 'Quel jour de la semaine cette tâche doit-elle être exécutée ?'; +$_MODULE['<{cronjobs}prestashop>cronjobsforms_b3364fad867d47ca61265fd315e4071e'] = 'À quelle heure la tâche doit-elle être exécutée ?'; +$_MODULE['<{cronjobs}prestashop>cronjobsforms_6c5d30049c4d8d644bd35650be4ac13a'] = 'Quel jour du mois doit-elle être exécutée ?'; +$_MODULE['<{cronjobs}prestashop>cronjobsforms_a1457ee25ec20fa032d37509b5a90a4e'] = 'Quel mois doit-elle être exécutée ?'; +$_MODULE['<{cronjobs}prestashop>cronjobsforms_65f768d204a3118f426c756056bef1e1'] = 'Quel jour de la semaine doit-elle être exécutée ?'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_f4f70727dc34561dfde1a3c529b6205c'] = 'Paramètres'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_b3419e63398ccc41c062f36631bebd9a'] = 'Mode cron'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_972e73b7a882d0802a4e3a16946a2f94'] = 'Basique'; @@ -22,7 +40,7 @@ $_MODULE['<{cronjobs}prestashop>cronjobsforms_eaf1dc6d93a18adb2619233d8e99c197'] $_MODULE['<{cronjobs}prestashop>cronjobsforms_9b6545e4cea9b4ad4979d41bb9170e2b'] = 'Avancé'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_b6610b26530c9ee3d7bc4a478cf35299'] = 'Pour les utilisateurs expérimentés seulement : utilisez votre propre éditeur de crontab au lieu du webservice pour tâches cron de PrestaShop.'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_2257d36bcb68362b24cf74f626bac599'] = 'Le mode avancé vous permet d\'utiliser votre propre éditeur de tâche cron au lieu du webservice PrestaShop.'; -$_MODULE['<{cronjobs}prestashop>cronjobsforms_94ad8b9f9d516489693dd835cf22bd3b'] = 'Avant tout, vérifiez que la bibliothèque "curl" est bien installée sur votre serveur.'; +$_MODULE['<{cronjobs}prestashop>cronjobsforms_94ad8b9f9d516489693dd835cf22bd3b'] = 'Avant tout, vérifiez que la bibliothèque \"curl\" est bien installée sur votre serveur.'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_18028ef85b7ce8fbde749a2c49c6d18a'] = 'Pour exécuter vos tâches cron, veuillez insérer la ligne suivante dans votre éditeur de tâches cron :'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_b55e509c697e4cca0e1d160a7806698f'] = 'Heure'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_03727ac48595a24daed975559c944a44'] = 'Jour'; @@ -38,18 +56,10 @@ $_MODULE['<{cronjobs}prestashop>cronjobsforms_8ed91b71d01993965915f3b296c20336'] $_MODULE['<{cronjobs}prestashop>cronjobsforms_50875e72e1477618055d1508112199b4'] = 'Tous les jours de la semaine'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_6e7b34fa59e1bd229b207892956dc41c'] = 'Jamais'; $_MODULE['<{cronjobs}prestashop>cronjobsforms_16ed0a7b977ec3bbd23badfb5580d56f'] = 'Tous les jours du mois'; -$_MODULE['<{cronjobs}prestashop>cronjobs_682ee2e41e510efdbced967430173c66'] = 'Éditeur de tâches cron'; -$_MODULE['<{cronjobs}prestashop>cronjobs_c75e110ddb05aea61563c50d7baf0ae0'] = 'Gérez toutes vos tâches web automatisées depuis une interface unique.'; -$_MODULE['<{cronjobs}prestashop>cronjobs_4093808c9781fb6ca2ed5ade71deff4d'] = 'Pour pouvoir utiliser ce module, veuillez activer cURL (extension PHP).'; -$_MODULE['<{cronjobs}prestashop>cronjobs_035d5cdab2c65ad42b303f8125025160'] = 'Tâches cron'; -$_MODULE['<{cronjobs}prestashop>cronjobs_6588952424b58b4c9fc9df026b668991'] = 'Ajouter une nouvelle tâche'; -$_MODULE['<{cronjobs}prestashop>form_ef7bd68a02b6b5656554f7a27d1c7bdf'] = 'Erreur !'; -$_MODULE['<{cronjobs}prestashop>form_dc3fd488f03d423a04da27ce66274c1b'] = 'Attention !'; -$_MODULE['<{cronjobs}prestashop>form_402e7a087747cb56c718bde84651f96a'] = 'Réussite !'; $_MODULE['<{cronjobs}prestashop>configure_27c1f598c2b2b0a8e64424d257e8b398'] = 'Que fait ce module ?'; $_MODULE['<{cronjobs}prestashop>configure_c22203a97c7dd88dd68d1e864d46ee0c'] = 'À l\'origine, cron est un outil du système Unix qui permet de planifier des tâches à un instant donné : vous pouvez créer de nombreuses tâches cron qui seront alors exécutées périodiquement à une heure, date ou intervalle fixé.'; $_MODULE['<{cronjobs}prestashop>configure_d24ca73e026491b9610193f36d5edec8'] = 'Ce module vous fournit un outil cron : vous pouvez créer des tâches qui appelleront un ensemble d\'URL sécurisées sur votre boutique PrestaShop, déclenchant ainsi des mises à jour et autres tâches automatisées.'; $_MODULE['<{cronjobs}prestashop>task_b43ff85c4fc17955aa3ba90827d65430'] = 'N\'oubliez pas d\'utiliser une URL absolue dans le lien cible pour le rendre valide ! Le lien doit aussi être sur le même domaine que la boutique.'; - - -return $_MODULE; +$_MODULE['<{cronjobs}prestashop>form_ef7bd68a02b6b5656554f7a27d1c7bdf'] = 'Erreur !'; +$_MODULE['<{cronjobs}prestashop>form_dc3fd488f03d423a04da27ce66274c1b'] = 'Attention !'; +$_MODULE['<{cronjobs}prestashop>form_402e7a087747cb56c718bde84651f96a'] = 'Réussite !'; diff --git a/modules/cronjobs/upgrade/upgrade-1.0.6.php b/modules/cronjobs/upgrade/upgrade-1.0.6.php index e6cfa7f93..cd2336d2c 100644 --- a/modules/cronjobs/upgrade/upgrade-1.0.6.php +++ b/modules/cronjobs/upgrade/upgrade-1.0.6.php @@ -24,13 +24,15 @@ * International Registered Trademark & Property of PrestaShop SA */ -if (!defined('_PS_VERSION_')) - exit; +if (!defined('_PS_VERSION_')) { + exit; +} function upgrade_module_1_0_6($module) { - if (Db::getInstance()->ExecuteS('SHOW COLUMNS FROM `'._DB_PREFIX_.$module->name.'` LIKE \'one_shot\'') == false) - Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.$module->name.'` ADD `one_shot` BOOLEAN NOT NULL DEFAULT 0 AFTER `updated_at`'); + if (Db::getInstance()->ExecuteS('SHOW COLUMNS FROM `'._DB_PREFIX_.$module->name.'` LIKE \'one_shot\'') == false) { + Db::getInstance()->Execute('ALTER TABLE `'._DB_PREFIX_.$module->name.'` ADD `one_shot` BOOLEAN NOT NULL DEFAULT 0 AFTER `updated_at`'); + } - return $module; + return $module; } diff --git a/modules/cronjobs/views/css/bootstrap.min.css b/modules/cronjobs/views/css/bootstrap.min.css new file mode 100644 index 000000000..a9f35ceed --- /dev/null +++ b/modules/cronjobs/views/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.2.0 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;width:100% \9;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/modules/cronjobs/views/css/configure-ps-15.css b/modules/cronjobs/views/css/configure-ps-15.css new file mode 100644 index 000000000..e03fd2d71 --- /dev/null +++ b/modules/cronjobs/views/css/configure-ps-15.css @@ -0,0 +1,65 @@ +#content { + margin: 20px; +} + +#cronjobs_toolbar { + margin-top: 20px !important; +} + +#cronjobs-logo { + margin: 6px 15px 3px 0; +} + +.alert { + border-left: 1px solid; + border-right: 1px solid; +} + +.alert-warning { + border: 1px solid #9e6014 !important; + background: #FEEFB3 !important; +} + +.alert-info { + border: 1px solid #00529B !important; + background: #BDE5F8 !important; +} + +.alert-success { + border: 1px solid #4F8A10 !important; + background: #DFF2BF !important; +} + +.panel { + padding: 15px; + border: 1px solid #eee; + text-align: justify; +} + +.panel h3 { + margin-top: 0; +} + +.margin-form label { + text-align: left; + margin-bottom: 0; + padding-top: 2px; + line-height: 20px; + float: none !important; +} + +.margin-form input { + margin: 5px 5px 0 0; + vertical-align: top; +} + +.bootstrap form .tab-pane:first-child .panel { + border-top-left-radius: 0; +} +.bootstrap #cronjobs-logo { + margin-right: 4px; +} + +input[name="task"] { + width: 80%; +} diff --git a/modules/cronjobs/views/css/configure-ps-16.css b/modules/cronjobs/views/css/configure-ps-16.css new file mode 100644 index 000000000..9f9609ae6 --- /dev/null +++ b/modules/cronjobs/views/css/configure-ps-16.css @@ -0,0 +1,6 @@ +.bootstrap form .tab-pane:first-child .panel { + border-top-left-radius: 0; +} +.bootstrap #cronjobs-logo { + margin-right: 4px; +} \ No newline at end of file diff --git a/modules/cronjobs/views/css/index.php b/modules/cronjobs/views/css/index.php new file mode 100644 index 000000000..c57519dfb --- /dev/null +++ b/modules/cronjobs/views/css/index.php @@ -0,0 +1,35 @@ + +* @copyright 2007-2016 PrestaShop SA +* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + +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/modules/cronjobs/views/templates/admin/_configure/helpers/form/form.tpl b/modules/cronjobs/views/templates/admin/_configure/helpers/form/form.tpl index ab547f4af..751d86245 100644 --- a/modules/cronjobs/views/templates/admin/_configure/helpers/form/form.tpl +++ b/modules/cronjobs/views/templates/admin/_configure/helpers/form/form.tpl @@ -1,5 +1,5 @@ {* -* 2007-2016 PrestaShop +* 2007-2017 PrestaShop * * NOTICE OF LICENSE * @@ -18,7 +18,7 @@ * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA -* @copyright 2007-2016 PrestaShop SA +* @copyright 2007-2017 PrestaShop SA * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA *} @@ -27,38 +27,38 @@ {block name="defaultForm"} - {if (isset($form_errors)) && (count($form_errors) > 0)} -
    -

    {l s='Error!' mod='cronjobs'}

    -
      - {foreach from=$form_errors item='message'} -
    • {$message|escape:'htmlall':'UTF-8'}
    • - {/foreach} -
    -
    - {/if} + {if (isset($form_errors)) && (count($form_errors) > 0)} +
    +

    {l s='Error!' mod='cronjobs'}

    +
      + {foreach from=$form_errors item='message'} +
    • {$message|escape:'htmlall':'UTF-8'}
    • + {/foreach} +
    +
    + {/if} - {if (isset($form_infos)) && (count($form_infos) > 0)} -
    -

    {l s='Warning!' mod='cronjobs'}

    -
      - {foreach from=$form_infos item='message'} -
    • {$message|escape:'htmlall':'UTF-8'}
    • - {/foreach} -
    -
    - {/if} + {if (isset($form_infos)) && (count($form_infos) > 0)} +
    +

    {l s='Warning!' mod='cronjobs'}

    +
      + {foreach from=$form_infos item='message'} +
    • {$message|escape:'htmlall':'UTF-8'}
    • + {/foreach} +
    +
    + {/if} - {if (isset($form_successes)) && (count($form_successes) > 0)} -
    -

    {l s='Success!' mod='cronjobs'}

    -
      - {foreach from=$form_successes item='message'} -
    • {$message|escape:'htmlall':'UTF-8'}
    • - {/foreach} -
    -
    - {/if} + {if (isset($form_successes)) && (count($form_successes) > 0)} +
    +

    {l s='Success!' mod='cronjobs'}

    +
      + {foreach from=$form_successes item='message'} +
    • {$message|escape:'htmlall':'UTF-8'}
    • + {/foreach} +
    +
    + {/if} - {$smarty.block.parent} + {$smarty.block.parent} {/block} diff --git a/modules/cronjobs/views/templates/admin/configure.tpl b/modules/cronjobs/views/templates/admin/configure.tpl index 7fe9fcb7c..aaeece531 100644 --- a/modules/cronjobs/views/templates/admin/configure.tpl +++ b/modules/cronjobs/views/templates/admin/configure.tpl @@ -1,5 +1,5 @@ {* -* 2007-2016 PrestaShop +* 2007-2017 PrestaShop * * NOTICE OF LICENSE * @@ -18,17 +18,17 @@ * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA -* @copyright 2007-2016 PrestaShop SA +* @copyright 2007-2017 PrestaShop SA * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA *}
    -

    {l s='What does this module do?' mod='cronjobs'}

    -

    - - {l s='Originally, cron is a Unix system tool that provides time-based job scheduling: you can create many cron jobs, which are then run periodically at fixed times, dates, or intervals.' mod='cronjobs'} -
    - {l s='This module provides you with a cron-like tool: you can create jobs which will call a given set of secure URLs to your PrestaShop store, thus triggering updates and other automated tasks.' mod='cronjobs'} -

    +

    {l s='What does this module do?' mod='cronjobs'}

    +

    + + {l s='Originally, cron is a Unix system tool that provides time-based job scheduling: you can create many cron jobs, which are then run periodically at fixed times, dates, or intervals.' mod='cronjobs'} +
    + {l s='This module provides you with a cron-like tool: you can create jobs which will call a given set of secure URLs to your PrestaShop store, thus triggering updates and other automated tasks.' mod='cronjobs'} +

    diff --git a/modules/cronjobs/views/templates/admin/task.tpl b/modules/cronjobs/views/templates/admin/task.tpl index 14b0555e4..43699bc5e 100644 --- a/modules/cronjobs/views/templates/admin/task.tpl +++ b/modules/cronjobs/views/templates/admin/task.tpl @@ -1,5 +1,5 @@ {* -* 2007-2016 PrestaShop +* 2007-2017 PrestaShop * * NOTICE OF LICENSE * @@ -18,14 +18,14 @@ * needs please refer to http://www.prestashop.com for more information. * * @author PrestaShop SA -* @copyright 2007-2016 PrestaShop SA +* @copyright 2007-2017 PrestaShop SA * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA *}
    -

    Reminder

    -

    - {l s='Do not forget to use an absolute URL in the target link to make it valid! The link also has to be on the same domain as the shop.' mod='cronjobs'} -

    +

    Reminder

    +

    + {l s='Do not forget to use an absolute URL in the target link to make it valid! The link also has to be on the same domain as the shop.' mod='cronjobs'} +

    diff --git a/modules/crossselling/config.xml b/modules/crossselling/config.xml new file mode 100644 index 000000000..6c1a7f4c6 --- /dev/null +++ b/modules/crossselling/config.xml @@ -0,0 +1,12 @@ + + + crossselling + + + + + + 1 + 0 + + \ No newline at end of file diff --git a/modules/dashactivity/config.xml b/modules/dashactivity/config.xml new file mode 100644 index 000000000..e26b353b1 --- /dev/null +++ b/modules/dashactivity/config.xml @@ -0,0 +1,12 @@ + + + dashactivity + + + + + + 0 + 1 + + \ No newline at end of file diff --git a/modules/dashactivity/dashactivity.php b/modules/dashactivity/dashactivity.php index f42aba2ff..799831c01 100644 --- a/modules/dashactivity/dashactivity.php +++ b/modules/dashactivity/dashactivity.php @@ -140,7 +140,7 @@ class Dashactivity extends Module 'dash_traffic_source' => array( ' prestashop.com' => round($visits / 2), ' google.com' => round($visits / 3), - ' Direct Traffic' => round($visits / 4) + ' Direct Traffic' => 0 ) ), 'data_chart' => array( @@ -149,7 +149,7 @@ class Dashactivity extends Module 'data' => array( array('key' => 'prestashop.com', 'y' => round($visits / 2), 'color' => self::$colors[0]), array('key' => 'google.com', 'y' => round($visits / 3), 'color' => self::$colors[1]), - array('key' => 'Direct Traffic', 'y' => round($visits / 4), 'color' => self::$colors[2]) + array('key' => 'Direct Traffic', 'y' =>0, 'color' => self::$colors[2]), ) ) ) diff --git a/modules/dashactivity/views/js/dashactivity.js b/modules/dashactivity/views/js/dashactivity.js index 06681d915..fa23e1831 100644 --- a/modules/dashactivity/views/js/dashactivity.js +++ b/modules/dashactivity/views/js/dashactivity.js @@ -23,134 +23,133 @@ * International Registered Trademark & Property of PrestaShop SA */ -function pie_chart_trends(widget_name, chart_details) -{ - nv.addGraph(function() { - var chart = nv.models.pieChart() - .x(function(d) { return d.key }) - .y(function(d) { return d.y }) - .color(d3.scale.category10().range()) - .donut(true) - .showLabels(false) - .showLegend(false); +function pie_chart_trends(widget_name, chart_details) { + nv.addGraph(function() { + var chart = nv.models.pieChart() + .x(function(d) { return d.key }) + .y(function(d) { return d.y }) + .color(d3.scale.category10().range()) + .donut(true) + .showLabels(false) + .showLegend(false); - d3.select("#dash_traffic_chart2 svg") - .datum(chart_details.data) - .transition().duration(1200) - .call(chart); - - nv.utils.windowResize(chart.update); + d3.select("#dash_traffic_chart2 svg") + .datum(chart_details.data) + .transition().duration(1200) + .call(chart); - return chart; - }); + nv.utils.windowResize(chart.update); + + return chart; + }); } //TODO unify this with other function in calenda.js and replace date.js functions Date.parseDate = function(date, format) { - if (format === undefined) - format = 'Y-m-d'; + if (format === undefined) + format = 'Y-m-d'; - var formatSeparator = format.match(/[.\/\-\s].*?/); - var formatParts = format.split(/\W+/); - var parts = date.split(formatSeparator); - var date = new Date(); + var formatSeparator = format.match(/[.\/\-\s].*?/); + var formatParts = format.split(/\W+/); + var parts = date.split(formatSeparator); + var date = new Date(); - if (parts.length === formatParts.length) { - date.setHours(0); - date.setMinutes(0); - date.setSeconds(0); - date.setMilliseconds(0); + if (parts.length === formatParts.length) { + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); - for (var i=0; i<=formatParts.length; i++) { - switch(formatParts[i]) { - case 'dd': - case 'd': - case 'j': - date.setDate(parseInt(parts[i], 10)||1); - break; + for (var i = 0; i <= formatParts.length; i++) { + switch (formatParts[i]) { + case 'dd': + case 'd': + case 'j': + date.setDate(parseInt(parts[i], 10) || 1); + break; - case 'mm': - case 'm': - date.setMonth((parseInt(parts[i], 10)||1) - 1); - break; + case 'mm': + case 'm': + date.setMonth((parseInt(parts[i], 10) || 1) - 1); + break; - case 'yy': - case 'y': - date.setFullYear(2000 + (parseInt(parts[i], 10)||1)); - break; + case 'yy': + case 'y': + date.setFullYear(2000 + (parseInt(parts[i], 10) || 1)); + break; - case 'yyyy': - case 'Y': - date.setFullYear(parseInt(parts[i], 10)||1); - break; - } - } - } + case 'yyyy': + case 'Y': + date.setFullYear(parseInt(parts[i], 10) || 1); + break; + } + } + } - return date; + return date; }; Date.prototype.format = function(format) { - if (format === undefined) - return this.toString(); + if (format === undefined) + return this.toString(); - var formatSeparator = format.match(/[.\/\-\s].*?/); - var formatParts = format.split(/\W+/); - var result = ''; + var formatSeparator = format.match(/[.\/\-\s].*?/); + var formatParts = format.split(/\W+/); + var result = ''; - for (var i=0; i<=formatParts.length; i++) { - switch(formatParts[i]) { - case 'd': - case 'j': - result += this.getDate() + formatSeparator; - break; + for (var i = 0; i <= formatParts.length; i++) { + switch (formatParts[i]) { + case 'd': + case 'j': + result += this.getDate() + formatSeparator; + break; - case 'dd': - result += (this.getDate() < 10 ? '0' : '')+this.getDate() + formatSeparator; - break; + case 'dd': + result += (this.getDate() < 10 ? '0' : '') + this.getDate() + formatSeparator; + break; - case 'm': - result += (this.getMonth() + 1) + formatSeparator; - break; + case 'm': + result += (this.getMonth() + 1) + formatSeparator; + break; - case 'mm': - result += (this.getMonth() < 9 ? '0' : '')+(this.getMonth() + 1) + formatSeparator; - break; + case 'mm': + result += (this.getMonth() < 9 ? '0' : '') + (this.getMonth() + 1) + formatSeparator; + break; - case 'yy': - case 'y': - result += this.getFullYear() + formatSeparator; - break; + case 'yy': + case 'y': + result += this.getFullYear() + formatSeparator; + break; - case 'yyyy': - case 'Y': - result += this.getFullYear() + formatSeparator; - break; - } - } + case 'yyyy': + case 'Y': + result += this.getFullYear() + formatSeparator; + break; + } + } - return result.slice(0, -1); + return result.slice(0, -1); } $(document).ready(function() { - if (typeof date_subtitle === "undefined") - var date_subtitle = '(from %s to %s)'; + if (typeof date_subtitle === "undefined") + var date_subtitle = '(from %s to %s)'; - if (typeof date_format === "undefined") - var date_format = 'Y-mm-dd'; + if (typeof date_format === "undefined") + var date_format = 'Y-mm-dd'; - $('#date-start').change(function() { - start = Date.parseDate($('#date-start').val(), 'Y-m-d'); - end = Date.parseDate($('#date-end').val(), 'Y-m-d'); - $('#customers-newsletters-subtitle').html(sprintf(date_subtitle, start.format(date_format), end.format(date_format))); - $('#traffic-subtitle').html(sprintf(date_subtitle, start.format(date_format), end.format(date_format))); - }); + $('#date-start').change(function() { + start = Date.parseDate($('#date-start').val(), 'Y-m-d'); + end = Date.parseDate($('#date-end').val(), 'Y-m-d'); + $('#customers-newsletters-subtitle').html(sprintf(date_subtitle, start.format(date_format), end.format(date_format))); + $('#traffic-subtitle').html(sprintf(date_subtitle, start.format(date_format), end.format(date_format))); + }); - $('#date-end').change(function() { - start = Date.parseDate($('#date-start').val(), 'Y-m-d'); - end = Date.parseDate($('#date-end').val(), 'Y-m-d'); - - $('#customers-newsletters-subtitle').html(sprintf(date_subtitle, start.format(date_format), end.format(date_format))); - $('#traffic-subtitle').html(sprintf(date_subtitle, start.format(date_format), end.format(date_format))); - }); + $('#date-end').change(function() { + start = Date.parseDate($('#date-start').val(), 'Y-m-d'); + end = Date.parseDate($('#date-end').val(), 'Y-m-d'); + + $('#customers-newsletters-subtitle').html(sprintf(date_subtitle, start.format(date_format), end.format(date_format))); + $('#traffic-subtitle').html(sprintf(date_subtitle, start.format(date_format), end.format(date_format))); + }); }); \ No newline at end of file diff --git a/modules/dashgoals/config.xml b/modules/dashgoals/config.xml new file mode 100644 index 000000000..5781266c1 --- /dev/null +++ b/modules/dashgoals/config.xml @@ -0,0 +1,12 @@ + + + dashgoals + + + + + + 0 + 1 + + \ No newline at end of file diff --git a/modules/dashproducts/config.xml b/modules/dashproducts/config.xml new file mode 100644 index 000000000..aafc0b9c4 --- /dev/null +++ b/modules/dashproducts/config.xml @@ -0,0 +1,12 @@ + + + dashproducts + + + + + + 0 + 1 + + \ No newline at end of file diff --git a/modules/dashtrends/config.xml b/modules/dashtrends/config.xml new file mode 100644 index 000000000..2493af2f9 --- /dev/null +++ b/modules/dashtrends/config.xml @@ -0,0 +1,12 @@ + + + dashtrends + + + + + + 0 + 1 + + \ No newline at end of file diff --git a/modules/dashtrends/views/js/dashtrends.js b/modules/dashtrends/views/js/dashtrends.js index 2e53be609..ad374e1cb 100644 --- a/modules/dashtrends/views/js/dashtrends.js +++ b/modules/dashtrends/views/js/dashtrends.js @@ -1,85 +1,80 @@ var dashtrends_data; var dashtrends_chart; -function line_chart_trends(widget_name, chart_details) -{ - if (chart_details.data[0].values.length <= 1) - $('#dash_trends_chart1').hide(); - else - $('#dash_trends_chart1').show(); - nv.addGraph(function() { - var chart = nv.models.lineChart() - .useInteractiveGuideline(true) - .x(function(d) { return (d !== undefined ? d[0] : 0); }) - .y(function(d) { return (d !== undefined ? parseInt(d[1]) : 0); }) - .margin({left: 80}); +function line_chart_trends(widget_name, chart_details) { + if (chart_details.data[0].values.length <= 1) + $('#dash_trends_chart1').hide(); + else + $('#dash_trends_chart1').show(); + nv.addGraph(function() { + var chart = nv.models.lineChart() + .useInteractiveGuideline(true) + .x(function(d) { return (d !== undefined ? d[0] : 0); }) + .y(function(d) { return (d !== undefined ? parseInt(d[1]) : 0); }) + .margin({ left: 80 }); - chart.xAxis.tickFormat(function(d) { - date = new Date(d*1000); - return date.format(chart_details['date_format']); - }); + chart.xAxis.tickFormat(function(d) { + date = new Date(d * 1000); + return date.format(chart_details['date_format']); + }); - first_data = new Array(); - $.each(chart_details.data, function(index, value) { - if (value.id == 'sales' || value.id == 'sales_compare') - { - if (value.id == 'sales') - $('#dashtrends_toolbar dl:first').css('background-color', chart_details.data[index].color).addClass('active'); - first_data.push(chart_details.data[index]); - } - }); + first_data = new Array(); + $.each(chart_details.data, function(index, value) { + if (value.id == 'sales' || value.id == 'sales_compare') { + if (value.id == 'sales') + $('#dashtrends_toolbar dl:first').css('background-color', chart_details.data[index].color).addClass('active'); + first_data.push(chart_details.data[index]); + } + }); - chart.yAxis.tickFormat(function(d) { - return formatCurrency(parseFloat(d), currency_format, currency_sign, currency_blank); - }); + chart.yAxis.tickFormat(function(d) { + return formatCurrency(parseFloat(d), currency_format, currency_sign, currency_blank); + }); - dashtrends_data = chart_details.data; - dashtrends_chart = chart; + dashtrends_data = chart_details.data; + dashtrends_chart = chart; - d3.select('#dash_trends_chart1 svg') - .datum(first_data) - .call(chart); - nv.utils.windowResize(chart.update); + d3.select('#dash_trends_chart1 svg') + .datum(first_data) + .call(chart); + nv.utils.windowResize(chart.update); - return chart; - }); + return chart; + }); } -function selectDashtrendsChart(element, type) -{ - $('#dashtrends_toolbar dl').removeClass('active'); - current_charts = new Array(); - $.each(dashtrends_data, function(index, value) { - if (value.id == type || value.id == type + '_compare') - { - if (value.id == type) - { - $(element).siblings().css('background-color', 'none').removeClass('active'); - $(element).css('background-color', dashtrends_data[index].color).addClass('active'); - } +function selectDashtrendsChart(element, type) { + $('#dashtrends_toolbar dl').removeClass('active'); + current_charts = new Array(); + $.each(dashtrends_data, function(index, value) { + if (value.id == type || value.id == type + '_compare') { + if (value.id == type) { + $(element).siblings().css('background-color', 'none').removeClass('active'); + $(element).css('background-color', dashtrends_data[index].color).addClass('active'); + } - current_charts.push(dashtrends_data[index]); - value.disabled = false; - } - }); + current_charts.push(dashtrends_data[index]); + value.disabled = false; + } + }); - dashtrends_chart.yAxis.tickFormat(d3.format('.f')); + dashtrends_chart.yAxis.tickFormat(d3.format('.f')); - if (type == 'sales' || type == 'average_cart_value' || type == 'net_profits') - dashtrends_chart.yAxis.tickFormat(function(d) { - return formatCurrency(parseFloat(d), currency_format, currency_sign, currency_blank); - }); + if (type == 'sales' || type == 'average_cart_value' || type == 'net_profits') + dashtrends_chart.yAxis.tickFormat(function(d) { + return formatCurrency(parseFloat(d), currency_format, currency_sign, currency_blank); + }); - if (type == 'conversion_rate') - dashtrends_chart.yAxis.tickFormat(function(d) { - return d3.round(d*100, 2)+' %'; - }); + if (type == 'conversion_rate') + dashtrends_chart.yAxis.tickFormat(function(d) { + return d3.round(d * 100, 2) + ' %'; + }); - d3.select('#dash_trends_chart1 svg') - .datum(current_charts) - .call(dashtrends_chart); + d3.select('#dash_trends_chart1 svg') + .datum(current_charts) + .call(dashtrends_chart); } -$(document).ready(function(){ +$(document).ready(function() { $("dl").tooltip(); -}); +}); \ No newline at end of file diff --git a/modules/gamification/config.xml b/modules/gamification/config.xml new file mode 100644 index 000000000..4d195148b --- /dev/null +++ b/modules/gamification/config.xml @@ -0,0 +1,12 @@ + + + gamification + + + + + + 1 + 1 + + diff --git a/modules/gamification/controllers/admin/AdminGamificationController.php b/modules/gamification/controllers/admin/AdminGamificationController.php index fd56e4196..9e182dd67 100644 --- a/modules/gamification/controllers/admin/AdminGamificationController.php +++ b/modules/gamification/controllers/admin/AdminGamificationController.php @@ -8,8 +8,8 @@ class AdminGamificationController extends ModuleAdminController { $this->bootstrap = true; $this->display = 'view'; - $this->meta_title = $this->l('Your Merchant Expertise'); parent::__construct(); + $this->meta_title = $this->l('Your Merchant Expertise'); if (!$this->module->active) { Tools::redirectAdmin($this->context->link->getAdminLink('AdminHome')); } diff --git a/modules/gamification/data/data_EN_INR_IN.json b/modules/gamification/data/data_EN_INR_IN.json deleted file mode 100644 index 71baf7a05..000000000 --- a/modules/gamification/data/data_EN_INR_IN.json +++ /dev/null @@ -1 +0,0 @@ -{"conditions":{"159":{"name":"inf 3 months","type":"install","request":"","operator":"<=","value":"90","calculation_type":"time","calculation_detail":"2","id_ps_condition":"159"},"158":{"name":"3 months","type":"install","request":"","operator":">=","value":"90","calculation_type":"time","calculation_detail":"2","id_ps_condition":"158"},"19":{"name":"Just installed","type":"install","request":"","operator":">","value":"0","calculation_type":"time","calculation_detail":"1","id_ps_condition":"19"},"40":{"name":"2 years","type":"install","request":"","operator":">=","value":"730","calculation_type":"time","calculation_detail":"2","id_ps_condition":"40"},"55":{"name":"Orders > 100","type":"sql","request":"SELECT COUNT(*) FROM ps_orders WHERE reference NOT IN (\"XKBKNABJK\", \"OHSATSERP\", \"FFATNOMMJ\", \"UOYEVOLI\", \"KHWLILZLL\")","operator":">=","value":"100","calculation_type":"hook","calculation_detail":"actionObjectOrderAddAfter","id_ps_condition":"55"},"12":{"name":"Products x100","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_product WHERE reference NOT LIKE \"demo_%\"","operator":">","value":"99","calculation_type":"hook","calculation_detail":"actionObjectProductAddAfter","id_ps_condition":"12"},"39":{"name":"1 year","type":"install","request":"","operator":">=","value":"365","calculation_type":"time","calculation_detail":"2","id_ps_condition":"39"},"132":{"name":"Local install","type":"sql","request":"SELECT count(id_configuration) FROM PREFIX_configuration WHERE `name` = 'PS_SHOP_DOMAIN' AND value IN ('127.0.0.1', 'localhost' )","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"132"},"175":{"name":"Not onDemand","type":"sql","request":"SELECT count(*) FROM\t PREFIX_configuration WHERE name = 'PS_HOSTED_MODE'","operator":"==","value":"0","calculation_type":"time","calculation_detail":"1","id_ps_condition":"175"},"542":{"name":"is PrestaShop 1.7.x.x","type":"sql","request":"SELECT '{config} PS_VERSION_DB{\/config}' >= '1.7.0.0' AND < '1.8.0.0'","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"542"},"1":{"name":"Friendly URL","type":"configuration","request":"PS_REWRITING_SETTINGS","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionAdminMetaControllerUpdate_optionsAfter","id_ps_condition":"1"},"2":{"id":"2","name":"Smarty Compile","type":"configuration","request":"PS_SMARTY_FORCE_COMPILE","operator":"!=","value":"2","calculation_type":"hook","calculation_detail":"actionAdminPerformanceControllerSaveAfter","currency_related":false,"created_at":"2013-03-11 15:49:50","updated_at":"2013-03-15 11:39:04","id_ps_condition":"2"},"3":{"id":"3","name":"CCC (CSS)","type":"configuration","request":"PS_CSS_THEME_CACHE","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionAdminPerformanceControllerSaveAfter","currency_related":false,"created_at":"2013-03-11 15:50:19","updated_at":"2013-03-12 11:10:24","id_ps_condition":"3"},"4":{"name":"Rijndael","type":"configuration","request":"PS_CIPHER_ALGORITHM","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionAdminPerformanceControllerSaveAfter","id_ps_condition":"4"},"5":{"name":"Media Servers","type":"configuration","request":"PS_MEDIA_SERVERS","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionAdminPerformanceControllerSaveAfter","id_ps_condition":"5"},"6":{"name":"Payment Module x1","type":"sql","request":"SELECT COUNT(distinct m.id_module) FROM PREFIX_hook h LEFT JOIN PREFIX_hook_module hm ON h.id_hook = hm.id_hook LEFT JOIN PREFIX_module m ON hm.id_module = m.id_module\r\nWHERE (h.name = \"displayPayment\" OR h.name = \"payment\") AND m.name NOT IN (\"bankwire\", \"cheque\", \"cashondelivery\")","operator":">","value":"0","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"6"},"7":{"name":"Payment Modules x2","type":"sql","request":"SELECT COUNT(distinct m.id_module) FROM PREFIX_hook h LEFT JOIN PREFIX_hook_module hm ON h.id_hook = hm.id_hook LEFT JOIN PREFIX_module m ON hm.id_module = m.id_module\r\nWHERE (h.name = \"displayPayment\" OR h.name = \"payment\") AND m.name NOT IN (\"bankwire\", \"cheque\", \"cashondelivery\")","operator":">","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"7"},"8":{"name":"Carrier x1","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_carrier WHERE name NOT IN (\"0\", \"My carrier\")","operator":">","value":"0","calculation_type":"hook","calculation_detail":"actionObjectCarrierAddAfter","id_ps_condition":"8"},"9":{"name":"Carriers x2","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_carrier WHERE name NOT IN (\"0\", \"My carrier\")","operator":">","value":"1","calculation_type":"hook","calculation_detail":"actionObjectCarrierAddAfter","id_ps_condition":"9"},"10":{"name":"Product x1","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_product WHERE reference NOT LIKE \"demo_%\"","operator":">","value":"0","calculation_type":"hook","calculation_detail":"actionObjectProductAddAfter","id_ps_condition":"10"},"11":{"name":"Products x10","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_product WHERE reference NOT LIKE \"demo_%\"","operator":">","value":"9","calculation_type":"hook","calculation_detail":"actionObjectProductAddAfter","id_ps_condition":"11"},"16":{"name":"Phone Number","type":"configuration","request":"PS_SHOP_PHONE","operator":"!=","value":"0","calculation_type":"hook","calculation_detail":"actionAdminStoresControllerUpdate_optionsAfter","id_ps_condition":"16"},"17":{"name":"1 additional contact","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_contact","operator":">","value":"2","calculation_type":"hook","calculation_detail":"actionObjectContactAddAfter","id_ps_condition":"17"},"18":{"name":"3 additional contacts","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_contact","operator":">","value":"4","calculation_type":"hook","calculation_detail":"actionObjectContactAddAfter","id_ps_condition":"18"},"13":{"name":"Products x1000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_product WHERE reference NOT LIKE \"demo_%\"","operator":">","value":"999","calculation_type":"hook","calculation_detail":"actionObjectProductAddAfter","id_ps_condition":"13"},"14":{"name":"Products x10000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_product WHERE reference NOT LIKE \"demo_%\"","operator":">","value":"9999","calculation_type":"hook","calculation_detail":"actionObjectProductAddAfter","id_ps_condition":"14"},"15":{"name":"Products x100000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_product WHERE reference NOT LIKE \"demo_%\"","operator":">","value":"99999","calculation_type":"hook","calculation_detail":"actionObjectProductAddAfter","id_ps_condition":"15"},"20":{"name":"1 week","type":"install","request":"","operator":">=","value":"7","calculation_type":"time","calculation_detail":"1","id_ps_condition":"20"},"21":{"name":"Logo","type":"configuration","request":"PS_LOGO","operator":"!=","value":"logo.jpg","calculation_type":"hook","calculation_detail":"actionAdminThemesControllerUpdate_optionsAfter","id_ps_condition":"21"},"22":{"name":"Template","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_theme WHERE directory != \"default\" AND directory != \"prestashop\" AND directory ! \"default-bootstrap\"","operator":">","value":"0","calculation_type":"hook","calculation_detail":"actionObjectShopUpdateAfter","id_ps_condition":"22"},"23":{"name":"Connected to Addons","type":"configuration","request":"PS_LOGGED_ON_ADDONS","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"23"},"24":{"name":"MultiStores activated","type":"configuration","request":"PS_MULTISHOP_FEATURE_ACTIVE","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionAdminPreferencesControllerUpdate_optionsAfter","id_ps_condition":"24"},"25":{"name":"Stores x2","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_shop","operator":">","value":"1","calculation_type":"hook","calculation_detail":"actionObjectShopAddAfter","id_ps_condition":"25"},"28":{"name":"Store Groups x2","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_shop_group","operator":">","value":"1","calculation_type":"hook","calculation_detail":"actionObjectShopGroupAddAfter","id_ps_condition":"28"},"26":{"name":"Stores x5","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_shop","operator":">","value":"4","calculation_type":"hook","calculation_detail":"actionObjectShopAddAfter","id_ps_condition":"26"},"27":{"name":"Store Groups x5","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_shop_group","operator":">","value":"5","calculation_type":"hook","calculation_detail":"actionObjectShopGroupAddAfter \t","id_ps_condition":"27"},"30":{"name":"Carriers x3","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_carrier WHERE name NOT IN (\"0\", \"My carrier\")","operator":">","value":"2","calculation_type":"hook","calculation_detail":"actionObjectCarrierAddAfter","id_ps_condition":"30"},"29":{"name":"Payment Modules x3","type":"sql","request":"SELECT COUNT(distinct m.id_module) FROM PREFIX_hook h LEFT JOIN PREFIX_hook_module hm ON h.id_hook = hm.id_hook LEFT JOIN PREFIX_module m ON hm.id_module = m.id_module\r\nWHERE (h.name = \"displayPayment\" OR h.name = \"payment\") AND m.name NOT IN (\"bankwire\", \"cheque\", \"cashondelivery\")","operator":">","value":"2","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"29"},"31":{"name":"Revenue > 100 (Base EUR)","type":"sql","request":"SELECT SUM(total_paid_tax_excl \/ c.conversion_rate)\r\nFROM PREFIX_orders o INNER JOIN PREFIX_currency c ON c.id_currency = o.id_currency WHERE valid = 1 AND reference != \"XKBKNABJK\"","operator":">=","value":8000,"calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"31"},"32":{"name":"Revenue > 1000 (Base EUR)","type":"sql","request":" \tSELECT SUM(total_paid_tax_excl \/ c.conversion_rate) FROM PREFIX_orders o INNER JOIN PREFIX_currency c ON c.id_currency = o.id_currency WHERE valid = 1 AND reference != \"XKBKNABJK\"","operator":">=","value":80000,"calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"32"},"33":{"name":"Revenue > 10 000 (Base EUR)","type":"sql","request":" \tSELECT SUM(total_paid_tax_excl \/ c.conversion_rate) FROM PREFIX_orders o INNER JOIN PREFIX_currency c ON c.id_currency = o.id_currency WHERE valid = 1 AND reference != \"XKBKNABJK\"","operator":">=","value":800000,"calculation_type":"time","calculation_detail":"1","id_ps_condition":"33"},"34":{"name":"Revenue > 100 000 (Base EUR)","type":"sql","request":" \tSELECT SUM(total_paid_tax_excl \/ c.conversion_rate) FROM PREFIX_orders o INNER JOIN PREFIX_currency c ON c.id_currency = o.id_currency WHERE valid = 1","operator":">=","value":8000000,"calculation_type":"time","calculation_detail":"7","id_ps_condition":"34"},"35":{"name":"Revenue > 1 million (Base EUR)","type":"sql","request":" \tSELECT SUM(total_paid_tax_excl \/ c.conversion_rate) FROM PREFIX_orders o INNER JOIN PREFIX_currency c ON c.id_currency = o.id_currency WHERE valid = 1","operator":">=","value":80000000,"calculation_type":"time","calculation_detail":"7","id_ps_condition":"35"},"36":{"name":"Revenue > 10 millions (Base EUR)","type":"sql","request":" \tSELECT SUM(total_paid_tax_excl \/ c.conversion_rate) FROM PREFIX_orders o INNER JOIN PREFIX_currency c ON c.id_currency = o.id_currency WHERE valid = 1","operator":">=","value":800000000,"calculation_type":"time","calculation_detail":"7","id_ps_condition":"36"},"37":{"name":"1 month","type":"install","request":"","operator":">=","value":"30","calculation_type":"time","calculation_detail":"1","id_ps_condition":"37"},"38":{"name":"6 months","type":"install","request":"","operator":">=","value":"182","calculation_type":"time","calculation_detail":"2","id_ps_condition":"38"},"41":{"name":"Visitors > 10","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_guest","operator":">=","value":"10","calculation_type":"time","calculation_detail":"1","id_ps_condition":"41"},"42":{"name":"Visitors > 100","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_guest","operator":">=","value":"100","calculation_type":"time","calculation_detail":"1","id_ps_condition":"42"},"43":{"name":"Visitors > 1000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_guest","operator":">=","value":"1000","calculation_type":"time","calculation_detail":"1","id_ps_condition":"43"},"44":{"name":"Visitors > 10 000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_guest","operator":">=","value":"10000","calculation_type":"time","calculation_detail":"2","id_ps_condition":"44"},"45":{"name":"Visitors > 100 000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_guest","operator":">=","value":"100000","calculation_type":"time","calculation_detail":"3","id_ps_condition":"45"},"46":{"name":"Visitors > 1 000 000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_guest","operator":">=","value":"1000000","calculation_type":"time","calculation_detail":"4","id_ps_condition":"46"},"47":{"name":"Carts > 2","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_cart WHERE secure_key != \"b44a6d9efd7a0076a0fbce6b15eaf3b1\"","operator":">=","value":"2","calculation_type":"hook","calculation_detail":"actionObjectCartAddAfter","id_ps_condition":"47"},"48":{"name":"Carts > 10","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_cart WHERE secure_key != \"b44a6d9efd7a0076a0fbce6b15eaf3b1\"","operator":">=","value":"10","calculation_type":"hook","calculation_detail":"actionObjectCartAddAfter","id_ps_condition":"48"},"49":{"name":"Carts > 100","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_cart WHERE secure_key != \"b44a6d9efd7a0076a0fbce6b15eaf3b1\"","operator":">=","value":"100","calculation_type":"hook","calculation_detail":"actionObjectCartAddAfter","id_ps_condition":"49"},"50":{"name":"Carts > 1000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_cart WHERE secure_key != \"b44a6d9efd7a0076a0fbce6b15eaf3b1\"","operator":">=","value":"1000","calculation_type":"time","calculation_detail":"1","id_ps_condition":"50"},"51":{"name":"Carts > 10 000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_cart WHERE secure_key != \"b44a6d9efd7a0076a0fbce6b15eaf3b1\"","operator":">=","value":"10000","calculation_type":"time","calculation_detail":"4","id_ps_condition":"51"},"52":{"name":"Carts > 100 000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_cart WHERE secure_key != \"b44a6d9efd7a0076a0fbce6b15eaf3b1\"","operator":">=","value":"100000","calculation_type":"time","calculation_detail":"8","id_ps_condition":"52"},"53":{"name":"First Order","type":"sql","request":"SELECT COUNT(*) FROM ps_orders WHERE reference NOT IN (\"XKBKNABJK\", \"OHSATSERP\", \"FFATNOMMJ\", \"UOYEVOLI\", \"KHWLILZLL\")","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionObjectOrderAddAfter","id_ps_condition":"53"},"54":{"name":"Orders > 10","type":"sql","request":"SELECT COUNT(*) FROM ps_orders WHERE reference NOT IN (\"XKBKNABJK\", \"OHSATSERP\", \"FFATNOMMJ\", \"UOYEVOLI\", \"KHWLILZLL\")","operator":">=","value":"10","calculation_type":"hook","calculation_detail":"actionObjectOrderAddAfter","id_ps_condition":"54"},"56":{"name":"Orders > 1000","type":"sql","request":"SELECT COUNT(*) FROM ps_orders WHERE reference NOT IN (\"XKBKNABJK\", \"OHSATSERP\", \"FFATNOMMJ\", \"UOYEVOLI\", \"KHWLILZLL\")","operator":">=","value":"1000","calculation_type":"time","calculation_detail":"2","id_ps_condition":"56"},"57":{"name":"Orders > 10 000","type":"sql","request":"SELECT COUNT(*) FROM ps_orders WHERE reference NOT IN (\"XKBKNABJK\", \"OHSATSERP\", \"FFATNOMMJ\", \"UOYEVOLI\", \"KHWLILZLL\")","operator":">=","value":"10000","calculation_type":"time","calculation_detail":"4","id_ps_condition":"57"},"58":{"name":"Orders > 100 000","type":"sql","request":"SELECT COUNT(*) FROM ps_orders WHERE reference NOT IN (\"XKBKNABJK\", \"OHSATSERP\", \"FFATNOMMJ\", \"UOYEVOLI\", \"KHWLILZLL\")","operator":">=","value":"100000","calculation_type":"time","calculation_detail":"8","id_ps_condition":"58"},"65":{"name":"Customer Thread x1","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_customer_thread","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionObjectCustomerThreadAddAfter","id_ps_condition":"65"},"66":{"name":"Customer Threads x10","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_customer_thread","operator":">=","value":"10","calculation_type":"hook","calculation_detail":"actionObjectCustomerThreadAddAfter","id_ps_condition":"66"},"67":{"name":"Customer Threads x100","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_customer_thread","operator":">=","value":"100","calculation_type":"hook","calculation_detail":"actionObjectCustomerThreadAddAfter","id_ps_condition":"67"},"68":{"name":"Customer Threads x1000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_customer_thread","operator":">=","value":"1000","calculation_type":"time","calculation_detail":"2","id_ps_condition":"68"},"69":{"name":"Customer Threads x10 000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_customer_thread","operator":">=","value":"10000","calculation_type":"time","calculation_detail":"4","id_ps_condition":"69"},"70":{"name":"Customer Threads x100 000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_customer_thread","operator":">=","value":"100000","calculation_type":"time","calculation_detail":"8","id_ps_condition":"70"},"59":{"name":"First Customer","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_customer WHERE email != \"pub@prestashop.com\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionObjectCustomerAddAfter","id_ps_condition":"59"},"60":{"name":"Customers x10","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_customer WHERE email != \"pub@prestashop.com\"","operator":">=","value":"10","calculation_type":"hook","calculation_detail":"actionObjectCustomerAddAfter","id_ps_condition":"60"},"61":{"name":"Customers x100","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_customer WHERE email != \"pub@prestashop.com\"","operator":">=","value":"100","calculation_type":"hook","calculation_detail":"actionObjectCustomerAddAfter","id_ps_condition":"61"},"62":{"name":"Customers x1000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_customer WHERE email != \"pub@prestashop.com\"","operator":">=","value":"1000","calculation_type":"time","calculation_detail":"1","id_ps_condition":"62"},"63":{"name":"Customers x10 000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_customer WHERE email != \"pub@prestashop.com\"","operator":">=","value":"10000","calculation_type":"time","calculation_detail":"2","id_ps_condition":"63"},"64":{"name":"Customers x100 000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_customer WHERE email != \"pub@prestashop.com\"","operator":">=","value":"100000","calculation_type":"time","calculation_detail":"4","id_ps_condition":"64"},"76":{"name":"North America","type":"sql","request":"SELECT IFNULL(id_order, 0) FROM PREFIX_orders o LEFT JOIN PREFIX_address a ON o.id_address_delivery = a.id_address LEFT JOIN PREFIX_country c ON c.id_country = a.id_country WHERE o.valid = 1 AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\" AND c.iso_code IN (\r\n\"CA\",\r\n\"GL\",\r\n\"PM\",\r\n\"US\"\r\n)","operator":"!=","value":"0","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"76"},"79":{"name":"Oceania","type":"sql","request":"SELECT IFNULL(id_order, 0) FROM PREFIX_orders o LEFT JOIN PREFIX_address a ON o.id_address_delivery = a.id_address LEFT JOIN PREFIX_country c ON c.id_country = a.id_country WHERE o.valid = 1 AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\" AND c.iso_code IN (\r\n\"UM\",\r\n\"AS\",\r\n\"AU\",\r\n\"CK\",\r\n\"FJ\",\r\n\"FM\",\r\n\"GU\",\r\n\"KI\",\r\n\"MH,\"\r\n\"MP\",\r\n\"NC\",\r\n\"NF\",\r\n\"NR\",\r\n\"NU\",\r\n\"NZ\",\r\n\"PF\",\r\n\"PG\",\r\n\"PN\",\r\n\"PW\",\r\n\"SB\",\r\n\"TK\",\r\n\"TO\",\r\n\"TV\",\r\n\"VU\",\r\n\"WF\",\r\n\"WS\"\r\n)","operator":"!=","value":"0","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"79"},"80":{"name":"Central Asia","type":"sql","request":"SELECT IFNULL(id_order, 0) FROM PREFIX_orders o LEFT JOIN PREFIX_address a ON o.id_address_delivery = a.id_address LEFT JOIN PREFIX_country c ON c.id_country = a.id_country WHERE o.valid = 1 AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\" AND c.iso_code IN (\r\n\"KG\",\r\n\"KZ\",\r\n\"TJ\",\r\n\"TM\",\r\n\"UZ\"\r\n)","operator":"!=","value":"0","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"80"},"81":{"name":"Middle East","type":"sql","request":"SELECT IFNULL(id_order, 0) FROM PREFIX_orders o LEFT JOIN PREFIX_address a ON o.id_address_delivery = a.id_address LEFT JOIN PREFIX_country c ON c.id_country = a.id_country WHERE o.valid = 1 AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\" AND c.iso_code IN (\r\n\"AE\",\r\n\"AM\",\r\n\"AZ\",\r\n\"BH\",\r\n\"CY\",\r\n\"GE\",\r\n\"IL\",\r\n\"IQ\",\r\n\"IR\",\r\n\"JO\",\r\n\"KW\",\r\n\"LB\",\r\n\"OM\",\r\n\"QA\",\r\n\"SA\",\r\n\"SY\",\r\n\"TR\",\r\n\"YE\"\r\n)","operator":"!=","value":"0","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"81"},"82":{"name":"Southern Asia","type":"sql","request":"SELECT IFNULL(id_order, 0) FROM PREFIX_orders o LEFT JOIN PREFIX_address a ON o.id_address_delivery = a.id_address LEFT JOIN PREFIX_country c ON c.id_country = a.id_country WHERE o.valid = 1 AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\" AND c.iso_code IN (\r\n\"AF\",\r\n\"BD\",\r\n\"BT\",\r\n\"IN\",\r\n\"IO\",\r\n\"LK\",\r\n\"MV\",\r\n\"NP\",\r\n\"PK\"\r\n)","operator":"!=","value":"0","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"82"},"83":{"name":"Eastern Asia","type":"sql","request":"SELECT IFNULL(id_order, 0) FROM PREFIX_orders o LEFT JOIN PREFIX_address a ON o.id_address_delivery = a.id_address LEFT JOIN PREFIX_country c ON c.id_country = a.id_country WHERE o.valid = 1 AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\" AND c.iso_code IN (\r\n\"CN\",\r\n\"HK\",\r\n\"JP\",\r\n\"KP\",\r\n\"KR\",\r\n\"MO\",\r\n\"TW\",\r\n\"MN\"\r\n)","operator":"!=","value":"0","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"83"},"84":{"name":"South Eastern Asia","type":"sql","request":"SELECT IFNULL(id_order, 0) FROM PREFIX_orders o LEFT JOIN PREFIX_address a ON o.id_address_delivery = a.id_address LEFT JOIN PREFIX_country c ON c.id_country = a.id_country WHERE o.valid = 1 AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\" AND c.iso_code IN (\r\n\"BN\",\r\n\"CC\",\r\n\"CX\",\r\n\"ID\",\r\n\"KH\",\r\n\"LA\",\r\n\"MM\",\r\n\"MY\",\r\n\"PH\",\r\n\"SG\",\r\n\"TH\",\r\n\"TP\",\r\n\"VN\"\r\n)","operator":"!=","value":"0","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"84"},"86":{"name":"South America (Global)","type":"sql","request":"SELECT IFNULL(id_order, 0) FROM PREFIX_orders o LEFT JOIN PREFIX_address a ON o.id_address_delivery = a.id_address LEFT JOIN PREFIX_country c ON c.id_country = a.id_country WHERE o.valid = 1 AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\" AND c.iso_code IN (\r\n\"BZ\",\r\n\"CR\",\r\n\"GT\",\r\n\"HN\",\r\n\"MX\",\r\n\"NI\",\r\n\"PA\",\r\n\"SV\",\r\n\"AG\",\r\n\"AI\",\r\n\"AN\",\r\n\"AW\",\r\n\"BB\",\r\n\"BM\",\r\n\"BS\",\r\n\"CU\",\r\n\"DM\",\r\n\"DO\",\r\n\"GD\",\r\n\"GP\",\r\n\"HT\",\r\n\"JM\",\r\n\"KN\",\r\n\"KY\",\r\n\"LC\",\r\n\"MQ\",\r\n\"MS\",\r\n\"PR\",\r\n\"TC\",\r\n\"TT\",\r\n\"VC\",\r\n\"VG\",\r\n\"VI\",\r\n\"AR\",\r\n\"BO\",\r\n\"BR\",\r\n\"CL\",\r\n\"CO\",\r\n\"EC\",\r\n\"FK\",\r\n\"GF\",\r\n\"GY\",\r\n\"PE\",\r\n\"PY\",\r\n\"SR\",\r\n\"UY\",\r\n\"VE\"\r\n)","operator":"!=","value":"0","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"86"},"87":{"name":"Europe","type":"sql","request":"SELECT IFNULL(id_order, 0) FROM PREFIX_orders o LEFT JOIN PREFIX_address a ON o.id_address_delivery = a.id_address LEFT JOIN PREFIX_country c ON c.id_country = a.id_country WHERE o.valid = 1 AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\" AND c.iso_code IN (\r\n\"BE\",\r\n\"DE\",\r\n\"FR\",\r\n\"FX\",\r\n\"GB\",\r\n\"IE\",\r\n\"LU\",\r\n\"MC\",\r\n\"NL\",\r\n\"IT\",\r\n\"MT\",\r\n\"SM\",\r\n\"VA\",\r\n\"AD\",\r\n\"ES\",\r\n\"GI\",\r\n\"PT\",\r\n\"BY\",\r\n\"EE\",\r\n\"LT\",\r\n\"LV\",\r\n\"MD\",\r\n\"PL\",\r\n\"UA\",\r\n\"AL\",\r\n\"BA\",\r\n\"BG\",\r\n\"GR\",\r\n\"HR\",\r\n\"MK\",\r\n\"RO\",\r\n\"SI\",\r\n\"YU\",\r\n\"RU\",\r\n\"AT\",\r\n\"CH\",\r\n\"CZ\",\r\n\"HU\",\r\n\"LI\",\r\n\"SK\",\r\n\"DK\",\r\n\"FI\",\r\n\"FO\",\r\n\"IS\",\r\n\"NO\",\r\n\"SE\",\r\n\"SJ\"\r\n)","operator":"!=","value":"0","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"87"},"88":{"name":"Africa","type":"sql","request":"SELECT IFNULL(id_order, 0) FROM PREFIX_orders o LEFT JOIN PREFIX_address a ON o.id_address_delivery = a.id_address LEFT JOIN PREFIX_country c ON c.id_country = a.id_country WHERE o.valid = 1 AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\" AND c.iso_code IN (\r\n\"BI\",\r\n\"CF\",\r\n\"CG\",\r\n\"RW\",\r\n\"TD\",\r\n\"ZR\",\r\n\"DJ\",\r\n\"ER\",\r\n\"ET\",\r\n\"KE\",\r\n\"SO\",\r\n\"TZ\",\r\n\"UG\",\r\n\"KM\",\r\n\"MG\",\r\n\"MU\",\r\n\"RE\",\r\n\"SC\",\r\n\"YT\",\r\n\"AO\",\r\n\"BW\",\r\n\"LS\",\r\n\"MW\",\r\n\"MZ\",\r\n\"NA\",\r\n\"SZ\",\r\n\"ZA\",\r\n\"ZM\",\r\n\"ZW\",\r\n\"BF\",\r\n\"BJ\",\r\n\"CI\",\r\n\"CM\",\r\n\"CV\",\r\n\"GA\",\r\n\"GH\",\r\n\"GM\",\r\n\"GN\",\r\n\"GQ\",\r\n\"GW\",\r\n\"LR\",\r\n\"ML\",\r\n\"MR\",\r\n\"NE\",\r\n\"NG\",\r\n\"SL\",\r\n\"SN\",\r\n\"ST\",\r\n\"TG\"\r\n)","operator":"!=","value":"0","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"88"},"89":{"name":"Maghreb","type":"sql","request":"SELECT IFNULL(id_order, 0) FROM PREFIX_orders o LEFT JOIN PREFIX_address a ON o.id_address_delivery = a.id_address LEFT JOIN PREFIX_country c ON c.id_country = a.id_country WHERE o.valid = 1 AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\" AND c.iso_code IN (\r\n\"DZ\",\r\n\"EG\",\r\n\"EH\",\r\n\"LY\",\r\n\"MA\",\r\n\"SD\",\r\n\"TN\"\r\n)","operator":"!=","value":"0","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"89"},"90":{"name":"Employees x2","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_employee","operator":">=","value":"2","calculation_type":"hook","calculation_detail":"actionObjectEmployeeAddAfter","id_ps_condition":"90"},"91":{"name":"Employees x3","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_employee","operator":">=","value":"3","calculation_type":"hook","calculation_detail":"actionObjectEmployeeAddAfter","id_ps_condition":"91"},"92":{"name":"Employees x5","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_employee","operator":">=","value":"5","calculation_type":"hook","calculation_detail":"actionObjectEmployeeAddAfter","id_ps_condition":"92"},"93":{"name":"Employees x10","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_employee","operator":">=","value":"10","calculation_type":"hook","calculation_detail":"actionObjectEmployeeAddAfter","id_ps_condition":"93"},"94":{"name":"Employees x20","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_employee","operator":">=","value":"20","calculation_type":"hook","calculation_detail":"actionObjectEmployeeAddAfter","id_ps_condition":"94"},"95":{"name":"Employees x40","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_employee","operator":">=","value":"40","calculation_type":"hook","calculation_detail":"actionObjectEmployeeAddAfter","id_ps_condition":"95"},"96":{"name":"Pictures x1","type":"sql","request":"SELECT id_image FROM PREFIX_image WHERE id_image > 26","operator":">","value":"0","calculation_type":"hook","calculation_detail":"actionObjectImageAddAfter","id_ps_condition":"96"},"97":{"name":"Pictures x50","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_image","operator":">=","value":"50","calculation_type":"hook","calculation_detail":"actionObjectImageAddAfter","id_ps_condition":"97"},"98":{"name":"Pictures x100","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_image","operator":">=","value":"100","calculation_type":"hook","calculation_detail":"actionObjectImageAddAfter","id_ps_condition":"98"},"99":{"name":"Pictures x1000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_image","operator":">=","value":"1000","calculation_type":"time","calculation_detail":"2","id_ps_condition":"99"},"100":{"name":"Pictures x10000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_image","operator":">=","value":"10000","calculation_type":"time","calculation_detail":"4","id_ps_condition":"100"},"101":{"name":"Pictures x50000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_image","operator":">=","value":"50000","calculation_type":"time","calculation_detail":"8","id_ps_condition":"101"},"102":{"name":"New CMS Page","type":"sql","request":"SELECT id_cms FROM PREFIX_cms WHERE id_cms > 5","operator":">","value":"0","calculation_type":"hook","calculation_detail":"actionObjectCMSAddAfter","id_ps_condition":"102"},"103":{"name":"First Cart Rule","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_cart_rule","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionObjectCartRuleAddAfter \t","id_ps_condition":"103"},"104":{"name":"Cart Rules x10","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_cart_rule","operator":">=","value":"10","calculation_type":"hook","calculation_detail":"actionObjectCartRuleAddAfter \t","id_ps_condition":"104"},"105":{"name":"Cart Rules x100","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_cart_rule","operator":">=","value":"100","calculation_type":"hook","calculation_detail":"actionObjectCartRuleAddAfter \t","id_ps_condition":"105"},"107":{"name":"Cart Rules x500","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_cart_rule","operator":">=","value":"500","calculation_type":"hook","calculation_detail":"actionObjectCartRuleAddAfter \t","id_ps_condition":"107"},"106":{"name":"Cart Rules x1000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_cart_rule","operator":">=","value":"1000","calculation_type":"hook","calculation_detail":"actionObjectCartRuleAddAfter \t","id_ps_condition":"106"},"108":{"name":"Cart Rules x5000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_cart_rule","operator":">=","value":"5000","calculation_type":"hook","calculation_detail":"actionObjectCartRuleAddAfter \t","id_ps_condition":"108"},"109":{"name":"First International Order","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o INNER JOIN PREFIX_address a ON a.id_address = o.id_address_delivery\r\nWHERE reference NOT IN (\"XKBKNABJK\", \"OHSATSERP\", \"FFATNOMMJ\", \"UOYEVOLI\", \"KHWLILZLL\") AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"newOrder","id_ps_condition":"109"},"110":{"name":"International Orders x10","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o INNER JOIN PREFIX_address a ON a.id_address = o.id_address_delivery\r\nWHERE reference NOT IN (\"XKBKNABJK\", \"OHSATSERP\", \"FFATNOMMJ\", \"UOYEVOLI\", \"KHWLILZLL\") AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\"","operator":">=","value":"10","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"110"},"111":{"name":"International Orders x100","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o INNER JOIN PREFIX_address a ON a.id_address = o.id_address_delivery\r\nWHERE reference NOT IN (\"XKBKNABJK\", \"OHSATSERP\", \"FFATNOMMJ\", \"UOYEVOLI\", \"KHWLILZLL\") AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\"","operator":">=","value":"100","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"111"},"113":{"name":"International Orders x1000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o INNER JOIN PREFIX_address a ON a.id_address = o.id_address_delivery\r\nWHERE reference NOT IN (\"XKBKNABJK\", \"OHSATSERP\", \"FFATNOMMJ\", \"UOYEVOLI\", \"KHWLILZLL\") AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\"","operator":">=","value":"1000","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"113"},"114":{"name":"International Orders x5000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o INNER JOIN PREFIX_address a ON a.id_address = o.id_address_delivery\r\nWHERE reference NOT IN (\"XKBKNABJK\", \"OHSATSERP\", \"FFATNOMMJ\", \"UOYEVOLI\", \"KHWLILZLL\") AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\"","operator":">=","value":"5000","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"114"},"112":{"name":"International Orders x10000","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o INNER JOIN PREFIX_address a ON a.id_address = o.id_address_delivery\r\nWHERE reference NOT IN (\"XKBKNABJK\", \"OHSATSERP\", \"FFATNOMMJ\", \"UOYEVOLI\", \"KHWLILZLL\") AND a.id_country != \"{config}PS_COUNTRY_DEFAULT{\/config}\"","operator":">=","value":"10000","calculation_type":"hook","calculation_detail":"actionOrderStatusUpdate","id_ps_condition":"112"},"165":{"name":"Physical Shop X1","type":"sql","request":"SELECT COUNT(s.`id_store`) FROM PREFIX_store s WHERE `latitude` NOT IN ('25.76500500', '26.13793600', '26.00998700', '25.73629600', '25.88674000') AND `longitude` NOT IN ('-80.24379700', '-80.13943500', '-80.29447200', '-80.24479700', '-80.16329200')","operator":">","value":"0","calculation_type":"hook","calculation_detail":"actionAdminStoresControllerSaveAfter","id_ps_condition":"165"},"166":{"name":"Physical Shop X2","type":"sql","request":"SELECT COUNT(s.`id_store`) FROM PREFIX_store s WHERE `latitude` NOT IN ('25.76500500', '26.13793600', '26.00998700', '25.73629600', '25.88674000') AND `longitude` NOT IN ('-80.24379700', '-80.13943500', '-80.29447200', '-80.24479700', '-80.16329200')","operator":">","value":"1","calculation_type":"hook","calculation_detail":"actionAdminStoresControllerSaveAfter","id_ps_condition":"166"},"167":{"name":"Physical Shop X5","type":"sql","request":"SELECT COUNT(s.`id_store`) FROM PREFIX_store s WHERE `latitude` NOT IN ('25.76500500', '26.13793600', '26.00998700', '25.73629600', '25.88674000') AND `longitude` NOT IN ('-80.24379700', '-80.13943500', '-80.29447200', '-80.24479700', '-80.16329200')","operator":">","value":"4","calculation_type":"hook","calculation_detail":"actionAdminStoresControllerSaveAfter","id_ps_condition":"167"},"168":{"name":"Physical Shop X10","type":"sql","request":"SELECT COUNT(s.`id_store`) FROM PREFIX_store s WHERE `latitude` NOT IN ('25.76500500', '26.13793600', '26.00998700', '25.73629600', '25.88674000') AND `longitude` NOT IN ('-80.24379700', '-80.13943500', '-80.29447200', '-80.24479700', '-80.16329200')","operator":">","value":"9","calculation_type":"hook","calculation_detail":"actionAdminStoresControllerSaveAfter","id_ps_condition":"168"},"169":{"name":"Physical Shop X20","type":"sql","request":"SELECT COUNT(s.`id_store`) FROM PREFIX_store s WHERE `latitude` NOT IN ('25.76500500', '26.13793600', '26.00998700', '25.73629600', '25.88674000') AND `longitude` NOT IN ('-80.24379700', '-80.13943500', '-80.29447200', '-80.24479700', '-80.16329200')","operator":">","value":"19","calculation_type":"hook","calculation_detail":"actionAdminStoresControllerSaveAfter","id_ps_condition":"169"},"170":{"name":"Physical Shop X50","type":"sql","request":"SELECT COUNT(s.`id_store`) FROM PREFIX_store s WHERE `latitude` NOT IN ('25.76500500', '26.13793600', '26.00998700', '25.73629600', '25.88674000') AND `longitude` NOT IN ('-80.24379700', '-80.13943500', '-80.29447200', '-80.24479700', '-80.16329200')","operator":">","value":"49","calculation_type":"hook","calculation_detail":"actionAdminStoresControllerSaveAfter","id_ps_condition":"170"},"171":{"name":"1 webservice account","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_webservice_account","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionAdminWebserviceControllerSaveAfter","id_ps_condition":"171"},"172":{"name":"2 webservice account","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_webservice_account","operator":">=","value":"2","calculation_type":"hook","calculation_detail":"actionAdminWebserviceControllerSaveAfter","id_ps_condition":"172"},"173":{"name":"3 webservice account","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_webservice_account","operator":">=","value":"3","calculation_type":"hook","calculation_detail":"actionAdminWebserviceControllerSaveAfter","id_ps_condition":"173"},"174":{"name":"4 webservice account","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_webservice_account","operator":">=","value":"4","calculation_type":"hook","calculation_detail":"actionAdminWebserviceControllerSaveAfter","id_ps_condition":"174"},"320":{"name":"Module shopgate installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%shopgate%\" ","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"320"},"322":{"name":"Module shopgate configured","type":"configuration","request":"SHOPGATE_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"322"},"375":{"name":"Module shopgate active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%shopgate%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"375"},"376":{"name":"Module shopgate superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%shopgate%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"1","id_ps_condition":"376"},"140":{"name":"Module moneybookers (skrill) installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%moneybookers%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"140"},"326":{"name":"Module moneybookers (skrill) configured","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'MONEYBOOKERS_CONFIGURATION_OK') AND ( value = '1')) OR (( name LIKE 'MB_PAY_TO_EMAIL ') AND ( value != 'testaccount2@moneybookers.com '))","operator":"==","value":"2","calculation_type":"time","calculation_detail":"1","id_ps_condition":"326"},"377":{"name":"Module moneybookers (skrill) active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%moneybookers%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"377"},"394":{"name":"Module moneybookers (skrill) superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%sofortbanking%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"1","id_ps_condition":"394"},"428":{"name":"Module authorizeaim installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%authorizeaim%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"428"},"429":{"name":"Module authorizeaim configured","type":"configuration","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'AUTHORIZEAIM_CONFIGURATION_OK') AND ( value = '1')) OR (( name LIKE 'AUTHORIZE_AIM_SANDBOX') AND ( value = '0'))","operator":"==","value":"2","calculation_type":"time","calculation_detail":"2","id_ps_condition":"429"},"430":{"name":"Module authorizeaim active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%authorizeaim%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"430"},"431":{"name":"Module authorizeaim superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%authorizeaim%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"7","id_ps_condition":"431"},"136":{"name":"Module ebay installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%ebay%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"136"},"209":{"name":"Module ebay configured","type":"configuration","request":"EBAY_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"209"},"358":{"name":"Module ebay active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%ebay%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"358"},"359":{"name":"Module ebay superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%ebay%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"1","id_ps_condition":"359"},"438":{"name":"Module payplug installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%payplug%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"438"},"439":{"name":"Module payplug configured","type":"configuration","request":"PAYPLUG_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"439"},"440":{"name":"Module payplug active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%payplug%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"440"},"441":{"name":"Module payplug superactive","type":"sql","request":"SELECT SUM(o.total_paid) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%payplug%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"10000","calculation_type":"time","calculation_detail":"7","id_ps_condition":"441"},"442":{"name":"Module affinityitems installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%affinityitems%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"442"},"443":{"name":"Module affinityitems configured","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE name LIKE 'AFFINITYITEMS_CONFIGURATION_OK' AND value = '1'","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"443"},"446":{"name":"Module dpdpoland installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%dpdpoland%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"446"},"447":{"name":"Module dpdpoland configured","type":"configuration","request":"DPDPOLAND_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"447"},"448":{"name":"Module dpdpoland active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state LEFT JOIN PREFIX_carrier c ON c.id_carrier = o.id_carrier WHERE c.name like \"%dpdpoland%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"448"},"449":{"name":"Module dpdpoland superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state LEFT JOIN PREFIX_carrier c ON c.id_carrier = o.id_carrier WHERE c.name like \"%dpdpoland%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"100","calculation_type":"time","calculation_detail":"7","id_ps_condition":"449"},"450":{"name":"Module envoimoinscher installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%envoimoinscher%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"450"},"451":{"name":"Module envoimoinscher configured","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'ENVOIMOINSCHER_CONFIGURATION_OK') AND ( value = '1')) OR (( name LIKE 'EMC_ENV ') AND ( value != 'TEST'))","operator":"==","value":"2","calculation_type":"time","calculation_detail":"1","id_ps_condition":"451"},"452":{"name":"Module envoimoinscher active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state LEFT JOIN PREFIX_carrier c ON c.id_carrier = o.id_carrier WHERE c.name like \"%envoimoinscher%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"452"},"453":{"name":"Module envoimoinscher superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state LEFT JOIN PREFIX_carrier c ON c.id_carrier = o.id_carrier WHERE c.name like \"%envoimoinscher%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"100","calculation_type":"time","calculation_detail":"7","id_ps_condition":"453"},"454":{"name":"Module klik&pay installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%klikandpay%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"454"},"455":{"name":"Module klik&pay configured","type":"configuration","request":"KLIKANDPAY_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"455"},"456":{"name":"Module klik&pay active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%klikandpay%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"456"},"457":{"name":"Module klik&pay superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%klikandpay%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"7","id_ps_condition":"457"},"458":{"name":"Module Clickline installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%clickline%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"458"},"459":{"name":"Module Clickline configured","type":"configuration","request":"CLICKLINE_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"459"},"460":{"name":"Module Clickline active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state LEFT JOIN PREFIX_carrier c ON c.id_carrier = o.id_carrier WHERE c.name like \"%clickline%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"460"},"461":{"name":"Module Clickline superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state LEFT JOIN PREFIX_carrier c ON c.id_carrier = o.id_carrier WHERE c.name like \"%clickline%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"100","calculation_type":"time","calculation_detail":"7","id_ps_condition":"461"},"462":{"name":"Module CDiscount installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%cdiscount%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"462"},"463":{"name":"Module CDiscount configured","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"100","id_ps_condition":"463"},"464":{"name":"Module CDiscount active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%cdiscount%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"464"},"465":{"name":"Module CDiscount superactive","type":"sql","request":"SELECT SUM(o.total_paid) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%cdiscount%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 365 DAY)","operator":">=","value":"500","calculation_type":"time","calculation_detail":"7","id_ps_condition":"465"},"467":{"name":"Module illicoPresta installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%erpillicopresta%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"467"},"468":{"name":"Module illicoPresta configured","type":"configuration","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'ERPILLICOPRESTA_CONFIGURATION_OK') AND ( value = '1')) OR (( name LIKE 'ERP_LICENCE_VALIDITY ') AND ( value == '1')) OR (( name LIKE 'ERP_MONTH_FREE_ACTIVE ') AND ( value == '0'))","operator":"==","value":"3","calculation_type":"time","calculation_detail":"1","id_ps_condition":"468"},"469":{"name":"Module illicoPresta active","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"100","id_ps_condition":"469"},"470":{"name":"Module illicoPresta superactive","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"100","id_ps_condition":"470"},"471":{"name":"Module netreviews installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%netreviews%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"471"},"472":{"name":"Module netreviews configured","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'NETREVIEWS_CONFIGURATION_OK') AND ( value = '1')) OR (( name LIKE 'AVISVERIFIES_URLCERTIFICAT ') AND ( value IS NOT LIKE '%preprod%'))","operator":"==","value":"2","calculation_type":"time","calculation_detail":"1","id_ps_condition":"472"},"473":{"name":"Module netreviews active","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"100","id_ps_condition":"473"},"474":{"name":"Module netreviews superactive","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"100","id_ps_condition":"474"},"475":{"name":"Module bluesnap installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%bluesnap%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"475"},"476":{"name":"Module bluesnap configured","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'BLUESNAP_CONFIGURATION_OK') AND ( value = '1')) OR (( name LIKE 'BLUESNAP_SANDBOX ') AND ( value NOT LIKE '%sandbox%'))","operator":"==","value":"2","calculation_type":"time","calculation_detail":"1","id_ps_condition":"476"},"477":{"name":"Module bluensap active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%bluesnap%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"477"},"478":{"name":"Module bluesnap superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%bluesnap%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"7","id_ps_condition":"478"},"479":{"name":"Module desjardins installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%desjardins%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"479"},"480":{"name":"Module desjardins configured","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'DESJARDINS_CONFIGURATION_OK') AND ( value = '1')) OR (( name LIKE 'DESJARDINS_MODE ') AND ( value NOT LIKE '%test%'))","operator":"==","value":"2","calculation_type":"time","calculation_detail":"1","id_ps_condition":"480"},"481":{"name":"Module desjardins active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%desjardins%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"481"},"482":{"name":"Module desjardins superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%desjardins%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"7","id_ps_condition":"482"},"483":{"name":"Module firstdata installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%firstdata%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"483"},"484":{"name":"Module firstdata configured","type":"configuration","request":"FIRSTDATA_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"484"},"485":{"name":"Module firstdata active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%firstdata%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"485"},"486":{"name":"Module firstdata superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%firstdata%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"7","id_ps_condition":"486"},"487":{"name":"Module give.it installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%giveit%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"487"},"488":{"name":"Module give.it configured","type":"sql","request":"GIVEIT_CONFIGURATION_OK","operator":">=","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"488"},"489":{"name":"Module give.it active","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"365","id_ps_condition":"489"},"490":{"name":"Module give.it superactive","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"365","id_ps_condition":"490"},"491":{"name":"Module googleanalytics installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%ganalytics%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"491"},"492":{"name":"Module googleanalytics configured","type":"configuration","request":"GANALYTICS_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"492"},"493":{"name":"Module googleanalytics active","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"493"},"494":{"name":"Module googleanalytics superactive","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"365","id_ps_condition":"494"},"496":{"name":"Module pagseguro installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%pagseguro%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"496"},"497":{"name":"Module pagseguro configured","type":"configuration","request":"PAGSEGURO_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"497"},"498":{"name":"Module pagseguro active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%pagseguro%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"498"},"499":{"name":"Module pagseguro superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%pagseguro%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"7","id_ps_condition":"499"},"500":{"name":"Module paypalmx installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%paypalmx%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"500"},"501":{"name":"Module paypalmx configured","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'PAYPALMX_CONFIGURATION_OK') AND ( value = '1')) OR (( name LIKE 'PAYPAL_MX_SANDBOX') AND ( value = '0'))","operator":"==","value":"2","calculation_type":"time","calculation_detail":"1","id_ps_condition":"501"},"502":{"name":"Module paypalmx active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%paypalmx%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"502"},"503":{"name":"Module paypalmx superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%paypalmx%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"7","id_ps_condition":"503"},"505":{"name":"Module paypalusa installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%paypalusa%\"","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"505"},"506":{"name":"Module paypalusa configured","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'PAYPALUSA_CONFIGURATION_OK') AND ( value = '1')) OR (( name LIKE 'PAYPAL_USA_SANDBOX') AND ( value = '0'))","operator":"==","value":"2","calculation_type":"time","calculation_detail":"1","id_ps_condition":"506"},"507":{"name":"Module paypalusa active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%paypalusa%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"507"},"508":{"name":"Module paypalusa superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%paypalmx%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"7","id_ps_condition":"508"},"509":{"name":"Module payulatam installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%payulatam%\"","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"509"},"510":{"name":"Module payulatam configured","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'PAYULATAM_CONFIGURATION_OK') AND ( value = '1')) OR (( name LIKE 'PAYU_LATAM_TEST') AND ( value = '1'))","operator":"==","value":"2","calculation_type":"time","calculation_detail":"1","id_ps_condition":"510"},"511":{"name":"Module payulatam active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%payulatam%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"511"},"512":{"name":"Module payulatam superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%payulatam%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"7","id_ps_condition":"512"},"513":{"name":"Module prestastats installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%prestastats%\"","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"513"},"514":{"name":"Module prestastats configured","type":"configuration","request":"PRESTASTATS_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"514"},"515":{"name":"Module prestastats active","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"365","id_ps_condition":"515"},"516":{"name":"Module prestastats superactive","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"365","id_ps_condition":"516"},"517":{"name":"Module riskified installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%riskified%\"","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"517"},"518":{"name":"Module riskified configured","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'RISKIFIED_CONFIGURATION_OK') AND ( value = '1')) OR (( name LIKE 'RISKIFIED_MODE') AND ( value = '1'))","operator":"==","value":"2","calculation_type":"time","calculation_detail":"1","id_ps_condition":"518"},"519":{"name":"Module riskified active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%riskified%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"519"},"520":{"name":"Module riskified superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%riskified%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"7","id_ps_condition":"520"},"521":{"name":"Module simplifycommerce installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%simplifycommerce%\"","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"521"},"522":{"name":"Module simplifycommerce configured","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'SIMPLIFY_CONFIGURATION_OK') AND ( value = '1')) OR (( name LIKE 'SIMPLIFY_MODE') AND ( value = '1'))","operator":"==","value":"2","calculation_type":"time","calculation_detail":"1","id_ps_condition":"522"},"523":{"name":"Module simplifycommerce active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%simplifycommerce%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"523"},"524":{"name":"Module simplifycommerce superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%simplifycommerce%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"7","id_ps_condition":"524"},"525":{"name":"Module vtpayment installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%vtpayment%\"","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"525"},"526":{"name":"Module vtpayment configured","type":"configuration","request":"VTPAYMENT_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"526"},"527":{"name":"Module vtpayment active","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%vtpayment%\" AND os.logable = 1","operator":">=","value":"1","calculation_type":"time","calculation_detail":"2","id_ps_condition":"527"},"528":{"name":"Module vtpayment superactive","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_orders o LEFT JOIN PREFIX_order_state os ON os.id_order_state = o.current_state WHERE o.module like \"%vtpayment%\" AND os.logable = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 90 DAY)","operator":">=","value":"30","calculation_type":"time","calculation_detail":"7","id_ps_condition":"528"},"529":{"name":"Module yotpo installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%yotpo%\"","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"529"},"530":{"name":"Module yotpo configured","type":"configuration","request":"YOTPO_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"530"},"531":{"name":"Module yotpo active","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"365","id_ps_condition":"531"},"532":{"name":"Module yotpo superactive","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"365","id_ps_condition":"532"},"533":{"name":"Module youstice installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%yotpo%\"","operator":"==","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"533"},"534":{"name":"Module youstice configured","type":"sql","request":"SELECT COUNT(*) FROM PREFIX_configuration WHERE (( name LIKE 'YOUSTICERESOLUTIONSYSTEM_CONF_OK') AND ( value = '1')) OR (( name LIKE 'YRS_SANDBOX') AND ( value = '0'))","operator":"==","value":"2","calculation_type":"time","calculation_detail":"1","id_ps_condition":"534"},"535":{"name":"Module youstice active","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"365","id_ps_condition":"535"},"536":{"name":"Module youstice superactive","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"365","id_ps_condition":"536"},"537":{"name":"Module loyaltylion installed","type":"sql","request":"SELECT COUNT( id_module ) FROM PREFIX_module WHERE `name` like \"%loyaltylion%\"","operator":">=","value":"1","calculation_type":"hook","calculation_detail":"actionModuleInstallAfter","id_ps_condition":"537"},"538":{"name":"Module loyaltylion configured","type":"configuration","request":"LOYALTYLION_CONFIGURATION_OK","operator":"==","value":"1","calculation_type":"time","calculation_detail":"1","id_ps_condition":"538"},"539":{"name":"Module loyaltylion active","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"365","id_ps_condition":"539"},"540":{"name":"Module loyaltylion superactive","type":"sql","request":"SELECT 1","operator":"!=","value":"1","calculation_type":"time","calculation_detail":"365","id_ps_condition":"540"}},"signature":"qljgKXeH7NzqCZvuOmiK5ZrpN1ePeGam3mu7XJm7Hy0s5TUJxzZ2lyP1ds8rdopw5ZtBLjRaHP4VnYIA8iwERkC0YbxEmr49u7P\/rVoJz1OA04pFV7mTmFhgm9h+\/xWAHc7tRmT47ECVYC5b9rZkw3Qdmr5BneVrf8UMZ4ipIMFsHwlcgiIyBzA9Nlx4i\/a2ZzjnXExxYsUf2UccxhH39tT7IiH68qfFmZTim1g1O47v8rdyrJLsEzkyRzcoCeixdUWI04Rjz59+eKfhAMihW2TNymYYDbgFfUvEbg582GWB9rTUJg3LpxoLk1wl230nPuHoEnNk0BFXdhqYjSJNOw==","signature_16":"qkmP0Gb\/Kc8NAfDkWHr0JInlQOFQuO5HMLnVARWFPthLdfS8uvuMzNtvoBWYQSEu5wez6ffuUZ7OCeAD700JaJK+pW7flg4btJlEv31wObuCFS4VZI7qQQ9Bt1uPwXkB5Kgear2JIKTJHQDh+xdSc0gpprxpM\/1z20ANwQTBlbXL7phMCzsm6srSGpWvp5fgwcrXQUGkGuWZ4oLtiZFrSbMGtx4tul\/jbeFsi9HuFcBGKhhq2cpaljeBQcO7mwP\/uzbwuDsUfnd+SfmE1FiQTOlqB9YnPr\/zZRzDeiBm7V+4Xv7u502HmYKeybk0GNSOwJCfDXoE8eBNU63rcau\/6Q==","badges":[{"type":"feature","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"1","id_group":"1","conditions":["1"]},{"type":"feature","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"2","id_group":"2","conditions":["2","3","4"]},{"type":"feature","group_position":"2","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"3","id_group":"2","conditions":["5"]},{"type":"feature","group_position":"1","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"4","id_group":"3","conditions":["6"]},{"type":"feature","group_position":"2","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"5","id_group":"3","conditions":["7"]},{"type":"feature","group_position":"1","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"6","id_group":"4","conditions":["8"]},{"type":"feature","group_position":"2","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"7","id_group":"4","conditions":["9"]},{"type":"feature","group_position":"1","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"8","id_group":"5","conditions":["10"]},{"type":"feature","group_position":"2","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"9","id_group":"5","conditions":["11"]},{"type":"feature","group_position":"1","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"10","id_group":"6","conditions":["16"]},{"type":"feature","group_position":"2","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"11","id_group":"6","conditions":["17"]},{"type":"feature","group_position":"3","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"12","id_group":"6","conditions":["18"]},{"type":"feature","group_position":"3","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"13","id_group":"5","conditions":["12"]},{"type":"feature","group_position":"4","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"14","id_group":"5","conditions":["13"]},{"type":"feature","group_position":"5","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"15","id_group":"5","conditions":["14"]},{"type":"feature","group_position":"6","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"16","id_group":"5","conditions":["15"]},{"type":"achievement","group_position":"1","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"17","id_group":"7","conditions":["19"]},{"type":"achievement","group_position":"2","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"18","id_group":"7","conditions":["20"]},{"type":"feature","group_position":"1","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"19","id_group":"8","conditions":["21"]},{"type":"feature","group_position":"2","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"20","id_group":"8","conditions":["22"]},{"type":"feature","group_position":"1","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"21","id_group":"9","conditions":["23"]},{"type":"feature","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"22","id_group":"10","conditions":["24"]},{"type":"feature","group_position":"2","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"23","id_group":"10","conditions":["25"]},{"type":"feature","group_position":"3","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"24","id_group":"10","conditions":["28"]},{"type":"feature","group_position":"4","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"25","id_group":"10","conditions":["26"]},{"type":"feature","group_position":"5","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"26","id_group":"10","conditions":["27"]},{"type":"feature","group_position":"3","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"27","id_group":"4","conditions":["30"]},{"type":"feature","group_position":"3","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"28","id_group":"3","conditions":["29"]},{"type":"achievement","group_position":"1","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"29","id_group":"11","conditions":["31"]},{"type":"achievement","group_position":"2","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"30","id_group":"11","conditions":["32"]},{"type":"achievement","group_position":"3","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"31","id_group":"11","conditions":["33"]},{"type":"achievement","group_position":"4","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"32","id_group":"11","conditions":["34"]},{"type":"achievement","group_position":"5","scoring":"25","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"33","id_group":"11","conditions":["35"]},{"type":"achievement","group_position":"6","scoring":"30","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"34","id_group":"11","conditions":["36"]},{"type":"achievement","group_position":"3","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"35","id_group":"7","conditions":["37"]},{"type":"achievement","group_position":"4","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"36","id_group":"7","conditions":["38"]},{"type":"achievement","group_position":"5","scoring":"25","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"37","id_group":"7","conditions":["39"]},{"type":"achievement","group_position":"6","scoring":"30","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"38","id_group":"7","conditions":["40"]},{"type":"achievement","group_position":"1","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"39","id_group":"12","conditions":["41"]},{"type":"achievement","group_position":"2","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"40","id_group":"12","conditions":["42"]},{"type":"achievement","group_position":"3","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"41","id_group":"12","conditions":["43"]},{"type":"achievement","group_position":"4","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"42","id_group":"12","conditions":["44"]},{"type":"achievement","group_position":"5","scoring":"25","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"43","id_group":"12","conditions":["45"]},{"type":"achievement","group_position":"6","scoring":"30","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"44","id_group":"12","conditions":["46"]},{"type":"achievement","group_position":"1","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"45","id_group":"13","conditions":["47"]},{"type":"achievement","group_position":"2","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"46","id_group":"13","conditions":["48"]},{"type":"achievement","group_position":"3","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"47","id_group":"13","conditions":["49"]},{"type":"achievement","group_position":"4","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"48","id_group":"13","conditions":["50"]},{"type":"achievement","group_position":"5","scoring":"25","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"49","id_group":"13","conditions":["51"]},{"type":"achievement","group_position":"6","scoring":"30","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"50","id_group":"13","conditions":["52"]},{"type":"achievement","group_position":"1","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"51","id_group":"14","conditions":["53"]},{"type":"achievement","group_position":"2","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"52","id_group":"14","conditions":["54"]},{"type":"achievement","group_position":"3","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"53","id_group":"14","conditions":["55"]},{"type":"achievement","group_position":"4","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"54","id_group":"14","conditions":["56"]},{"type":"achievement","group_position":"5","scoring":"25","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"55","id_group":"14","conditions":["57"]},{"type":"achievement","group_position":"6","scoring":"30","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"56","id_group":"14","conditions":["58"]},{"type":"achievement","group_position":"1","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"57","id_group":"15","conditions":["65"]},{"type":"achievement","group_position":"2","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"58","id_group":"15","conditions":["66"]},{"type":"achievement","group_position":"3","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"59","id_group":"15","conditions":["67"]},{"type":"achievement","group_position":"4","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"60","id_group":"15","conditions":["68"]},{"type":"achievement","group_position":"5","scoring":"25","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"61","id_group":"15","conditions":["69"]},{"type":"achievement","group_position":"6","scoring":"30","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"62","id_group":"15","conditions":["70"]},{"type":"achievement","group_position":"1","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"63","id_group":"16","conditions":["59"]},{"type":"achievement","group_position":"2","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"64","id_group":"16","conditions":["60"]},{"type":"achievement","group_position":"3","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"65","id_group":"16","conditions":["61"]},{"type":"achievement","group_position":"4","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"66","id_group":"16","conditions":["62"]},{"type":"achievement","group_position":"5","scoring":"25","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"67","id_group":"16","conditions":["63"]},{"type":"achievement","group_position":"6","scoring":"30","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"68","id_group":"16","conditions":["64"]},{"type":"international","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"74","id_group":"22","conditions":["76"]},{"type":"international","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"75","id_group":"23","conditions":["79"]},{"type":"international","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"78","id_group":"26","conditions":["80"]},{"type":"international","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"79","id_group":"27","conditions":["81"]},{"type":"international","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"80","id_group":"28","conditions":["82"]},{"type":"international","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"81","id_group":"29","conditions":["83"]},{"type":"international","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"82","id_group":"30","conditions":["84"]},{"type":"international","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"84","id_group":"25","conditions":["86"]},{"type":"international","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"85","id_group":"32","conditions":["87"]},{"type":"international","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"86","id_group":"33","conditions":["88"]},{"type":"international","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"87","id_group":"34","conditions":["89"]},{"type":"feature","group_position":"1","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"88","id_group":"35","conditions":["90"]},{"type":"feature","group_position":"2","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"89","id_group":"35","conditions":["91"]},{"type":"feature","group_position":"3","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"90","id_group":"35","conditions":["92"]},{"type":"feature","group_position":"4","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"91","id_group":"35","conditions":["93"]},{"type":"feature","group_position":"5","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"92","id_group":"35","conditions":["94"]},{"type":"feature","group_position":"6","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"93","id_group":"35","conditions":["95"]},{"type":"feature","group_position":"1","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"94","id_group":"36","conditions":["96"]},{"type":"feature","group_position":"2","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"95","id_group":"36","conditions":["97"]},{"type":"feature","group_position":"3","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"96","id_group":"36","conditions":["98"]},{"type":"feature","group_position":"4","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"97","id_group":"36","conditions":["99"]},{"type":"feature","group_position":"5","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"98","id_group":"36","conditions":["100"]},{"type":"feature","group_position":"6","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"99","id_group":"36","conditions":["101"]},{"type":"feature","group_position":"3","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"100","id_group":"8","conditions":["102"]},{"type":"achievement","group_position":"1","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"101","id_group":"37","conditions":["103"]},{"type":"achievement","group_position":"2","scoring":"5","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"102","id_group":"37","conditions":["104"]},{"type":"achievement","group_position":"3","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"103","id_group":"37","conditions":["105"]},{"type":"achievement","group_position":"4","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"104","id_group":"37","conditions":["107"]},{"type":"achievement","group_position":"5","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"105","id_group":"37","conditions":["106"]},{"type":"achievement","group_position":"6","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"106","id_group":"37","conditions":["108"]},{"type":"achievement","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"107","id_group":"38","conditions":["109"]},{"type":"achievement","group_position":"2","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"108","id_group":"38","conditions":["110"]},{"type":"achievement","group_position":"3","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"109","id_group":"38","conditions":["111"]},{"type":"achievement","group_position":"4","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"110","id_group":"38","conditions":["113"]},{"type":"achievement","group_position":"5","scoring":"25","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"111","id_group":"38","conditions":["114"]},{"type":"achievement","group_position":"6","scoring":"30","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"112","id_group":"38","conditions":["112"]},{"type":"achievement","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"113","id_group":"39","conditions":["165"]},{"type":"achievement","group_position":"2","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"114","id_group":"39","conditions":["166"]},{"type":"achievement","group_position":"3","scoring":"30","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"115","id_group":"39","conditions":["167"]},{"type":"achievement","group_position":"4","scoring":"40","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"116","id_group":"39","conditions":["168"]},{"type":"achievement","group_position":"5","scoring":"50","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"117","id_group":"39","conditions":["169"]},{"type":"achievement","group_position":"6","scoring":"50","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"118","id_group":"39","conditions":["170"]},{"type":"feature","group_position":"1","scoring":"10","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"119","id_group":"40","conditions":["171"]},{"type":"feature","group_position":"2","scoring":"15","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"120","id_group":"40","conditions":["172"]},{"type":"feature","group_position":"3","scoring":"20","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"121","id_group":"40","conditions":["173"]},{"type":"feature","group_position":"4","scoring":"25","awb":false,"partner_id":"-1","active":true,"id_ps_badge":"122","id_group":"40","conditions":["174"]}],"badges_lang":[{"id_ps_badge":"1","name":"SEO","description":"You enabled the URL rewriting through the tab \"Preferences > SEO and URLs\".","group_name":"SEO"},{"id_ps_badge":"2","name":"Site Performance","description":"You enabled CCC (Combine, Compress and Cache), Rijndael and Smarty through the tab \r\nAdvanced Parameters > Performance.","group_name":"Site Performance"},{"id_ps_badge":"3","name":"Site Performance","description":"You enabled media servers through the tab \"Advanced parameters > Performance\".","group_name":"Site Performance"},{"id_ps_badge":"4","name":"Payment","description":"You configured a payment solution on your shop.","group_name":"Payment"},{"id_ps_badge":"5","name":"Payment","description":"You offer two different payment methods to your customers.","group_name":"Payment"},{"id_ps_badge":"6","name":"Shipping","description":"You configured a carrier on your shop.","group_name":"Shipping"},{"id_ps_badge":"7","name":"Shipping","description":"You offer two shipping solutions (carriers) to your customers.","group_name":"Shipping"},{"id_ps_badge":"8","name":"Catalog Size","description":"You added your first product to your catalog!","group_name":"Catalog Size"},{"id_ps_badge":"9","name":"Catalog Size","description":"You have 10 products within your catalog.","group_name":"Catalog Size"},{"id_ps_badge":"10","name":"Contact information","description":"You configured your phone number so your customers can reach you!","group_name":"Contact information"},{"id_ps_badge":"11","name":"Contact information","description":"You added a third email address to your contact form.","group_name":"Contact information"},{"id_ps_badge":"12","name":"Contact information","description":"You suggest a total of 5 departments to be reached by your customers via your contact form.","group_name":"Contact information"},{"id_ps_badge":"13","name":"Catalog Size","description":"You have 100 products within your catalog.","group_name":"Catalog Size"},{"id_ps_badge":"14","name":"Catalog Size","description":"You have 1,000 products within your catalog.","group_name":"Catalog Size"},{"id_ps_badge":"15","name":"Catalog Size","description":"You have 10,000 products within your catalog.","group_name":"Catalog Size"},{"id_ps_badge":"16","name":"Catalog Size","description":"You have 100,000 products within your catalog.","group_name":"Catalog Size"},{"id_ps_badge":"17","name":"Days of Experience","description":"You just installed PrestaShop!","group_name":"Days of Experience"},{"id_ps_badge":"18","name":"Days of Experience","description":"You installed PrestaShop a week ago!","group_name":"Days of Experience"},{"id_ps_badge":"19","name":"Customization","description":"You uploaded your own logo.","group_name":"Customization"},{"id_ps_badge":"20","name":"Customization","description":"You installed a new template.","group_name":"Customization"},{"id_ps_badge":"21","name":"Addons","description":"You connected your back-office to the Addons platform using your PrestaShop Addons account.","group_name":"Addons"},{"id_ps_badge":"22","name":"Multistores","description":"You enabled the Multistores feature.","group_name":"Multistores"},{"id_ps_badge":"23","name":"Multistores","description":"You manage two shops with the Multistores feature.","group_name":"Multistores"},{"id_ps_badge":"24","name":"Multistores","description":"You manage two different groups of shops using the Multistores feature.","group_name":"Multistores"},{"id_ps_badge":"25","name":"Multistores","description":"You manage five shops with the Multistores feature.","group_name":"Multistores"},{"id_ps_badge":"26","name":"Multistores","description":"You manage five different groups of shops using the Multistores feature.","group_name":"Multistores"},{"id_ps_badge":"27","name":"Shipping","description":"You offer three different shipping solutions (carriers) to your customers.","group_name":"Shipping"},{"id_ps_badge":"28","name":"Payment","description":"You offer three different payment methods to your customers.","group_name":"Payment"},{"id_ps_badge":"29","name":"Revenue","description":"You get this badge when you reach 8000 INR in sales.","group_name":"Revenue"},{"id_ps_badge":"30","name":"Revenue","description":"You get this badge when you reach 10000 INR in sales.","group_name":"Revenue"},{"id_ps_badge":"31","name":"Revenue","description":"You get this badge when you reach 10000 INR in sales.","group_name":"Revenue"},{"id_ps_badge":"32","name":"Revenue","description":"You get this badge when you reach 8000 INR in sales.","group_name":"Revenue"},{"id_ps_badge":"33","name":"Revenue","description":"You get this badge when you reach 10000 INR in sales.","group_name":"Revenue"},{"id_ps_badge":"34","name":"Revenue","description":"You get this badge when you reach 10000 INR in sales.","group_name":"Revenue"},{"id_ps_badge":"35","name":"Days of Experience","description":"You installed PrestaShop a month ago!","group_name":"Days of Experience"},{"id_ps_badge":"36","name":"Days of Experience","description":"You installed PrestaShop six months ago!","group_name":"Days of Experience"},{"id_ps_badge":"37","name":"Days of Experience","description":"You installed PrestaShop a year ago!","group_name":"Days of Experience"},{"id_ps_badge":"38","name":"Days of Experience","description":"You installed PrestaShop two years ago!","group_name":"Days of Experience"},{"id_ps_badge":"39","name":"Visitors","description":"You reached 10 visitors!","group_name":"Visitors"},{"id_ps_badge":"40","name":"Visitors","description":"You reached 100 visitors!","group_name":"Visitors"},{"id_ps_badge":"41","name":"Visitors","description":"You reached 1,000 visitors!","group_name":"Visitors"},{"id_ps_badge":"42","name":"Visitors","description":"You reached 10,000 visitors!","group_name":"Visitors"},{"id_ps_badge":"43","name":"Visitors","description":"You reached 100,000 visitors!","group_name":"Visitors"},{"id_ps_badge":"44","name":"Visitors","description":"You reached 1,000,000 visitors!","group_name":"Visitors"},{"id_ps_badge":"45","name":"Customer Carts","description":"Two carts have been created by visitors","group_name":"Customer Carts"},{"id_ps_badge":"46","name":"Customer Carts","description":"Ten carts have been created by visitors.","group_name":"Customer Carts"},{"id_ps_badge":"47","name":"Customer Carts","description":"A hundred carts have been created by visitors on your shop.","group_name":"Customer Carts"},{"id_ps_badge":"48","name":"Customer Carts","description":"A thousand carts have been created by visitors on your shop.","group_name":"Customer Carts"},{"id_ps_badge":"49","name":"Customer Carts","description":"10,000 carts have been created by visitors.","group_name":"Customer Carts"},{"id_ps_badge":"50","name":"Customer Carts","description":"100,000 carts have been created by visitors.","group_name":"Customer Carts"},{"id_ps_badge":"51","name":"Orders","description":"You received your first order.","group_name":"Orders"},{"id_ps_badge":"52","name":"Orders","description":"10 orders have been placed through your online shop.","group_name":"Orders"},{"id_ps_badge":"53","name":"Orders","description":"You received 100 orders through your online shop!","group_name":"Orders"},{"id_ps_badge":"54","name":"Orders","description":"You received 1,000 orders through your online shop, congrats!","group_name":"Orders"},{"id_ps_badge":"55","name":"Orders","description":"You received 10,000 orders through your online shop, cheers!","group_name":"Orders"},{"id_ps_badge":"56","name":"Orders","description":"You received 100,000 orders through your online shop!","group_name":"Orders"},{"id_ps_badge":"57","name":"Customer Service Threads","description":"You received your first customer's message.","group_name":"Customer Service Threads"},{"id_ps_badge":"58","name":"Customer Service Threads","description":"You received 10 messages from your customers.","group_name":"Customer Service Threads"},{"id_ps_badge":"59","name":"Customer Service Threads","description":"You received 100 messages from your customers.","group_name":"Customer Service Threads"},{"id_ps_badge":"60","name":"Customer Service Threads","description":"You received 1,000 messages from your customers.","group_name":"Customer Service Threads"},{"id_ps_badge":"61","name":"Customer Service Threads","description":"You received 10,000 messages from your customers.","group_name":"Customer Service Threads"},{"id_ps_badge":"62","name":"Customer Service Threads","description":"You received 100,000 messages from your customers.","group_name":"Customer Service Threads"},{"id_ps_badge":"63","name":"Customers","description":"You got the first customer registered on your shop!","group_name":"Customers"},{"id_ps_badge":"64","name":"Customers","description":"You have over 10 customers registered on your shop.","group_name":"Customers"},{"id_ps_badge":"65","name":"Customers","description":"You have over 100 customers registered on your shop.","group_name":"Customers"},{"id_ps_badge":"66","name":"Customers","description":"You have over 1,000 customers registered on your shop.","group_name":"Customers"},{"id_ps_badge":"67","name":"Customers","description":"You have over 10,000 customers registered on your shop.","group_name":"Customers"},{"id_ps_badge":"68","name":"Customers","description":"You have over 100,000 customers registered on your shop.","group_name":"Customers"},{"id_ps_badge":"74","name":"North America","description":"You got your first sale in North America","group_name":"North America"},{"id_ps_badge":"75","name":"Oceania","description":"You got your first sale in Oceania","group_name":"Oceania"},{"id_ps_badge":"78","name":"Central Asia","description":"You got your first sale in Central Asia","group_name":"Central Asia"},{"id_ps_badge":"79","name":"Middle East","description":"You got your first sale in Middle East","group_name":"Middle East"},{"id_ps_badge":"80","name":"Southern Asia","description":"You got your first sale in Southern Asia","group_name":"Southern Asia"},{"id_ps_badge":"81","name":"Eastern Asia","description":"You got your first sale in Eastern Asia","group_name":"Eastern Asia"},{"id_ps_badge":"82","name":"South Eastern Asia","description":"You got your first sale in South Eastern Asia","group_name":"South Eastern Asia"},{"id_ps_badge":"84","name":"South America","description":"You got your first sale in South America","group_name":"South America"},{"id_ps_badge":"85","name":"Europe","description":"You got your first sale in Europe!","group_name":"Europe"},{"id_ps_badge":"86","name":"Africa","description":"You got your first sale in Africa","group_name":"Africa"},{"id_ps_badge":"87","name":"Maghreb","description":"You got your first sale in Maghreb","group_name":"Maghreb"},{"id_ps_badge":"88","name":"Your Team's Employees","description":"First employee account added to your shop","group_name":"Your Team's Employees"},{"id_ps_badge":"89","name":"Your Team's Employees","description":"3 employee accounts added to your shop","group_name":"Your Team's Employees"},{"id_ps_badge":"90","name":"Your Team's Employees","description":"5 employee accounts added to your shop","group_name":"Your Team's Employees"},{"id_ps_badge":"91","name":"Your Team's Employees","description":"10 employee accounts added to your shop","group_name":"Your Team's Employees"},{"id_ps_badge":"92","name":"Your Team's Employees","description":"20 employee accounts added to your shop","group_name":"Your Team's Employees"},{"id_ps_badge":"93","name":"Your Team's Employees","description":"40 employee accounts added to your shop","group_name":"Your Team's Employees"},{"id_ps_badge":"94","name":"Product Pictures","description":"First photo added to your catalog","group_name":"Product Pictures"},{"id_ps_badge":"95","name":"Product Pictures","description":"50 photos added to your catalog","group_name":"Product Pictures"},{"id_ps_badge":"96","name":"Product Pictures","description":"100 photos added to your catalog","group_name":"Product Pictures"},{"id_ps_badge":"97","name":"Product Pictures","description":"1,000 photos added to your catalog","group_name":"Product Pictures"},{"id_ps_badge":"98","name":"Product Pictures","description":"10,000 photos added to your catalog","group_name":"Product Pictures"},{"id_ps_badge":"99","name":"Product Pictures","description":"50,000 photos added to your catalog","group_name":"Product Pictures"},{"id_ps_badge":"100","name":"Customization","description":"First CMS page added to your catalog","group_name":"Customization"},{"id_ps_badge":"101","name":"Cart Rules","description":"First cart rules configured on your shop","group_name":"Cart Rules"},{"id_ps_badge":"102","name":"Cart Rules","description":"You have 10 cart rules configured on your shop","group_name":"Cart Rules"},{"id_ps_badge":"103","name":"Cart Rules","description":"You have 100 cart rules configured on your shop","group_name":"Cart Rules"},{"id_ps_badge":"104","name":"Cart Rules","description":"You have 500 cart rules configured on your shop","group_name":"Cart Rules"},{"id_ps_badge":"105","name":"Cart Rules","description":"You have 1,000 cart rules configured on your shop","group_name":"Cart Rules"},{"id_ps_badge":"106","name":"Cart Rules","description":"You have 5,000 cart rules configured on your shop","group_name":"Cart Rules"},{"id_ps_badge":"107","name":"International Orders","description":"First international order placed on your shop.","group_name":"International Orders"},{"id_ps_badge":"108","name":"International Orders","description":"10 international orders placed on your shop.","group_name":"International Orders"},{"id_ps_badge":"109","name":"International Orders","description":"100 international orders placed on your shop!","group_name":"International Orders"},{"id_ps_badge":"110","name":"International Orders","description":"1,000 international orders placed on your shop!","group_name":"International Orders"},{"id_ps_badge":"111","name":"International Orders","description":"5,000 international orders placed on your shop!","group_name":"International Orders"},{"id_ps_badge":"112","name":"International Orders","description":"10,000 international orders placed on your shop!","group_name":"International Orders"},{"id_ps_badge":"113","name":"Store","description":"First store configured on your shop!","group_name":"Store"},{"id_ps_badge":"114","name":"Store","description":"You have 2 stores configured on your shop","group_name":"Store"},{"id_ps_badge":"115","name":"Store","description":"You have 5 stores configured on your shop","group_name":"Store"},{"id_ps_badge":"116","name":"Store","description":"You have 10 stores configured on your shop","group_name":"Store"},{"id_ps_badge":"117","name":"Store","description":"You have 20 stores configured on your shop","group_name":"Store"},{"id_ps_badge":"118","name":"Store","description":"You have 50 stores configured on your shop","group_name":"Store"},{"id_ps_badge":"119","name":"Webservice x1","description":"First webservice account added to your shop","group_name":"WebService"},{"id_ps_badge":"120","name":"Webservice x2","description":"2 webservice accounts added to your shop","group_name":"WebService"},{"id_ps_badge":"121","name":"Webservice x3","description":"3 webservice accounts added to your shop","group_name":"WebService"},{"id_ps_badge":"122","name":"Webservice x4","description":"4 webservice accounts added to your shop","group_name":"WebService"}],"advices":[],"advices_lang":[],"advices_16":[{"name":"Online Merchant Training","module_name":"","weight":"1","location":"before","selector":".toolbar-placeholder:eq(0), form#invoice_date_form, form#product, form#form-product, form#store, form#form-store, form#category, form#form-category","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2014-10-23 17:50:25","tabs":["AdminInvoices","AdminProducts","AdminStores","AdminCategories"],"tab":"AdminInvoices","display_conditions":["159"],"hide_conditions":["158"],"id_ps_advice":"324"},{"name":"Translate","module_name":null,"weight":"1","location":"before","selector":"#typeTranslationForm","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2014-05-23 17:45:45","tabs":["AdminTranslations"],"tab":"AdminTranslations","display_conditions":["19"],"hide_conditions":["40"],"id_ps_advice":"353"},{"name":"Addons Dashboard","module_name":"","weight":"1","location":"before","selector":"addons","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2015-04-29 17:52:30","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":["40"],"id_ps_advice":"354"},{"name":"User Club","module_name":null,"weight":"1","location":"before","selector":"#upgradeButtonBlock","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2014-06-10 17:53:21","tabs":["AdminSelfUpgrade"],"tab":"AdminSelfUpgrade","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"389"},{"name":"Store Manager","module_name":null,"weight":"1","location":"before","selector":".toolbar-placeholder:eq(0), form#product, form#form-product","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2014-08-27 18:25:54","tabs":["AdminProducts"],"tab":"AdminProducts","display_conditions":["19"],"hide_conditions":["40"],"id_ps_advice":"479"},{"name":"[Tips] sendinblue","module_name":null,"weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2014-11-12 12:01:41","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"520"},{"name":"SendinBlue","module_name":null,"weight":"1","location":"before","selector":".leadin:first","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2014-12-19 16:18:47","tabs":["AdminCustomerThreads","AdminCustomers"],"tab":"AdminCustomerThreads","display_conditions":["19"],"hide_conditions":["40"],"id_ps_advice":"532"},{"name":"Nosto 1","module_name":"nostotagging","weight":"1","location":"after","selector":".leadin:first","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2014-12-19 16:18:12","tabs":["AdminOrders","AdminProducts"],"tab":"AdminOrders","display_conditions":["55"],"hide_conditions":[],"id_ps_advice":"540"},{"name":"Nosto 2","module_name":"nostotagging","weight":"1","location":"after","selector":".leadin:first","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2014-12-19 16:18:12","tabs":["AdminProducts"],"tab":"AdminProducts","display_conditions":["55"],"hide_conditions":[],"id_ps_advice":"548"},{"name":"[Tips] hipay2","module_name":null,"weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2015-02-25 18:16:15","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"569"},{"name":"[Tips] storemanager","module_name":null,"weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2015-02-25 18:15:33","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"570"},{"name":"Nosto 1","module_name":null,"weight":"1","location":"before","selector":".leadin:first","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2015-04-23 14:09:51","tabs":["AdminCatalog","AdminCustomers","AdminGroups"],"tab":"AdminCatalog","display_conditions":["12"],"hide_conditions":["39"],"id_ps_advice":"571"},{"name":"A2 Hosting","module_name":null,"weight":"1","location":"before","selector":".leadin:first","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2015-04-23 14:09:51","tabs":["AdminCategories","AdminCmsContent","AdminImport","AdminModules","AdminProducts","AdminThemes","AdminDashboard"],"tab":"AdminCategories","display_conditions":["132","175"],"hide_conditions":["40"],"id_ps_advice":"590"},{"name":"Block Top Menu [Produit]","module_name":null,"weight":"1","location":"after","selector":".leadin:first","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2015-07-30 11:54:57","tabs":["AdminCategories"],"tab":"AdminCategories","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"610"},{"name":"[Premium] hipay2","module_name":"hipay2","weight":"1","location":"after","selector":"#dashtrends","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2015-06-19 12:14:31","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"650"},{"name":"[Tips] release","module_name":"","weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2016-05-03 16:21:11","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19","542"],"hide_conditions":[],"id_ps_advice":"673"},{"name":"[Tips] sslcertificate","module_name":"","weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2015-10-30 11:08:21","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":["175"],"id_ps_advice":"698"},{"name":"[Tips] videotraining_productpage","module_name":null,"weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2015-12-10 16:27:10","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"708"},{"name":"[Tips] videotraining_businesstech","module_name":null,"weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2016-03-29 10:21:59","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"730"},{"name":"[Tips] videotraining_enverguredigital","module_name":null,"weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2016-03-29 10:21:59","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"731"},{"name":"[Tips] videotraining_envoimoinscher","module_name":null,"weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2016-03-29 10:21:59","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"732"},{"name":"[Tips] videotraining_milega","module_name":null,"weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2016-03-29 10:21:59","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"733"},{"name":"[Tips] videotraining_prestashop","module_name":null,"weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2016-03-29 10:21:59","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"734"},{"name":"[Tips] videotraining_suscribe","module_name":null,"weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2016-03-29 10:21:59","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"735"},{"name":"[Premium] skrill2","module_name":"skrill2","weight":"1","location":"after","selector":"#dashtrends","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2016-08-26 16:03:06","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"765"},{"name":"[Tips] crowdin","module_name":null,"weight":"1","location":"after","selector":".dash_news","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2016-09-16 17:35:22","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"773"},{"name":"[Premium] nostotagging","module_name":"nostotagging","weight":"1","location":"after","selector":"#dashtrends","active":true,"start_day":"0","stop_day":"0","start_date":"0000-00-00 00:00:00","stop_date":"0000-00-00 00:00:00","first_online_date":"2016-10-06 11:03:26","tabs":["AdminDashboard"],"tab":"AdminDashboard","display_conditions":["19"],"hide_conditions":[],"id_ps_advice":"779"}],"advices_lang_16":[{"id_ps_advice":"324","html":"
      l( - 'Warning: You cannot use this tool to upgrade your store anymore.

    You already have PrestaShop version %1$s installed.

    If you want to upgrade to the latest version, please read our documentation:
    %2$s', + 'Warning: You cannot use this tool to upgrade your store anymore.

    You already have QloApps version %1$s installed.

    If you want to upgrade to the latest version, please read our documentation: %2$s', $this->ps_version, $this->getDocumentationUpgradeLink() ) ?>