From 6f5fdb19c094681a3d1b91dc29b4a772c72b5aa1 Mon Sep 17 00:00:00 2001 From: AnthonyAxenov Date: Mon, 9 Sep 2019 23:17:39 +0800 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=20-=20=D0=BE=D1=82=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=82=D1=83=D1=81=D0=B0=20=D1=84=D0=B8=D1=81=D0=BA=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8.=20=D0=92=D0=B5=D1=81?= =?UTF-8?q?=D1=8C=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B2=D1=8B=D0=B9=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BB=D0=B6=D0=B5=D0=BD=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D1=8C.=20=D0=92=D0=B0=D0=B6=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2?= =?UTF-8?q?=20README=20+=20LICENSE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 4 +- README.md | 54 +++--- dreamkas-opencart-3.ocmod.zip | Bin 0 -> 13309 bytes dreamkas-opencart3.ocmod.zip | Bin 12830 -> 0 bytes dreamkas-opencart3.ocmod/install.xml | 170 ------------------ .../template/extension/module/dreamkas.tpl | 127 ------------- .../template/extension/module/dreamkas.twig | 120 ------------- .../controller/extension/module/dreamkas.php | 120 ------------- src/install.xml | 164 +++++++++++++++++ .../controller/extension/module/dreamkas.php | 93 +++++++--- .../ru-ru/extension/module/dreamkas.php | 0 .../language/russian/module/dreamkas.php | 39 ++++ .../template/extension/module/dreamkas.twig | 127 +++++++++++++ .../controller/extension/module/dreamkas.php | 123 +++++++++++++ 14 files changed, 553 insertions(+), 588 deletions(-) create mode 100644 dreamkas-opencart-3.ocmod.zip delete mode 100644 dreamkas-opencart3.ocmod.zip delete mode 100644 dreamkas-opencart3.ocmod/install.xml delete mode 100644 dreamkas-opencart3.ocmod/upload/admin/view/template/extension/module/dreamkas.tpl delete mode 100644 dreamkas-opencart3.ocmod/upload/admin/view/template/extension/module/dreamkas.twig delete mode 100644 dreamkas-opencart3.ocmod/upload/catalog/controller/extension/module/dreamkas.php create mode 100644 src/install.xml rename {dreamkas-opencart3.ocmod => src}/upload/admin/controller/extension/module/dreamkas.php (65%) rename {dreamkas-opencart3.ocmod => src}/upload/admin/language/ru-ru/extension/module/dreamkas.php (100%) create mode 100644 src/upload/admin/language/russian/module/dreamkas.php create mode 100644 src/upload/admin/view/template/extension/module/dreamkas.twig create mode 100644 src/upload/catalog/controller/extension/module/dreamkas.php diff --git a/LICENSE b/LICENSE index 5093005..1d1b842 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,9 @@ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 - Copyright (C) 2018 Anthony Axenov (Антон Аксенов) + Copyright (C) 2018 Anthony Axenov (Антон Аксенов) , + Alexey Kopylov (Алексей Копылов) , + LLC Alt-team (ООО "Альт-тим") Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long diff --git a/README.md b/README.md index aed310d..4e761c5 100644 --- a/README.md +++ b/README.md @@ -2,41 +2,31 @@ ## Содержимое репозитория -- `./dreamkas-opencart3.ocmod/` - директория с исходным кодом модифицированного мной модуля -- `./dreamkas-opencart3.ocmod.zip` - модифицированный модуль, готовый к установке +- `./src/` - директория с исходным кодом модифицированного мной модуля +- `./dreamkas-opencart-3.ocmod.zip` - модифицированный модуль, готовый к установке - `./dreamkas-f opencart.ocmod.zip` - исходный модуль для OpenCart 2.3, на котором основана данная модификация ## Описание Модификация тестировалась на **OpenCart 3.0.2.0**. + Модуль устанавливается, удаляется, настройки сохраняются, читаются. -Судя по отзывам ([первый](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), [второй](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` - -Этот файл я не трогал. -Я лишь восстановил возможность установить, удалить и настроить модуль. +Вся основная логика модуля прописана здесь: `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)_. +Основано на модуле _[dreamkas-f opencart.ocmod.zip](https://help.dreamkas.ru/hc/ru/article_attachments/115010763145/dreamkas-f_opencart.ocmod.zip)_ от команды alt-team.ru. -Этот архив предоставляется самими сотрудниками Dreamkas. -Он включен в репозиторий для истории. +Этот архив предоставляется самими сотрудниками Dreamkas. Он включен в репозиторий для истории. -Ниже вкратце описаны мои правки, но чтобы узнать детальные изменения, то можете заморочиться с 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`) +В этом устаревшем модуле до сих пор существует НДС 18/180. + +**Важно знать, что с 1 января 2019 эти ставки были заменены на НДС 20/120!** ## Полезные ссылки @@ -54,9 +44,10 @@ ЛЮБЫЕ МАНИПУЛЯЦИИ С МОДУЛЕМ — НА ВАШ СТРАХ И РИСК. -Я вижу, что люди используют мою модификацию. Но у меня нет никакого интереса и необходимости в этом. Многие вещи об OpenCart, продуктах Dreamkas и этом модуле уже забыты. Поэтому, и поскольку проект изначально не мой, лично я развивать его точно не буду. +У меня нет возможности полноценно проверить насколько качественно работает этот модуль: для этого нужны реальные заказы и покупки. +Проект, в рамках которого я работал над этим модулем, я больше не поддерживаю. -Этот репозиторий появился только потому, что на фоне наплевательского отношения со стороны Dreamkas мне случайно удалось сделать из совсем нерабочей вещи почти рабочую. +У меня нет никакого интереса и необходимости в этом. Многие вещи об OpenCart, продуктах Dreamkas и этом модуле уже забыты. Поэтому, и поскольку проект изначально не мой, лично я развивать его точно не буду. Берите и используйте. Не работает — штош. Если у вас есть какие-то доработки — pull-requests are welcome. Но лучше сделайте форк этого репозитория и развивайте проект дальше самостоятельно. @@ -65,14 +56,19 @@ [WTFPL](LICENSE) Аргументирую: + 1. Компания Dreamkas распространяет свои модули без какой-либо лицензии. -2. [Код этих модулей не был написан компанией Dreamkas](https://help.dreamkas.ru/hc/ru/articles/115005504689/comments/360000156078), а в этом случае исключительные авторские права Dreamkas на этот код должны быть оговорены только в рамках правовых отношений с подрядчиком. +2. [Код модуля был написан командой alt-team, а не компанией Dreamkas](https://help.dreamkas.ru/hc/ru/articles/115005504689/comments/360000156078). В этом случае исключительные авторские права Dreamkas на этот код должны быть оговорены только в рамках правовых отношений с командой alt-team. 3. Этот модуль находится в открытом доступе в разделе поддержки Dreamkas. Ни [лицензионное соглашение](https://dreamkas.ru/content/kluch-oferta.pdf), ни [договор-оферта](https://dreamkas.ru/content/dogovor-oferta-clients.pdf), публично представленные на сайте Dreamkas: - * не содержат условий использования, изменения и распространения пользователями этого модуля; - * неприменимы для этого случая (см. п. 2) + - не содержат условий использования, изменения и распространения пользователями этого модуля; + - неприменимы для этого случая (см. п. 2) +4. [Политика обновлений компании alt-team](https://www.alt-team.ru/upgrade-policy.html) не распространяется на модуль интеграции Dreamkas и Opencart, т.к. этот модуль не продаётся на их сайте; +5. В исходном коде модуля нигде прямо не указан копирайт в соответствии со статьёй 1271 ГК РФ. Исходя из этого, делаю выводы: -1. Компания Dreamkas никоим образом не заявляет о своих правах на код модуля, об условиях его использования, распространения и изменения. Поэтому я вправе сделать это самостоятельно, так как код был изменён мной. -2. **[Лицензия WTFPL v2](LICENSE)** как никакая другая лучше подходит для этого случая. -Я готов обсудить вопросы лицензии и изменить условия, если вам есть что сказать по существу. +1. Компания Dreamkas и команда alt-team никоим образом не заявляют о своих правах на код модуля, об условиях его использования, распространения и изменения. Поэтому я вправе сделать это самостоятельно. +2. **[Лицензия WTFPL v2](LICENSE)** как никакая другая лучше подходит для этого случая. +3. Компания Альт-тим должна быть упомянута в тексте лицензии среди прочих авторов исходного кода, т.к. в файле `dreamkas-f opencart.ocmod.zip/install.xml` встречается её упоминание. + +Я готов обсудить и изменить эти условия, если вам есть что сказать по существу. diff --git a/dreamkas-opencart-3.ocmod.zip b/dreamkas-opencart-3.ocmod.zip new file mode 100644 index 0000000000000000000000000000000000000000..eee793051c9362391f4e1aba7e42dfa27fedb790 GIT binary patch literal 13309 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 V$NvBTn0G(2cmLTFNB;fl{{WjePxk-- literal 0 HcmV?d00001 diff --git a/dreamkas-opencart3.ocmod.zip b/dreamkas-opencart3.ocmod.zip deleted file mode 100644 index 44fe04453a9e77c6c134065ca512f9fc3235bf01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12830 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
`Dgs6irq=CL|MDpRjnsW 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 diff --git a/dreamkas-opencart3.ocmod/install.xml b/dreamkas-opencart3.ocmod/install.xml deleted file mode 100644 index 75a4e14..0000000 --- a/dreamkas-opencart3.ocmod/install.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - 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/view/template/extension/module/dreamkas.tpl b/dreamkas-opencart3.ocmod/upload/admin/view/template/extension/module/dreamkas.tpl deleted file mode 100644 index 444c898..0000000 --- a/dreamkas-opencart3.ocmod/upload/admin/view/template/extension/module/dreamkas.tpl +++ /dev/null @@ -1,127 +0,0 @@ - -
- -
- -
- -
- -
-
-

-
-
-
-
- -
- - -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
- -
- -
- -
-
- -
- -
-
- -
- -
- -
-
-
- - -
- -
- -
-
-
-
-
-
-
- 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 deleted file mode 100644 index 173f5d0..0000000 --- a/dreamkas-opencart3.ocmod/upload/admin/view/template/extension/module/dreamkas.twig +++ /dev/null @@ -1,120 +0,0 @@ -{{ 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 deleted file mode 100644 index f39ffcf..0000000 --- a/dreamkas-opencart3.ocmod/upload/catalog/controller/extension/module/dreamkas.php +++ /dev/null @@ -1,120 +0,0 @@ -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 . "'"); - } - } - } - } - } - } - -} diff --git a/src/install.xml b/src/install.xml new file mode 100644 index 0000000..2406835 --- /dev/null +++ b/src/install.xml @@ -0,0 +1,164 @@ + + + Dreamkas 3.x + Dreamkas 3.x + 1.02 + Anthony Axenov, Alexey Kopylov (based on code by alt-team.ru) + https://github.com/anthonyaxenov/dreamkas-opencart-3 + + + + {{ entry_price }}]]> + + +
+ +
+ + ]]> +
+
+
+ + + 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'] = ''; + } + ]]> + + + + + + {{ column_action }}]]> + Статус фискализации]]> + + + {{ order.date_modified }}]]> + {{order.dk_status}}]]> + + + + + {{ text_affiliate }} + ]]> + + {{ entry_dk_status }} +{% if dk_status %} {{dk_status }} {%endif%} + + + + ]]> + + + + + + 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('date_format_short'), strtotime($order_info['date_added']));]]> + 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/src/upload/admin/controller/extension/module/dreamkas.php similarity index 65% rename from dreamkas-opencart3.ocmod/upload/admin/controller/extension/module/dreamkas.php rename to src/upload/admin/controller/extension/module/dreamkas.php index be55078..47a846d 100644 --- a/dreamkas-opencart3.ocmod/upload/admin/controller/extension/module/dreamkas.php +++ b/src/upload/admin/controller/extension/module/dreamkas.php @@ -1,8 +1,10 @@ load->language('extension/module/dreamkas'); $this->document->setTitle($this->language->get('heading_title')); $this->load->model('setting/setting'); @@ -10,10 +12,21 @@ class ControllerExtensionModuleDreamkas extends Controller { 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')); + //$this->response->redirect($this->url->link('extension/extension', 'token=' . $this->session->data['token'], 'SSL')); + $this->response->redirect($this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module', true)); } - + /* + if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) { + if (!isset($this->request->get['module_id'])) { + $this->model_extension_module->addModule('dreamkas', $this->request->post); + } else { + $this->model_extension_module->editModule($this->request->get['module_id'], $this->request->post); + } + //$this->cache->delete('product'); + $this->session->data['success'] = $this->language->get('text_success'); + $this->response->redirect($this->url->link('extension/extension', 'token=' . $this->session->data['token'] . '&type=module', true)); + } + */ $data['heading_title'] = $this->language->get('heading_title'); $data['text_edit'] = $this->language->get('text_edit'); $data['text_enabled'] = $this->language->get('text_enabled'); @@ -37,7 +50,15 @@ class ControllerExtensionModuleDreamkas extends Controller { $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'); - + /* + fnr($this); + $data['entry_name'] = $this->language->get('entry_name'); + $data['entry_limit'] = $this->language->get('entry_limit'); + $data['entry_image'] = $this->language->get('entry_image'); + $data['entry_width'] = $this->language->get('entry_width'); + $data['entry_height'] = $this->language->get('entry_height'); + $data['entry_status'] = $this->language->get('entry_status'); + */ $data['button_save'] = $this->language->get('button_save'); $data['button_cancel'] = $this->language->get('button_cancel'); @@ -66,14 +87,14 @@ class ControllerExtensionModuleDreamkas extends Controller { ); $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) + 'href' => $this->url->link('marketplace/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); + $data['cancel'] = $this->url->link('marketplace/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']); @@ -124,14 +145,40 @@ class ControllerExtensionModuleDreamkas extends Controller { //Get payments $this->load->model('setting/extension'); - $paymenttypes = $this->model_setting_extension->getInstalled('payment'); + $extensions = $this->model_setting_extension->getInstalled('payment'); + foreach ($extensions as $key => $value) { + if (!is_file(DIR_APPLICATION . 'controller/extension/payment/' . $value . '.php') && !is_file(DIR_APPLICATION . 'controller/payment/' . $value . '.php')) { + $this->model_extension_extension->uninstall('payment', $value); + unset($extensions[$key]); + } + } - foreach ($paymenttypes as $type) { - $this->load->language('extension/payment/' . $type, 'extension'); - $data['paymenttypes'][] = array( - 'code' => $type, - 'name' => $this->language->get('extension')->get('heading_title'), - ); + $data['extensions'] = array(); + + // Compatibility code for old extension folders + $files = glob(DIR_APPLICATION . 'controller/{extension/payment,payment}/*.php', GLOB_BRACE); + if ($files) { + foreach ($files as $file) { + $extension = basename($file, '.php'); + $this->load->language('extension/payment/' . $extension); + $text_link = $this->language->get('text_' . $extension); + if ($text_link != 'text_' . $extension) { + $link = $this->language->get('text_' . $extension); + } else { + $link = ''; + } + $data['extensions'][] = array( + 'name' => $this->language->get('heading_title'), + 'code' => $extension, + 'link' => $link, + 'status' => $this->config->get($extension . '_status') ? $this->language->get('text_enabled') : $this->language->get('text_disabled'), + 'sort_order' => $this->config->get($extension . '_sort_order'), + 'install' => $this->url->link('extension/extension/payment/install', 'user_token=' . $this->session->data['user_token'] . '&extension=' . $extension, true), + 'uninstall' => $this->url->link('extension/extension/payment/uninstall', 'user_token=' . $this->session->data['user_token'] . '&extension=' . $extension, true), + 'installed' => in_array($extension, $extensions), + 'edit' => $this->url->link('extension/payment/' . $extension, 'user_token=' . $this->session->data['user_token'], true) + ); + } } if (isset($this->request->post['dreamkas_status'])) { @@ -145,7 +192,8 @@ class ControllerExtensionModuleDreamkas extends Controller { $this->response->setOutput($this->load->view('extension/module/dreamkas', $data)); } - protected function validate() { + protected function validate() + { if (!$this->user->hasPermission('modify', 'extension/module/dreamkas')) { $this->error['warning'] = $this->language->get('error_permission'); } @@ -161,7 +209,8 @@ class ControllerExtensionModuleDreamkas extends Controller { return !$this->error; } - public function install() { + 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(" @@ -173,12 +222,14 @@ class ControllerExtensionModuleDreamkas extends Controller { 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 ''"); + $this->db->query(" + ALTER TABLE `" . DB_PREFIX . "product` ADD `dk_tax_type` VARCHAR(50) NOT NULL DEFAULT '' + "); } - public function uninstall() { + 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/src/upload/admin/language/ru-ru/extension/module/dreamkas.php similarity index 100% rename from dreamkas-opencart3.ocmod/upload/admin/language/ru-ru/extension/module/dreamkas.php rename to src/upload/admin/language/ru-ru/extension/module/dreamkas.php diff --git a/src/upload/admin/language/russian/module/dreamkas.php b/src/upload/admin/language/russian/module/dreamkas.php new file mode 100644 index 0000000..f4aa231 --- /dev/null +++ b/src/upload/admin/language/russian/module/dreamkas.php @@ -0,0 +1,39 @@ + + +
+ {% if error_warning %} +
+ {{ error_warning }} + +
+ {% endif %} +
+
+

+ {{text_edit}} +

+
+
+
+ +
+ +
+ + {% if error_access_token %} +
{{error_access_token}}
+ {% endif %} +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+ {% for type in extensions %} +
+ +
+ {% endfor %} +
+
+
+ +
+ +
+ +
+
+ +
+
+
+
+ +{{ footer }} diff --git a/src/upload/catalog/controller/extension/module/dreamkas.php b/src/upload/catalog/controller/extension/module/dreamkas.php new file mode 100644 index 0000000..fa6f231 --- /dev/null +++ b/src/upload/catalog/controller/extension/module/dreamkas.php @@ -0,0 +1,123 @@ +session->data, $route, $data); + if (!empty($data[0])) { + $this->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']; + // fn_write_r($data, $status, $this->config->get('dreamkas_paid_order'), $payment_code, $this->config->get('dreamkas_payments_ids')); + // if (in_array($status, $this->config->get('sms_alert_processing_status'))) { + 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 + ); + } + } + } + // fn_write_die($order_id, $tax_sum, $query, $items, $shipping); + $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 + ) + ); + // fn_write_die($request, $products, $shipping, $order_info); + $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); + // $response = json_decode('{"id": "5956889136fdd7733f19cfe6","createdAt": "2017-06-20 12:01:47.990Z","status": "PENDING"}', 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 . "'"); + } + } + } + } + } + } +}