cart = null;
$this->name = 'przelewy24';
$this->tab = 'payments_gateways';
$this->version = '1.3.96';
$this->author = 'Przelewy24';
$this->need_instance = 1;
$this->ps_versions_compliancy = ['min' => '1.7', 'max' => _PS_VERSION_];
$this->bootstrap = true;
$this->displayName = $this->l('Przelewy24.pl');
$this->description = $this->l('Przelewy24.pl - Payment Service');
$this->module_key = 'c5c0cc074d01e2a3f8bbddc744d60fc9';
$this->confirmUninstall = $this->l('Are you sure you want to uninstall?');
if (!Configuration::get('PRZELEWY24')) {
$this->warning = $this->l('Module is not configured.');
}
if ((string) Configuration::get('P24_PLUGIN_VERSION') !== $this->version) {
$this->clearCache();
}
parent::__construct();
/* This block has to be executed after parent constructor. */
if ((string) Configuration::get('P24_PLUGIN_VERSION') !== $this->version) {
$ok = $this->registerAllHooks();
if ($ok) {
Configuration::updateValue('P24_PLUGIN_VERSION', $this->version);
}
}
$this->cachedPaymentList = [];
}
/**
* Install.
*
* @return bool
*/
public function install()
{
/** @var Przelewy24ServiceInstall */
$serviceInstall = new Przelewy24ServiceInstall($this);
$serviceInstall->execute();
return parent::install()
&& $this->registerAllHooks()
&& Configuration::updateValue('PRZELEWY24', true);
}
/**
* Register all hooks.
*
* @return bool
*/
private function registerAllHooks()
{
return $this->registerHook('displayHeader')
&& $this->registerHook('displayPaymentTop')
&& $this->registerHook('displayShoppingCart')
&& $this->registerHook('paymentOptions')
&& $this->registerHook('displayPaymentReturn')
&& $this->registerHook('displayCustomerAccount')
&& $this->registerHook('displayOrderDetail')
&& $this->registerHook('actionObjectOrderUpdateAfter')
&& $this->registerHook('displayAdminOrderContentOrder')
&& $this->registerHook('displayBeforeCarrier')
&& $this->registerHook('displayOrderConfirmation')
&& $this->registerHook('actionEmailAddAfterContent')
&& $this->registerHook('displayInvoiceLegalFreeText')
&& $this->registerHook('displayAdminOrderLeft')
&& $this->registerHook('displayAdminOrderMain')
&& $this->registerHook('displayAdminOrderTabLink')
&& $this->registerHook('displayAdminOrderTabContent')
&& $this->registerHook('displayProductPriceBlock')
&& $this->registerHook('displayInstallmentPayment')
&& $this->registerHook('actionAdminControllerSetMedia')
&& $this->registerHook('actionValidateOrder');
}
/**
* Uninstall.
*
* @return bool
*/
public function uninstall()
{
if (strstr($_SERVER['REQUEST_URI'], 'reset')) {
$this->reset();
}
if (!parent::uninstall()
|| !Configuration::deleteByName('PRZELEWY24')
) {
return false;
}
return true;
}
/**
* Reset.
*/
public function reset()
{
$sql = new DbQuery();
$sql->select('`name`');
$sql->from('configuration');
$sql->where(' `name` LIKE "P24\\\\_%"');
$configurationPrzelewy24 = Db::getInstance()->executeS($sql->build());
foreach ($configurationPrzelewy24 as $r) {
Configuration::deleteByName($r['name']);
}
}
/**
* Return content for configuration on admin panel.
*
* @return string
*
* @throws Exception
*/
public function getContent()
{
/**
* @var AdminController $controller
*/
$controller = $this->context->controller;
$controller->addJS(_MODULE_DIR_ . 'przelewy24/views/js/admin.js', 'all');
$controller->addCSS(_MODULE_DIR_ . 'przelewy24/views/css/przelewy24.css', 'all');
$serviceAdminForm = new Przelewy24ServiceAdminForm($this);
return $serviceAdminForm->processSubmit($this->getLangArray()) .
$serviceAdminForm->displayForm($this->getLangArray());
}
/**
* Add to invoice note add extra charge.
*
* @param array $param
*
* @return float|string
*/
public function hookDisplayInvoiceLegalFreeText($param)
{
$name = $param['order']->module;
$this->cart = Cart::getCartByOrderId($param['order']->id);
if ('przelewy24' !== $name) {
return '';
}
return $this->getTextExtraCharge();
}
/**
* Add to email html template: 'email_extracharge.tpl' if order have extra charge.
*
* IMPORTANT original email template has been cut in first '
'.
*
* @param array $params
*
* @return array $params
*/
public function hookActionEmailAddAfterContent($params)
{
$cart = $this->context->cart;
$order = $cart ? Order::getByCartId($cart->id) : null;
if (!$this->active
|| !$order
|| ($order->module !== $this->name)
|| !empty($this->context->controller->errors)
|| (substr_count($params['template'], 'error') > 0)) {
return $params;
}
$extracharge = $this->getFloatExtraChange();
$textToSearchFor = false !== strpos(
$params['template_html'],
'
'
) ? '
' : '
';
$emailHead = strstr($params['template_html'], $textToSearchFor, true);
$emailFoot = strstr($params['template_html'], $textToSearchFor);
if ($emailHead) {
$priceTotal = $cart->getOrderTotal(true, Cart::BOTH);
$priceTotal += $extracharge;
$priceTotal = Tools::displayPrice($priceTotal, $this->context->currency, false);
$emailFoot = str_replace('{total_paid}', $priceTotal, $emailFoot);
$params['template_html'] = $emailHead . $this->renderExtraChargeDataInMail($extracharge) . $emailFoot;
}
return $params;
}
/**
* Hook affecting checkout.
*
* @param $param
*
* @return mixed
*/
public function hookDisplayOrderConfirmation($param)
{
if ($this->name !== $param['order']->module) {
return null;
}
$this->cart = Cart::getCartByOrderId($param['order']->id);
$p24paymentData = new Przelewy24PaymentData($this->cart);
$orderId = $p24paymentData->getFirstOrderId();
if ($orderId) {
$order = new Order($orderId);
$paid = $order->getCurrentOrderState()->paid;
} else {
$paid = false;
}
$this->getSmarty()->assign(
[
'isMultiOrder' => $p24paymentData->isMultiOrder(),
'isPaid' => $paid,
]
);
return $this->fetch('module:przelewy24/views/templates/hook/order_confirmation_order_data.tpl');
}
/**
* Prepares html string containing extracharge data, which has to be send in email to user.
*
* @param int $extracharge
*
* @return string
*/
private function renderExtraChargeDataInMail($extracharge)
{
if (0 === (int) $extracharge) {
return '';
}
$this->getSmarty()->assign(
[
'extracharge' => $extracharge,
'extracharge_formatted' => Tools::displayPrice($extracharge, $this->context->currency, false),
'extracharge_text' => $this->getLangString('Extra charge was added to this order by Przelewy24: '),
]
);
return $this->fetch('module:przelewy24/views/templates/hook/email_extracharge.tpl');
}
/**
* Together in true - return string to invoice.
* Together in false - return float.
*
* @return string
*/
private function getTextExtraCharge()
{
$return = '';
$getExtraChange = $this->getExtraChange();
if ($getExtraChange['extraChange'] > 0) {
$return = $this->l('Extracharge was added to this order by Przelewy24: ') .
' ' . number_format($getExtraChange['extraChange'], 2, ',', '.') .
' ' . $getExtraChange['sign'];
}
return $return;
}
/**
* Get float extra charge.
*
* @return float
*/
private function getFloatExtraChange()
{
$extracharge = 0;
$getExtraChange = $this->getExtraChange();
if ($getExtraChange['extraChange'] > 0) {
$extracharge = $getExtraChange['extraChange'];
}
return round($extracharge, 2);
}
/**
* This method would work for 1.3.40+ version
* Get extra charge.
*
* @return array
*/
private function getExtraChange()
{
$przelewy24ServiceOrderRepeatPayment = new Przelewy24ServiceOrderRepeatPayment($this);
$orderInformation = $przelewy24ServiceOrderRepeatPayment->execute();
$przelewy24ServicePaymentOptions = new Przelewy24ServicePaymentOptions($this);
if ((int) $orderInformation->id > 0) {
$currency = new Currency($orderInformation->id_currency);
$sign = $currency->sign;
$extracharge = $przelewy24ServicePaymentOptions->getExtraChargeOrder((int) $orderInformation->id);
} else {
$sign = $this->getContext()->currency->sign;
$amountTotal = $this->getTemplateVars()['total'];
$suffix = Przelewy24Helper::getSuffix($this->getContext()->currency->iso_code);
$extracharge = $przelewy24ServicePaymentOptions->getExtraCharge($amountTotal, $suffix);
}
if ($this->cart) {
$paymentData = new Przelewy24PaymentData($this->cart);
$sign = $paymentData->getCurrency()->getSign();
$extracharge = $paymentData->getExtrachargeFromDatabase()->extra_charge_amount / 100;
}
return ['extraChange' => $extracharge, 'sign' => $sign];
}
/**
* Get protocol.
*
* @return string
*/
public function getProtocol()
{
return 'http' . (isset($_SERVER['HTTPS']) && 'on' === $_SERVER['HTTPS'] ? 's' : '') . '://';
}
public function hookDisplayHeader($params)
{
$this->context->controller->registerStylesheet(
'p24-style-inside',
'modules/przelewy24/views/css/p24_inside.css'
);
$this->context->controller->registerJavascript(
'p24-script-inside',
'modules/przelewy24/views/js/p24_inside.js'
);
if ($this->context->controller instanceof FrontController) {
$this->context->controller->registerStylesheet(
'p24-style-local',
'modules/przelewy24/views/css/przelewy24.css'
);
}
$this->context->controller->registerJavascript(
'p24-script-common',
'modules/przelewy24/views/js/przelewy24Common.js'
);
}
protected function canRegisterRemoteScript($controller)
{
switch ($controller) {
case 'product':
return true;
default:
return false;
}
}
protected function getP24Host()
{
$p24c = Przelewy24ClassStaticInterfaceFactory::getDefault();
return $p24c::getHostForEnvironment(false);
}
/**
* Blik code for confirmation page.
*
* @param array $params
*/
public function hookDisplayPaymentTop($params)
{
if (isset($params['cart'])) {
$cart = $params['cart'];
$useHttps = '1' === Configuration::get('PS_SSL_ENABLED');
$currency = new Currency($cart->id_currency);
$suffix = Przelewy24Helper::getSuffix($currency->iso_code);
$currentYear = (int) date('Y');
$data = [
'p24_blik_inside_enable' => (bool) Configuration::get('P24_BLIK_INSIDE_ENABLE' . $suffix),
'p24_card_inside_enable' => (bool) Configuration::get('P24_PAY_CARD_INSIDE_ENABLE' . $suffix),
'p24_charge_blik_url' => $this->context->link->getModuleLink(
'przelewy24',
'chargeBlik',
[],
$useHttps
),
'p24_charge_card_url' => $this->context->link->getModuleLink(
'przelewy24',
'chargeCardExt',
[],
$useHttps
),
'p24_card_ids_string' => implode(',', Przelewy24OneClickHelper::getCardPaymentIds()),
'p24_card_years' => range($currentYear, $currentYear + 10),
'p24_page_type' => 'confirmation',
'p24_cart_id' => (int) $cart->id,
'p24_blik_needs_term_accept' => true,
'p24_card_needs_term_accept' => true,
'p24_failure_url' => $this->context->link->getModuleLink('przelewy24', 'paymentFailed', [], $useHttps),
'p24_success_url' => Przelewy24TransactionSupport::generateReturnUrl(new Przelewy24PaymentData($cart), true),
];
$this->context->smarty->assign($data);
$ret = '';
$hasInside = false;
if ($data['p24_blik_inside_enable']) {
$ret .= $this->fetch('module:przelewy24/views/templates/hook/parts/blik_html_code.tpl');
$hasInside = true;
}
if ($data['p24_card_inside_enable']) {
$ret .= $this->fetch('module:przelewy24/views/templates/hook/parts/card_html_code.tpl');
$hasInside = true;
}
if ($hasInside) {
$ret .= $this->fetch('module:przelewy24/views/templates/hook/parts/other_html_code.tpl');
}
return $ret;
}
}
/**
* Get cached payment list.
*
* @param $suffix
*
* @return Przelewy24CachedPaymentList
*/
private function getCachedPaymentList($suffix)
{
if ($suffix === '') {
$idx = 'PLN';
} else {
$idx = $suffix;
}
if (!isset($this->cachedPaymentList[$idx])) {
$this->cachedPaymentList[$idx] = Przelewy24CachedPaymentListFactory::buildForSuffix($suffix);
}
return $this->cachedPaymentList[$idx];
}
/**
* Display przelewy24 on /zamowienie page as payment method.
*/
public function hookPaymentOptions($params)
{
/** @var Przelewy24ServicePaymentOptions */
$text = $this->getLangString('Pay with Przelewy24');
$servicePaymentOptions = new Przelewy24ServicePaymentOptions($this);
$cart = Context::getContext()->cart;
$currency = new Currency($cart->id_currency);
$suffix = Przelewy24Helper::getSuffix($currency->iso_code);
$cachedList = $this->getCachedPaymentList($suffix);
$newOptions = $servicePaymentOptions->execute($params, $text, $cachedList);
return $newOptions;
}
/**
* Display on /potwierdzenie-zamowienia page as block after order details.
*
* The name of hook may be misleading.
*
* The hook is used to retry payment too.
*
* @param $params
*
* @return mixed
*
* @throws Exception
*/
public function hookDisplayPaymentReturn($params)
{
$controller = Context::getContext()->controller;
if (!$controller) {
throw new LogicException('Misused hook.');
}
$controller->registerStylesheet('p24-style-local', 'modules/przelewy24/views/css/przelewy24.css');
$controller->registerJavascript('p24-script-local', 'modules/przelewy24/views/js/przelewy24.js');
/** @var Przelewy24ServicePaymentReturn */
$servicePaymentReturn = new Przelewy24ServicePaymentReturn($this);
if (!$servicePaymentReturn->canBePaid($params)) {
return '';
}
$data = $servicePaymentReturn->execute($params);
$this->getSmarty()->assign($data);
return $this->fetch('module:przelewy24/views/templates/hook/payment_block.tpl');
}
/**
* Hook display customer account.
*
* @return string
*
* @throws Exception
*/
public function hookDisplayCustomerAccount()
{
if (!Przelewy24HookHelper::isStoreConfiguredForSuffix('')) {
/* Cannot run this hook. */
return '';
}
$smarty = Context::getContext()->smarty;
if (Przelewy24OneClickHelper::isOneClickEnable() && (null !== $smarty)) {
$smarty->assign(
'my_stored_cards_page',
$this->context->link->getModuleLink('przelewy24', 'accountMyCards')
);
return $this->display(__FILE__, 'account_card_display.tpl');
}
}
/**
* Hook display order detail.
*
* @return string
*/
public function hookDisplayOrderDetail()
{
$przelewy24ServiceOrderRepeatPayment = new Przelewy24ServiceOrderRepeatPayment($this);
$orderInformation = $przelewy24ServiceOrderRepeatPayment->execute();
$przelewy24ServicePaymentOptions = new Przelewy24ServicePaymentOptions($this);
$currency = new Currency($orderInformation->id_currency);
$extracharge = $przelewy24ServicePaymentOptions->getExtraChargeOrder((int) $orderInformation->id);
$this->getSmarty()->assign(
[
'extracharge' => number_format($extracharge, 2),
'currencySign' => $currency->sign,
]
);
if (((int) $orderInformation->current_state === (int) Configuration::get('P24_ORDER_STATE_1'))
|| ($extracharge > 0)) {
if (!$this->getContext()->customer->id) {
// guest login for repayment
$customer = new Customer((int) $orderInformation->id_customer);
Context::getContext()->updateCustomer($customer);
}
return $this->fetch('module:przelewy24/views/templates/hook/repeat_payment_return.tpl');
}
}
/**
* Hook on order edit. It will fix extracharge.
*
* @param array $input Input with an Order instance
* @return void
*/
public function hookActionObjectOrderUpdateAfter($input)
{
/* Protect from entering this method twice. */
static $in_hook = false;
if ($in_hook) {
return;
}
$in_hook = true;
$order = $input['object'] ?? null;
if (!$order instanceof Order) {
return;
}
$extracharge = Przelewy24Extracharge::prepareByOrderId($order->id);
if ($extracharge->extra_charge_amount && $extracharge->total_paid) {
$extra_total_paid = round($extracharge->total_paid, 2);
$order_total_paid = round($order->total_paid, 2);
if ($extra_total_paid !== $order_total_paid) {
$amount = round($extracharge->extra_charge_amount / 100, 2);
Przelewy24ServicePaymentOptions::addToOrder($order, $amount);
Przelewy24ServicePaymentOptions::syncExtraChargeToOrder($order, $extracharge);
}
}
$in_hook = false;
}
/**
* Adding an additional fee to the order view in the admin panel.
*
* Orders from other modules are ignored.
*
* @return string
*/
public function hookDisplayAdminOrderContentOrder()
{
$przelewy24ServiceOrderRepeatPayment = new Przelewy24ServiceOrderRepeatPayment($this);
$orderInformation = $przelewy24ServiceOrderRepeatPayment->execute();
$linkViewPartial = '';
$module = $orderInformation->module;
if ($module != 'przelewy24') {
/* Ignore orders from other modules. */
return $linkViewPartial;
}
$this->context->controller->addJS(_MODULE_DIR_ . 'przelewy24/views/js/przelewy24.js', 'all');
$przelewy24ServicePaymentOptions = new Przelewy24ServicePaymentOptions($this);
$currency = new Currency($orderInformation->id_currency);
$extracharge = $przelewy24ServicePaymentOptions->getExtraChargeOrder((int) $orderInformation->id);
$przelewy24Order = new Przelewy24Order();
$p24OrderData = $przelewy24Order->getByPshopOrderId((int) $orderInformation->id);
$p24FullOrderId = isset($p24OrderData->p24_full_order_id) ? $p24OrderData->p24_full_order_id : '';
$p24Link = $this->createP24Link($p24OrderData, $currency);
if ($p24OrderData) {
$p24OrderId = $p24OrderData->p24_order_id;
$psOrderId = $p24OrderData->pshop_order_id;
$p24OrderAmount = $p24OrderData->amount ? number_format($p24OrderData->amount / 100, 2, ',', ' ') : null;
$p24OrderReceived = $p24OrderData->received;
} else {
$p24OrderId = null;
$psOrderId = null;
$p24OrderAmount = null;
$p24OrderReceived = null;
}
$this->getSmarty()->assign(
[
'extracharge' => round($extracharge, 2),
'extrachargeFormatted' => number_format($extracharge, 2),
'currencySign' => $currency->sign,
'extracharge_text' => $this->getLangString('Extracharge Przelewy24'),
'p24_order_amount' => $p24OrderAmount,
'p24_order_received' => $p24OrderReceived,
'p24_order_id' => $p24OrderId,
'p24_full_order_id' => $p24FullOrderId,
'ps_order_id' => $psOrderId,
'link' => $p24Link,
]
);
if (!empty($p24Link)) {
$linkViewPartial = $this->display(__FILE__, 'admin_order_full_order_link_view.tpl');
}
if ($extracharge > 0) {
$linkViewPartial .= $this->display(__FILE__, 'admin_order_view.tpl');
}
return $linkViewPartial;
}
/**
* Adding on refunds to the order view in the admin panel for Presta 1.7.7
*
* This function is run in PHP 7.1 or greater.
*
* @param array $params
*
* @return string
*
* @throws PrestaShopDatabaseException
* @throws Exception
*/
public function hookDisplayAdminOrderMain($params)
{
$orderId = $params['id_order'];
if (!$orderId) {
/* Should not happen. */
return '';
}
$order = new Order($orderId);
if ($order->module && ($order->module !== $this->name)) {
return '';
}
try {
$displayRefund = $this->prepDataForRefunds($order);
if ($this->refundError) {
return $this->display(__FILE__, 'transaction_refund_conf_error_177.tpl');
}
} catch (Throwable $ex) {
PrestaShopLogger::addLog($ex->getMessage());
return $this->display(__FILE__, 'transaction_refund_conf_error_177.tpl');
}
if ($displayRefund) {
return $this->display(__FILE__, 'transaction_refund_177.tpl');
}
return '';
}
/**
* @param array $params
*
* @return string
*
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookDisplayAdminOrderTabLink($params)
{
/* We have to render content fist to check if the title is needed. */
$przelewy24ServiceOrderRepeatPayment = new Przelewy24ServiceOrderRepeatPayment($this);
$orderInformation = $przelewy24ServiceOrderRepeatPayment->execute();
$przelewy24ServicePaymentOptions = new Przelewy24ServicePaymentOptions($this);
$currency = new Currency($orderInformation->id_currency);
$extracharge = $przelewy24ServicePaymentOptions->getExtraChargeOrder((int) $orderInformation->id);
$przelewy24Order = new Przelewy24Order();
$linkViewPartial = '';
$extrachargeViewData = $this->buildExtrachargeViewData($extracharge, $currency);
$fullOrderIdViewData = $this->buildFullOrderIdViewData($przelewy24Order, $orderInformation, $currency);
$templateVariables = $extrachargeViewData + $fullOrderIdViewData;
$this->getSmarty()->assign($templateVariables);
if (!empty($fullOrderIdViewData['link'])) {
$linkViewPartial = $this->display(__FILE__, 'admin_order_tab_full_177.tpl');
}
if ($extracharge > 0) {
$linkViewPartial .= $this->display(__FILE__, 'admin_order_view.tpl');
}
/* Save rendered content to variable, may be empty. */
$this->adminOrderTabContent = $linkViewPartial;
if ($this->adminOrderTabContent) {
return $this->display(__FILE__, 'admin_order_tab_link_177.tpl');
} else {
return '';
}
}
/**
* @param $params
*
* @return string
*
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookDisplayAdminOrderTabContent($params)
{
/* The content is rendered in hookDisplayAdminOrderTabLink. */
return $this->adminOrderTabContent;
}
/**
* Adding on refunds to the order view in the admin panel.
*
* @param array $params
*
* @return bool
*
* @throws Exception
*/
public function hookDisplayAdminOrderLeft($params)
{
if (isset($params['id_order'])) {
$orderId = (int) $params['id_order'];
} else {
return '';
}
$order = new Order($orderId);
if ($order->module && ($order->module !== $this->name)) {
return '';
}
try {
$displayRefund = $this->prepDataForRefunds($order);
if ($this->refundError) {
return $this->display(__FILE__, 'transaction_refund_conf_error.tpl');
}
} catch (Exception $ex) {
PrestaShopLogger::addLog($ex->getMessage());
return $this->display(__FILE__, 'transaction_refund_conf_error.tpl');
}
/* explicit boolean value is intentional */
if ($displayRefund) {
$returnValue = $this->display(__FILE__, 'transactionRefund.tpl');
} else {
$returnValue = false;
}
return $returnValue;
}
/**
* Prepare data for refunds.
*
* @param Order $order
*
* @return bool
*
* @throws PrestaShopDatabaseException
*/
private function prepDataForRefunds(Order $order)
{
$this->refundError = false;
$cookie = Context::getContext()->cookie;
$orderId = (int) $order->id;
if (!isset($order->id_currency)) {
return false;
}
if (!$orderId) {
return false;
}
if (!$this->active) {
return false;
}
$currency = new Currency($order->id_currency);
$suffix = Przelewy24Helper::getSuffix($currency->iso_code);
$refundApi = Przelewy24RestRefundFactory::buildForSuffix($suffix);
$przelewy24ServiceRefund = new Przelewy24ServiceRefund($this, $suffix, $refundApi);
$productsPossible = $przelewy24ServiceRefund->extractProductsDetails($order);
$refundDataFromDB = $przelewy24ServiceRefund->getRefundDataFromDB($orderId);
if ($refundDataFromDB) {
$dataToRefund = $przelewy24ServiceRefund->getDataToRefund($refundDataFromDB);
if (!$dataToRefund) {
$this->refundError = true;
return false;
}
} else {
return false;
}
$needReload = false;
if (Tools::isSubmit('submitRefund') && isset($cookie->refundToken)) {
$submittedMaximum = (string) Tools::getValue('refundMaximum');
$expectedMaximum = (string) ($dataToRefund['amount'] / 100);
if ($expectedMaximum !== $submittedMaximum) {
$dataToRefund['refundError'] = 'Refund error';
} elseif (Tools::getValue('refundToken') === $cookie->refundToken) {
$amountToRefund = (int) round(Tools::getValue('amountToRefund') * 100);
$refunded = $przelewy24ServiceRefund->refundProcess(
$dataToRefund['sessionId'],
$dataToRefund['p24OrderId'],
$amountToRefund
);
if ($refunded) {
$productsToRefund = Tools::getValue('refundProductQuantity');
$przelewy24ServiceRefund->updateProductsForRefund($order, $productsToRefund);
/* Reload data. */
$needReload = true;
} else {
$dataToRefund['refundError'] = 'Refund error';
}
}
}
if (!isset($dataToRefund['refundError'])) {
$dataToRefund['refundError'] = '';
}
$random = hash('sha224', rand());
$cookie->__set('refundToken', $random);
$cookie->write();
$dataToRefund['refundToken'] = $random;
$dataToRefund['sign'] = $currency->sign;
$this->context->smarty->assign($dataToRefund);
$this->context->smarty->assign($dataToRefund);
$this->context->smarty->assign([
'productsPossibleToRefund' => $productsPossible,
'p24NeedReloadRefund' => $needReload,
]);
return true;
}
/**
* Get price variable on cart.
*
* @return array
*/
public function getTemplateVars()
{
if (!$this->cart) {
$this->cart = $this->context->cart;
}
$priceTotal = $this->cart->getOrderTotal(true, Cart::BOTH);
$total = Tools::displayPrice($this->cart->getOrderTotal(true, Cart::BOTH));
if ((float) $priceTotal <= 0) {
$priceTotal = 0;
$total = '0';
}
return [
'checkTotal' => $total,
'total' => $priceTotal,
'tax' => $this->getLangString('(tax incl.)'),
];
}
/**
* Hook display right column product.
*
* Not used for now.
*
* @param array $params
*
* @return null
*/
public function hookDisplayProductPriceBlock($params)
{
return null;
}
/**
* Hook display under payment option method przelewy24.
*
* Not used for now.
*
* @param array $params
*
* null
*/
public function hookdisplayInstallmentPayment($params)
{
return null;
}
public function hookActionAdminControllerSetMedia($params)
{
$script = $this->getPathUri() . 'views/js/admin_common.js?v=' . $this->version;
$this->context->controller->addJS($script);
}
/**
* Hook action validate order.
*
* @param array $params
*/
public function hookActionValidateOrder($params)
{
if (!$this->active) {
return false;
}
if (isset($params['order'], $params['order']->id)) {
$order = $params['order'];
$cart = Cart::getCartByOrderId($order->id);
} else {
$cart = isset($params['cart']) ? $params['cart'] : $this->context->cart;
if (!$cart && isset($params['order']) && ($params['order'] instanceof Order)) {
$cart = new Cart((int) $params['order']->id_cart);
}
if ($cart) {
$orderId = Order::getOrderByCartId($cart->id);
}
}
if (!isset($order) && !isset($orderId)) {
return;
}
if (!isset($order)) {
$order = new Order($orderId);
} else {
$orderId = $order->id;
}
if ($order->module && ($order->module !== $this->name)) {
return;
}
$przelewy24ServicePaymentOptions = new Przelewy24ServicePaymentOptions($this);
if (!$przelewy24ServicePaymentOptions->hasExtrachargeOrder($orderId)) {
$przelewy24ServicePaymentOptions->setExtracharge($order);
}
}
/**
* Get context.
*
* @return Context
*/
public function getContext()
{
return $this->context;
}
/**
* Get smarty.
*
* @return Smarty
*/
public function getSmarty()
{
return $this->smarty;
}
/**
* Get path.
*
* @return string
*/
public function getPath()
{
return _MODULE_DIR_ . 'przelewy24/';
}
/**
* Get base file.
*
* @return string
*/
public function getBaseFile()
{
return __FILE__;
}
/**
* Clears cache.
*/
public function clearCache()
{
$this->_clearCache('payment_return.tpl');
}
/**
* Get language array (translations).
*
* @return array
*/
public function getLangArray()
{
$lang = [
'After selecting products to refund, alter stock quantity' => $this->l('After selecting products to refund, alter stock quantity'),
'Allows to pay by BLIK without leaving the store website' => $this->l('Allows to pay by BLIK without leaving the store website'),
'BLIK payments inside shop' => $this->l('BLIK payments inside shop'),
'Documentation' => $this->l('Documentation'),
'Force confirmation page' => $this->l('Force confirmation page'),
'Link to documentation' => $this->l('Link to documentation'),
'Payment descriptions' => $this->l('Custom payment descriptions'),
'Rembember to configure external IP address on Przelewy24 panel.' => $this->l('Rembember to configure external IP address on Przelewy24 panel.'),
'Show available payment methods in shop on confirmation page' => $this->l('Show available payment methods in shop on confirmation page'),
'Show BLIK to customers' => $this->l('Show BLIK to customers'),
'Show promoted payment methods' => $this->l('Show promoted payment methods'),
'Select currency for which you want to configure your merchant' => $this->l('Select currency for which you want to configure your merchant'),
'Requires setting ‘Creating the order’ to ‘After choosing Przelewy24 as a payment gateway’.' => $this->l('Requires setting ‘Creating the order’ to ‘After choosing Przelewy24 as a payment gateway’.'),
'This option is ignored, if an order is created at a later stage.' => $this->l('This option is ignored, if an order is created at a later stage.'),
'Use standard return page' => $this->l('Use standard return page'),
'Currency' => $this->l('Currency'),
'Settings' => $this->l('Settings'),
'Merchant ID' => $this->l('Merchant ID'),
'Shop ID' => $this->l('Shop ID'),
'CRC Key' => $this->l('CRC Key'),
'Module mode' => $this->l('Module mode'),
'Choose module mode.' => $this->l('Choose module mode.'),
'Skip order confirmation' => $this->l('Skip order confirmation'),
'Skip order confirmation if it is possible.' => $this->l('Skip order confirmation if it is possible.'),
'Test (Sandbox)' => $this->l('Test (Sandbox)'),
'Normal/production' => $this->l('Normal/production'),
'API Key' => $this->l('API Key'),
'API key allow access to additional functions, e.g. graphics list of payment methods.' => $this->l('API key allow access to additional functions, e.g. graphics list of payment methods.'),
'You can get API key from Przelewy24 dashboard, from my data tab.' => $this->l('You can get API key from Przelewy24 dashboard, from my data tab.'),
'Save' => $this->l('Save'),
'Stage of creating the order:' => $this->l('Stage of creating the order:'),
'After choosing Przelewy24 as a payment gateway' => $this->l('After choosing Przelewy24 as a payment gateway'),
'After payment' => $this->l('After payment'),
'After click "Confirm" button' => $this->l('After click "Confirm" button'),
'Oneclick payments' => $this->l('Oneclick payments'),
'Allows you to order products with on-click' => $this->l('Allows you to order products with on-click'),
'Card payments inside shop' => $this->l('Card payments inside shop'),
'Allows to pay by credit/debit card without leaving the store website' => $this->l('Allows to pay by credit/debit card without leaving the store website'),
'Customer can chose payment method on confirmation page.' => $this->l('Customer can chose payment method on confirmation page.'),
'Wait for a result of the transaction' => $this->l('Wait for a result of the transaction'),
'What is P24NOW' => $this->l('What is P24NOW'),
'Customer will see P24NOW as a promoted option' => $this->l('Customer will see P24NOW as a promoted option'),
'P24NOW module will be promoted as main payment option' => $this->l('P24NOW module will be promoted as main payment option'),
'Use graphics list of payment methods' => $this->l('Use graphics list of payment methods'),
'Show available payment methods in confirm' => $this->l('Show available payment methods in confirm'),
'Promote some payment methods' => $this->l('Promote some payment methods'),
'Enable extra charge' => $this->l('Enable extra charge'),
'Increase payment (amount)' => $this->l('Increase payment (amount)'),
'Increase payment (percent)' => $this->l('Increase payment (percent)'),
'Disable intro text' => $this->l('Disable intro text'),
'Promote P24NOW payment' => $this->l('Promote P24NOW payment'),
'Promote P24NOW payment in methods' => $this->l('Promote P24NOW payment in methods'),
'Back to list' => $this->l('Back to list'),
'Invalid merchant ID' => $this->l('Invalid merchant ID'),
'Invalid shop ID' => $this->l('Invalid shop ID'),
'Invalid CRC key' => $this->l('Invalid CRC key'),
'Cannot connect to external service. This could be network error or wrong merchant ID.' => $this->l('Cannot connect to external service. This could be network error or wrong merchant ID.'),
'Wrong CRC Key for this Merchant / Shop ID and module mode!' => $this->l('Wrong CRC Key for this Merchant / Shop ID and module mode!'),
'Wrong API key for this Merchant / Shop ID!' => $this->l('Wrong API key for this Merchant / Shop ID!'),
'Settings saved.' => $this->l('Settings saved.'),
'Przelewy24 module settings are not configured correctly.' => $this->l('Przelewy24 module settings are not configured correctly.'),
'Przelewy24 payment method does not appear in the list in order.' => $this->l('Przelewy24 payment method does not appear in the list in order.'),
'Order' => $this->l('Order'),
'Cart' => $this->l('Cart'),
'Extra charge [VAT and discounts]' => $this->l('Extra charge [VAT and discounts]'),
'Your order' => $this->l('Your order'),
'Extra charge was added to this order by Przelewy24: ' => $this->l('Extra charge was added to this order by Przelewy24: '),
'Module is not configured.' => $this->l('Module is not configured.'),
'Przelewy24.pl' => $this->l('Przelewy24.pl'),
'Przelewy24.pl - Payment Service' => $this->l('Przelewy24.pl - Payment Service'),
'Removed successfully' => $this->l('Removed successfully'),
'Saved successfully' => $this->l('Saved successfully'),
'(tax incl.)' => $this->l('(tax incl.)'),
'Extracharge Przelewy24' => $this->l('Extracharge Przelewy24'),
'Pay with Przelewy24' => $this->l('Pay with Przelewy24'),
'Order not exist for this customer' => $this->l('Order not exist for this customer'),
'Failed transaction registration in Przelewy24' => $this->l('Failed transaction registration in Przelewy24'),
'Pay with Blik' => $this->l('Pay with Blik'),
'Invalid request' => $this->l('Invalid request'),
'Invalid cart ID' => $this->l('Invalid cart ID'),
'Your card is not valid' => $this->l('Your card is not valid'),
'Your card is expired' => $this->l('Your card is expired'),
'Success, no error' => $this->l('Success, no error'),
'Your Blik alias was declined, please provide BlikCode' => $this->l('Your Blik alias was declined, please provide BlikCode'),
'Identification not possible by given alias' => $this->l('Identification not possible by given alias'),
'Your Blik alias is incorrect, please provide BlikCode' => $this->l('Your Blik alias is incorrect, please provide BlikCode'),
'Your Blik alias is not confirmed, please provide BlikCode' => $this->l('Your Blik alias is not confirmed, please provide BlikCode'),
'Your Blik alias was not found, please provide BlikCode' => $this->l('Your Blik alias was not found, please provide BlikCode'),
'Alias payments are currently not supported, please provide BlikCode' => $this->l('Alias payments are currently not supported, please provide BlikCode'),
'Your Blik alias was unregistered, please provide BlikCode' => $this->l('Your Blik alias was unregistered, please provide BlikCode'),
'Bad PIN provided, please generate new BlikCode' => $this->l('Bad PIN provided, please generate new BlikCode'),
'Blik service unavailable' => $this->l('Blik service unavailable'),
'Your BlikCode was rejected, please generate new BlikCode' => $this->l('Your BlikCode was rejected, please generate new BlikCode'),
'Insufficient funds' => $this->l('Insufficient funds'),
'Limit exceeded' => $this->l('Limit exceeded'),
'Your PIN was rejected' => $this->l('Your PIN was rejected'),
'Transaction timeout' => $this->l('Transaction timeout'),
'Your BlikCode has expired, please generate another' => $this->l('Your BlikCode has expired, please generate another'),
'Incorrect BlikCode format, please generate another' => $this->l('Incorrect BlikCode format, please generate another'),
'Your BlikCode is incorrect, please generate another' => $this->l('Your BlikCode is incorrect, please generate another'),
'Your BlikCode was already used, please generate another' => $this->l('Your BlikCode was already used, please generate another'),
'Transaction failed, incorrect alias' => $this->l('Transaction failed, incorrect alias'),
'Blik payment error' => $this->l('Blik payment error'),
'Please accept' => $this->l('Please accept'),
'the Przelewy24 Terms' => $this->l('the Przelewy24 Terms'),
'Status before completing payment' => $this->l('Status before completing payment'),
'Status after completing payment' => $this->l('Status after completing payment'),
'Settings for all currencies' => $this->l('Settings for all currencies'),
'Show accept button in shop' => $this->l('Show accept button in shop'),
'Order id in title' => $this->l('Order id in title'),
'Order id in database (e.g. 1, 2, 3)' => $this->l('Order id in database (e.g. 1, 2, 3)'),
'Masked order id (e.g. QYTUVLHOW)' => $this->l('Masked order id (e.g. QYTUVLHOW)'),
'Multi warehouse order. Cart may contain additional products, not listed below.' => $this->l('Multi warehouse order. Cart may contain additional products, not listed below.'),
];
return $lang;
}
/**
* Get language string.
*
* @param string $text
*
* @return string
*/
public function getLangString($text)
{
$return = $text;
$langArray = $this->getLangArray();
if (array_key_exists($text, $langArray)) {
$return = $langArray[$text];
}
return $return;
}
/**
* @param Przelewy24Order $fulOrderIdData
* @param Currency $currency
*
* @return string
*/
private function createP24Link($fulOrderIdData, $currency)
{
if (!isset($fulOrderIdData->p24_order_id, $currency->iso_code)) {
return '';
}
$suffix = Przelewy24Helper::getSuffix($currency->iso_code);
$testMode = (bool) Configuration::get('P24_TEST_MODE' . $suffix);
$hostForEnvironment = Przelewy24Class::getHostForEnvironment($testMode);
$host = str_replace('secure', 'panel', $hostForEnvironment);
return sprintf('%s' . self::TRANSAKCJA_PHP_ID . '%s', $host, $fulOrderIdData->p24_order_id);
}
/**
* @param Przelewy24Order $przelewy24Order
* @param $orderInformation
* @param Currency $currency
*
* @return array
*/
private function buildFullOrderIdViewData(Przelewy24Order $przelewy24Order, $orderInformation, Currency $currency)
{
$p24OrderData = $przelewy24Order->getByPshopOrderId((int) $orderInformation->id);
$p24FullOrderId = isset($p24OrderData->p24_full_order_id) ? $p24OrderData->p24_full_order_id : '';
$p24Link = $this->createP24Link($p24OrderData, $currency);
if ($p24OrderData) {
$p24OrderId = $p24OrderData->p24_order_id;
$psOrderId = $p24OrderData->pshop_order_id;
$p24OrderAmount = $p24OrderData->amount ? number_format($p24OrderData->amount / 100, 2, ',', ' ') : null;
$p24OrderReceived = $p24OrderData->received;
} else {
$p24OrderId = null;
$psOrderId = null;
$p24OrderAmount = null;
$p24OrderReceived = null;
}
$fullOrderIdViewData = [
'p24_order_amount' => $p24OrderAmount,
'p24_order_received' => $p24OrderReceived,
'p24_full_order_id' => $p24FullOrderId,
'p24_order_id' => $p24OrderId,
'ps_order_id' => $psOrderId,
'link' => $p24Link,
];
return $fullOrderIdViewData;
}
/**
* @param $extracharge
* @param Currency $currency
*
* @return array
*/
private function buildExtrachargeViewData($extracharge, Currency $currency)
{
$extrachargeViewData = [
'extracharge' => round($extracharge, 2),
'extrachargeFormatted' => number_format($extracharge, 2),
'extracharge_text' => $this->getLangString('Extracharge Przelewy24'),
'currencySign' => $currency->sign,
];
return $extrachargeViewData;
}
}