From 2ede7861579facaf3688edd0d62af1c9346b8569 Mon Sep 17 00:00:00 2001 From: AnthonyAxenov Date: Thu, 25 Apr 2019 00:15:47 +0800 Subject: [PATCH] Initial commit --- README.md | 60 ++++++ dreamkas-f opencart.ocmod.zip | Bin 0 -> 12233 bytes dreamkas-opencart3.ocmod.zip | Bin 0 -> 12830 bytes dreamkas-opencart3.ocmod/install.xml | 170 ++++++++++++++++ .../controller/extension/module/dreamkas.php | 184 ++++++++++++++++++ .../ru-ru/extension/module/dreamkas.php | 38 ++++ .../template/extension/module/dreamkas.tpl | 127 ++++++++++++ .../template/extension/module/dreamkas.twig | 120 ++++++++++++ .../controller/extension/module/dreamkas.php | 120 ++++++++++++ 9 files changed, 819 insertions(+) create mode 100644 README.md create mode 100644 dreamkas-f opencart.ocmod.zip create mode 100644 dreamkas-opencart3.ocmod.zip create mode 100644 dreamkas-opencart3.ocmod/install.xml create mode 100644 dreamkas-opencart3.ocmod/upload/admin/controller/extension/module/dreamkas.php create mode 100644 dreamkas-opencart3.ocmod/upload/admin/language/ru-ru/extension/module/dreamkas.php create mode 100644 dreamkas-opencart3.ocmod/upload/admin/view/template/extension/module/dreamkas.tpl create mode 100644 dreamkas-opencart3.ocmod/upload/admin/view/template/extension/module/dreamkas.twig create mode 100644 dreamkas-opencart3.ocmod/upload/catalog/controller/extension/module/dreamkas.php diff --git a/README.md b/README.md new file mode 100644 index 0000000..c829399 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +# Модуль интеграции Dreamkas для OpenCart 3.* + +## Содержимое репозитория + +* `./dreamkas-opencart3.ocmod/` - директория с исходным кодом модуля +* `./dreamkas-opencart3.ocmod.ocmod.zip` - модуль, готовый к установке +* `./dreamkas-f opencart.ocmod.zip` - исходный модуль для OpenCart 2.3, на котором основан данный + +## Описание + +Модуль устанавливается на OpenCart 3.0.2.0, настройки сохраняются, читаются. +Судя по отзывам ([1](http://blog.anthonyaxenov.ru/2018/05/09/%d0%bc%d0%be%d0%b4%d1%83%d0%bb%d1%8c-%d0%b8%d0%bd%d1%82%d0%b5%d0%b3%d1%80%d0%b0%d1%86%d0%b8%d0%b8-dreamkas-%d0%b4%d0%bb%d1%8f-opencart-3-0-2-0/#comment-103) [2](https://help.dreamkas.ru/hc/ru/articles/115005504689-%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D1%8C-%D0%BA%D0%B0%D1%81%D1%81%D1%83-%D0%BA-OpenCart)), модуль рабочий, за исключением одного момента: не отображаются статусы фискализации, но сама фискализация работает. + +У меня лично нет возможности проверить насколько качественно работает этот модуль: для этого нужны реальные заказы и покупки. +Проект, в рамках которого я работал над этим модулем, я больше не поддерживаю. + +Вся основная логика модуля прописана здесь: + +```upload/catalog/controller/extension/module/dreamkas.php``` + +Этот файл я не трогал. +Я лишь восстановил возможность установить, удалить и настроить модуль. + +## Краткая информация + +Основано на модуле *[dreamkas-f opencart.ocmod.zip](https://help.dreamkas.ru/hc/ru/article_attachments/115010763145/dreamkas-f_opencart.ocmod.zip)*. + +Этот архив включен в репозиторий - для истории. +Может кому-нибудь даже будет интересно увидеть в diff-ах точные правки, но ниже я опишу вкратце лишь основные: + +1. Шаблон (`upload/admin/view/template/extension/module/dreamkas.twig`): + 1. переписан с языка php на язык шаблонизатора Twig + 2. изменено расширение с .tpl на .twig +2. Страница настроек: + 1. удалены большие куски закомментированного и нерабочего (?) кода + 2. исправлено получение списка установленных платёжных систем + 3. форматирование кода (`upload/admin/controller/extension/module/dreamkas.php`) +3. Мелкое форматирование и исправление ссылки на сайт разработчика (`install.xml`) + +## Полезные ссылки + +1. История появления модуля: [читать в блоге](http://blog.anthonyaxenov.ru/2018/05/09/модуль-интеграции-dreamkas-для-opencart-3-0-2-0) +2. Открытая документация к Dreamkas API: [kabinet.docs.apiary.io](http://kabinet.docs.apiary.io) +3. [Как подключить интернет-магазин к кассе через Кабинет?](https://help.dreamkas.ru/hc/ru/articles/115005007709) +4. [Подключить кассу к OpenCart](https://help.dreamkas.ru/hc/ru/articles/115005504689-%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D1%8C-%D0%BA%D0%B0%D1%81%D1%81%D1%83-%D0%BA-OpenCart) +5. Групповой чат для разработчиков в Telegram: [@apidreamkas](https://t.me/apidreamkas) (если ссылка не работает — ищи через в TG поиск) + +## Лицензия + +Весь исходный код, находящийся в этом репозитории, распространяется по [лицензии WTFPL v2](http://www.wtfpl.net/txt/copying/). + +Причина - отсутствие какой-либо лицензии на исходный модуль `./dreamkas-f opencart.ocmod.zip` и безразличие к моим доработкам. + +## Поддержка + +Отсутствует и не появится. + +Любые манипуляции с модулем - НА ВАШ СТРАХ И РИСК. + +Я НЕ ДАЮ НИКАКИХ ГАРАНТИЙ ЕГО РАБОТОСПОСОБНОСТИ. diff --git a/dreamkas-f opencart.ocmod.zip b/dreamkas-f opencart.ocmod.zip new file mode 100644 index 0000000000000000000000000000000000000000..c4ff8ae0a8e535f67e36dc6f32501b0966399156 GIT binary patch literal 12233 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 Aw*UYD literal 0 HcmV?d00001 diff --git a/dreamkas-opencart3.ocmod.zip b/dreamkas-opencart3.ocmod.zip new file mode 100644 index 0000000000000000000000000000000000000000..44fe04453a9e77c6c134065ca512f9fc3235bf01 GIT binary patch literal 12830 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
`Dgs6irq=CL|MDpRjnsW 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 literal 0 HcmV?d00001 diff --git a/dreamkas-opencart3.ocmod/install.xml b/dreamkas-opencart3.ocmod/install.xml new file mode 100644 index 0000000..75a4e14 --- /dev/null +++ b/dreamkas-opencart3.ocmod/install.xml @@ -0,0 +1,170 @@ + + + Dreamkas 2.3.x + Dreamkas 2.3.x + 1.00 + Alt-team + https://www.alt-team.ru/ + + + + + ]]> + + +
+ +
+ + ]]>
+
+
+ + + db->query("DELETE FROM " . DB_PREFIX . "product_description WHERE product_id = '" . (int)$product_id . "'"); + ]]> + db->query("UPDATE " . DB_PREFIX . "product SET dk_tax_type = '" . $this->db->escape($data['dk_tax_type']) . "' WHERE product_id = '" . (int)$product_id . "'"); + } + ]]> + + + + + load->model('catalog/recurring'); + ]]> + request->post['dk_tax_type'])) { + $data['dk_tax_type'] = $this->request->post['dk_tax_type']; + } elseif (!empty($product_info['dk_tax_type'])) { + $data['dk_tax_type'] = $product_info['dk_tax_type']; + } else { + $data['dk_tax_type'] = ''; + } + ]]> + + + + + + ]]> + Статус фискализации + ]]> + + + + ]]> + + ]]> + + + + + + ]]> + + + + + + ]]> + + + + + model_sale_order->getOrders($filter_data); + ]]> + db->query("SELECT dk_status FROM " . DB_PREFIX . "dreamkas WHERE order_id = '" . (int)$result['order_id']. "'"); + ]]> + + + $result['shipping_code'],]]> + !empty($dkquery->row['dk_status'])?$dkquery->row['dk_status']:'', + ]]> + + + language->get('tab_additional');]]> + db->query("SELECT order_status_id FROM `" . DB_PREFIX . "order` o WHERE o.order_id = '" . (int)$order_id . "'"); + $status = $query->row['order_status_id']; + + $query = $this->db->query("SELECT payment_code FROM `" . DB_PREFIX . "order` o WHERE o.order_id = '" . (int)$order_id . "'"); + $payment_code = $query->row['payment_code']; + + if ($status == $this->config->get('dreamkas_paid_order') && in_array($payment_code, $this->config->get('dreamkas_payments_ids'))) { + + $query = $this->db->query("SELECT dk_id FROM " . DB_PREFIX . "dreamkas WHERE order_id = '" . (int)$order_id. "'"); + if(!empty($query->row['dk_id'])) { + $dk_id = $query->row['dk_id']; + $ch = curl_init(); + $access_token = $this->config->get('dreamkas_access_token'); + + curl_setopt($ch, CURLOPT_HTTPHEADER, array( + "Content-Type: application/json", + "Authorization: Bearer $access_token" + )); + + curl_setopt($ch, CURLOPT_URL, "https://kabinet.dreamkas.ru/api/operations/".$dk_id); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); + curl_setopt($ch, CURLOPT_HEADER, FALSE); + $response = curl_exec($ch); + curl_close($ch); + + $response = json_decode($response, true); + + if((substr($response['status'], 0, 1)==4)) { + $this->log->write('Dreamkas debug: ' . json_encode($response)); + } elseif(!empty($response['data']['error'])) { + $this->log->write('Dreamkas debug: ' . json_encode($response['data']['error'])); + } else { + $dk_date = empty($response['createdAt'])?$response['completedAt']:$response['createdAt']; + $this->db->query("UPDATE `" . DB_PREFIX . "dreamkas` SET `order_id` = '" . (int)$order_id . "', `dk_id` = '".$response['id']."', `dk_date` ='".$dk_date."', `dk_status` = '" .$response['status']. "' WHERE order_id = '" . (int)$order_id. "'"); + } + } + } + + $query = $this->db->query("SELECT dk_status FROM " . DB_PREFIX . "dreamkas WHERE order_id = '" . (int)$order_id. "'"); + if(!empty($query->row['dk_status'])) { + $data['dk_status'] = $query->row['dk_status']; + } else { + $data['dk_status']=''; + } + $this->load->language('extension/module/dreamkas'); + $data['entry_dk_status'] = $this->language->get('entry_dk_status'); + ]]> + + +
\ No newline at end of file diff --git a/dreamkas-opencart3.ocmod/upload/admin/controller/extension/module/dreamkas.php b/dreamkas-opencart3.ocmod/upload/admin/controller/extension/module/dreamkas.php new file mode 100644 index 0000000..be55078 --- /dev/null +++ b/dreamkas-opencart3.ocmod/upload/admin/controller/extension/module/dreamkas.php @@ -0,0 +1,184 @@ +load->language('extension/module/dreamkas'); + $this->document->setTitle($this->language->get('heading_title')); + $this->load->model('setting/setting'); + + if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { + $this->model_setting_setting->editSetting('dreamkas', $this->request->post); + $this->session->data['success'] = $this->language->get('text_success'); + //$this->response->redirect($this->url->link('extension/extension', 'user_token=' . $this->session->data['user_token'], 'SSL')); + $this->response->redirect($this->url->link('extension/module/dreamkas', 'user_token=' . $this->session->data['user_token'], 'SSL')); + } + + $data['heading_title'] = $this->language->get('heading_title'); + $data['text_edit'] = $this->language->get('text_edit'); + $data['text_enabled'] = $this->language->get('text_enabled'); + $data['text_disabled'] = $this->language->get('text_disabled'); + $data['entry_status'] = $this->language->get('entry_status'); + $data['entry_access_token'] = $this->language->get('entry_access_token'); + $data['entry_device_id'] = $this->language->get('entry_device_id'); + $data['entry_tax_mode'] = $this->language->get('entry_tax_mode'); + $data['entry_tax_type'] = $this->language->get('entry_tax_type'); + $data['entry_payments_ids'] = $this->language->get('entry_payments_ids'); + $data['entry_paid_order'] = $this->language->get('entry_paid_order'); + $data['text_tax_default'] = $this->language->get('text_tax_default'); + $data['text_tax_simple'] = $this->language->get('text_tax_simple'); + $data['text_tax_simple_wo'] = $this->language->get('text_tax_simple_wo'); + $data['text_tax_envd'] = $this->language->get('text_tax_envd'); + $data['text_tax_agricult'] = $this->language->get('text_tax_agricult'); + $data['text_tax_patent'] = $this->language->get('text_tax_patent'); + $data['text_tax_nds_no_tax'] = $this->language->get('text_tax_nds_no_tax'); + $data['text_tax_nds_0'] = $this->language->get('text_tax_nds_0'); + $data['text_tax_nds_10'] = $this->language->get('text_tax_nds_10'); + $data['text_tax_nds_18'] = $this->language->get('text_tax_nds_18'); + $data['text_tax_nds_10_calculated'] = $this->language->get('text_tax_nds_10_calculated'); + $data['text_tax_nds_18_calculated'] = $this->language->get('text_tax_nds_18_calculated'); + + $data['button_save'] = $this->language->get('button_save'); + $data['button_cancel'] = $this->language->get('button_cancel'); + + if (isset($this->error['warning'])) { + $data['error_warning'] = $this->error['warning']; + } else { + $data['error_warning'] = ''; + } + + if (isset($this->error['access_token'])) { + $data['error_access_token'] = $this->error['access_token']; + } else { + $data['error_access_token'] = ''; + } + + if (isset($this->error['device_id'])) { + $data['error_device_id'] = $this->error['device_id']; + } else { + $data['error_device_id'] = ''; + } + + $data['breadcrumbs'] = array(); + $data['breadcrumbs'][] = array( + 'text' => $this->language->get('text_home'), + 'href' => $this->url->link('common/dashboard', 'user_token=' . $this->session->data['user_token'], true) + ); + $data['breadcrumbs'][] = array( + 'text' => $this->language->get('text_extension'), + 'href' => $this->url->link('extension/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true) + ); + $data['breadcrumbs'][] = array( + 'text' => $this->language->get('heading_title'), + 'href' => $this->url->link('extension/module/dreamkas', 'user_token=' . $this->session->data['user_token'], true) + ); + $data['action'] = $this->url->link('extension/module/dreamkas', 'user_token=' . $this->session->data['user_token'], true); + $data['cancel'] = $this->url->link('extension/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true); + + if (isset($this->request->get['module_id']) && ($this->request->server['REQUEST_METHOD'] != 'POST')) { + $module_info = $this->model_extension_module->getModule($this->request->get['module_id']); + } + + if (isset($this->request->post['dreamkas_access_token'])) { + $data['access_token'] = $this->request->post['dreamkas_access_token']; + } else { + $data['access_token'] = $this->config->get('dreamkas_access_token'); + } + + if (isset($this->request->post['dreamkas_device_id'])) { + $data['device_id'] = $this->request->post['dreamkas_device_id']; + } else { + $data['device_id'] = $this->config->get('dreamkas_device_id'); + } + + if (isset($this->request->post['dreamkas_tax_mode'])) { + $data['tax_mode'] = $this->request->post['dreamkas_tax_mode']; + } else { + $data['tax_mode'] = $this->config->get('dreamkas_tax_mode'); + } + + if (isset($this->request->post['dreamkas_tax_type'])) { + $data['tax_type'] = $this->request->post['dreamkas_tax_type']; + } else { + $data['tax_type'] = $this->config->get('dreamkas_tax_type'); + } + + if (isset($this->request->post['dreamkas_payments_ids'])) { + $data['payments_ids'] = $this->request->post['dreamkas_payments_ids']; + } else { + $data['payments_ids'] = $this->config->get('dreamkas_payments_ids'); + } + + if (isset($this->request->post['dreamkas_paid_order'])) { + $data['paid_order'] = $this->request->post['dreamkas_paid_order']; + } else { + $data['paid_order'] = $this->config->get('dreamkas_paid_order'); + } + + if (!isset($data['payments_ids'])) { + $data['payments_ids'] = array(); + } + + $this->load->model('localisation/order_status'); + $data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses(); + + //Get payments + $this->load->model('setting/extension'); + $paymenttypes = $this->model_setting_extension->getInstalled('payment'); + + foreach ($paymenttypes as $type) { + $this->load->language('extension/payment/' . $type, 'extension'); + $data['paymenttypes'][] = array( + 'code' => $type, + 'name' => $this->language->get('extension')->get('heading_title'), + ); + } + + if (isset($this->request->post['dreamkas_status'])) { + $data['status'] = $this->request->post['dreamkas_status']; + } else { + $data['status'] = $this->config->get('dreamkas_status'); + } + $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/module/dreamkas', $data)); + } + + protected function validate() { + if (!$this->user->hasPermission('modify', 'extension/module/dreamkas')) { + $this->error['warning'] = $this->language->get('error_permission'); + } + if (!$this->request->post['dreamkas_access_token']) { + $this->error['error_access_token'] = $this->language->get('error_access_token'); + } + if (!$this->request->post['dreamkas_device_id']) { + $this->error['error_device_id'] = $this->language->get('error_device_id'); + } + if (!isset($this->request->post['dreamkas_payments_ids'])) { + //$this->error['error_payments_ids'] = $this->language->get('error_payments_ids'); + } + return !$this->error; + } + + public function install() { + $this->load->model('setting/event'); + $this->model_setting_event->addEvent('dreamkas', 'catalog/model/checkout/order/addOrderHistory/after', 'extension/module/dreamkas'); + $this->db->query(" + CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "dreamkas` ( + `order_id` int(11) NOT NULL, + `dk_id` VARCHAR(30) NOT NULL, + `dk_date` VARCHAR(30) NOT NULL, + `dk_status` VARCHAR(30) NOT NULL, + PRIMARY KEY (`order_id`) + ) ENGINE=MyISAM DEFAULT COLLATE=utf8_general_ci + "); + $this->db->query("ALTER TABLE `" . DB_PREFIX . "product` ADD `dk_tax_type` VARCHAR(50) NOT NULL DEFAULT ''"); + } + + public function uninstall() { + $this->load->model('setting/event'); + $this->db->query("ALTER TABLE `" . DB_PREFIX . "product` DROP `dk_tax_type`;"); + $this->model_setting_event->deleteEvent('dreamkas'); + } +} \ No newline at end of file diff --git a/dreamkas-opencart3.ocmod/upload/admin/language/ru-ru/extension/module/dreamkas.php b/dreamkas-opencart3.ocmod/upload/admin/language/ru-ru/extension/module/dreamkas.php new file mode 100644 index 0000000..adff48f --- /dev/null +++ b/dreamkas-opencart3.ocmod/upload/admin/language/ru-ru/extension/module/dreamkas.php @@ -0,0 +1,38 @@ + +
+ +
+ +
+ +
+ +
+
+

+
+
+
+
+ +
+ + +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ +
+ +
+ +
+
+
+ + +
+ +
+ +
+
+
+
+
+
+
+ diff --git a/dreamkas-opencart3.ocmod/upload/admin/view/template/extension/module/dreamkas.twig b/dreamkas-opencart3.ocmod/upload/admin/view/template/extension/module/dreamkas.twig new file mode 100644 index 0000000..173f5d0 --- /dev/null +++ b/dreamkas-opencart3.ocmod/upload/admin/view/template/extension/module/dreamkas.twig @@ -0,0 +1,120 @@ +{{ header }} +{{ column_left }} +
+ +
+ {% if error_warning %} +
{{ error_warning }} + +
+ {% endif %} +
+
+

{{ text_edit }}

+
+
+
+ +
+ +
+ + {% if error_access_token %} +
{{ error_access_token }}
+ {% endif %} +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ {% for type in paymenttypes %} +
+ +
+ {% endfor %} +
+
+
+ +
+ +
+ +
+
+
+
+
+
+
+{{ footer }} diff --git a/dreamkas-opencart3.ocmod/upload/catalog/controller/extension/module/dreamkas.php b/dreamkas-opencart3.ocmod/upload/catalog/controller/extension/module/dreamkas.php new file mode 100644 index 0000000..f39ffcf --- /dev/null +++ b/dreamkas-opencart3.ocmod/upload/catalog/controller/extension/module/dreamkas.php @@ -0,0 +1,120 @@ +load->language('extension/module/dreamkas'); + $order_id = $data[0]; + $query = $this->db->query("SELECT order_status_id FROM `" . DB_PREFIX . "order` o WHERE o.order_id = '" . (int) $order_id . "'"); + $status = $query->row['order_status_id']; + $query = $this->db->query("SELECT payment_code FROM `" . DB_PREFIX . "order` o WHERE o.order_id = '" . (int) $order_id . "'"); + $payment_code = $query->row['payment_code']; + + if ($status == $this->config->get('dreamkas_paid_order') && + in_array($payment_code, $this->config->get('dreamkas_payments_ids'))) + { + $this->load->model('checkout/order'); + $order_info = $this->model_checkout_order->getOrder($order_id); + $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_product WHERE order_id = '" . (int) $order_id . "'"); + $products = $query->rows; + $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_total WHERE order_id = '" . (int) $order_id . "' AND code = 'shipping' ORDER BY sort_order"); + $shipping = $query->rows; + $tax_type = $this->config->get('dreamkas_tax_type'); + $tax_sum = 0; + $items = array(); + foreach ($products as $product) { + $query = $this->db->query("SELECT dk_tax_type FROM " . DB_PREFIX . "product WHERE product_id = '" . (int) $product['product_id'] . "'"); + $dk_tax_type = $query->row; + $product_tax_type = empty($dk_tax_type['dk_tax_type']) ? $tax_type : $dk_tax_type['dk_tax_type']; + $items[] = array( + "name" => $product['name'], + "type" => "COUNTABLE", + "quantity" => $product['quantity'], + "price" => ($product['price'] + $product['tax']) * 100, + "priceSum" => ($product['total'] + $product['tax'] * $product['quantity']) * 100, + "tax" => "$product_tax_type", + "taxSum" => 0, //$product['tax']*100*$product['quantity'] + ); + $tax_sum += $product['tax'] * $product['quantity']; + } + + if (!empty($shipping)) { + $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "order_total WHERE order_id = '" . (int) $order_id . "' AND code = 'tax' ORDER BY sort_order"); + $tax_total = reset($query->rows); + if (!empty($tax_total['value'])) { + $shipping_tax = $tax_total['value'] - $tax_sum; + } else { + $shipping_tax = 0; + } + foreach ($shipping as $_shipping) { + if ($_shipping['value'] > 0) { + $items[] = array( + "name" => 'Доставка', + "type" => "COUNTABLE", + "quantity" => 1, + "price" => ($_shipping['value'] + $shipping_tax) * 100, + "priceSum" => ($_shipping['value'] + $shipping_tax) * 100, + "tax" => "$tax_type", + "taxSum" => 0, //$shipping_tax*100 + ); + } + } + } + + $request = array( + "deviceId" => $this->config->get('dreamkas_device_id'), + "type" => "SALE", + "timeout" => 180, + "taxMode" => $this->config->get('dreamkas_tax_mode'), + "positions" => $items, + "payments" => array( + array( + "sum" => $order_info['total'] * 100, + "type" => "CASHLESS", + ), + ), + "attributes" => array( + "email" => $order_info['email'], + "phone" => $order_info['telephone'], //"+71239994499" + ), + "total" => array( + "priceSum" => $order_info['total'] * 100, + ), + ); + + $ch = curl_init(); + $access_token = $this->config->get('dreamkas_access_token'); + curl_setopt($ch, CURLOPT_HTTPHEADER, array( + "Content-Type: application/json", + "Authorization: Bearer $access_token", + )); + curl_setopt($ch, CURLOPT_URL, "https://kabinet.dreamkas.ru/api/receipts"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HEADER, false); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($request)); + $response = curl_exec($ch); + curl_close($ch); + + if (!empty($response)) { + $response = json_decode($response, true); + if ((substr($response['status'], 0, 1) == 4)) { + $this->log->write('Dreamkas debug: ' . json_encode($response)); + } else { + $dk_date = empty($response['createdAt']) ? $response['completedAt'] : $response['createdAt']; + $query = $this->db->query("SELECT order_id FROM " . DB_PREFIX . "dreamkas WHERE order_id = '" . (int) $order_id . "'"); + $exist_order_id = $query->rows; + if (empty($exist_order_id)) { + $this->db->query("INSERT INTO `" . DB_PREFIX . "dreamkas` SET `order_id` = '" . (int) $order_id . "', `dk_id` = '" . $response['id'] . "', `dk_date` ='" . $dk_date . "', `dk_status` = '" . $response['status'] . "'"); + } else { + $this->db->query("UPDATE `" . DB_PREFIX . "dreamkas` SET `order_id` = '" . (int) $order_id . "', `dk_id` = '" . $response['id'] . "', `dk_date` ='" . $dk_date . "', `dk_status` = '" . $response['status'] . "' WHERE order_id = '" . (int) $order_id . "'"); + } + } + } + } + } + } + +}