354 lines
11 KiB
PHP
Executable File
354 lines
11 KiB
PHP
Executable File
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Opencart\Admin\Controller\Extension\PayAnyWay\Payment;
|
|
|
|
/**
|
|
* @package Opencart\Admin\Controller\Extension\PayAnyWay\Payment
|
|
*/
|
|
class PayAnyWay extends \Opencart\System\Engine\Controller
|
|
{
|
|
public const CMS_NAME = 'OpenCart';
|
|
public const MODULE_NAME = 'payanyway';
|
|
public const MODULE_VERSION = '1.0.2';
|
|
public const MODULE_DEFAULT_SORT_ORDER = 0;
|
|
|
|
private const SUPPORTED_CURRENCIES = ['RUB'];
|
|
private const AVAILABLE_VAT_RATES = [
|
|
'vat_none' => '1105',
|
|
'vat0' => '1104',
|
|
'vat5' => '1108',
|
|
'vat7' => '1109',
|
|
'vat10' => '1103',
|
|
'vat22' => '1113',
|
|
'vat105' => '1110',
|
|
'vat107' => '1111',
|
|
'vat110' => '1107',
|
|
'vat122' => '1114',
|
|
];
|
|
|
|
private array $errors = [];
|
|
|
|
/**
|
|
* @throws \Exception
|
|
*/
|
|
public function index(): void
|
|
{
|
|
$this->load->language('extension/payanyway/payment/payanyway');
|
|
$this->document->setTitle($this->language->get('heading_title'));
|
|
|
|
$data = [];
|
|
$this->applyValidationErrors($data);
|
|
|
|
$data['breadcrumbs'] = $this->getBreadcrumbs();
|
|
$data['save'] = $this->url->link('extension/payanyway/payment/payanyway.save', 'user_token=' . $this->session->data['user_token']);
|
|
$data['back'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment');
|
|
|
|
$data['payment_payanyway_status'] = $this->retrieveValue('payment_payanyway_status');
|
|
$data['payment_payanyway_account'] = $this->retrieveValue('payment_payanyway_account');
|
|
$data['payment_payanyway_integrity_code'] = $this->getIntegrityCode();
|
|
$data['payment_payanyway_server'] = $this->retrieveValue('payment_payanyway_server');
|
|
$data['payment_payanyway_vat_rates'] = $this->getModuleVatRates();
|
|
$data['payment_payanyway_vat_rate'] = $this->retrieveValue('payment_payanyway_vat_rate');
|
|
$data['payment_payanyway_currencies'] = $this->getModuleCurrencies();
|
|
$data['payment_payanyway_currency'] = $this->retrieveValue('payment_payanyway_currency');
|
|
$data['order_statuses'] = $this->getAvailableOrderStatuses();
|
|
$data['payment_payanyway_pending_order_status_id'] = $this->retrieveValue('payment_payanyway_pending_order_status_id');
|
|
$data['payment_payanyway_success_order_status_id'] = $this->retrieveValue('payment_payanyway_success_order_status_id');
|
|
$data['payment_payanyway_error_order_status_id'] = $this->retrieveValue('payment_payanyway_error_order_status_id');
|
|
$data['geo_zones'] = $this->getAvailableGeoZones();
|
|
$data['payment_payanyway_geo_zone_id'] = $this->retrieveValue('payment_payanyway_geo_zone_id');
|
|
$data['payment_payanyway_sort_order'] = $this->retrieveValue('payment_payanyway_sort_order');
|
|
$data['payment_payanyway_cms_module_version'] = $this->getCmsModuleVersion();
|
|
|
|
$data['header'] = $this->load->controller('common/header');
|
|
$data['column_left'] = $this->load->controller('common/column_left');
|
|
$data['footer'] = $this->load->controller('common/footer');
|
|
|
|
$this->response->setOutput($this->load->view('extension/payanyway/payment/payanyway', $data));
|
|
}
|
|
|
|
public function save(): void
|
|
{
|
|
$this->load->language('extension/payanyway/payment/payanyway');
|
|
|
|
$json = [];
|
|
|
|
if (!$this->user->hasPermission('modify', 'extension/payanyway/payment/payanyway')) {
|
|
$json['error'] = $this->language->get('error_permission');
|
|
|
|
$this->response->addHeader('Content-Type: application/json');
|
|
$this->response->setOutput(json_encode($json));
|
|
|
|
return;
|
|
}
|
|
|
|
if (!$this->validate()) {
|
|
$errorString = $this->language->get('error_validation') .
|
|
"<p style='white-space: pre-wrap; margin: 0;'>\n";
|
|
|
|
foreach ($this->errors as $error) {
|
|
$errorString .= $error . "\n";
|
|
}
|
|
|
|
$errorString = substr($errorString, 0, -1) . "</p>";
|
|
|
|
$json['error'] = $errorString;
|
|
}
|
|
|
|
if (!$json) {
|
|
$this->load->model('setting/setting');
|
|
$this->model_setting_setting->editSetting('payment_payanyway', $this->request->post);
|
|
|
|
$json['success'] = $this->language->get('text_success');
|
|
}
|
|
|
|
$this->response->addHeader('Content-Type: application/json');
|
|
$this->response->setOutput(json_encode($json));
|
|
}
|
|
|
|
/**
|
|
* @throws \Exception
|
|
*/
|
|
public function install(): void
|
|
{
|
|
if (!$this->user->hasPermission('modify', 'extension/payment')) {
|
|
return;
|
|
}
|
|
|
|
$defaultSettings = [
|
|
'payment_payanyway_status' => 0,
|
|
'payment_payanyway_account' => '',
|
|
'payment_payanyway_integrity_code' => '',
|
|
'payment_payanyway_server' => 'prod',
|
|
'payment_payanyway_sort_order' => 0,
|
|
'payment_payanyway_cms_module_version' => $this->getCmsModuleVersion(),
|
|
];
|
|
|
|
$orderStatuses = $this->getAvailableOrderStatuses();
|
|
|
|
$pendingStatus = array_filter($orderStatuses, function ($status) {
|
|
return (int)$status['order_status_id'] === 1;
|
|
});
|
|
if (!empty($pendingStatus)) {
|
|
$pendingKey = key($pendingStatus);
|
|
$defaultSettings['payment_payanyway_pending_order_status_id'] = $pendingStatus[$pendingKey]['order_status_id'];
|
|
}
|
|
|
|
$successStatus = array_filter($orderStatuses, function ($status) {
|
|
return (int)$status['order_status_id'] === 5;
|
|
});
|
|
if (!empty($successStatus)) {
|
|
$successKey = key($successStatus);
|
|
$defaultSettings['payment_payanyway_success_order_status_id'] = $successStatus[$successKey]['order_status_id'];
|
|
}
|
|
|
|
$errorStatus = array_filter($orderStatuses, function ($status) {
|
|
return (int)$status['order_status_id'] === 10;
|
|
});
|
|
if (!empty($errorStatus)) {
|
|
$errorKey = key($errorStatus);
|
|
$defaultSettings['payment_payanyway_error_order_status_id'] = $errorStatus[$errorKey]['order_status_id'];
|
|
}
|
|
|
|
$this->load->model('setting/setting');
|
|
$this->model_setting_setting->editSetting('payment_payanyway', $defaultSettings);
|
|
}
|
|
|
|
public function uninstall(): void
|
|
{
|
|
if (!$this->user->hasPermission('modify', 'extension/payment')) {
|
|
return;
|
|
}
|
|
|
|
$this->load->model('setting/setting');
|
|
$this->model_setting_setting->deleteSetting('payment_payanyway');
|
|
}
|
|
|
|
private function validate(): bool
|
|
{
|
|
$this->errors = [];
|
|
|
|
if (!isset($this->request->post['payment_payanyway_account']) ||
|
|
((int)$this->request->post['payment_payanyway_account'] <= 0)
|
|
) {
|
|
$this->errors['account'] = $this->language->get('error_account');
|
|
}
|
|
|
|
if (empty($this->request->post['payment_payanyway_integrity_code'])) {
|
|
$this->errors['integrity_code'] = $this->language->get('error_integrity_code');
|
|
}
|
|
|
|
if (empty($this->request->post['payment_payanyway_pending_order_status_id'])) {
|
|
$this->errors['pending_order_status'] = $this->language->get('error_pending_order_status');
|
|
}
|
|
if (empty($this->request->post['payment_payanyway_success_order_status_id'])) {
|
|
$this->errors['success_order_status'] = $this->language->get('error_success_order_status');
|
|
}
|
|
if (empty($this->request->post['payment_payanyway_error_order_status_id'])) {
|
|
$this->errors['error_order_status'] = $this->language->get('error_error_order_status');
|
|
}
|
|
|
|
$sortOrder = isset($this->request->post['payment_payanyway_sort_order'])
|
|
? (int)$this->request->post['payment_payanyway_sort_order']
|
|
: self::MODULE_DEFAULT_SORT_ORDER;
|
|
$this->request->post['payment_payanyway_sort_order'] = $sortOrder;
|
|
$this->request->post['payment_payanyway_cms_module_version'] = $this->getCmsModuleVersion();
|
|
|
|
return empty($this->errors);
|
|
}
|
|
|
|
/** @param array<string, mixed> $data */
|
|
private function applyValidationErrors(array &$data): void
|
|
{
|
|
$data['error_warning'] = $this->errors['warning'] ?? '';
|
|
$data['error_account'] = $this->errors['account'] ?? '';
|
|
$data['error_integrity_code'] = $this->errors['integrity_code'] ?? '';
|
|
$data['error_pending_order_status'] = $this->errors['pending_order_status'] ?? '';
|
|
$data['error_success_order_status'] = $this->errors['success_order_status'] ?? '';
|
|
$data['error_error_order_status'] = $this->errors['error_order_status'] ?? '';
|
|
}
|
|
|
|
/** @return array<int, array{text: string, href: string}> */
|
|
private function getBreadcrumbs(): array
|
|
{
|
|
return [
|
|
[
|
|
'text' => $this->language->get('text_home'),
|
|
'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token']),
|
|
],
|
|
[
|
|
'text' => $this->language->get('text_extension'),
|
|
'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment'),
|
|
],
|
|
[
|
|
'text' => $this->language->get('heading_title'),
|
|
'href' => $this->url->link('extension/payanyway/payment/payanyway', 'user_token=' . $this->session->data['user_token']),
|
|
],
|
|
];
|
|
}
|
|
|
|
private function getIntegrityCode(): string
|
|
{
|
|
$value = $this->retrieveValue('payment_payanyway_integrity_code');
|
|
if (null === $value) {
|
|
return '';
|
|
}
|
|
|
|
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
|
|
}
|
|
|
|
/** @return array<string, mixed> */
|
|
private function getModuleVatRates(): array
|
|
{
|
|
$result = array();
|
|
foreach (self::AVAILABLE_VAT_RATES as $vat => $value) {
|
|
$label = 'entry_' . $vat . '_label';
|
|
$result[$value] = $this->language->get($label);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* @return array<string, mixed>
|
|
* @throws \Exception
|
|
*/
|
|
private function getModuleCurrencies(): array
|
|
{
|
|
$this->load->model('localisation/currency');
|
|
$shopCurrencies = $this->model_localisation_currency->getCurrencies();
|
|
|
|
$result = array();
|
|
foreach (self::SUPPORTED_CURRENCIES as $currencyCode) {
|
|
$result[$currencyCode] = $shopCurrencies[$currencyCode] ?? $this->getDefaultCurrencyDefinition($currencyCode);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/** @return array<string, mixed> */
|
|
private function getDefaultCurrencyDefinition(string $currencyCode): array
|
|
{
|
|
$definitions = [
|
|
'RUB' => [
|
|
'currency_id' => 0,
|
|
'title' => 'Рубль',
|
|
'code' => 'RUB',
|
|
'symbol_left' => '',
|
|
'symbol_right' => '₽',
|
|
'decimal_place' => '2',
|
|
'value' => 1.00000000,
|
|
'status' => '1',
|
|
'date_modified' => date('Y-m-d H:i:s'),
|
|
],
|
|
];
|
|
|
|
return $definitions[$currencyCode] ?? [];
|
|
}
|
|
|
|
/**
|
|
* @return array<string, mixed>
|
|
* @throws \Exception
|
|
*/
|
|
private function getAvailableOrderStatuses(): array
|
|
{
|
|
$this->load->model('localisation/order_status');
|
|
return $this->model_localisation_order_status->getOrderStatuses();
|
|
}
|
|
|
|
/**
|
|
* @return array<string, mixed>
|
|
* @throws \Exception
|
|
*/
|
|
private function getAvailableGeoZones(): array
|
|
{
|
|
$this->load->model('localisation/geo_zone');
|
|
return $this->model_localisation_geo_zone->getGeoZones();
|
|
}
|
|
|
|
/** @return string */
|
|
private function getCmsModuleVersion(): string
|
|
{
|
|
$this->load->language('common/footer');
|
|
$textFooter = $this->language->get('text_footer');
|
|
$textFooter = is_string($textFooter) ? $textFooter : '';
|
|
|
|
$cmsName = $this->detectCmsByPatterns($textFooter);
|
|
$cmsVersion = defined('VERSION') ? constant('VERSION') : '.unknown';
|
|
|
|
return sprintf('%s v%s|PHP %s|%s v%s',
|
|
$cmsName,
|
|
$cmsVersion,
|
|
PHP_VERSION,
|
|
self::MODULE_NAME,
|
|
self::MODULE_VERSION
|
|
);
|
|
}
|
|
|
|
private function detectCmsByPatterns($textFooter): string
|
|
{
|
|
$patterns = [
|
|
'ocStore' => '/ocStore/i',
|
|
'Russian OpenCart' => '/opencart-russia/i',
|
|
self::CMS_NAME => '/opencart\.com/i'
|
|
];
|
|
|
|
if (!empty($textFooter)) {
|
|
foreach ($patterns as $cms => $pattern) {
|
|
if (preg_match($pattern, $textFooter)) {
|
|
return $cms;
|
|
}
|
|
}
|
|
}
|
|
|
|
return self::CMS_NAME;
|
|
}
|
|
|
|
private function retrieveValue(string $name): mixed
|
|
{
|
|
return $this->request->post[$name] ?? $this->config->get($name);
|
|
}
|
|
}
|