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