Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/fermaofd.ferma/classes/mysql/
Upload File :
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;
    }
}