• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/cashbox/checkmanager.php
  • Класс: BitrixSaleCashboxCheckManager
  • Вызов: CheckManager::getPrintableChecks
static function getPrintableChecks(array $cashboxIds, array $orderIds = array())
{
	$result = array();

	$con = MainApplication::getConnection();
	$dbLocRes = $con->query("SELECT GET_LOCK('get_check_list', 0) as L");
	$locResult = $dbLocRes->fetch();
	if ($locResult["L"] == "0")
	{
		return $result;
	}

	$filter = array(
		'LINK_PARAMS' => '',
		'CHECK2CASHBOX.CASHBOX_ID' => $cashboxIds,
		array(
			'LOGIC' => 'OR',
			array(
				'=STATUS' => 'N',
				'DATE_PRINT_START' => ''
			),
			array(
				'=STATUS' => 'P',
				' new TypeDateTime()
			)
		)
	);

	if ($orderIds)
	{
		$filter['ORDER_ID'] = $orderIds;
	}

	$limit = count($cashboxIds)*self::CHECK_LIMIT_RECORDS;
	$dbRes = self::getList(
		array(
			'select' => array('*', 'AVAILABLE_CASHBOX_ID' => 'CHECK2CASHBOX.CASHBOX_ID'),
			'filter' => $filter,
			'limit' => $limit,
			'runtime' => array(
				new MainEntityExpressionField(
					'MAX_DT_REPEAT_CHECK',
					'DATE_ADD(DATE_PRINT_START, INTERVAL '.self::CHECK_RESENDING_TIME.' MINUTE)',
					null,
					array(
						'data_type' => 'datetime'
					)
				)
			)
		)
	);

	if ($data = $dbRes->fetch())
	{
		$i = 0;
		do
		{
			if (!isset($result[$data['ID']]))
			{
				$i++;
				if ($i > self::CHECK_LIMIT_RECORDS)
					break;

				$result[$data['ID']] = $data;
				$result[$data['ID']]['CASHBOX_LIST'] = array();
			}

			$result[$data['ID']]['CASHBOX_LIST'][] = $data['AVAILABLE_CASHBOX_ID'];
		}
		while ($data = $dbRes->fetch());

		foreach ($result as $checkId => $item)
		{
			if ($item['STATUS'] === 'P')
			{
				$now = new TypeDateTime();
				$nowTs = $now->getTimestamp();

				/** @var TypeDateTime $dateStartPrint */
				$dateStartPrint = $item['DATE_PRINT_START'];
				$dateStartPrintTs = $dateStartPrint->getTimestamp();

				if ($nowTs - $dateStartPrintTs > self::MIN_TIME_FOR_SWITCH_CASHBOX)
				{
					$availableCashboxIds = array_diff($item['CASHBOX_LIST'], array($item['CASHBOX_ID']));
					if ($availableCashboxIds)
					{
						$result[$checkId]['CASHBOX_ID'] = Manager::chooseCashbox($availableCashboxIds);
						CashboxCheckTable::update($checkId, array('CASHBOX_ID' => $result[$checkId]['CASHBOX_ID']));
					}
				}
				else
				{
					if ($item['CASHBOX_ID'] > 0 && !in_array($item['CASHBOX_ID'], $cashboxIds))
						unset($result[$checkId]);
				}

				continue;
			}

			$result[$checkId]['CASHBOX_ID'] = Manager::chooseCashbox($item['CASHBOX_LIST']);
			CashboxCheckTable::update($checkId, array('STATUS' => 'P', 'DATE_PRINT_START' => new TypeDateTime(), 'CASHBOX_ID' => $result[$checkId]['CASHBOX_ID']));
		}
	}

	$con->query("SELECT RELEASE_LOCK('get_check_list')");

	return $result;
}