- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/cashbox/checkmanager.php
- Класс: BitrixSaleCashboxCheckManager
- Вызов: CheckManager::addByType
static function addByType(array $entities, $type, array $relatedEntities = array())
{
$result = new Result();
if ($type === '')
{
$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_EMPTY_CHECK_TYPE')));
return $result;
}
$check = self::createByType($type);
if (!$check instanceof Check)
{
$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK')));
return $result;
}
$check->setEntities($entities);
$check->setRelatedEntities($relatedEntities);
$cashboxList = Manager::getAvailableCashboxList($check);
$entity = reset($entities);
$order = self::getOrder($entity);
if (!$cashboxList)
{
$dbRes = CashboxTable::getList(array('filter' => array('ACTIVE' => 'Y')));
if ($dbRes->fetch())
$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_NOT_FOUND')));
return $result;
}
$check->setAvailableCashbox($cashboxList);
$registry = SaleRegistry::getInstance($check->getField("ENTITY_REGISTRY_TYPE"));
$validateResult = $check->validate();
if (!$validateResult->isSuccess())
{
if (MainLoader::includeModule('crm'))
{
BitrixCrmTimelineOrderCheckController::getInstance()->onCheckFailure(
[
'ORDER_FIELDS' => $order->getFieldValues(),
'SETTINGS' => [
'FAILURE' => 'Y',
'PRINTED' => 'N',
],
'BINDINGS' => BitrixCrmOrderBindingsMakerTimelineBindingsMaker::makeByOrder($order),
]
);
}
$notifyClassName = $registry->getNotifyClassName();
$notifyClassName::callNotify($order, SaleEventActions::EVENT_ON_CHECK_VALIDATION_ERROR);
$result->addErrors($validateResult->getErrors());
$event = new MainEvent('sale', self::EVENT_ON_CHECK_VALIDATION_ERROR, $check->getDataForCheck());
$event->send();
return $result;
}
$saveResult = $check->save();
if ($saveResult->isSuccess())
{
$checkId = $saveResult->getId();
$order->addPrintedCheck($check);
$enabledImmediateCashboxList = array();
foreach ($cashboxList as $item)
{
if ($item['ENABLED'] === 'Y')
{
$cashbox = Cashbox::create($item);
if ($cashbox instanceof IPrintImmediately)
{
$enabledImmediateCashboxList[$item['ID']] = $cashbox;
}
}
}
if ($enabledImmediateCashboxList)
{
$cashboxId = Manager::chooseCashbox(array_keys($enabledImmediateCashboxList));
/** @var Cashbox|IPrintImmediately $cashbox */
$cashbox = $enabledImmediateCashboxList[$cashboxId];
CashboxCheckTable::update(
$checkId,
array(
'STATUS' => 'P',
'DATE_PRINT_START' => new TypeDateTime(),
'CASHBOX_ID' => $cashbox->getField('ID')
)
);
$printResult = $cashbox->printImmediately($check);
if ($printResult->isSuccess())
{
$data = $printResult->getData();
if ($data)
{
CashboxCheckTable::update($checkId, ['EXTERNAL_UUID' => $data['UUID']]);
}
}
else
{
self::savePrintResult(
$checkId,
[
'ID' => $checkId,
'ERROR' => [
'TYPE' => ErrorsError::TYPE,
'MESSAGE' => implode("n", $printResult->getErrorMessages())
]
]
);
}
$result->setId($checkId);
return $result;
}
global $CACHE_MANAGER;
foreach ($cashboxList as $cashbox)
{
$CACHE_MANAGER->Read(CACHED_b_sale_order, 'sale_checks_'.$cashbox['ID']);
$CACHE_MANAGER->SetImmediate('sale_checks_'.$cashbox['ID'], true);
}
}
else
{
$result->addErrors($saveResult->getErrors());
}
return $result;
}