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 месяц назад Я выиграл деньги в
этом самом популярном казино
Я думаю, что на данном интернет-сайте множество ценной
для меня информации:) И я рад изучать
ваши обзоры) Но, хочу добавить,
они по-настоящему качественные:) Большая работа.
Благодарствую!
какое же лютое говнище это битрикс!