'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') . "

\n"; foreach ($this->errors as $error) { $errorString .= $error . "\n"; } $errorString = substr($errorString, 0, -1) . "

"; $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 $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 */ 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 */ 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 * @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 */ 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 * @throws \Exception */ private function getAvailableOrderStatuses(): array { $this->load->model('localisation/order_status'); return $this->model_localisation_order_status->getOrderStatuses(); } /** * @return array * @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); } }