- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/cashbox/checkmanager.php
- Класс: BitrixSaleCashboxCheckManager
- Вызов: CheckManager::savePrintResult
static function savePrintResult($checkId, array $data)
{
$result = new Result();
if ($checkId <= 0)
{
$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_ID')));
return $result;
}
$order = null;
$payment = null;
$shipment = null;
$dbRes = self::getList(array('select' => array('*'), 'filter' => array('ID' => $checkId)));
$check = $dbRes->fetch();
if (!$check)
{
$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_NOT_FOUND', array('#CHECK_ID#' => $checkId))));
return $result;
}
if ($check['STATUS'] === 'Y')
return $result;
$registry = SaleRegistry::getInstance($check['ENTITY_REGISTRY_TYPE']);
if ($check['ORDER_ID'] > 0)
{
/** @var SaleOrder $orderClassName */
$orderClassName = $registry->getOrderClassName();
$order = $orderClassName::load($check['ORDER_ID']);
if ($order === null)
{
$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_ORDER_LOAD')));
return $result;
}
$paymentCollection = $order->getPaymentCollection();
if ($check['PAYMENT_ID'] > 0)
{
$payment = $paymentCollection->getItemById($check['PAYMENT_ID']);
if ($payment === null)
{
$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_PAYMENT_LOAD')));
return $result;
}
}
$shipmentCollection = $order->getShipmentCollection();
if ($check['SHIPMENT_ID'] > 0)
{
$shipment = $shipmentCollection->getItemById($check['SHIPMENT_ID']);
if ($shipment === null)
{
$result->addError(new Error(Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_SHIPMENT_LOAD')));
return $result;
}
}
}
if (isset($data['ERROR']))
{
$errorMessage = Loc::getMessage('SALE_CASHBOX_ERROR_CHECK_PRINT', array('#CHECK_ID#' => $checkId));
if ($data['ERROR']['MESSAGE'])
$errorMessage .= ': '.$data['ERROR']['MESSAGE'];
if ($data['ERROR']['TYPE'] === ErrorsWarning::TYPE)
{
if ($check['CNT_FAIL_PRINT'] >= 3)
{
$data['ERROR']['TYPE'] = ErrorsError::TYPE;
}
else
{
CashboxCheckTable::update($checkId, array('CNT_FAIL_PRINT' => $check['CNT_FAIL_PRINT'] + 1));
$result->addError(new ErrorsWarning($errorMessage));
return $result;
}
}
if ($data['ERROR']['TYPE'] === ErrorsError::TYPE)
{
$updatedFields = [
'STATUS' => 'E',
'DATE_PRINT_END' => new MainTypeDateTime(),
'ERROR_MESSAGE' => $data['ERROR']['MESSAGE']
];
if ((int)$check['CNT_FAIL_PRINT'] === 0)
$updatedFields['CNT_FAIL_PRINT'] = 1;
CashboxCheckTable::update($checkId, $updatedFields);
/** @ToDO Will be removed after OrderCheckCollection is realized */
self::addTimelineCheckEntryOnCreateToOrder($order, $checkId, ['PRINTED' => 'N']);
if ($order !== null
&& (
$payment !== null
|| $shipment !== null
)
)
{
$r = new Result();
$errorCode = isset($data['ERROR']['CODE']) ? $data['ERROR']['CODE'] : 0;
$r->addWarning(new MainError($errorMessage, $errorCode));
/** @var EntityMarker $markerClassName */
$markerClassName = $registry->getEntityMarkerClassName();
if ($payment !== null)
{
$markerClassName::addMarker($order, $payment, $r);
$payment->setField('MARKED', 'Y');
/** @var SaleNotify $notifyClassName */
$notifyClassName = $registry->getNotifyClassName();
$notifyClassName::callNotify($payment, SaleEventActions::EVENT_ON_CHECK_PRINT_ERROR);
}
elseif ($shipment !== null)
{
$markerClassName::addMarker($order, $shipment, $r);
$shipment->setField('MARKED', 'Y');
/** @var SaleNotify $notifyClassName */
$notifyClassName = $registry->getNotifyClassName();
$notifyClassName::callNotify($shipment, SaleEventActions::EVENT_ON_CHECK_PRINT_ERROR);
}
$order->save();
}
$error = new ErrorsError($errorMessage);
Logger::addError($error->getMessage(), $check['CASHBOX_ID']);
}
else
{
$error = new ErrorsWarning($errorMessage);
Logger::addWarning($error->getMessage(), $check['CASHBOX_ID']);
}
$event = new MainEvent('sale', self::EVENT_ON_CHECK_PRINT_ERROR, array($data));
$event->send();
$result->addError($error);
}
else
{
$updateParams = [
'STATUS' => 'Y',
'LINK_PARAMS' => $data['LINK_PARAMS'],
'DATE_PRINT_END' => new MainTypeDateTime(),
];
if (isset($data['EXTERNAL_UUID']))
{
$updateParams['EXTERNAL_UUID'] = $data['EXTERNAL_UUID'];
}
$updateResult = CashboxCheckTable::update($checkId, $updateParams);
if ($updateResult->isSuccess())
{
self::addStatisticOnSuccessCheckPrint($checkId);
self::addTimelineCheckEntryOnCreateToOrder($order, $checkId, ['PRINTED' => 'Y']);
$isSend = false;
$event = new MainEvent(
'sale',
self::EVENT_ON_CHECK_PRINT_SEND,
array('PAYMENT' => $payment, 'SHIPMENT' => $shipment, 'CHECK' => $check)
);
$event->send();
$eventResults = $event->getResults();
/** @var MainEventResult $eventResult */
foreach($eventResults as $eventResult)
{
if($eventResult->getType() == MainEventResult::SUCCESS)
$isSend = true;
}
if (!$isSend)
{
if ($payment !== null)
{
/** @var SaleNotify $notifyClassName */
$notifyClassName = $registry->getNotifyClassName();
$notifyClassName::callNotify($payment, SaleEventActions::EVENT_ON_CHECK_PRINT);
}
elseif ($shipment !== null)
{
/** @var SaleNotify $notifyClassName */
$notifyClassName = $registry->getNotifyClassName();
$notifyClassName::callNotify($shipment, SaleEventActions::EVENT_ON_CHECK_PRINT);
}
}
}
else
{
$result->addErrors($updateResult->getErrors());
}
}
return $result;
}