| Current Path : /var/www/homesaver/www/bitrix/modules/fermaofd.ferma/classes/general/ |
| Current File : /var/www/homesaver/www/bitrix/modules/fermaofd.ferma/classes/general/CAllOfdFermaReceipt.php |
<?php
IncludeModuleLangFile(__DIR__ . '/other.php');
CAllOfdFermaReceipt::$receiptTypes = [
'Income' => GetMessage('FERMAOFD_PAYMENT'),
'IncomeReturn' => GetMessage('FERMAOFD_REFUND_PAYMENT'),
'IncomePrepayment' => GetMessage('FERMAOFD_ADVANCE_PAYMENT'),
'IncomeReturnPrepayment' => GetMessage('FERMAOFD_REFUND_ADVANCE_PAYMENT'),
'Expense' => GetMessage('FERMAOFD_ISSUANCE_ISSUED_TO_BUYER'),
'ExpenseReturn' => GetMessage('FERMAOFD_REFUND_ISSUED_TO_BUYER'),
];
class CAllOfdFermaReceipt
{
public static $receiptTypes;
public static function receiptPriceFormat($value)
{
return number_format($value, 2, '.', ' ') . ' ' . GetMessage('FERMAOFD_RUB');
}
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,
);
}
}