Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/classes/general/
Upload File :
Current File : /var/www/homesaver/www/bitrix/classes/general/CAllOfdFermaReceipt.php

<?php

class CAllOfdFermaReceipt
{
    public static $receiptTypes = [
        'Income' => 'платёж от покупателя',
        'IncomeReturn' => 'возврат платежа',
        'IncomePrepayment' => 'авансовый платёж от покупателя',
        'IncomePrepaymentReturn' => 'возврат авансового платежа',
        'Expense' => 'выдача денежных средств покупателю',
        'ExpenseReturn' => 'возврат денежных средств, выданных покупателю',
    ];

    public static function receiptPriceFormat($value)
    {
        return number_format($value, 2, '.', '&nbsp;') . '&nbsp;руб.';
    }

    public static function PrepareSql(
        &$arFields,
        $arOrder,
        &$arFilter,
        $arGroupBy,
        $arSelectFields,
        $obUserFieldsSql = false
    ) {
        global $DB;

        $strSqlSelect = '';
        $strSqlFrom = '';
        $strSqlWhere = '';
        $strSqlGroupBy = '';
        $strSqlOrderBy = '';

        $arGroupByFunct = array('COUNT', 'AVG', 'MIN', 'MAX', 'SUM');

        $arAlreadyJoined = array();

        // GROUP BY -->
        if (is_array($arGroupBy) && count($arGroupBy) > 0) {
            $arSelectFields = $arGroupBy;
            foreach ($arGroupBy as $key => $val) {
                $val = strtoupper($val);
                $key = strtoupper($key);
                if (array_key_exists($val, $arFields) && !in_array($key, $arGroupByFunct)) {
                    if (strlen($strSqlGroupBy) > 0) {
                        $strSqlGroupBy .= ', ';
                    }
                    $strSqlGroupBy .= $arFields[$val]['FIELD'];

                    if (isset($arFields[$val]['FROM'])
                        && strlen($arFields[$val]['FROM']) > 0
                        && !in_array($arFields[$val]['FROM'], $arAlreadyJoined)) {
                        if (strlen($strSqlFrom) > 0) {
                            $strSqlFrom .= ' ';
                        }
                        $strSqlFrom .= $arFields[$val]['FROM'];
                        $arAlreadyJoined[] = $arFields[$val]['FROM'];
                    }
                }
            }
        }
        // <-- GROUP BY

        // SELECT -->
        $arFieldsKeys = array_keys($arFields);

        if (is_array($arGroupBy) && count($arGroupBy) == 0) {
            $strSqlSelect = 'COUNT(%%_DISTINCT_%% ' . $arFields[$arFieldsKeys[0]]['FIELD'] . ') as CNT ';
        } else {
            if (isset($arSelectFields) && !is_array($arSelectFields) && is_string($arSelectFields) && strlen($arSelectFields) > 0 && array_key_exists($arSelectFields, $arFields)) {
                $arSelectFields = array($arSelectFields);
            }

            if (!isset($arSelectFields)
                || !is_array($arSelectFields)
                || count($arSelectFields) <= 0
                || in_array('*', $arSelectFields)) {
                foreach ($arFieldsKeys as $fkey) {
                    if (isset($arFields[$fkey]['WHERE_ONLY']) && $arFields[$fkey]['WHERE_ONLY'] == 'Y') {
                        continue;
                    }

                    if (strlen($strSqlSelect) > 0) {
                        $strSqlSelect .= ', ';
                    }

                    if ($arFields[$fkey]['TYPE'] == 'datetime') {
                        if (array_key_exists($fkey, $arOrder)) {
                            $strSqlSelect .= $arFields[$fkey]['FIELD'] . ' as ' . $fkey . '_X1, ';
                        }

                        $strSqlSelect .= $DB->DateToCharFunction($arFields[$fkey]['FIELD'], 'FULL') . ' as ' . $fkey;
                    } elseif ($arFields[$fkey]['TYPE'] == 'date') {
                        if (array_key_exists($fkey, $arOrder)) {
                            $strSqlSelect .= $arFields[$fkey]['FIELD'] . ' as ' . $fkey . '_X1, ';
                        }

                        $strSqlSelect .= $DB->DateToCharFunction($arFields[$fkey]['FIELD'], 'SHORT') . ' as ' . $fkey;
                    } else {
                        $strSqlSelect .= $arFields[$fkey]['FIELD'] . ' as ' . $fkey;
                    }

                    if (isset($arFields[$fkey]['FROM'])
                        && strlen($arFields[$fkey]['FROM']) > 0
                        && !in_array($arFields[$fkey]['FROM'], $arAlreadyJoined)) {
                        if (strlen($strSqlFrom) > 0) {
                            $strSqlFrom .= ' ';
                        }
                        $strSqlFrom .= $arFields[$fkey]['FROM'];
                        $arAlreadyJoined[] = $arFields[$fkey]['FROM'];
                    }
                }
            } else {
                foreach ($arSelectFields as $key => $val) {
                    $val = strtoupper($val);
                    $key = strtoupper($key);
                    if (array_key_exists($val, $arFields)) {
                        if (strlen($strSqlSelect) > 0) {
                            $strSqlSelect .= ', ';
                        }

                        if (in_array($key, $arGroupByFunct)) {
                            $strSqlSelect .= $key . '(' . $arFields[$val]['FIELD'] . ') as ' . $val;
                        } else {
                            if ($arFields[$val]['TYPE'] == 'datetime') {
                                if (array_key_exists($val, $arOrder)) {
                                    $strSqlSelect .= $arFields[$val]['FIELD'] . ' as ' . $val . '_X1, ';
                                }

                                $strSqlSelect .= $DB->DateToCharFunction($arFields[$val]['FIELD'], 'FULL') . ' as ' . $val;
                            } elseif ($arFields[$val]['TYPE'] == 'date') {
                                if (array_key_exists($val, $arOrder)) {
                                    $strSqlSelect .= $arFields[$val]['FIELD'] . ' as ' . $val . '_X1, ';
                                }

                                $strSqlSelect .= $DB->DateToCharFunction($arFields[$val]['FIELD'], 'SHORT') . ' as ' . $val;
                            } else {
                                $strSqlSelect .= $arFields[$val]['FIELD'] . ' as ' . $val;
                            }
                        }

                        if (isset($arFields[$val]['FROM'])
                            && strlen($arFields[$val]['FROM']) > 0
                            && !in_array($arFields[$val]['FROM'], $arAlreadyJoined)) {
                            if (strlen($strSqlFrom) > 0) {
                                $strSqlFrom .= ' ';
                            }
                            $strSqlFrom .= $arFields[$val]['FROM'];
                            $arAlreadyJoined[] = $arFields[$val]['FROM'];
                        }
                    }
                }
            }

            if (strlen($strSqlGroupBy) > 0) {
                if (strlen($strSqlSelect) > 0) {
                    $strSqlSelect .= ', ';
                }
                $strSqlSelect .= 'COUNT(%%_DISTINCT_%% ' . $arFields[$arFieldsKeys[0]]['FIELD'] . ') as CNT';
            } else {
                $strSqlSelect = '%%_DISTINCT_%% ' . $strSqlSelect;
            }
        }
        // <-- SELECT

        // WHERE -->
        $arSqlSearch = Array();

        if (!is_array($arFilter)) {
            $filter_keys = Array();
        } else {
            $filter_keys = array_keys($arFilter);
        }

        foreach ($filter_keys as $fkey) {
            $vals = $arFilter[$fkey];
            if (!is_array($vals)) {
                $vals = array($vals);
            }

            $key = $fkey;
            $key_res = COfdFermaReceipt::GetFilterOperation($key);
            $key = $key_res['FIELD'];
            $strNegative = $key_res['NEGATIVE'];
            $strOperation = $key_res['OPERATION'];
            $strOrNull = $key_res['OR_NULL'];

            $arSqlSearch_tmp = array();
            if (array_key_exists($key, $arFields)) {
                if (count($vals) > 0) {
                    if ($strOperation == 'IN') {
                        if (isset($arFields[$key]['WHERE'])) {
                            $arSqlSearch_tmp1 = call_user_func_array(
                                $arFields[$key]['WHERE'],
                                array(
                                    $vals, $key, $strOperation, $strNegative, $arFields[$key]['FIELD'], $arFields,
                                    $arFilter,
                                )
                            );
                            if ($arSqlSearch_tmp1 !== false) {
                                $arSqlSearch_tmp[] = $arSqlSearch_tmp1;
                            }
                        } else {
                            if ($arFields[$key]['TYPE'] == 'int') {
                                array_walk($vals, create_function('&$item', '$item=IntVal($item);'));
                                $vals = array_unique($vals);
                                $val = implode(',', $vals);

                                if (count($vals) <= 0) {
                                    $arSqlSearch_tmp[] = '(1 = 2)';
                                } else {
                                    $arSqlSearch_tmp[] = (($strNegative == 'Y') ? ' NOT ' : '') . '(' . $arFields[$key]['FIELD'] . ' IN (' . $val . '))';
                                }
                            } elseif ($arFields[$key]['TYPE'] == 'double') {
                                array_walk($vals, create_function('&$item', '$item=DoubleVal($item);'));
                                $vals = array_unique($vals);
                                $val = implode(',', $vals);

                                if (count($vals) <= 0) {
                                    $arSqlSearch_tmp[] = '(1 = 2)';
                                } else {
                                    $arSqlSearch_tmp[] = (($strNegative == 'Y') ? ' NOT ' : '') . '(' . $arFields[$key]['FIELD'] . ' ' . $strOperation . ' (' . $val . '))';
                                }
                            } elseif ($arFields[$key]['TYPE'] == 'string' || $arFields[$key]['TYPE'] == 'char') {
                                array_walk($vals, create_function('&$item', "\$item=\"'\".\$GLOBALS[\"DB\"]->ForSql(\$item).\"'\";"));
                                $vals = array_unique($vals);
                                $val = implode(',', $vals);

                                if (count($vals) <= 0) {
                                    $arSqlSearch_tmp[] = '(1 = 2)';
                                } else {
                                    $arSqlSearch_tmp[] = (($strNegative == 'Y') ? ' NOT ' : '') . '(' . $arFields[$key]['FIELD'] . ' ' . $strOperation . ' (' . $val . '))';
                                }
                            } elseif ($arFields[$key]['TYPE'] == 'datetime') {
                                array_walk($vals, create_function('&$item', "\$item=\"'\".\$GLOBALS[\"DB\"]->CharToDateFunction(\$GLOBALS[\"DB\"]->ForSql(\$item), \"FULL\").\"'\";"));
                                $vals = array_unique($vals);
                                $val = implode(',', $vals);

                                if (count($vals) <= 0) {
                                    $arSqlSearch_tmp[] = '1 = 2';
                                } else {
                                    $arSqlSearch_tmp[] = ($strNegative == 'Y' ? ' NOT ' : '') . '(' . $arFields[$key]['FIELD'] . ' ' . $strOperation . ' (' . $val . '))';
                                }
                            } elseif ($arFields[$key]['TYPE'] == 'date') {
                                array_walk($vals, create_function('&$item', "\$item=\"'\".\$GLOBALS[\"DB\"]->CharToDateFunction(\$GLOBALS[\"DB\"]->ForSql(\$item), \"SHORT\").\"'\";"));
                                $vals = array_unique($vals);
                                $val = implode(',', $vals);

                                if (count($vals) <= 0) {
                                    $arSqlSearch_tmp[] = '1 = 2';
                                } else {
                                    $arSqlSearch_tmp[] = ($strNegative == 'Y' ? ' NOT ' : '') . '(' . $arFields[$key]['FIELD'] . ' ' . $strOperation . ' (' . $val . '))';
                                }
                            }
                        }
                    } else {
                        foreach ($vals as $val) {
                            if (isset($arFields[$key]['WHERE'])) {
                                $arSqlSearch_tmp1 = call_user_func_array(
                                    $arFields[$key]['WHERE'],
                                    array(
                                        $val, $key, $strOperation, $strNegative, $arFields[$key]['FIELD'], $arFields,
                                        $arFilter,
                                    )
                                );
                                if ($arSqlSearch_tmp1 !== false) {
                                    $arSqlSearch_tmp[] = $arSqlSearch_tmp1;
                                }
                            } else {
                                if ($arFields[$key]['TYPE'] == 'int') {
                                    if ((IntVal($val) == 0) && (strpos($strOperation, '=') !== false)) {
                                        $arSqlSearch_tmp[] = '(' . $arFields[$key]['FIELD'] . ' IS ' . (($strNegative == 'Y') ? 'NOT ' : '') . 'NULL) ' . (($strNegative == 'Y') ? 'AND' : 'OR') . ' ' . (($strNegative == 'Y') ? 'NOT ' : '') . '(' . $arFields[$key]['FIELD'] . ' ' . $strOperation . ' 0)';
                                    } else {
                                        $arSqlSearch_tmp[] = (($strNegative == 'Y') ? ' ' . $arFields[$key]['FIELD'] . ' IS NULL OR NOT ' : '') . '(' . $arFields[$key]['FIELD'] . ' ' . $strOperation . ' ' . IntVal($val) . ' )';
                                    }
                                } elseif ($arFields[$key]['TYPE'] == 'double') {
                                    $val = str_replace(',', '.', $val);

                                    if ((DoubleVal($val) == 0) && (strpos($strOperation, '=') !== false)) {
                                        $arSqlSearch_tmp[] = '(' . $arFields[$key]['FIELD'] . ' IS ' . (($strNegative == 'Y') ? 'NOT ' : '') . 'NULL) ' . (($strNegative == 'Y') ? 'AND' : 'OR') . ' ' . (($strNegative == 'Y') ? 'NOT ' : '') . '(' . $arFields[$key]['FIELD'] . ' ' . $strOperation . ' 0)';
                                    } else {
                                        $arSqlSearch_tmp[] = (($strNegative == 'Y') ? ' ' . $arFields[$key]['FIELD'] . ' IS NULL OR NOT ' : '') . '(' . $arFields[$key]['FIELD'] . ' ' . $strOperation . ' ' . DoubleVal($val) . ' )';
                                    }
                                } elseif ($arFields[$key]['TYPE'] == 'string' || $arFields[$key]['TYPE'] == 'char') {
                                    if ($strOperation == 'QUERY') {
                                        $arSqlSearch_tmp[] = GetFilterQuery($arFields[$key]['FIELD'], $val, 'Y');
                                    } else {
                                        if ((strlen($val) == 0) && (strpos($strOperation, '=') !== false)) {
                                            $arSqlSearch_tmp[] = '(' . $arFields[$key]['FIELD'] . ' IS ' . (($strNegative == 'Y') ? 'NOT ' : '') . 'NULL) ' . (($strNegative == 'Y') ? 'AND NOT' : 'OR') . ' (' . $DB->Length($arFields[$key]['FIELD']) . ' <= 0) ' . (($strNegative == 'Y') ? 'AND NOT' : 'OR') . ' (' . $arFields[$key]['FIELD'] . ' ' . $strOperation . " '" . $DB->ForSql($val) . "' )";
                                        } else {
                                            $arSqlSearch_tmp[] = (($strNegative == 'Y') ? ' ' . $arFields[$key]['FIELD'] . ' IS NULL OR NOT ' : '') . '(' . $arFields[$key]['FIELD'] . ' ' . $strOperation . " '" . $DB->ForSql($val) . "' )";
                                        }
                                    }
                                } elseif ($arFields[$key]['TYPE'] == 'datetime') {
                                    if (strlen($val) <= 0) {
                                        $arSqlSearch_tmp[] = ($strNegative == 'Y' ? 'NOT' : '') . '(' . $arFields[$key]['FIELD'] . ' IS NULL)';
                                    } else {
                                        $arSqlSearch_tmp[] = ($strNegative == 'Y' ? ' ' . $arFields[$key]['FIELD'] . ' IS NULL OR NOT ' : '') . '(' . $arFields[$key]['FIELD'] . ' ' . $strOperation . ' ' . $DB->CharToDateFunction($DB->ForSql($val), 'FULL') . ')';
                                    }
                                } elseif ($arFields[$key]['TYPE'] == 'date') {
                                    if (strlen($val) <= 0) {
                                        $arSqlSearch_tmp[] = ($strNegative == 'Y' ? 'NOT' : '') . '(' . $arFields[$key]['FIELD'] . ' IS NULL)';
                                    } else {
                                        $arSqlSearch_tmp[] = ($strNegative == 'Y' ? ' ' . $arFields[$key]['FIELD'] . ' IS NULL OR NOT ' : '') . '(' . $arFields[$key]['FIELD'] . ' ' . $strOperation . ' ' . $DB->CharToDateFunction($DB->ForSql($val), 'SHORT') . ')';
                                    }
                                }
                            }
                        }
                    }
                }

                if (isset($arFields[$key]['FROM'])
                    && strlen($arFields[$key]['FROM']) > 0
                    && !in_array($arFields[$key]['FROM'], $arAlreadyJoined)) {
                    if (strlen($strSqlFrom) > 0) {
                        $strSqlFrom .= ' ';
                    }
                    $strSqlFrom .= $arFields[$key]['FROM'];
                    $arAlreadyJoined[] = $arFields[$key]['FROM'];
                }

                $strSqlSearch_tmp = '';
                foreach ($arSqlSearch_tmp as $arSqlS) {
                    if (strlen($strSqlSearch_tmp) > 0) {
                        $strSqlSearch_tmp .= ($strNegative == 'Y' ? ' AND ' : ' OR ');
                    }
                    $strSqlSearch_tmp .= '(' . $arSqlS . ')';
                }
                if ($strOrNull == 'Y') {
                    if (strlen($strSqlSearch_tmp) > 0) {
                        $strSqlSearch_tmp .= ($strNegative == 'Y' ? ' AND ' : ' OR ');
                    }
                    $strSqlSearch_tmp .= '(' . $arFields[$key]['FIELD'] . ' IS ' . ($strNegative == 'Y' ? 'NOT ' : '') . 'NULL)';

                    if (strlen($strSqlSearch_tmp) > 0) {
                        $strSqlSearch_tmp .= ($strNegative == 'Y' ? ' AND ' : ' OR ');
                    }
                    if ($arFields[$key]['TYPE'] == 'int' || $arFields[$key]['TYPE'] == 'double') {
                        $strSqlSearch_tmp .= '(' . $arFields[$key]['FIELD'] . ' ' . ($strNegative == 'Y' ? '<>' : '=') . ' 0)';
                    } elseif ($arFields[$key]['TYPE'] == 'string' || $arFields[$key]['TYPE'] == 'char') {
                        $strSqlSearch_tmp .= '(' . $arFields[$key]['FIELD'] . ' ' . ($strNegative == 'Y' ? '<>' : '=') . " '')";
                    }
                }

                if ($strSqlSearch_tmp != '') {
                    $arSqlSearch[] = '(' . $strSqlSearch_tmp . ')';
                }
            }
        }

        foreach ($arSqlSearch as $sqlS) {
            if (strlen($strSqlWhere) > 0) {
                $strSqlWhere .= ' AND ';
            }
            $strSqlWhere .= '(' . $sqlS . ')';
        }
        // <-- WHERE

        // ORDER BY -->
        $arSqlOrder = Array();
        foreach ($arOrder as $by => $order) {
            $by = strtoupper($by);
            $order = strtoupper($order);

            if ($order != 'ASC') {
                $order = 'DESC';
            } else {
                $order = 'ASC';
            }

            if (array_key_exists($by, $arFields)) {
                $arSqlOrder[] = ' ' . (array_key_exists('ORDER', $arFields[$by]) ? $arFields[$by]['ORDER'] : $arFields[$by]['FIELD']) . ' ' . $order . ' ';

                if (isset($arFields[$by]['FROM'])
                    && strlen($arFields[$by]['FROM']) > 0
                    && !in_array($arFields[$by]['FROM'], $arAlreadyJoined)) {
                    if (strlen($strSqlFrom) > 0) {
                        $strSqlFrom .= ' ';
                    }
                    $strSqlFrom .= $arFields[$by]['FROM'];
                    $arAlreadyJoined[] = $arFields[$by]['FROM'];
                }
            } elseif ($obUserFieldsSql) {
                $arSqlOrder[] = ' ' . $obUserFieldsSql->GetOrder($by) . ' ' . $order . ' ';
            }
        }

        $strSqlOrderBy = '';
        DelDuplicateSort($arSqlOrder);
        foreach ($arSqlOrder as $sqlO) {
            if (strlen($strSqlOrderBy) > 0) {
                $strSqlOrderBy .= ', ';
            }

            if (strtoupper($DB->type) == 'ORACLE') {
                if (substr($sqlO, -3) == 'ASC') {
                    $strSqlOrderBy .= $sqlO . ' NULLS FIRST';
                } else {
                    $strSqlOrderBy .= $sqlO . ' NULLS LAST';
                }
            } else {
                $strSqlOrderBy .= $sqlO;
            }
        }

        // <-- ORDER BY

        return array(
            'SELECT' => $strSqlSelect,
            'FROM' => $strSqlFrom,
            'WHERE' => $strSqlWhere,
            'GROUPBY' => $strSqlGroupBy,
            'ORDERBY' => $strSqlOrderBy,
        );
    }

    public static function GetFilterOperation($key)
    {
        $strNegative = "N";
        if (substr($key, 0, 1) == "!") {
            $key = substr($key, 1);
            $strNegative = "Y";
        }

        $strOrNull = "N";
        if (substr($key, 0, 1) == "+") {
            $key = substr($key, 1);
            $strOrNull = "Y";
        }

        if (substr($key, 0, 2) == ">=") {
            $key = substr($key, 2);
            $strOperation = ">=";
        } elseif (substr($key, 0, 1) == ">") {
            $key = substr($key, 1);
            $strOperation = ">";
        } elseif (substr($key, 0, 2) == "<=") {
            $key = substr($key, 2);
            $strOperation = "<=";
        } elseif (substr($key, 0, 1) == "<") {
            $key = substr($key, 1);
            $strOperation = "<";
        } elseif (substr($key, 0, 1) == "@") {
            $key = substr($key, 1);
            $strOperation = "IN";
        } elseif (substr($key, 0, 1) == "~") {
            $key = substr($key, 1);
            $strOperation = "LIKE";
        } elseif (substr($key, 0, 1) == "%") {
            $key = substr($key, 1);
            $strOperation = "QUERY";
        } else {
            $strOperation = "=";
        }

        return array(
            "FIELD" => $key, "NEGATIVE" => $strNegative, "OPERATION" => $strOperation, "OR_NULL" => $strOrNull,
        );
    }
}