Bitrix — переопределяем метод отправки чека пользователю OnPrintableCheckSend

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 которое можно получить по почте при запросе в ТК ОФД. Тогда вашим клиентам не придётся вводить на странице чека номер ККТ и признак фискального документа что бы определить подлинность самого чека.

 

Bitrix — переопределяем метод отправки чека пользователю OnPrintableCheckSend: 4 комментария

  1. 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.

  2. Я думаю, что на данном интернет-сайте множество ценной
    для меня информации:) И я рад изучать
    ваши обзоры) Но, хочу добавить,
    они по-настоящему качественные:) Большая работа.

    Благодарствую!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *