Files
interblue.pl/modules/imoje/imoje.php
2024-10-25 14:16:28 +02:00

663 lines
20 KiB
PHP

<?php
use Imoje\Payment\Twisto;
use Imoje\Payment\Util;
include_once(_PS_MODULE_DIR_ . 'imoje/libraries/Payment-core/vendor/autoload.php');
if(!defined('_PS_VERSION_')) {
exit;
}
/**
* Class IMoje
*
* @property string name
* @property string tab
* @property string version
* @property string author
* @property int need_instance
* @property bool currencies
* @property string currencies_mode
* @property array ps_versions_compliancy
* @property int is_eu_compatible
* @property string displayName
* @property string description
* @property string confirm_uninstall
*/
class IMoje extends PaymentModule
{
/**
* Sets the Information for the Module manager
* Also creates an instance of this class
*/
public function __construct()
{
$this->name = 'imoje';
$this->displayName = 'imoje';
$this->tab = 'payments_gateways';
$this->version = '1.3.4';
$this->author = 'imoje';
$this->need_instance = 1;
$this->currencies = true;
$this->currencies_mode = 'checkbox';
$this->ps_versions_compliancy = [
'min' => '1.7',
'max' => '1.7',
];
$this->is_eu_compatible = 1;
parent::__construct();
$this->displayName = $this->l('imoje');
$this->description = $this->l('Visa, MasterCard, Blik ect.');
$this->confirm_uninstall = $this->l('Are you sure you want to uninstall imoje module?');
}
/**
* @param $name
* @param $type
*
* @return string
*/
public static function buildTemplatePath($name, $type)
{
return 'module:imoje/views/templates/' . $type . '/' . $name . '.tpl';
}
/**
* This function installs the imoje Module
*
* @return boolean
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function install()
{
if(!(
parent::install()
&& $this->registerHook('paymentOptions')
&& $this->registerHook('orderConfirmation')
&& $this->registerHook('paymentReturn')
&& $this->registerHook('displayBackOfficeHeader')
&& $this->registerHook('displayHeader')
&& Configuration::updateValue('IMOJE_SANDBOX', 0)
&& Configuration::updateValue('IMOJE_SERVICE_ID', '')
&& Configuration::updateValue('IMOJE_SERVICE_KEY', '')
&& Configuration::updateValue('IMOJE_MERCHANT_ID', '')
&& Configuration::updateValue('IMOJE_PAYMENT_METHODS', '')
&& Configuration::updateValue('IMOJE_GA_KEY', '')
&& Configuration::updateValue('IMOJE_IMOJE_BUTTON', 1)
&& Configuration::updateValue('IMOJE_PAYMENT_TITLE', '')
&& Configuration::updateValue('IMOJE_TWISTO_BUTTON', 0)
&& Configuration::updateValue('IMOJE_TWISTO_ENABLED', 0)
&& Configuration::updateValue('IMOJE_TWISTO_PAYMENT_TITLE', '')
&& Configuration::updateValue('IMOJE_BLIK_BUTTON', 0)
&& Configuration::updateValue('IMOJE_BLIK_PAYMENT_TITLE', '')
&& Configuration::updateValue('IMOJE_TOKEN', '')
)) {
return false;
}
if(Validate::isInt(Configuration::get('PAYMENT_IMOJE_NEW_STATUS'))
XOR (Validate::isLoadedObject($orderStateNew = new OrderState(Configuration::get('PAYMENT_IMOJE_NEW_STATUS'))))) {
$orderStateNew = new OrderState();
$missingLang = true;
$langs = [
'en' => 'Payment imoje: awaiting for confirmation',
'pl' => 'Płatność imoje: oczekuje na potwierdzenie',
];
foreach($langs as $lang => $message) {
$langId = Language::getIdByIso($lang);
if(isset($langId)) {
$orderStateNew->name[$langId] = $message;
$missingLang = false;
}
}
if($missingLang) {
$langId = (int) $this->context->language->id;
$orderStateNew->name[$langId] = $langs['en'];
}
$orderStateNew->send_email = false;
$orderStateNew->invoice = false;
$orderStateNew->unremovable = false;
$orderStateNew->color = "lightblue";
if(!$orderStateNew->add()) {
$this->_errors[] = $this->l('There was an Error installing the module. Cannot add new order state.');
return false;
}
if(!Configuration::updateValue('PAYMENT_IMOJE_NEW_STATUS', $orderStateNew->id)) {
$this->_errors[] = $this->l('There was an Error installing the module. Cannot update new order state.');
return false;
}
copy(_PS_MODULE_DIR_ . $this->name . '/imoje.gif', _PS_IMG_DIR_ . 'os/' . $orderStateNew->id . '.gif');
}
return true;
}
/**
* This function uninstalls the imoje Module
*
* @return boolean
*/
public function uninstall()
{
return Configuration::deleteByName('IMOJE_SANDBOX')
&& Configuration::deleteByName('IMOJE_SERVICE_ID')
&& Configuration::deleteByName('IMOJE_SERVICE_KEY')
&& Configuration::deleteByName('IMOJE_MERCHANT_ID')
&& Configuration::deleteByName('IMOJE_PAYMENT_METHODS')
&& Configuration::deleteByName('IMOJE_TWISTO_ENABLED')
&& Configuration::deleteByName('IMOJE_GA_KEY')
&& Configuration::deleteByName('IMOJE_IMOJE_BUTTON')
&& Configuration::deleteByName('IMOJE_PAYMENT_TITLE')
&& Configuration::deleteByName('IMOJE_TWISTO_BUTTON')
&& Configuration::deleteByName('IMOJE_TWISTO_PAYMENT_TITLE')
&& Configuration::deleteByName('IMOJE_BLIK_BUTTON')
&& Configuration::deleteByName('IMOJE_BLIK_PAYMENT_TITLE')
&& Configuration::deleteByName('IMOJE_TOKEN')
&& parent::uninstall();
}
/**
* Display configuration form.
*
* @return mixed
*/
public function getContent()
{
$msg = '';
$paymentMethods = json_decode(Configuration::get('IMOJE_PAYMENT_METHODS'), true);
if(isset($paymentMethods['errorTmp'])) {
$msg = [
'type' => 'error',
'message' => $this->l('Couldn\'t connect to imoje to get the Twisto configuration. Please try again later!'),
];
unset($paymentMethods['errorTmp']);
Configuration::updateValue('IMOJE_PAYMENT_METHODS', json_encode($paymentMethods));
};
if(isset($paymentMethods['errorCurl'])) {
$msg = [
'type' => 'error',
'message' => $this->l('Curl extension is not installed on server.'),
];
unset($paymentMethods['errorCurl']);
Configuration::updateValue('IMOJE_PAYMENT_METHODS', json_encode($paymentMethods));
};
if(isset($paymentMethods['successTmp'])) {
$msg = [
'type' => 'success',
'message' => $this->l('Configuration was successfully downloaded.'),
];
if(isset($paymentMethods['noTwisto'])) {
$msg = [
'type' => 'success',
'message' => $this->l('Twisto is not activated in your shop. Please contact our Customer Service.'),
];
unset($paymentMethods['noTwisto']);
}
unset($paymentMethods['successTmp']);
Configuration::updateValue('IMOJE_PAYMENT_METHODS', json_encode($paymentMethods));
};
if(Tools::isSubmit('submitiMoje')) {
if($this->saveConfiguration($paymentMethods)) {
$msg = [
'type' => 'success',
'message' => $this->l('Configuration updated successfully'),
];
} else {
$msg = [
'type' => 'error',
'message' => $this->l('There was an error saving your configuration'),
];
}
}
$this->context->smarty->assign([
'imoje_form' => './index.php?tab=AdminModules&configure=imoje&token=' . Tools::getAdminTokenLite('AdminModules') . '&tab_module=' . $this->tab . '&module_name=imoje',
'imoje_enabled' => Configuration::get('IMOJE_ENABLED'),
'imoje_token' => Configuration::get('IMOJE_TOKEN'),
'imoje_sandbox' => Configuration::get('IMOJE_SANDBOX'),
'imoje_service_id' => Configuration::get('IMOJE_SERVICE_ID'),
'imoje_service_key' => Configuration::get('IMOJE_SERVICE_KEY'),
'imoje_merchant_id' => Configuration::get('IMOJE_MERCHANT_ID'),
'imoje_twisto' => Configuration::get('IMOJE_TWISTO_ENABLED'),
'imoje_payment_methods' => $paymentMethods,
'imoje_payment_methods_url' => $this->context->link->getModuleLink('imoje', 'checkmethods'),
'imoje_notification_url' => $this->context->link->getModuleLink('imoje', 'notification'),
'imoje_msg' => $msg,
'imoje_ga_key' => Configuration::get('IMOJE_GA_KEY'),
'imoje_imoje_button' => Configuration::get('IMOJE_IMOJE_BUTTON'),
'imoje_payment_title' => Configuration::get('IMOJE_PAYMENT_TITLE'),
'imoje_payment_title_default' => $this->getPaymentTitleDefault($paymentMethods, Configuration::get('IMOJE_TWISTO_ENABLED')),
'imoje_twisto_button' => Configuration::get('IMOJE_TWISTO_BUTTON'),
'imoje_twisto_payment_title' => Configuration::get('IMOJE_TWISTO_PAYMENT_TITLE'),
'imoje_twisto_payment_title_default' => $this->getTwistoPaymentTitleDefault(),
'imoje_blik_button' => Configuration::get('IMOJE_BLIK_BUTTON'),
'imoje_blik_payment_title' => Configuration::get('IMOJE_BLIK_PAYMENT_TITLE'),
'imoje_blik_payment_title_default' => $this->getBlikPaymentTitleDefault(),
]);
return $this->fetchTemplate('admin.tpl');
}
/**
* @param string $name
*
* @return mixed
*/
public function fetchTemplate($name)
{
return $this->display(__FILE__, $name);
}
/**
* Hook that run on mobile version of Prestashop.
*/
public function hookDisplayMobileHeader()
{
$this->hookHeader();
}
/**
* Hook that adds css for old versions of Prestashop.
*/
public function hookHeader()
{
$this->context->controller->addCSS(($this->_path) . 'assets/css/imoje-legacy-front.min.css', 'all');
}
/**
* Hook that adds css and js in admin panel. For newer version of PrestaShop.
*/
public function hookDisplayBackOfficeHeader()
{
$this->context->controller->addJquery();
$this->context->controller->addCSS($this->_path . 'assets/css/imoje-admin.min.css', 'all');
$this->context->controller->addCSS($this->_path . 'assets/css/font-awesome.min.css', 'all');
}
/**
* Hook that adds css and js in admin panel.
*/
public function hookBackOfficeFooter()
{
echo '<link type="text/css" rel="stylesheet" href="' . $this->_path . 'assets/css/imoje-admin.min.css">';
echo '<link type="text/css" rel="stylesheet" href="' . $this->_path . 'assets/font-awesome.min.css">';
echo '<script src="' . $this->_path . 'assets/js/imoje-legacy-admin.js"></script>';
}
/**
* @param array $params
*
* @return array|bool
* @throws SmartyException
* @throws Exception
*/
public function hookPaymentOptions($params)
{
$cart = new Cart($params['cart']->id);
$currency = Currency::getCurrency($params['cart']->id_currency);
if(
!Configuration::get('IMOJE_MERCHANT_ID')
|| !Configuration::get('IMOJE_SERVICE_ID')
|| !Configuration::get('IMOJE_SERVICE_KEY')
|| !$this->active
|| !Util::canUseForCurrency($currency['iso_code'])
) {
return false;
}
$paymentMethods = json_decode(Configuration::get('IMOJE_PAYMENT_METHODS'), true);
$twistoPayload = '';
$isTwisto = Configuration::get('IMOJE_TWISTO_ENABLED');
if(Twisto::isActive(
$paymentMethods,
$isTwisto
)) {
$customer = new Customer((int) $cart->id_customer);
$twistoPayload = Twisto::getPayload(
$paymentMethods['twisto']['sk'],
$cart->getOrderTotal(true),
$this->getCart($cart),
$customer->email,
DateTime::createFromFormat('Y-m-d H:i:s', $cart->date_upd));
}
$environment = Configuration::get('IMOJE_SANDBOX') == 1
? Util::ENVIRONMENT_SANDBOX
: Util::ENVIRONMENT_PRODUCTION;
$link = $this->context->link->getModuleLink('imoje', 'payment');
$linkTwisto = $this->context->link->getModuleLink('imoje', 'twisto');
$this->context->smarty->assign([
'imoje_ps_version' => _PS_VERSION_,
'imoje_enabled' => Configuration::get('IMOJE_ENABLED'),
'imoje_sandbox' => Configuration::get('IMOJE_SANDBOX'),
'imoje_twisto_payload' => $twistoPayload,
'imoje_logo' => Media::getMediaPath(_PS_MODULE_DIR_ . $this->name . '/assets/img/logo.png'),
'blik_logo' => Media::getMediaPath(_PS_MODULE_DIR_ . $this->name . '/assets/img/blik.png'),
'twisto_logo' => Media::getMediaPath(_PS_MODULE_DIR_ . $this->name . '/twisto.svg'),
'loading_gif' => Media::getMediaPath(_PS_MODULE_DIR_ . $this->name . '/assets/img/loading.gif'),
'imoje_payment_url' => $link,
'imoje_payment_methods' => $paymentMethods,
'imoje_twisto_script_url' => Twisto::getUrlScript(
$environment
),
'imoje_link_twisto' => $linkTwisto,
'twisto_hint' => $this->l('Please wait, the connection with the Twisto is being established'),
]);
$paymentOptions = [];
$isBlikButton = Configuration::get('IMOJE_BLIK_BUTTON');
if($isBlikButton) {
$paymentOptionBlik = new PrestaShop\PrestaShop\Core\Payment\PaymentOption();
$paymentOptions[] = $paymentOptionBlik->setCallToActionText(
(Configuration::get('IMOJE_BLIK_PAYMENT_TITLE')
?: $this->getBlikPaymentTitleDefault()) . ($environment === Util::ENVIRONMENT_SANDBOX
? ' ' . $this->l('Sandbox is enabled.')
: ''))
->setModuleName($this->name)
->setAction($this->context->link->getModuleLink('imoje', 'paymentblik'))
->setAdditionalInformation($this->context->smarty->fetch('module:imoje/views/templates/hook/payment_blik.tpl'));
}
if(Configuration::get('IMOJE_IMOJE_BUTTON') || (!$isTwisto && !$isBlikButton)) {
$paymentOptionImoje = new PrestaShop\PrestaShop\Core\Payment\PaymentOption();
$paymentOptions[] = $paymentOptionImoje->setCallToActionText(
(Configuration::get('IMOJE_PAYMENT_TITLE')
?: $this->getPaymentTitleDefault($paymentMethods)) . ($environment === Util::ENVIRONMENT_SANDBOX
? ' ' . $this->l('Sandbox is enabled.')
: ''))
->setModuleName($this->name)
->setAction($link)
->setAdditionalInformation($this->context->smarty->fetch('module:imoje/views/templates/hook/payment_imoje.tpl'));
}
if(Configuration::get('IMOJE_TWISTO_BUTTON') && $isTwisto) {
$paymentOptionTwisto = new PrestaShop\PrestaShop\Core\Payment\PaymentOption();
$paymentOptions[] = $paymentOptionTwisto->setCallToActionText(
(Configuration::get('IMOJE_TWISTO_PAYMENT_TITLE')
?: $this->getTwistoPaymentTitleDefault()) . ($environment === Util::ENVIRONMENT_SANDBOX
? ' ' . $this->l('Sandbox is enabled.')
: ''))
->setModuleName('twisto')
->setAction($linkTwisto)
->setAdditionalInformation($this->context->smarty->fetch('module:imoje/views/templates/hook/payment_twisto.tpl'));
}
return $paymentOptions;
}
/**
* @param Cart $cart
*
* @return array
* @throws Exception
*/
public function getCart($cart)
{
$items = [];
foreach($cart->getProducts() as $product) {
$items[] = [
'name' => $product['name'],
'productId' => $product['id_product'] . (isset($product['attributes_small']) && !empty($product['attributes_small'])
? ' - ' . $product['attributes_small']
: ''),
'quantity' => (float) $product['quantity'],
'amount' => round($product['total_wt'], 2) / $product['quantity'],
'vatRate' => (float) $product['rate'],
];
}
$carrier = new Carrier($cart->id_carrier);
$addressBilling = new Address((int) $cart->id_address_invoice);
$addressDelivery = new Address((int) $cart->id_address_delivery);
$data = [
'shipping' => [
'amount' => $cart->getTotalShippingCost(),
'name' => $carrier->name,
'vatRate' => (float) $carrier->getTaxesRate(new Address((int) $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')})),
],
'items' => $items,
'addressBilling' => Util::formatAddress(
$addressBilling->firstname . ' ' . $addressBilling->lastname,
empty($addressBilling->address2)
? $addressBilling->address1
: $addressBilling->address1 . ', ' . $addressBilling->address2,
$addressBilling->city,
$addressBilling->postcode,
CountryCore::getIsoById($addressBilling->id_country),
empty($addressBilling->phone_mobile)
? (empty($addressBilling->phone)
? ''
: $addressBilling->phone)
: $addressBilling->phone_mobile),
'addressDelivery' => Util::formatAddress(
$addressDelivery->firstname . ' ' . $addressDelivery->lastname,
empty($addressDelivery->address2)
? $addressDelivery->address1
: $addressDelivery->address1 . ', ' . $addressDelivery->address2,
$addressDelivery->city,
$addressDelivery->postcode,
CountryCore::getIsoById($addressDelivery->id_country),
empty($addressDelivery->phone_mobile)
? (empty($addressDelivery->phone)
? ''
: $addressDelivery->phone)
: $addressDelivery->phone_mobile),
];
$discount = $cart->getOrderTotal(true, Cart::ONLY_DISCOUNTS);
if($discount > 0) {
$data['discount'] = [
'amount' => $discount,
'name' => 'discount',
'vatRate' => 0,
];
}
return $data;
}
/**
* @return mixed
*/
public function hookPaymentReturn()
{
return $this->display(__FILE__, 'tpl/confirmation.tpl');
}
/**
* Prepares data for form that is send to imoje.
*
* @param Cart $cart
* @param string $twistoData
*
* @return array
* @throws Exception
*/
public function getDataForRequestToPaywall($cart, $twistoData = '')
{
$cartId = $cart->id;
$customer = new Customer(intval($cart->id_customer));
$addressBilling = new Address((int) $cart->id_address_invoice);
$addressDelivery = new Address((int) $cart->id_address_delivery);
$currencyInfo = Currency::getCurrency($cart->id_currency);
if(Imoje\Payment\Twisto::isActive(
json_decode(Configuration::get('IMOJE_PAYMENT_METHODS'), true),
Configuration::get('IMOJE_TWISTO_ENABLED')
)
&& Configuration::get('IMOJE_SANDBOX')) {
$twistoData = Twisto::getDataSandbox();
}
return Util::prepareData(
Util::convertAmountToFractional(Context::getContext()->cart->getOrderTotal()),
$currencyInfo['iso_code'],
intval($cartId),
null,
$customer->firstname,
$customer->lastname,
$customer->email,
($addressDelivery->phone_mobile
?: ($addressBilling->phone_mobile
?: '')),
Configuration::get('IMOJE_GA_KEY')
? $this->context->link->getModuleLink('imoje', 'success', [
'ga_cart_id' => $cart->id,
'ga_hash' => hash('sha256', $cart->id . $cart->secure_key),
])
: $this->context->link->getModuleLink('imoje', 'success'),
$this->context->link->getModuleLink('imoje', 'failure'),
$this->context->link->getModuleLink('imoje', 'confirmation'),
$this->version . ';prestashop_' . _PS_VERSION_,
$twistoData
);
}
/**
* @param array $paymentMethods
* @param bool $isTwisto
*
* @return string
*/
private function getPaymentTitleDefault($paymentMethods, $isTwisto = false)
{
$paymentDefaultTitle = $this->l('Pay for purchases using the most convenient online payment methods - PayByLink, cards, BLIK.');
if(Twisto::isActive(
$paymentMethods,
$isTwisto
) && !Configuration::get('IMOJE_TWISTO_BUTTON')) {
$paymentDefaultTitle = $paymentDefaultTitle . ' ' . $this->getTwistoPaymentTitleDefault();
}
return $paymentDefaultTitle;
}
/**
* @return string
*/
private function getTwistoPaymentTitleDefault()
{
return $this->l('Order now, pay in 21 days with Twisto');
}
/**
* @return string
*/
private function getBlikPaymentTitleDefault()
{
return $this->l('BLIK');
}
/**
* @param array $paymentMethods
*
* @return bool
*/
private function saveConfiguration(&$paymentMethods)
{
if(isset($paymentMethods['twisto'])) {
Configuration::updateValue('IMOJE_TWISTO_ENABLED', pSQL(Tools::getValue('imoje_twisto')));
}
Configuration::updateValue('IMOJE_SANDBOX', pSQL(Tools::getValue('imoje_sandbox')));
Configuration::updateValue('IMOJE_SERVICE_ID', pSQL(Tools::getValue('imoje_service_id')));
Configuration::updateValue('IMOJE_SERVICE_KEY', pSQL(Tools::getValue('imoje_service_key')));
Configuration::updateValue('IMOJE_MERCHANT_ID', pSQL(Tools::getValue('imoje_merchant_id')));
Configuration::updateValue('IMOJE_TOKEN', pSQL(Tools::getValue('imoje_token')));
Configuration::updateValue('IMOJE_PAYMENT_METHODS', ($paymentMethods === ''
? $paymentMethods
: json_encode($paymentMethods)));
Configuration::updateValue('IMOJE_GA_KEY', pSQL(Tools::getValue('imoje_ga_key')));
Configuration::updateValue('IMOJE_IMOJE_BUTTON', pSQL(Tools::getValue('imoje_imoje_button')));
Configuration::updateValue('IMOJE_PAYMENT_TITLE', pSQL(Tools::getValue('imoje_payment_title')));
Configuration::updateValue('IMOJE_TWISTO_BUTTON', pSQL(Tools::getValue('imoje_twisto_button')));
Configuration::updateValue('IMOJE_TWISTO_PAYMENT_TITLE', pSQL(Tools::getValue('imoje_twisto_payment_title')));
Configuration::updateValue('IMOJE_BLIK_BUTTON', pSQL(Tools::getValue('imoje_blik_button')));
Configuration::updateValue('IMOJE_BLIK_PAYMENT_TITLE', pSQL(Tools::getValue('imoje_blik_payment_title')));
return true;
}
}