* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 */ if (!defined('_PS_VERSION_')) { exit; } if (file_exists(__DIR__ . '/vendor/autoload.php')) { require_once __DIR__ . '/vendor/autoload.php'; } use PrestaShop\PrestaShop\Core\Payment\PaymentOption; class Ps_Cashondelivery extends PaymentModule { const HOOKS = [ 'displayOrderConfirmation', 'paymentOptions', ]; const CONFIG_OS_CASH_ON_DELIVERY = 'PS_OS_COD_VALIDATION'; /** * {@inheritdoc} */ public function __construct() { $this->name = 'ps_cashondelivery'; $this->tab = 'payments_gateways'; $this->author = 'PrestaShop'; $this->version = '2.0.1'; $this->need_instance = 1; $this->ps_versions_compliancy = ['min' => '1.7.6.0', 'max' => _PS_VERSION_]; $this->controllers = ['validation']; $this->currencies = false; parent::__construct(); $this->displayName = $this->trans('Cash on delivery (COD)', [], 'Modules.Cashondelivery.Admin'); $this->description = $this->trans('Accept cash payments on delivery to make it easy for customers to purchase on your store.', [], 'Modules.Cashondelivery.Admin'); } /** * {@inheritdoc} */ public function install() { return parent::install() && (bool) $this->registerHook(static::HOOKS) && $this->installOrderState(); } /** * @param array{cookie: Cookie, cart: Cart, altern: int} $params * * @return array|PaymentOption[] Should always returns an array to avoid issue */ public function hookPaymentOptions(array $params) { if (empty($params['cart'])) { return []; } /** @var Cart $cart */ $cart = $params['cart']; if ($cart->isVirtualCart()) { return []; } $cashOnDeliveryOption = new PaymentOption(); $cashOnDeliveryOption->setModuleName($this->name); $cashOnDeliveryOption->setCallToActionText($this->trans('Pay by Cash on Delivery', [], 'Modules.Cashondelivery.Shop')); $cashOnDeliveryOption->setAction($this->context->link->getModuleLink($this->name, 'validation', [], true)); $cashOnDeliveryOption->setAdditionalInformation($this->fetch('module:ps_cashondelivery/views/templates/hook/paymentOptions-additionalInformation.tpl')); return [$cashOnDeliveryOption]; } /** * @param array{cookie: Cookie, cart: Cart, altern: int, order: Order, objOrder: Order} $params * * @return string */ public function hookDisplayOrderConfirmation(array $params) { /** @var Order $order */ $order = (isset($params['objOrder'])) ? $params['objOrder'] : $params['order']; if (!Validate::isLoadedObject($order) || $order->module !== $this->name) { return ''; } $this->context->smarty->assign([ 'shop_name' => $this->context->shop->name, 'total' => $this->context->getCurrentLocale()->formatPrice($params['order']->getOrdersTotalPaid(), (new Currency($params['order']->id_currency))->iso_code), 'reference' => $order->reference, 'contact_url' => $this->context->link->getPageLink('contact', true), ]); return $this->fetch('module:ps_cashondelivery/views/templates/hook/displayOrderConfirmation.tpl'); } /** * @return bool */ public function installOrderState() { if (Configuration::getGlobalValue(Ps_Cashondelivery::CONFIG_OS_CASH_ON_DELIVERY)) { $orderState = new OrderState((int) Configuration::getGlobalValue(Ps_Cashondelivery::CONFIG_OS_CASH_ON_DELIVERY)); if (Validate::isLoadedObject($orderState) && $this->name === $orderState->module_name) { return true; } } return $this->createOrderState( static::CONFIG_OS_CASH_ON_DELIVERY, [ 'en' => 'Awaiting Cash On Delivery validation', 'bs' => 'Čeka validaciju Plaćanje po dostavi', 'ca' => 'Esperant la validació del pagament contra reemborsament', 'da' => 'Afventer godkendelse af levering pr. efterkrav', 'de' => 'Warten auf Zahlungseingang Nachnahme', 'et' => 'Ootab sularaha kauba kättesaamisel kinnitust', 'es' => 'En espera de validación por contra reembolso.', 'mx' => 'En espera de validación por pago contra entrega', 'fr' => 'En attente de paiement à la livraison', 'qc' => 'En attente de paiement à la livraison', 'gl' => 'Agardando a validación do Pago Contra Reembolso', 'hr' => 'Awaiting cod validation', 'id' => 'Awaiting cod validation', 'it' => 'In attesa verifica contrassegno', 'lv' => 'Gaida skaidrās naudas apmaksas apstiprinājumu', 'hu' => 'Awaiting cod validation', 'nl' => 'Wachten op bevestiging (rembours)', 'no' => 'Awaiting cod validation', 'pl' => 'Oczekiwanie na płatność przy odbiorze', 'br' => 'Aguardando validação de pagamento na entrega', 'pt' => 'Awaiting cod validation', 'ro' => 'In asteptarea confirmarii platii la livrare', 'sq' => 'Në pritje të pagesës gjatë dorëzimit', 'sk' => 'Čaká sa na potvrdenie platby dobierkou', 'sr' => 'Čeka se potvrda keširanja pri isporuci', 'fi' => 'Odottaa maksuvahvistusta', 'sv' => 'Väntar på postförskott validering', 'tr' => 'Kapıda ödeme onayı bekleniyor', 'lt' => 'Awaiting cod validation', 'si' => 'Čaka potrdilo za plačilo po povzetju', 'vn' => 'Chờ xác nhận thanh toán COD', 'cs' => 'Čeká se na potvrzení dobírky', 'el' => 'Αναμονή επικύρωσης Αντικαταβολής', 'ru' => 'Ожидается подтверждение оплаты наличными', 'uk' => 'Очікується платіж післяплатою', 'bg' => 'В очакване на валидиране на плащане при доставка', 'mk' => 'Awaiting cod validation', 'he' => 'Awaiting cod validation', 'fa' => 'Awaiting cod validation', 'hi' => 'Awaiting Cash On Delivery validation', 'bn' => 'Awaiting cod validation', 'ar' => 'بإنتظار المصادقة على الدفع عند الإستلام', 'ja' => '代金引換払い確認待ち', 'zh' => '接受远程付费', 'tw' => '等待貨到付款驗證', 'ko' => '배송시 현금 지불 확인 대기', ], true === (bool) version_compare(_PS_VERSION_, '1.7.7.0', '>=') ? '#4169E1' : '#34219E' ); } /** * Create custom OrderState used for payment * * @param string $configurationKey Configuration key used to store OrderState identifier * @param array $nameByLangIsoCode An array of name for all languages, default is en * @param string $color Color of the label * @param bool $isLogable consider the associated order as validated * @param bool $isPaid set the order as paid * @param bool $isInvoice allow a customer to download and view PDF versions of his/her invoices * @param bool $isShipped set the order as shipped * @param bool $isDelivery show delivery PDF * @param bool $isPdfDelivery attach delivery slip PDF to email * @param bool $isPdfInvoice attach invoice PDF to email * @param bool $isSendEmail send an email to the customer when his/her order status has changed * @param string $template Only letters, numbers and underscores are allowed. Email template for both .html and .txt * @param bool $isHidden hide this status in all customer orders * @param bool $isUnremovable Disallow delete action for this OrderState * @param bool $isDeleted Set OrderState deleted * * @return bool */ private function createOrderState( $configurationKey, array $nameByLangIsoCode, $color, $isLogable = false, $isPaid = false, $isInvoice = false, $isShipped = false, $isDelivery = false, $isPdfDelivery = false, $isPdfInvoice = false, $isSendEmail = false, $template = '', $isHidden = false, $isUnremovable = true, $isDeleted = false ) { $tabNameByLangId = []; foreach ($nameByLangIsoCode as $langIsoCode => $name) { foreach (Language::getLanguages(false) as $language) { if (Tools::strtolower($language['iso_code']) === $langIsoCode) { $tabNameByLangId[(int) $language['id_lang']] = $name; } elseif (isset($nameByLangIsoCode['en'])) { $tabNameByLangId[(int) $language['id_lang']] = $nameByLangIsoCode['en']; } } } $orderState = new OrderState(); $orderState->module_name = $this->name; $orderState->name = $tabNameByLangId; $orderState->color = $color; $orderState->logable = $isLogable; $orderState->paid = $isPaid; $orderState->invoice = $isInvoice; $orderState->shipped = $isShipped; $orderState->delivery = $isDelivery; $orderState->pdf_delivery = $isPdfDelivery; $orderState->pdf_invoice = $isPdfInvoice; $orderState->send_email = $isSendEmail; $orderState->hidden = $isHidden; $orderState->unremovable = $isUnremovable; $orderState->template = $template; $orderState->deleted = $isDeleted; $result = (bool) $orderState->add(); if (false === $result) { $this->_errors[] = sprintf( 'Failed to create OrderState %s', $configurationKey ); return false; } $result = (bool) Configuration::updateGlobalValue($configurationKey, (int) $orderState->id); if (false === $result) { $this->_errors[] = sprintf( 'Failed to save OrderState %s to Configuration', $configurationKey ); return false; } $orderStateImgPath = $this->getLocalPath() . 'views/img/orderstate/' . $configurationKey . '.gif'; if (false === (bool) Tools::file_exists_cache($orderStateImgPath)) { $this->_errors[] = sprintf( 'Failed to find icon file of OrderState %s', $configurationKey ); return false; } if (false === (bool) Tools::copy($orderStateImgPath, _PS_ORDER_STATE_IMG_DIR_ . $orderState->id . '.gif')) { $this->_errors[] = sprintf( 'Failed to copy icon of OrderState %s', $configurationKey ); return false; } return true; } }