3
0
2026-05-15 17:04:16 +03:00

334 lines
11 KiB
PHP
Executable File

<?php
/**
* @property ModelSettingSetting $model_setting_setting
* @property ModelLocalisationCurrency $model_localisation_currency
* @property ModelLocalisationOrderStatus $model_localisation_order_status
* @property ModelLocalisationGeoZone $model_localisation_geo_zone
*/
class ControllerExtensionPaymentPayanyway extends Controller {
const CMS_NAME = 'OpenCart';
const MODULE_NAME = 'payanyway';
const MODULE_VERSION = '1.0.0';
const MODULE_DEFAULT_SORT_ORDER = 0;
private $supportedCurrencies = array('RUB');
private $availableVatRates = array(
'vat_none' => '1105',
'vat0' => '1104',
'vat5' => '1108',
'vat7' => '1109',
'vat10' => '1103',
'vat22' => '1113',
'vat105' => '1110',
'vat107' => '1111',
'vat110' => '1107',
'vat122' => '1114'
);
private $error = array();
/**
* @return void
* @throws \Exception
*/
public function index() {
$this->load->language('extension/payment/payanyway');
$this->document->setTitle($this->language->get('heading_title'));
if (($this->request->server['REQUEST_METHOD'] === 'POST') && $this->validate($this->request)) {
$this->load->model('setting/setting');
$this->model_setting_setting->editSetting('payment_payanyway', $this->request->post);
$this->session->data['success'] = $this->language->get('text_success');
$this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true));
}
$data = array();
$this->applyValidationErrors($data);
$data['breadcrumbs'] = $this->getBreadcrumbs();
$data['action'] = $this->url->link('extension/payment/payanyway', 'user_token=' . $this->session->data['user_token'], true);
$data['cancel'] = $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true);
$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('payment_payanyway_integrity_code');
$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/payment/payanyway', $data));
}
/**
* @return void
* @throws \Exception
*/
public function install() {
$defaultSettings = array(
'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);
}
/**
* @return void
* @throws \Exception
*/
public function uninstall() {
$this->load->model('setting/setting');
$this->model_setting_setting->deleteSetting('payment_payanyway');
}
/**
* @param \Request $request
* @return bool
*/
private function validate($request) {
if (!$this->user->hasPermission('modify', 'extension/payment/payanyway')) {
$this->error['warning'] = $this->language->get('error_permission');
}
if (!isset($request->post['payment_payanyway_account']) ||
((int)$request->post['payment_payanyway_account'] <= 0)
) {
$this->error['account'] = $this->language->get('error_account');
}
if (empty($request->post['payment_payanyway_integrity_code'])) {
$this->error['integrity_code'] = $this->language->get('error_integrity_code');
}
if (empty($request->post['payment_payanyway_pending_order_status_id'])) {
$this->error['pending_order_status'] = $this->language->get('error_order_status');
}
if (empty($request->post['payment_payanyway_success_order_status_id'])) {
$this->error['success_order_status'] = $this->language->get('error_order_status');
}
if (empty($request->post['payment_payanyway_error_order_status_id'])) {
$this->error['error_order_status'] = $this->language->get('error_order_status');
}
$sortOrder = isset($request->post['payment_payanyway_sort_order'])
? (int)$request->post['payment_payanyway_sort_order']
: self::MODULE_DEFAULT_SORT_ORDER;
$request->post['payment_payanyway_sort_order'] = $sortOrder;
$request->post['payment_payanyway_cms_module_version'] = $this->getCmsModuleVersion();
return empty($this->error);
}
/**
* @param array<string, mixed> $data
* @return void
*/
private function applyValidationErrors(array &$data) {
$data['error_warning'] = isset($this->error['warning']) ? $this->error['warning'] : '';
$data['error_account'] = isset($this->error['account']) ? $this->error['account'] : '';
$data['error_integrity_code'] = isset($this->error['integrity_code']) ? $this->error['integrity_code'] : '';
$data['error_pending_order_status'] = isset($this->error['pending_order_status']) ? $this->error['pending_order_status'] : '';
$data['error_success_order_status'] = isset($this->error['success_order_status']) ? $this->error['success_order_status'] : '';
$data['error_error_order_status'] = isset($this->error['error_order_status']) ? $this->error['error_order_status'] : '';
}
/** @return array<int, array{text: string, href: string}> */
private function getBreadcrumbs() {
return array(
array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true),
),
array(
'text' => $this->language->get('text_extension'),
'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=payment', true),
),
array(
'text' => $this->language->get('heading_title'),
'href' => $this->url->link('extension/payment/payanyway', 'user_token=' . $this->session->data['user_token'], true),
),
);
}
/**
* @param string $key
* @return string
*/
private function getIntegrityCode($key) {
$value = $this->retrieveValue($key);
if (null === $value) {
return '';
}
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
/** @return array<string, mixed> */
private function getModuleVatRates() {
$result = array();
foreach ($this->availableVatRates as $vat => $value) {
$label = 'entry_' . $vat . '_label';
$result[$value] = $this->language->get($label);
}
return $result;
}
/**
* @return array<string, mixed>
* @throws \Exception
*/
private function getModuleCurrencies() {
$this->load->model('localisation/currency');
$shopCurrencies = $this->model_localisation_currency->getCurrencies();
$result = array();
foreach ($this->supportedCurrencies as $currencyCode) {
$result[$currencyCode] = isset($shopCurrencies[$currencyCode])
? $shopCurrencies[$currencyCode]
: $this->getDefaultCurrencyDefinition($currencyCode);
}
return $result;
}
/**
* @param string $currencyCode
* @return array<string, mixed>
*/
private function getDefaultCurrencyDefinition($currencyCode) {
$definitions = array(
'RUB' => array(
'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 isset($definitions[$currencyCode]) ? $definitions[$currencyCode] : array();
}
/**
* @return array<string, mixed>
* @throws \Exception
*/
private function getAvailableOrderStatuses() {
$this->load->model('localisation/order_status');
return $this->model_localisation_order_status->getOrderStatuses();
}
/**
* @return array<string, mixed>
* @throws \Exception
*/
private function getAvailableGeoZones() {
$this->load->model('localisation/geo_zone');
return $this->model_localisation_geo_zone->getGeoZones();
}
/** @return string */
private function getCmsModuleVersion() {
$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 | %s v%s',
$cmsName,
$cmsVersion,
self::MODULE_NAME,
self::MODULE_VERSION
);
}
private function detectCmsByPatterns($textFooter) {
$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;
}
/**
* @param string $name
* @return mixed
*/
private function retrieveValue($name) {
if (!is_string($name)) {
throw new \InvalidArgumentException("The name must be a string");
}
if (isset($this->request->post[$name])) {
return $this->request->post[$name];
}
return $this->config->get($name);
}
}