| Current Path : /var/www/homesaver/www/bitrix/modules/fermaofd.ferma/classes/mysql/ |
| Current File : /var/www/homesaver/www/bitrix/modules/fermaofd.ferma/classes/mysql/COfdFermaReceipt.php |
<?php
require_once __DIR__ . '/../../const.php';
use Bitrix\Main\Web\Json;
class COfdFermaReceipt extends CAllOfdFermaReceipt
{
static function hasReceipt(string $orderId, string $type): bool
{
if ($type === 'Income') {
$income = static::getReceiptCount($orderId, 'Income');
$return = static::getReceiptCount($orderId, 'IncomeReturn');
return ($income - $return) > 0;
}
if ($type === 'IncomeReturn') {
$income = static::getReceiptCount($orderId, 'Income');
$return = static::getReceiptCount($orderId, 'IncomeReturn');
return ($return - $income) === 0;
}
if ($type === 'IncomePrepayment') {
$income = static::getReceiptCount($orderId, 'IncomePrepayment');
$return = static::getReceiptCount($orderId, 'IncomeReturnPrepayment');
return ($income - $return) > 0;
}
if ($type === 'IncomeReturnPrepayment') {
$income = static::getReceiptCount($orderId, 'IncomePrepayment');
$return = static::getReceiptCount($orderId, 'IncomeReturnPrepayment');
return ($return - $income) === 0;
}
return static::getReceiptCount($orderId, $type) > 0;
}
static function getReceiptCount(string $orderId, string $type): int
{
$receiptsQuery = static::GetList(['ID' => 'DESC'], [
'ORDER_ID' => $orderId,
'TYPE' => $type,
'STATUS_ID' => [0, 1, 2],
]);
return $receiptsQuery->SelectedRowsCount();
}
function Add($arFields)
{
global $DB;
static::migrateTableColumns();
if (!isset($arFields['PAYMENT_METHOD_ID'])) {
$arFields['PAYMENT_METHOD_ID'] = COption::GetOptionString(FERMAOFD_FERMA_MODULE_ID, 'receipt_payment_default_method', '4');
}
$arFields1 = [];
foreach ($arFields as $key => $value) {
if (substr($key, 0, 1) === '=') {
$arFields1[substr($key, 1)] = $value;
unset($arFields[$key]);
}
}
$events = GetModuleEvents(FERMAOFD_FERMA_MODULE_ID, 'OnBeforeReceiptAdd', true);
foreach ($events as $arEvent) {
if (ExecuteModuleEventEx($arEvent, [&$arFields]) === false) {
return false;
}
}
$arInsert = $DB->PrepareInsert('b_fermaofd_ferma_receipt', $arFields);
foreach ($arFields1 as $key => $value) {
if (strlen($arInsert[0]) > 0) {
$arInsert[0] .= ', ';
}
$arInsert[0] .= $key;
if (strlen($arInsert[1]) > 0) {
$arInsert[1] .= ', ';
}
$arInsert[1] .= $value;
}
$ID = false;
if (strlen($arInsert[0]) > 0) {
$strSql =
'INSERT INTO b_fermaofd_ferma_receipt(' . $arInsert[0] . ') ' .
'VALUES(' . $arInsert[1] . ')';
$DB->Query($strSql, false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__);
$ID = (int)$DB->LastID();
}
if ($ID) {
$events = GetModuleEvents(FERMAOFD_FERMA_MODULE_ID, 'OnReceiptAdd', true);
foreach ($events as $arEvent) {
ExecuteModuleEventEx($arEvent, [$ID, &$arFields]);
}
}
return $ID;
}
public static function Update($ID, $arFields)
{
global $DB;
static::migrateTableColumns();
$ID = (int)$ID;
$arFields1 = [];
foreach ($arFields as $key => $value) {
if (substr($key, 0, 1) == '=') {
$arFields1[substr($key, 1)] = $value;
unset($arFields[$key]);
}
}
$events = GetModuleEvents(FERMAOFD_FERMA_MODULE_ID, 'OnBeforeReceiptUpdate', true);
foreach ($events as $arEvent) {
if (ExecuteModuleEventEx($arEvent, [$ID, &$arFields]) === false) {
return false;
}
}
$strUpdate = $DB->PrepareUpdate('b_fermaofd_ferma_receipt', $arFields);
foreach ($arFields1 as $key => $value) {
if (strlen($strUpdate) > 0) {
$strUpdate .= ', ';
}
$strUpdate .= $key . '=' . $value . ' ';
}
if (strlen($strUpdate) > 0) {
$strSql =
'UPDATE b_fermaofd_ferma_receipt SET ' .
' ' . $strUpdate . ' ' .
'WHERE ID = ' . $ID . ' ';
$DB->Query($strSql, false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__);
unset(static::$arReceiptCache[$ID]);
} else {
$ID = false;
}
if ($ID) {
$events = GetModuleEvents(FERMAOFD_FERMA_MODULE_ID, 'OnReceiptUpdate', true);
foreach ($events as $arEvent) {
ExecuteModuleEventEx($arEvent, [$ID, &$arFields]);
}
}
return $ID;
}
private static $arReceiptCache;
public function GetByID($ID)
{
global $DB;
$ID = (int)$ID;
if (
!empty(static::$arReceiptCache[$ID])
&& is_set(static::$arReceiptCache[$ID], 'ID')
) {
return static::$arReceiptCache[$ID];
} else {
static $strSql;
if (!isset($strSql)) {
$strSql =
'SELECT *, ' .
' ' . $DB->DateToCharFunction('DATE_CREATE', 'FULL') . ' as DATE_CREATE, ' .
' ' . $DB->DateToCharFunction('DATE_UPDATE', 'FULL') . ' as DATE_UPDATE ' .
'FROM b_fermaofd_ferma_receipt ' .
'WHERE ID = ';
}
$dbResult = $DB->Query($strSql . $ID, false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__);
if ($arResult = $dbResult->Fetch()) {
static::$arReceiptCache[$ID] = $arResult;
return $arResult;
}
}
return false;
}
public function GetByReceiptID($ReceiptID)
{
global $DB;
if (
!empty(static::$arReceiptCache[$ReceiptID])
&& is_set(static::$arReceiptCache[$ReceiptID], 'ID')
) {
return static::$arReceiptCache[$ReceiptID];
} else {
static $strSql;
if (!isset($strSql)) {
$strSql =
'SELECT *, ' .
' ' . $DB->DateToCharFunction('DATE_CREATE', 'FULL') . ' as DATE_CREATE, ' .
' ' . $DB->DateToCharFunction('DATE_UPDATE', 'FULL') . ' as DATE_UPDATE ' .
'FROM b_fermaofd_ferma_receipt ' .
'WHERE RECEIPT_ID = ';
}
$dbResult = $DB->Query($strSql . Json::encode($ReceiptID), false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__);
if ($arResult = $dbResult->Fetch()) {
static::$arReceiptCache[$ReceiptID] = $arResult;
return $arResult;
}
}
return false;
}
public function GetByOrderID($OrderID)
{
global $DB;
if (
!empty(static::$arReceiptCache[$OrderID])
&& is_set(static::$arReceiptCache[$OrderID], 'ID')
) {
return static::$arReceiptCache[$OrderID];
} else {
static $strSql;
if (!isset($strSql)) {
$strSql =
'SELECT *, ' .
' ' . $DB->DateToCharFunction('DATE_CREATE', 'FULL') . ' as DATE_CREATE, ' .
' ' . $DB->DateToCharFunction('DATE_UPDATE', 'FULL') . ' as DATE_UPDATE ' .
'FROM b_fermaofd_ferma_receipt ' .
'WHERE ORDER_ID = ';
}
$dbResult = $DB->Query($strSql . Json::encode($OrderID), false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__);
if ($arResult = $dbResult->Fetch()) {
static::$arReceiptCache[$OrderID] = $arResult;
return $arResult;
}
}
return false;
}
public function GetList(
$arOrder = ['ID' => 'DESC'],
$arFilter = [],
$arGroupBy = false,
$arNavStartParams = false,
$arSelectFields = []
)
{
global $DB, $USER_FIELD_MANAGER;
static $blogPostEventIdList = null;
static::migrateTableColumns();
$obUserFieldsSql = new CUserTypeSQL;
$obUserFieldsSql->SetEntity('OFDFERMA_RECEIPT', 'P.ID');
$obUserFieldsSql->SetSelect($arSelectFields);
$obUserFieldsSql->SetFilter($arFilter);
$obUserFieldsSql->SetOrder($arOrder);
if (count($arSelectFields) <= 0) {
$arSelectFields = [
'ID', 'ORDER_ID', 'RECEIPT_ID', 'DATE_CREATE', 'DATE_UPDATE', 'TYPE', 'CONTENT', 'TOTAL_PRICE',
'STATUS_ID', 'STATUS_NAME', 'STATUS_MESSAGE', 'DEVICE_ID', 'RNM', 'ZN', 'FN', 'FDN', 'FPD',
'PAYMENT_METHOD_ID', 'FINISHED', 'ENV', 'DESCRIPTION',
];
}
if (in_array('*', $arSelectFields)) {
$arSelectFields = [
'ID', 'ORDER_ID', 'RECEIPT_ID', 'DATE_CREATE', 'DATE_UPDATE', 'TYPE', 'CONTENT', 'TOTAL_PRICE',
'STATUS_ID', 'STATUS_NAME', 'STATUS_MESSAGE', 'DEVICE_ID', 'RNM', 'ZN', 'FN', 'FDN', 'FPD',
'PAYMENT_METHOD_ID', 'FINISHED', 'ENV', 'DESCRIPTION',
];
}
$arFields = [
'ID' => ['FIELD' => 'P.ID', 'TYPE' => 'int'],
'ORDER_ID' => ['FIELD' => 'P.ORDER_ID', 'TYPE' => 'int'],
'RECEIPT_ID' => ['FIELD' => 'P.RECEIPT_ID', 'TYPE' => 'string'],
'DATE_CREATE' => ['FIELD' => 'P.DATE_CREATE', 'TYPE' => 'datetime'],
'DATE_UPDATE' => ['FIELD' => 'P.DATE_UPDATE', 'TYPE' => 'datetime'],
'TYPE' => ['FIELD' => 'P.TYPE', 'TYPE' => 'string'],
'CONTENT' => ['FIELD' => 'P.CONTENT', 'TYPE' => 'string'],
'TOTAL_PRICE' => ['FIELD' => 'P.TOTAL_PRICE', 'TYPE' => 'decimal'],
'STATUS_ID' => ['FIELD' => 'P.STATUS_ID', 'TYPE' => 'int'],
'STATUS_NAME' => ['FIELD' => 'P.STATUS_NAME', 'TYPE' => 'string'],
'STATUS_MESSAGE' => ['FIELD' => 'P.STATUS_MESSAGE', 'TYPE' => 'string'],
'DEVICE_ID' => ['FIELD' => 'P.DEVICE_ID', 'TYPE' => 'int'],
'RNM' => ['FIELD' => 'P.RNM', 'TYPE' => 'string'],
'ZN' => ['FIELD' => 'P.ZN', 'TYPE' => 'string'],
'FN' => ['FIELD' => 'P.FN', 'TYPE' => 'string'],
'FDN' => ['FIELD' => 'P.FDN', 'TYPE' => 'string'],
'FPD' => ['FIELD' => 'P.FPD', 'TYPE' => 'string'],
'PAYMENT_METHOD_ID' => ['FIELD' => 'P.PAYMENT_METHOD_ID', 'TYPE' => 'int'],
'FINISHED' => ['FIELD' => 'P.FINISHED', 'TYPE' => 'int'],
'ENV' => ['FIELD' => 'P.ENV', 'TYPE' => 'string'],
'DESCRIPTION' => ['FIELD' => 'P.DESCRIPTION', 'TYPE' => 'string'],
];
foreach ($arFilter as $key => $val) {
$key_res = COfdFermaReceipt::GetFilterOperation($key);
$k = $key_res['FIELD'];
if (
$k == 'POST_PARAM_OFDFERMA_RECEIPT_IMPRTNT'
&& $key_res['NEGATIVE'] == 'Y'
&& $key_res['OR_NULL'] == 'N'
) {
unset($arFilter[$key]);
}
}
// <-- FIELDS
$bNeedDistinct = false;
$arSqls = COfdFermaReceipt::PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields, $obUserFieldsSql);
if ($bNeedDistinct) {
$arSqls['SELECT'] = str_replace('%%_DISTINCT_%%', 'DISTINCT', $arSqls['SELECT']);
} else {
$arSqls['SELECT'] = str_replace('%%_DISTINCT_%%', '', $arSqls['SELECT']);
}
$r = $obUserFieldsSql->GetFilter();
if (strlen($r) > 0) {
$strSqlUFFilter = ' (' . $r . ') ';
}
if (is_array($arGroupBy) && count($arGroupBy) == 0) {
$strSql =
'SELECT ' . $arSqls['SELECT'] . ' ' .
$obUserFieldsSql->GetSelect() . ' ' .
'FROM b_fermaofd_ferma_receipt P ' .
' ' . $arSqls['FROM'] . ' ' .
$obUserFieldsSql->GetJoin('P.ID') . ' ';
if (strlen($arSqls['WHERE']) > 0) {
$strSql .= 'WHERE ' . $arSqls['WHERE'] . ' ';
}
if (strlen($arSqls['WHERE']) > 0 && strlen($strSqlUFFilter) > 0) {
$strSql .= ' AND ' . $strSqlUFFilter . ' ';
} elseif (strlen($arSqls['WHERE']) <= 0 && strlen($strSqlUFFilter) > 0) {
$strSql .= ' WHERE ' . $strSqlUFFilter . ' ';
}
if (strlen($arSqls['GROUPBY']) > 0) {
$strSql .= 'GROUP BY ' . $arSqls['GROUPBY'] . ' ';
}
//echo "!1!=".htmlspecialcharsbx($strSql)."<br>";
$dbRes = $DB->Query($strSql, false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__);
if ($arRes = $dbRes->Fetch()) {
return $arRes['CNT'];
} else {
return false;
}
}
$strSql =
'SELECT ' . $arSqls['SELECT'] . ' ' .
$obUserFieldsSql->GetSelect() . ' ' .
'FROM b_fermaofd_ferma_receipt P ' .
' ' . $arSqls['FROM'] . ' ' .
$obUserFieldsSql->GetJoin('P.ID') . ' ';
if (strlen($arSqls['WHERE']) > 0) {
$strSql .= 'WHERE ' . $arSqls['WHERE'] . ' ';
}
if (strlen($arSqls['WHERE']) > 0 && strlen($strSqlUFFilter) > 0) {
$strSql .= ' AND ' . $strSqlUFFilter . ' ';
} elseif (strlen($arSqls['WHERE']) <= 0 && strlen($strSqlUFFilter) > 0) {
$strSql .= ' WHERE ' . $strSqlUFFilter . ' ';
}
if (strlen($arSqls['GROUPBY']) > 0) {
$strSql .= 'GROUP BY ' . $arSqls['GROUPBY'] . ' ';
}
if (strlen($arSqls['ORDERBY']) > 0) {
$strSql .= 'ORDER BY ' . $arSqls['ORDERBY'] . ' ';
}
if (is_array($arNavStartParams) && IntVal($arNavStartParams['nTopCount']) <= 0) {
$strSql_tmp =
'SELECT COUNT(DISTINCT P.ID) as CNT ' .
'FROM b_fermaofd_ferma_receipt P ' .
' ' . $arSqls['FROM'] . ' ' .
$obUserFieldsSql->GetJoin('P.ID') . ' ';
if (strlen($arSqls['WHERE']) > 0) {
$strSql_tmp .= 'WHERE ' . $arSqls['WHERE'] . ' ';
}
if (strlen($arSqls['WHERE']) > 0 && strlen($strSqlUFFilter) > 0) {
$strSql_tmp .= ' AND ' . $strSqlUFFilter . ' ';
} elseif (strlen($arSqls['WHERE']) <= 0 && strlen($strSqlUFFilter) > 0) {
$strSql_tmp .= ' WHERE ' . $strSqlUFFilter . ' ';
}
if (strlen($arSqls['GROUPBY']) > 0) {
$strSql_tmp .= 'GROUP BY ' . $arSqls['GROUPBY'] . ' ';
}
//echo "!2.1!=".htmlspecialcharsbx($strSql_tmp)."<br>";
$dbRes = $DB->Query($strSql_tmp, false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__);
$cnt = 0;
if (strlen($arSqls['GROUPBY']) <= 0) {
if ($arRes = $dbRes->Fetch()) {
$cnt = $arRes['CNT'];
}
} else {
$cnt = $dbRes->SelectedRowsCount();
}
$dbRes = new CDBResult();
//echo "!2.2!=".htmlspecialcharsbx($strSql)."<br>";
$dbRes->SetUserFields($USER_FIELD_MANAGER->GetUserFields('OFDFERMA_RECEIPT'));
$dbRes->NavQuery($strSql, $cnt, $arNavStartParams);
} else {
if (is_array($arNavStartParams) && IntVal($arNavStartParams['nTopCount']) > 0) {
$strSql .= 'LIMIT ' . IntVal($arNavStartParams['nTopCount']);
}
//echo "!3!=".htmlspecialcharsbx($strSql)."<br>";
$dbRes = $DB->Query($strSql, false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__);
$dbRes->SetUserFields($USER_FIELD_MANAGER->GetUserFields('OFDFERMA_RECEIPT'));
}
//echo "!4!=".htmlspecialcharsbx($strSql)."<br>";
return $dbRes;
}
public static function migrateTableColumns()
{
global $DB;
$columns = static::getReceptColumns();
$expectedColumns = [
'ID' => 'int not null auto_increment',
'RECEIPT_ID' => 'char(36) not null',
'SITE_ID' => 'char(2) not null',
'ORDER_ID' => 'int not null',
'TYPE' => 'varchar(255) not null',
'CONTENT' => 'text not null',
'PAYMENT_METHOD_ID' => 'smallint default null',
'TOTAL_PRICE' => 'decimal(18,2) not null default 0',
'STATUS_ID' => 'smallint not null default 0',
'STATUS_NAME' => 'varchar(255) not null default \'NEW\'',
'STATUS_MESSAGE' => 'text default null',
'DEVICE_ID' => 'varchar(255) default null',
'RNM' => 'varchar(255) default null',
'ZN' => 'varchar(255) default null',
'FN' => 'varchar(255) default null',
'FDN' => 'varchar(255) default null',
'FPD' => 'varchar(255) default null',
'DATE_CREATE' => 'datetime not null',
'DATE_UPDATE' => 'datetime not null',
'FINISHED' => 'smallint default null',
'ENV' => 'ENUM(\'demo\', \'prod\') default \'prod\'',
'DESCRIPTION' => 'text default null',
];
$diff = array_diff(array_keys($expectedColumns), $columns);
if (count($diff) === 0) {
return;
}
foreach ($diff as $key) {
$DB->Query("alter table b_fermaofd_ferma_receipt add {$key} {$expectedColumns[$key]}");
}
}
private static function getReceptColumns()
{
global $DB;
$queryResult = $DB->Query('SHOW COLUMNS FROM b_fermaofd_ferma_receipt');
$result = [];
while ($column = $queryResult->Fetch()) {
$result[] = $column['Field'];
}
return $result;
}
}