CMS Bitrix отлично сочетается с Федеральным законом 54 (ФЗ-54). И встроенные механизмы позволяют связывать ККТ с интернет магазином.
Но часто стандартного механизма заложенного в Битрикс может не хватать и для этого есть специальные события, которые позволяют переопределить методы и функции.
Рассмотрим следующий пример:
1. У нас есть ККТ АТОЛ 30Ф и он синхронизирован с интернет магазином на Битрикс.
2. ККТ передаёт данные в ОФД «Ярус»
3. Битрикс отправляет чеки покупателю через Email
В версии Битрикс «Управление сайтом» 17.0.10 не может формировать корректную ссылку на чек для ОФД «Ярус», клиенту приходит письмо с заголовком «Ссылка на чек», но ссылки там нет(в теле письма).
Если заглянуть в исходники «Битрикс», то действительно там и намёка нет на то что бы была возможность получить ссылку от текущего ОФД. Для решения задачи можно взять и переопределить событие связанное с печатью чека.
Из документации «OnPrintableCheckSend — Событие позволяет переопределить стандартный механизм отправки уведомления о печати чека. » и в качестве примера указан следующий код
AddEventHandler("sale", "OnPrintableCheckSend", "PrintableCheckSend"); function PrintableCheckSend() { /* Отправка чека по СМС */ $event = new Bitrix\Main\EventResult(Bitrix\Main\EventResult::SUCCESS); return $event; }
Что на практике получается для переопределения метода отправки:
AddEventHandler("sale", "OnPrintableCheckSend", "zixnruYarusOfdSent"); function zixnruYarusOfdSent($order) { include_once $_SERVER["DOCUMENT_ROOT"] . '/bitrix/php_interface/init_functions/checkyarusofd.php'; $objOfd = new CheckYarusOFD(); $objOfd->sentEmailUser($order); $event = new Bitrix\Main\EventResult(Bitrix\Main\EventResult::SUCCESS); return $event; }
На самом деле в функцию zixnruYarusOfdSent можно передать два параметра, это объект оплаты order и данные о чеке check. Но в текущем примере выбран не рациональный метод с дополнительными запросами в классе CheckYarusOFD которые дублируют параметр check. Такой метод сделан для наглядности.
Код класса CheckYarusOFD:
<?php use Bitrix\Sale\Cashbox\Internals\CashboxCheckTable; use Bitrix\Main; class CheckYarusOFD { protected $url_ofd = 'https://ofd-ya.ru/check'; //Урл для проверки чеков protected $kkt_id = '0001234131234061'; //ИД ККТ - в системе Ярус /** * Модифицирует шаблон с чеком и отправляет его пользователю * @param type $order * @return boolean */ public function sentEmailUser($order) { if (CModule::IncludeModule("sale")) { $orderid = $order->getField("ORDER_ID"); $paymentid = $order->getId(); $arUserData = $this->getUserData($orderid); $arCheck = $this->getCheck($paymentid); //$order->getId() , $arField = array( "ACCOUNT_NUMBER" => $order->getField("ACCOUNT_NUMBER"), "ORDER_ID" => $orderid, "USER_ID" => $arUserData['ID'], "ORDER_USER" => $arUserData['NAME'], "EMAIL" => $arUserData['EMAIL'], "PAYMENT_ID" => $paymentid, "CHECK_DATA" => $arCheck, //Все параметры чека "URL_OFD" => $this->url_ofd, 'KKT_ID' => $this->kkt_id, //Регистрационный номер ККТ 'CHECK_SIGN' => $arCheck['fiscal_doc_attribute'], //Фискальный признак документа: ); $mailField = array( "ORDER_ID" => $arField['ACCOUNT_NUMBER'], "ORDER_ACCOUNT_NUMBER_ENCODE" => urlencode(urlencode($arField['ACCOUNT_NUMBER'])), "ORDER_USER" => $arField['ORDER_USER'], "ORDER_DATE" => $arUserData['DATE_INSERT'], "EMAIL" => $arField['EMAIL'], "SALE_EMAIL" => Main\Config\Option::get("sale", "order_email", "order@" . $_SERVER["SERVER_NAME"]), "CHECK_LINK" => $this->getMessage($arField), "BCC" => "shop@magazin.ru", ); $event = new \CEvent; $event->Send('SALE_CHECK_PRINT', 's1', $mailField, "N"); } return true; } /** * Сообщение для отправки пользователю с ифнормацией по чеку * @param type $arField * @return string */ protected function getMessage($arField) { if (empty($arField['CHECK_SIGN'])) { return ''; } $linkCheck = ''; $linkCheck .= '<a href="' . $arField['URL_OFD'] . '">' . $arField['URL_OFD'] . '</a>'; $linkCheck .= '<br>'; $linkCheck .= 'Регистрационный номер ККТ: ' . $arField['KKT_ID'] . '<br>'; $linkCheck .= 'Фискальный признак документа: ' . $arField['CHECK_SIGN'] . ''; return $linkCheck; } /** * Информация по чеку * @global type $DB * @param type $payment_id * @return array */ protected function getCheck($payment_id) { global $DB; $arResult = []; $user_table = CashboxCheckTable::getTableName(); $sqlQuery = "SELECT {$user_table}.LINK_PARAMS FROM {$user_table} " . "WHERE {$user_table}.PAYMENT_ID={$payment_id} AND {$user_table}.STATUS='Y'"; $queryResult = $DB->query($sqlQuery, FALSE); while ($arField = $queryResult->fetch()) { $arField['LINK_PARAMS'] = unserialize($arField['LINK_PARAMS']); return $arField['LINK_PARAMS']; } return $arResult; } /** * Данные о пользователе * @global type $DB * @param type $order_id * @return type */ protected function getUserData($order_id) { global $DB; $arResult = []; $user_table = Bitrix\Main\UserTable::getTableName(); $sale_table = Bitrix\Sale\Internals\OrderTable::getTableName(); $sqlQuery = "SELECT {$user_table}.NAME,{$user_table}.EMAIL,{$user_table}.ID, {$sale_table}.DATE_INSERT FROM {$user_table}, {$sale_table} " . "WHERE {$sale_table}.USER_ID={$user_table}.ID AND {$sale_table}.ID={$order_id}"; $queryResult = $DB->query($sqlQuery, FALSE); while ($arField = $queryResult->fetch()) { $arResult = $arField; return $arResult; } return $arResult; } }
Так же для формирования ссылки на чек для Ярус ОФД есть отличное API которое можно получить по почте при запросе в ТК ОФД. Тогда вашим клиентам не придётся вводить на странице чека номер ККТ и признак фискального документа что бы определить подлинность самого чека.
Xoчу cказaтb чтo кpиптoаkkaунт kласc! тaк лeгкo пoкупaть и пpoдавaть, paбoтать с kpиптовaлютaми ещe нигдe не дoводилoсь. будy иcполbзoвать вcе возможноcти в полнoй мерe. в кaчестве бонуca при pегистpaции пoлучил эфиpиум чтo пoрядkа 300 баkсoв, закинул эти денbги cразу на свою банkовcкyю kapтy.
1 месяц назад Я выиграл деньги в
этом самом популярном казино
Я думаю, что на данном интернет-сайте множество ценной
для меня информации:) И я рад изучать
ваши обзоры) Но, хочу добавить,
они по-настоящему качественные:) Большая работа.
Благодарствую!
какое же лютое говнище это битрикс!