From df7de315693a17a10ed64ee4528b64b6c81954e2 Mon Sep 17 00:00:00 2001 From: Ruslan Mavlyanov Date: Mon, 29 Apr 2019 15:00:38 +0300 Subject: [PATCH] V2.3 Different fixes. Update readme and translations (#36) * [NN2-136] Fetch phone num from billing address. Fixed type error handling. Fixing ACL * [NN2-136] Fixed transaction attempt registration. Removed SID from frontend URL * [NN2-136] Fixed statistics collection * [NN2-136] Updated readme. Added template for report email layout * [NN2-136] Added ability to set cron expressions manually. Fixed email sending error for Magento 2.3. * [NN2-136] Updated readme. * codestyle * [NN2-136] Fixed report sending by cron (undefined index). Added translations. Minor fixes. --- Api/Data/ItemInterface.php | 2 +- Api/Data/RequestInterface.php | 8 +- Controller/Adminhtml/Cheque/CheckStatus.php | 5 + Controller/Adminhtml/Cheque/Resend.php | 9 ++ Controller/Adminhtml/Logs/Clear.php | 2 +- Controller/Frontend/Callback.php | 2 +- Helper/Data.php | 5 +- Helper/Email.php | 2 +- Helper/Error.php | 7 +- Helper/Transaction.php | 15 +++ Helper/TransactionAttempt.php | 4 +- Model/Atol/Client.php | 2 +- Model/Atol/Item.php | 2 +- Model/Atol/Request.php | 4 +- Model/Atol/Vendor.php | 14 ++- Model/Queue/Consumer.php | 4 +- Model/Report.php | 18 ++-- Observer/Send.php | 9 ++ README.md | 100 ++++++++++++++++-- etc/acl.xml | 6 +- etc/adminhtml/system.xml | 19 +++- etc/config.xml | 2 + etc/crontab.xml | 4 +- i18n/ru_RU.csv | 53 ++++++++++ .../templates/email/detailed_statistics.phtml | 2 +- .../templates/email/kkm_report-mjml.mjml | 95 +++++++++++++++++ 26 files changed, 350 insertions(+), 45 deletions(-) create mode 100644 view/adminhtml/templates/email/kkm_report-mjml.mjml diff --git a/Api/Data/ItemInterface.php b/Api/Data/ItemInterface.php index 023d64a1..9dfb8d71 100644 --- a/Api/Data/ItemInterface.php +++ b/Api/Data/ItemInterface.php @@ -63,7 +63,7 @@ public function getTax(): string; * @param string $tax * @return $this */ - public function setTax(string $tax); + public function setTax($tax); /** * @return float diff --git a/Api/Data/RequestInterface.php b/Api/Data/RequestInterface.php index 24042fd0..c7111ed6 100644 --- a/Api/Data/RequestInterface.php +++ b/Api/Data/RequestInterface.php @@ -35,10 +35,10 @@ public function setSno(string $sno): self; public function getEmail(): string; /** - * @param string $email + * @param string|null $email * @return $this */ - public function setEmail(string $email): self; + public function setEmail($email): self; /** * @return string @@ -46,10 +46,10 @@ public function setEmail(string $email): self; public function getPhone(): string; /** - * @param string $phone + * @param string|null $phone * @return $this */ - public function setPhone(string $phone): self; + public function setPhone($phone): self; /** * @return \Mygento\Kkm\Api\Data\ItemInterface[] diff --git a/Controller/Adminhtml/Cheque/CheckStatus.php b/Controller/Adminhtml/Cheque/CheckStatus.php index 970c97f4..0114c46b 100644 --- a/Controller/Adminhtml/Cheque/CheckStatus.php +++ b/Controller/Adminhtml/Cheque/CheckStatus.php @@ -12,6 +12,11 @@ class CheckStatus extends \Magento\Backend\App\Action { + /** + * @see _isAllowed() + */ + const ADMIN_RESOURCE = 'Mygento_Kkm::cheque_checkstatus'; + /** @var \Mygento\Kkm\Helper\Data */ protected $kkmHelper; diff --git a/Controller/Adminhtml/Cheque/Resend.php b/Controller/Adminhtml/Cheque/Resend.php index e74998c1..64a25406 100644 --- a/Controller/Adminhtml/Cheque/Resend.php +++ b/Controller/Adminhtml/Cheque/Resend.php @@ -13,6 +13,11 @@ class Resend extends \Magento\Backend\App\Action { + /** + * @see _isAllowed() + */ + const ADMIN_RESOURCE = 'Mygento_Kkm::cheque_resend'; + /** @var \Mygento\Kkm\Helper\Data */ protected $kkmHelper; @@ -100,6 +105,10 @@ public function execute() $this->getMessageManager()->addErrorMessage($exc->getMessage()); $this->kkmHelper->error('Resend failed. Reason: ' . $exc->getMessage()); $this->errorHelper->processKkmChequeRegistrationError($entity, $exc); + } catch (\Throwable $thr) { + $this->getMessageManager()->addErrorMessage(__('Something went wrong. See log.')); + $this->kkmHelper->error('Resend failed. Reason: ' . $thr->getMessage()); + $this->errorHelper->processKkmChequeRegistrationError($entity, $thr); } finally { return $this->resultRedirectFactory->create()->setUrl( $this->_redirect->getRefererUrl() diff --git a/Controller/Adminhtml/Logs/Clear.php b/Controller/Adminhtml/Logs/Clear.php index 1e498ec0..ef0034df 100644 --- a/Controller/Adminhtml/Logs/Clear.php +++ b/Controller/Adminhtml/Logs/Clear.php @@ -64,7 +64,7 @@ public function execute() $this->getMessageManager()->addSuccessMessage( __('Logs have been cleared') ); - } catch (\Exception $exc) { + } catch (\Throwable $exc) { $this->getMessageManager()->addErrorMessage($exc->getMessage()); } diff --git a/Controller/Frontend/Callback.php b/Controller/Frontend/Callback.php index 92be148e..d1fadbc2 100644 --- a/Controller/Frontend/Callback.php +++ b/Controller/Frontend/Callback.php @@ -89,7 +89,7 @@ public function execute() ->sendResponse(); $result->setContents($entity->getIncrementId()); - } catch (\Exception $exc) { + } catch (\Throwable $exc) { $this->kkmHelper->error($exc->getMessage()); $this->kkmHelper->debug("Callback RAW: {$json}"); diff --git a/Helper/Data.php b/Helper/Data.php index 086f1c42..8918fc9c 100644 --- a/Helper/Data.php +++ b/Helper/Data.php @@ -20,11 +20,12 @@ class Data extends \Mygento\Base\Helper\Data /** * @param string $param + * @param string|null $scopeCode * @return string */ - public function getConfig($param, $scopeCode = NULL) + public function getConfig($param, $scopeCode = null) { - return parent::getConfig($this->getCode() . '/' . $param); + return parent::getConfig($this->getCode() . '/' . $param, $scopeCode); } /** diff --git a/Helper/Email.php b/Helper/Email.php index 5fe1da7f..aeed211d 100644 --- a/Helper/Email.php +++ b/Helper/Email.php @@ -77,7 +77,7 @@ public function setSender($email, $name) */ public function setRecipient($email) { - $this->recipient['email'] = $email; + $this->recipient = explode(',', $email); return $this; } diff --git a/Helper/Error.php b/Helper/Error.php index 11583b47..f2a12266 100644 --- a/Helper/Error.php +++ b/Helper/Error.php @@ -52,9 +52,9 @@ public function __construct( /** * Makes different notifications if cheque was not successfully sent to KKM * @param \Magento\Sales\Api\Data\EntityInterface $entity - * @param \Exception|null $exception + * @param \Throwable|null $exception */ - public function processKkmChequeRegistrationError($entity, \Exception $exception = null) + public function processKkmChequeRegistrationError($entity, \Throwable $exception = null) { try { $entityType = ucfirst($entity->getEntityType()); @@ -74,6 +74,7 @@ public function processKkmChequeRegistrationError($entity, \Exception $exception $fullMessage .= $uuid ? ". Transaction Id (uuid): {$uuid}" : ''; } $this->baseHelper->error($fullMessage); + $this->baseHelper->debug($exception->getTraceAsString()); //Show Admin Messages if ($this->baseHelper->getConfig('general/admin_notifications')) { @@ -92,7 +93,7 @@ public function processKkmChequeRegistrationError($entity, \Exception $exception $fullMessage ); $this->orderRepository->save($order); - } catch (\Exception $e) { + } catch (\Throwable $e) { $this->baseHelper->error($e->getMessage()); } } diff --git a/Helper/Transaction.php b/Helper/Transaction.php index 5c97c08a..d2ed4a55 100644 --- a/Helper/Transaction.php +++ b/Helper/Transaction.php @@ -93,6 +93,21 @@ public function __construct( $this->invoiceFactory = $invoiceFactory; } + /** + * @param CreditmemoInterface|InvoiceInterface $entity + * @param ResponseInterface $response + * @throws \Magento\Framework\Exception\LocalizedException + * @return \Magento\Sales\Api\Data\TransactionInterface + */ + public function registerTransaction($entity, ResponseInterface $response) + { + if ($entity instanceof InvoiceInterface) { + return $this->saveSellTransaction($entity, $response); + } + + return $this->saveRefundTransaction($entity, $response); + } + /** * @param \Magento\Sales\Api\Data\InvoiceInterface $invoice * @param ResponseInterface $response diff --git a/Helper/TransactionAttempt.php b/Helper/TransactionAttempt.php index 3ca4aab9..7a7f8378 100644 --- a/Helper/TransactionAttempt.php +++ b/Helper/TransactionAttempt.php @@ -72,7 +72,9 @@ public function getTrials(RequestInterface $request) public function registerAttempt(RequestInterface $request, $entityIncrementId, $orderId) { $attempt = $this->attemptRepository - ->getByEntityId($request->getOperationType(), $request->getSalesEntityId()); + ->getByEntityId($request->getOperationType(), $entityIncrementId); + + $this->kkmHelper->debug('Attempt found: ' . $attempt->getId(), $attempt->getData()); $trials = $attempt->getNumberOfTrials(); diff --git a/Model/Atol/Client.php b/Model/Atol/Client.php index 7f6052a9..048607bb 100644 --- a/Model/Atol/Client.php +++ b/Model/Atol/Client.php @@ -161,7 +161,7 @@ public function sendRefund($request): ResponseInterface $this->kkmHelper->debug('Response:', [$response]); } catch (VendorBadServerAnswerException $exc) { throw $exc; - } catch (\Exception $exc) { + } catch (\Throwable $exc) { throw new CreateDocumentFailedException( $exc->getMessage(), $response ?? null, diff --git a/Model/Atol/Item.php b/Model/Atol/Item.php index c7216d53..a075ff31 100644 --- a/Model/Atol/Item.php +++ b/Model/Atol/Item.php @@ -147,7 +147,7 @@ public function getTax(): string * @inheritdoc * @throws \Exception */ - public function setTax(string $tax) + public function setTax($tax) { if (!in_array($tax, Tax::getAllTaxes(), true)) { throw new \Exception("Incorrect tax {$tax} for Item {$this->getName()}"); diff --git a/Model/Atol/Request.php b/Model/Atol/Request.php index da367dc2..8ff367f3 100644 --- a/Model/Atol/Request.php +++ b/Model/Atol/Request.php @@ -109,7 +109,7 @@ public function getEmail(): string /** * @inheritdoc */ - public function setEmail(string $email): RequestInterface + public function setEmail($email): RequestInterface { $this->email = $email; @@ -127,7 +127,7 @@ public function getPhone(): string /** * @inheritdoc */ - public function setPhone(string $phone): RequestInterface + public function setPhone($phone): RequestInterface { $this->phone = $phone; diff --git a/Model/Atol/Vendor.php b/Model/Atol/Vendor.php index e3801a68..83fbec76 100644 --- a/Model/Atol/Vendor.php +++ b/Model/Atol/Vendor.php @@ -285,8 +285,8 @@ public function buildRequest($salesEntity): RequestInterface ->setPaymentObject($paymentObject); } - $telephone = $order->getShippingAddress() - ? $order->getShippingAddress()->getTelephone() + $telephone = $order->getBillingAddress() + ? (string) $order->getBillingAddress()->getTelephone() : ''; $request @@ -342,7 +342,10 @@ public function generateExternalId(EntityInterface $entity, $postfix = '') public function getCallbackUrl() { return $this->kkmHelper->getConfig('atol/callback_url') - ?? $this->urlHelper->getUrl('kkm/frontend/callback', ['_secure' => true]); + ?? $this->urlHelper->getUrl('kkm/frontend/callback', [ + '_secure' => true, + '_nosid' => true, + ]); } /** @@ -385,6 +388,7 @@ public function addCommentToOrder($entity, ResponseInterface $response, $txnId = * @throws CreateDocumentFailedException * @throws \Magento\Framework\Exception\LocalizedException * @throws \Magento\Framework\Exception\NoSuchEntityException + * @throws \Throwable * @return ResponseInterface|null */ private function sendRequest($request, $callback, $entity = null) @@ -413,12 +417,12 @@ private function sendRequest($request, $callback, $entity = null) $response = $this->apiClient->{$callback}($request); //Save transaction data - $txn = $this->transactionHelper->saveSellTransaction($entity, $response); + $txn = $this->transactionHelper->registerTransaction($entity, $response); $this->addCommentToOrder($entity, $response, $txn->getId() ?? null); //Mark attempt as Sent $this->attemptHelper->finishAttempt($attempt); - } catch (\Exception $e) { + } catch (\Throwable $e) { //Mark attempt as Error $this->attemptHelper->failAttempt($attempt, $e->getMessage()); diff --git a/Model/Queue/Consumer.php b/Model/Queue/Consumer.php index 6e1cb4a6..0f317f42 100644 --- a/Model/Queue/Consumer.php +++ b/Model/Queue/Consumer.php @@ -101,7 +101,7 @@ public function sendSellRequest($request) $request->setIgnoreTrialsNum(false); $this->publisher->publish(Processor::TOPIC_NAME_SELL, $request); - } catch (\Exception $e) { + } catch (\Throwable $e) { $entity = $this->requestHelper->getEntityByRequest($request); $this->errorHelper->processKkmChequeRegistrationError($entity, $e); } @@ -120,7 +120,7 @@ public function sendRefundRequest($request) $request->setIgnoreTrialsNum(false); $this->publisher->publish(Processor::TOPIC_NAME_REFUND, $request); - } catch (\Exception $e) { + } catch (\Throwable $e) { $entity = $this->requestHelper->getEntityByRequest($request); $this->errorHelper->processKkmChequeRegistrationError($entity, $e); } diff --git a/Model/Report.php b/Model/Report.php index 6fffa2ee..40afe8a0 100644 --- a/Model/Report.php +++ b/Model/Report.php @@ -101,6 +101,7 @@ public function getWeekStatistics() /** * @param string $from * @param string|null $to + * @throws \Magento\Framework\Exception\LocalizedException * @return \Mygento\Kkm\Model\Statistics */ public function getStatisticsByPeriod($from, $to = null) @@ -110,8 +111,7 @@ public function getStatisticsByPeriod($from, $to = null) } $searchCriteria = $this->searchCriteriaBuilder - ->addFilter('created_at', $from, 'gteq') - ->create(); + ->addFilter('created_at', $from, 'gteq'); return $this->collectStatistics($searchCriteria) ->setFromDate($from) @@ -119,14 +119,20 @@ public function getStatisticsByPeriod($from, $to = null) } /** - * @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria + * @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder * @throws \Magento\Framework\Exception\LocalizedException * @return \Mygento\Kkm\Model\Statistics */ - private function collectStatistics($searchCriteria) + private function collectStatistics($searchCriteriaBuilder) { - $transactions = $this->transactionRepo->getList($searchCriteria); - $transactionAttempts = $this->attemptRepository->getList($searchCriteria); + $transactions = $this->transactionRepo->getList( + $searchCriteriaBuilder + ->addFilter('kkm_status', null, 'neq') + ->create() + ); + $transactionAttempts = $this->attemptRepository->getList( + $searchCriteriaBuilder->create() + ); /** @var $statistics \Mygento\Kkm\Model\Statistics */ $statistics = $this->statisticsFactory->create(); diff --git a/Observer/Send.php b/Observer/Send.php index 930a59b0..99c1354e 100644 --- a/Observer/Send.php +++ b/Observer/Send.php @@ -13,6 +13,9 @@ use Magento\Sales\Api\Data\InvoiceInterface; use Mygento\Kkm\Model\VendorInterface; +/** + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ class Send implements ObserverInterface { /** @var \Mygento\Kkm\Helper\Data */ @@ -142,6 +145,12 @@ private function proceed($entity) ); $this->errorHelper->processKkmChequeRegistrationError($entity, $exc); + } catch (\Throwable $thr) { + $this->messageManager->addErrorMessage( + __('Cheque has not been successfully registered on KKM vendor side. See log.') + ); + $this->kkmHelper->error('Resend failed. Reason: ' . $thr->getMessage()); + $this->errorHelper->processKkmChequeRegistrationError($entity, $thr); } } diff --git a/README.md b/README.md index 361e5d7f..a1a86942 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,101 @@ [![Latest Stable Version](https://poser.pugx.org/mygento/module-kkm/v/stable)](https://packagist.org/packages/mygento/module-kkm) [![Total Downloads](https://poser.pugx.org/mygento/module-kkm/downloads)](https://packagist.org/packages/mygento/module-kkm) -# Модуль интеграции фискальных кассовых аппаратов для 54 ФЗ для Magento 1/2 +# Модуль интеграции АТОЛ онлайн для Magento 1/2 -Модуль разрабатывается для полной поддержки требований 54 ФЗ интернет-магазинами на Magento 1 и 2 +Модуль разрабатывается для полной поддержки требований 54 ФЗ интернет-магазинами на Magento 1 и 2 для сервиса АТОЛ онлайн. +Модуль поддерживает версию сервиса АТОЛ v4 (ФФД 1.05). -На первом этапе реализуется поддержка касс АТОЛ 42 ФС. Данное решение будет использовать платежные центры Яндекс Касса, Uniteller. +## Функционал модуля -В дальнешейшем будут добавлены решения следующих вендоров: +### Передача данных в АТОЛ +* отправляет данные о счете/возврате в АТОЛ: + * автоматически при создании счета (настраивается в конфигурации) + * автоматически при создании возврата (настраивается в конфигурации) + * вручную одной из консольных команд (см. ниже) + * вручную из админки кнопкой на странице Счета или Возврата -* СКБ Контур -* Эвотор (Сбербанк/Альфабанк) +### Получение данных из АТОЛ +* получает из АТОЛ данные о статусе регистрации счета/возврата + * автоматически (настраивается в конфигурации). После обработки данных АТОЛ отправляет реультат обратно (колбек). По умолчанию URL: http://shop.ru/kkm/frontend/callback + * крон задачей для проверки статусов + * вручную из админки кнопкой на странице Счета или Возврата + * консольной командой `mygento:atol:update {$uuid}` + +### Процесс отправки данных в АТОЛ +1. На основании сущности Invoice или Creditmemo формируется объект `Mygento\Kkm\Api\Data\RequestInterface`. + 1.1. При асинхронной передаче - объект помещается в очередь (см. Magento Queue Framework) + 1.2. При синхронной передаче - передается классу `Vendor` для отправки + +2. Регистрируется попытка отправки данных. Создается сущность `Api\Data\TransactionInterface\TransactionAttemptInterface` со статусом `NEW` (1) + +3. Осуществляется передача данных в виде JSON в АТОЛ. + 3.1. В случае **УСПЕШНОЙ** передачи (один из HTTP статусов `[200, 400, 401]`) + * создается транзакция - сущность `Magento\Sales\Api\Data\TransactionInterface` в который записываются UUID и все данные о передаче. В админке это грида Sales -> Transactions. + * Сущность попытки отправки `TransactionAttemptInterface` получает статус `Sent` (2) + * Создается комментарий к заказу + + 3.2. В случае **НЕУСПЕШНОЙ** передачи (статусы отличные от `[200, 400, 401]`, отсутствие ответа от сервера, некорректные данные в инвойсе или возврате) + * Сущность попытки отправки `TransactionAttemptInterface` получает статус `Error` (3) + * Создается комментарий к заказу с описанием причины ошибки + * Заказ получает статус "KKM Failed" + * Если выброшено исключение `VendorBadServerAnswerException` (сервер АТОЛ не отвечает и еще в некоторых случаях) и включена асинхронная передача - то отправка будет снова помещена в очередь. + + +### Отчеты +Модуль отправляет отчеты об отправленных данных в АТОЛ на емейл (в конфиге). Неуспешные отправки отображаются в этом же письме с доп.деталями. Также этот отчет можно посмотреть в консоли. + +* Еженедельный (за прошлую неделю), Ежедневный (за текущий день), Ежедневный (за вчерашний день) +* Верстка письма. Файл `view/adminhtml/templates/email/kkm_report-mjml.mjml` содержит верстку письма. Редактируется с помощью сервиса https://mjml.io/ + + +### Поддержка новых версий сервиса АТОЛ Онлайн +Модуль поддерживал версии сервиса v3 и v4. Если выйдет новая версия, необходимо сделать след.шаги: +1. создать class RequestForVersionX наследник абстрактного класса Request +2. релилизовать его JSON представление - метод jsonSerialize() +3. добавить создание объекта реквеста в Mygento\Kkm\Model\Atol\RequestFactory +4. добавить инфу о новой версии сервиса в сурс модель Mygento\Kkm\Model\Source\ApiVersion + +### Использование очередей +* отправка сообщений в АТОЛ может осущетвляться в двух режимах: + * синхронный (сразу после сохранения сущности или ручной отправки); + * асинхронно (через нативный механизм очередей сообщений Magento). +* режим работы настраивается в конфигурации + +### Ручная отправка данных в АТОЛ +* Отправка данных на странице сущности +* Отправка данных консольной командой с указанием IncrementId сущности + +### Логирование сообщений +* Модуль логирует (при включенном режиме Debug в Stores -> Configuration -> Mygento Extensions -> Extensions and Support) все запросы (и ответы) АТОЛ. +* Лог запросов доступен на странице конфигурации модуля + +## Список Rewrite +нет + +## Список событий и плагинов, Описание действий и причины + +### События +* **sales_order_invoice_save_commit_after**: + * отправляет данные по инвойсу после его сохранения. +* **sales_order_creditmemo_save_commit_after**: + * отправляет данные по возврату после сохранения. + +### Плагины +* before плагин `ExtraSalesViewToolbarButtons` на метод `Magento\Backend\Block\Widget\Button\Toolbar::pushButtons` добавляет кнопки Отправки в АТОЛ и кнопку проверки статуса на страницу сущности в админке + +## Список доступных реализованных API +нет + +## Список встроенных тестов, что и как они тестируют +нет + +## Cron-процессы +* Отчет: job отправки отчета. Частота конфигурируется в админке на стр. настроек модуля. По умолчанию ежедневно в 00:07 +* Обновление статуса: job обновляет статусы транзакций, у которых статус `wait`. По умолчанию каждую минуту + +## Консольные команды +* `mygento:atol:report` - Отображает отчет. Аргументы: today, yesterday, week +* `mygento:atol:refund` - Отправляет возврат. Аргументы: IncrementId сущности +* `mygento:atol:sell` - Отправляет счет. Аргументы: IncrementId сущности +* `mygento:atol:update` - Запрашивает данные о статусе. Аргументы: UUID или "all". Если указать 'all' - обновит все зависшие (`wait`) отправки diff --git a/etc/acl.xml b/etc/acl.xml index 2be18c4b..e99ddab6 100644 --- a/etc/acl.xml +++ b/etc/acl.xml @@ -12,13 +12,13 @@ - + + - - + diff --git a/etc/adminhtml/system.xml b/etc/adminhtml/system.xml index 54af1204..54884b59 100644 --- a/etc/adminhtml/system.xml +++ b/etc/adminhtml/system.xml @@ -15,7 +15,7 @@ separator-top mygento - Mygento_Base::config + Mygento_Kkm::config @@ -150,6 +150,12 @@ Magento\Config\Model\Config\Source\Yesno + + + + 1 + + Magento\Config\Model\Config\Source\Yesno @@ -179,7 +185,7 @@ - validate-email + validate-emails You can specify several emails separated by comma 1 @@ -187,6 +193,7 @@ + validate-email 1 @@ -199,6 +206,14 @@ 1 + + + + + 1 + + + diff --git a/etc/config.xml b/etc/config.xml index b146fe0c..d2db699d 100644 --- a/etc/config.xml +++ b/etc/config.xml @@ -18,6 +18,7 @@ no-reply@example.com yesterday + 7 0 * * * 0 @@ -29,6 +30,7 @@ 10 1 1 + * * * * * diff --git a/etc/crontab.xml b/etc/crontab.xml index 68e65482..450d0e49 100644 --- a/etc/crontab.xml +++ b/etc/crontab.xml @@ -2,10 +2,10 @@ - * * * * * + mygento_kkm/general/update_cron_expr - * * * * * + mygento_kkm/report/cron_expr_to_send diff --git a/i18n/ru_RU.csv b/i18n/ru_RU.csv index e69de29b..ab4deee0 100644 --- a/i18n/ru_RU.csv +++ b/i18n/ru_RU.csv @@ -0,0 +1,53 @@ +Kkm transaction status was updated. Status: %1,Статус ККМ транзакции был обновлен. Статус: %1 +Can not check status of the transaction.,Невозможно проверить статус транзакции. +Invalid request. Check logs.,Некорректный запрос. Проверьте логи. +Something went wrong. See log.,Что-то полшло не так. Проверьте логи. +Logs have been cleared,Логи очищены +Callback received. Status: %1. Uuid: %2,Получен колбек. Статус: %1. Uuid: %2 +Callback received: %1,Callback received: %1 +KKM Cheque sending error. Order: %1,Ошибка отправки чека. Заказ: %1 +"Response from Atol does not contain valid token value. Response: ","Корректный токен получен не был. Response: " +Creditmemo is sent. Uuid: %1,Возврат отправлен. Uuid: %1 +Invoice is sent. Uuid: %1,Заказ отправлен. Uuid: %1 +Response from Atol is not valid. Response: %1,Ответ от АТОЛ невалидный. Response: %1 +Receipt is not registered. Response: %1,Чек не был зарегистрирован. Response: %1 +[ATOL] Cheque was sent. %1,[ATOL] Чек отправлен. %1 +Item %1 has undefined tax.,Item %1 has undefined tax. +Can not send data to Atol. Reason: %1,Невозможно отправить данные в АТОЛ. Reason: %1 +Weekly (This week),Еженедельный (Текущая неделя) +Daily (Yesterday),Ежедневный (Вчера) +Daily (Today),Ежедневный (Сегодня) +Without VAT,Без НДС +Cheque has not been successfully registered on KKM vendor side. Reason: %1,Чек не был зарегистрирован ККМ вендором. Причина: %1 +Cheque has not been successfully registered on KKM vendor side. See log.,Чек не был зарегистрирован ККМ вендором. См.логи. +Send to KKM,Отправить в ККМ +Check status in KKM,Проверить ККМ статус +Kkm Integration,Kkm Интеграция +Atol Settings,Настройки Atol +Atol Group Code,Код группы +INN,ИНН +Payment Address,Платежный адрес +SNO,СНО +API Version,Версия API +Test mode,Тестовый режим +Tax all,Налог для всех +Tax options,Значение налога +Attribute for product tax,Атрибут продукта с налогом +List of payment methods,Список разрешенных платежных методов +Auto send after invoice,Автоматическая отправка счета +Auto send after refund,Автоматическая отправка возврата +Shipping tax code,Налог на доставку +Use default shipping name,Имя доставки по умолчанию +Custom shipping name,Имя доставки +Async processing,Асинхронная отправка +Through queue (Magento Queue Framework),Через механизм очередей (Magento Queue Framework) +Max trials to resend,Макс кол-во попыток отправки +Update by cron,Обновлять статусы по CRON +Update frequency,Частота обновления +Show notifications in Dashboard,Показывать уведомления в панели управления +Report Settings,Настройки отчетов +Email template,Шаблон письма +"You can specify several emails separated by comma","Несколько адресов, разделенных запятой" +Sender email,Email отправителя +Period,Период +Frequency (Cron expression),Частота (CRON) \ No newline at end of file diff --git a/view/adminhtml/templates/email/detailed_statistics.phtml b/view/adminhtml/templates/email/detailed_statistics.phtml index 03b7c5f6..09fa6057 100644 --- a/view/adminhtml/templates/email/detailed_statistics.phtml +++ b/view/adminhtml/templates/email/detailed_statistics.phtml @@ -52,7 +52,7 @@ $notSent = array_merge($statistics->getFails(), $statistics->getUnknowns(), $sta $incrementId = $additional[Transaction::INCREMENT_ID_KEY] ?? null; $message = isset($additional[Transaction::ERROR_MESSAGE_KEY]) ? $additional[Transaction::ERROR_MESSAGE_KEY] - : $additional[Transaction::RAW_RESPONSE_KEY]; + : ($additional[Transaction::RAW_RESPONSE_KEY] ?? ''); $message = wordwrap($message, 50); ?> diff --git a/view/adminhtml/templates/email/kkm_report-mjml.mjml b/view/adminhtml/templates/email/kkm_report-mjml.mjml new file mode 100644 index 00000000..2cb840c2 --- /dev/null +++ b/view/adminhtml/templates/email/kkm_report-mjml.mjml @@ -0,0 +1,95 @@ + + + + + + + Статистика + + + + + + + + От: + + + До: + + + + + + + + + # + Статус + Количество + + + 1 + Неотправленных чеков + 3 + + + 2 + Чеков в ожидании + 4 + + + 3 + Успешно отправленных + 7 + + + + + + + + + + + + Детали + + + + + + + + Дата + UUID + Операция + IncrementId + Сообщение + + + 1 + Неотправленных чеков + 3 + 3 + 3 + + + + + + + + + + + + + + + +