%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/sale/lib/delivery/requests/ |
Current File : //home/bitrix/www/bitrix/modules/sale/lib/delivery/requests/manager.php |
<? namespace Bitrix\Sale\Delivery\Requests; use Bitrix\Main; use Bitrix\Sale\Order; use Bitrix\Sale\ResultWarning; use Bitrix\Sale\Shipment; use Bitrix\Sale\Internals; use Bitrix\Sale\EntityMarker; use Bitrix\Main\Localization\Loc; use Bitrix\Sale\Delivery\Services; Loc::loadMessages(__FILE__); /** * Class Manager * @package Bitrix\Sale\Delivery\Requests * Manages the lifecycle of delivery requests items */ final class Manager { const STATUS_PREPARED = 0; const STATUS_SENT = 10; const STATUS_PROCESSED = 20; const FORM_FIELDS_TYPE_CREATE = 10; const FORM_FIELDS_TYPE_ADD = 20; const FORM_FIELDS_TYPE_ACTION = 30; /** * @param int $shipmentId * @param int $requestId * @return Result * @throws Main\ArgumentException */ public static function getDeliveryRequestShipmentContent($requestId, $shipmentId) { $result = new Result(); if(intval($shipmentId) <= 0) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SHIPMENT_ID'))); return $result; } $res = ShipmentTable::getList(array( 'filter' => array( '=SHIPMENT_ID' => $shipmentId ), 'select' => array( '*', 'DELIVERY_ID' => 'SHIPMENT.DELIVERY_ID' ) )); if(!($row = $res->fetch())) { $result->addError( new Main\Error( Loc::getMessage( 'SALE_DLVR_REQ_MNGR_ERROR_SHIPMENT_NOT_IN_REQUEST', array('#SHIPMENT_ID#' => $shipmentId) ))); return $result; } $deliveryId = intval($row['DELIVERY_ID']); if($deliveryId <= 0) { $result->addError( new Main\Error( Loc::getMessage( 'SALE_DLVR_REQ_MNGR_ERROR_DELIVERY_NOT_FOUND', array('#SHIPMENT_LINK#' => Helper::getShipmentEditLink($shipmentId))))); return $result; } $deliveryRequestHandler = self::getDeliveryRequestHandlerByDeliveryId($deliveryId); if(!$deliveryRequestHandler) { $result->addError( new Main\Error( Loc::getMessage( 'SALE_DLVR_REQ_MNGR_ERROR_DELIVERY_NOT_SUPPORT', array('#DELIVERY_LINK#' => Helper::getDeliveryEditLink($deliveryId))))); return $result; } return $deliveryRequestHandler->getShipmentContent($requestId, $shipmentId); } /** * @param Shipment $shipment * @return array Shipment actions * @throws Main\ArgumentNullException */ public static function getDeliveryRequestShipmentActions(Shipment $shipment) { $deliveryId = $shipment->getDeliveryId(); if($deliveryId <= 0) return array(); if(!($delivery = Services\Manager::getObjectById($deliveryId))) return array(); if(!($deliveryRequestHandler = $delivery->getDeliveryRequestHandler())) return array(); return $deliveryRequestHandler->getShipmentActions($shipment); } /** * @param int $requestId * @return array Request actions * @throws Main\ArgumentNullException */ public static function getDeliveryRequestActions($requestId) { $result = array(); $deliveryRequestHandler = self::getDeliveryRequestHandlerByRequestId($requestId); if($deliveryRequestHandler) $result = $deliveryRequestHandler->getActions($requestId); return $result; } /** * @param int $requestId * @return HandlerBase|null Delivery request handler * @throws Main\ArgumentNullException */ protected static function getDeliveryRequestHandlerByRequestId($requestId) { if(intval($requestId) <= 0) return null; if(!($requestFields = RequestTable::getById($requestId)->fetch())) return null; if(intval($requestFields['DELIVERY_ID']) <= 0) return null; return self::getDeliveryRequestHandlerByDeliveryId($requestFields['DELIVERY_ID']); } /** * @param int $deliveryId * @return HandlerBase|null Delivery request handler * @throws Main\ArgumentNullException * @throws Main\SystemException */ public static function getDeliveryRequestHandlerByDeliveryId($deliveryId) { if(intval($deliveryId) <= 0) return null; if(!($delivery = Services\Manager::getObjectById($deliveryId))) return null; return $delivery->getDeliveryRequestHandler(); } /** * @param int $deliveryId * @param int[] $shipmentIds * @param array $additional Additional info required for creation. Depends on delivery service. * @return Result * @throws Main\ArgumentException * @throws Main\ArgumentNullException * @throws Main\SystemException * @throws \Exception */ public static function createDeliveryRequest($deliveryId, array $shipmentIds, array $additional = array()) { $result = new Result(); if(!($deliveryRequestHandler = self::getDeliveryRequestHandlerByDeliveryId($deliveryId))) { $result->addError( new Main\Error( Loc::getMessage( 'SALE_DLVR_REQ_MNGR_ERROR_NOT_SUPPORT', array('#DELIVERY_LINK#' => Helper::getDeliveryEditLink($deliveryId)) ))); return $result; } /** @var ShipmentResult[] $checkResults */ $checkResults = self::checkShipmentIdsBeforeAdd($shipmentIds); foreach($checkResults as $res) { if($res->isSuccess()) continue; $result->addResult( self::processShipmentResult( $res )); unset($shipmentIds[array_search($res->getInternalId(), $shipmentIds)]); } if(empty($shipmentIds)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SHP_ABSENT'))); return $result; } $res = $deliveryRequestHandler->create($shipmentIds, $additional); if($res->isSuccess()) { $result->addResults($res->getResults()); } else { $result->addErrors($res->getErrors()); foreach($res->getShipmentResults() as $sRes) $result->addResult(self::processShipmentResult($sRes)); return $result; } $results = $result->getResults(); if(!is_array($results) || empty($results)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_RES_UNKNOWN'))); return $result; } /** @var ShipmentResult|RequestResult $requestResult */ foreach($results as $resId => $requestResult) { if($requestResult instanceof ShipmentResult) { $requestResult = self::processShipmentResult($requestResult); } elseif($requestResult instanceof RequestResult) { $requestId = 0; /** @var RequestResult $requestResult*/ if($requestResult->isSuccess()) { $res = RequestTable::add(array( 'DELIVERY_ID' => $deliveryRequestHandler->getHandlingDeliveryServiceId(), 'EXTERNAL_ID' => $requestResult->getExternalId(), 'STATUS' => Manager::STATUS_SENT )); if(!$res->isSuccess()) { $requestResult->addErrors($res->getErrors()); continue; } $requestId = $res->getId(); if($requestId > 0) $requestResult->setInternalId($requestId); } $shipmentsResults = $requestResult->getShipmentResults(); if(empty($shipmentsResults)) continue; foreach($shipmentsResults as $sResIdx => $shipmentResult) $shipmentsResults[$sResIdx] = self::processShipmentResult($shipmentResult, $requestId); $requestResult->setResults($shipmentsResults); } else { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_ANSW_TYPE').' "'.get_class($requestResult).'"')); continue; } $results[$resId] = $requestResult; } $result->setResults($results); return $result; } /** * @param ShipmentResult $result * @param int $requestId * @return ShipmentResult */ protected static function processShipmentResult($result, $requestId = 0) { if(!($result instanceof ShipmentResult)) return $result; $shipmentId = $result->getInternalId(); if(intval($shipmentId) <= 0) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SAVE_SHIPMENT_ID'))); return $result; } $extShipmentId = $result->getExternalId(); if($result->isSuccess()) { if(intval($requestId) > 0) { $res = ShipmentTable::setShipment(array( 'REQUEST_ID' => $requestId, 'SHIPMENT_ID' => $shipmentId, 'EXTERNAL_ID' => $extShipmentId, 'ERROR_DESCRIPTION' => '' )); if(!$res->isSuccess()) $result->addErrors($res->getErrors()); $res = self::saveShipmentResult($shipmentId, $result); if(!$res->isSuccess()) $result->addErrors($res->getErrors()); } } else { ShipmentTable::setShipment(array( 'SHIPMENT_ID' => $shipmentId, 'ERROR_DESCRIPTION' => implode("\n", $result->getErrorMessages()) )); } return $result; } /** * @param int $deliveryId * @param int $formFieldsType FORM_FIELDS_TYPE_ACTION | FORM_FIELDS_TYPE_ADD | FORM_FIELDS_TYPE_CREATE * @param int[] $shipmentIds * @param array $additional * @return array Form fields * @throws Main\ArgumentNullException */ public static function getDeliveryRequestFormFields($deliveryId, $formFieldsType, array $shipmentIds, array $additional = array()) { if(!$deliveryRequestHandler = self::getDeliveryRequestHandlerByDeliveryId($deliveryId)) return array(); return $deliveryRequestHandler->getFormFields($formFieldsType, $shipmentIds, $additional); } /** * @param int $requestId * @return Result * @throws \Exception */ public static function deleteDeliveryRequest($requestId) { $result = new Result(); if(empty($requestId)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_REQ_ID'))); return $result; } if($deliveryRequestHandler = self::getDeliveryRequestHandlerByRequestId($requestId)) { $res = $deliveryRequestHandler->delete($requestId); if(!$res->isSuccess()) $result->addErrors($res->getErrors()); } if($result->isSuccess()) { $con = Main\Application::getConnection(); $con->queryExecute("DELETE FROM ".ShipmentTable::getTableName()." WHERE REQUEST_ID=".intval($requestId)); $res = RequestTable::delete($requestId); if(!$res->isSuccess()) $result->addErrors($res->getErrors()); } return $result; } /** * @param int $requestId * @param int[] $shipmentIds * @return Result */ public static function deleteShipmentsFromDeliveryRequest($requestId, array $shipmentIds) { $result = new Result(); if(empty($requestId)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_REQ_ID'))); return $result; } if(empty($shipmentIds)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SHP_ID_LIST_EMPTY'))); return $result; } if(!($deliveryRequestHandler = self::getDeliveryRequestHandlerByRequestId($requestId))) { $result->addError( new Main\Error( Loc::getMessage( 'SALE_DLVR_REQ_MNGR_ERROR_REQ_OBJ' ))); return $result; } $checkResults = self::checkShipmentIdsBeforeDelete($shipmentIds); foreach($checkResults as $res) { if(!$res->isSuccess()) { $result->addErrors($res->getErrors()); unset($shipmentIds[array_search($res->getInternalId(), $shipmentIds)]); } } if(empty($shipmentIds)) return $result; $res = $deliveryRequestHandler->deleteShipments($requestId, $shipmentIds); $result->setResults($res->getResults()); if(!$res->isSuccess()) { $result->addErrors($res->getErrors()); return $result; } $results = $result->getResults(); if(!is_array($results) || empty($results)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_RES_UNKNOWN'))); return $result; } $con = Main\Application::getConnection(); /** @var ShipmentResult $shpRes */ foreach($results as $resId => $shpRes) { if(!($shpRes instanceof ShipmentResult)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_ANSW_TYPE').' "'.get_class($shpRes).'"')); continue; } if($shpRes->isSuccess()) { $shpId = intval($shpRes->getInternalId()); if($shpId <= 0) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_SHP_ID_LESS_ZERO'))); continue; } $con->queryExecute("DELETE FROM ".ShipmentTable::getTableName()." WHERE REQUEST_ID=".intval($requestId)." AND SHIPMENT_ID=".intval($shpId)); //Unset mark about changed shipment self::unSetMarkerShipmentChanged($shpId); //If there is no more shipments in this request if(!ShipmentTable::getList(array('filter' => array('=REQUEST_ID' => $requestId)))->fetch()) { $res = RequestTable::delete($requestId); if($res->isSuccess()) { $result->addMessage( new Message( Loc::getMessage( 'SALE_DLVR_REQ_MNGR_EMPTY_REQ_DELETED', array('#REQUEST_ID#' => $requestId) ))); } else { $result->addError( new Main\Error( Loc::getMessage( 'SALE_DLVR_REQ_MNGR_EMPTY_REQ_NOT_DELETED', array('#REQUEST_LINK#' => Helper::getRequestViewLink($requestId)) ).implode('; ',$result->getErrorMessages()) )); } } } $results[$resId] = $shpRes; } $result->setResults($results); return $result; } /** * @param int $requestId * @return Result */ public static function getDeliveryRequestContent($requestId) { $deliveryRequestHandler = self::getDeliveryRequestHandlerByRequestId($requestId); if(!$deliveryRequestHandler) { $result= new Result(); $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_REQ_OBJ'))); return $result; } return $deliveryRequestHandler->getContent($requestId); } /** * @param int $requestId * @param string $actionType * @param array $additional * @return Result */ public static function executeDeliveryRequestAction($requestId, $actionType, array $additional = array()) { $deliveryRequestHandler = self::getDeliveryRequestHandlerByRequestId($requestId); if(!$deliveryRequestHandler) { $result = new Result(); $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_ACTION_EXEC').'. '.Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_REQ_OBJ'))); return $result; } return $deliveryRequestHandler->executeAction($requestId, $actionType, $additional); } /** * @param int $requestId * @param int $shipmentId * @param string $actionType * @param array $additional * @return Result */ public static function executeDeliveryRequestShipmentAction($requestId, $shipmentId, $actionType, array $additional = array()) { $deliveryRequestHandler = self::getDeliveryRequestHandlerByRequestId($requestId); if(!$deliveryRequestHandler) { $result = new Result(); $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_ACTION_EXEC').'. '.Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_REQ_OBJ'))); return $result; } return $deliveryRequestHandler->executeShipmentAction($requestId, $shipmentId, $actionType, $additional); } /** * @param int[] $shipmentIds * @return ShipmentResult[] * @throws \Bitrix\Main\ArgumentException */ protected static function checkShipmentIdsBeforeAdd(array $shipmentIds) { $result = array(); $positiveIds = self::filterPositiveIds($shipmentIds); foreach(array_diff($shipmentIds, $positiveIds) as $id) { $shpRes = new ShipmentResult($id); $shpRes->addError( new Main\Error( Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SHIPMENT_ID').' "'.$id.'"', $id )); $result[] = $shpRes; } $addedIds = self::filterAddedIds($positiveIds); foreach(array_intersect($positiveIds, $addedIds) as $id) { $shpRes = new ShipmentResult($id); $shpRes->addError( new Main\Error( Loc::getMessage('SALE_DLVR_REQ_MNGR_ALREADY_ADDED') )); $result[] = $shpRes; } $existingIds = self::filterExistIds($addedIds); foreach(array_diff($addedIds, $existingIds) as $id) { $shpRes = new ShipmentResult($id); $shpRes->addError( new Main\Error( Loc::getMessage('SALE_DLVR_REQ_MNGR_SHP_NOT_FOUND', array('#SHIPMENT_ID#' => $id) ))); $result[] = $shpRes; } return $result; } /** * @param int[] $shipmentIds * @return int[] Choose ids only for existing shipments. * @throws Main\ArgumentException */ protected static function filterExistIds(array $shipmentIds) { $result = array(); $res = Internals\ShipmentTable::getList(array( 'filter' => array( '=ID' => $shipmentIds, ) )); while($row = $res->fetch()) $result[] = $row['ID']; return $result; } /** * @param int[] $shipmentIds * @return int[] * @throws \Bitrix\Main\ArgumentException */ protected static function filterAddedIds(array $shipmentIds) { $result = array(); $res = ShipmentTable::getList(array( 'filter' => array( '=SHIPMENT_ID' => $shipmentIds, '!=REQUEST_ID' => false ) )); while($row = $res->fetch()) $result[] = $row['SHIPMENT_ID']; return $result; } /** * @param int[] $shipmentIds * @return int[] */ protected static function filterPositiveIds(array $shipmentIds) { $result = array(); foreach($shipmentIds as $id) if(intval($id) > 0) $result[] = $id; return $result; } /** * @param int[] $shipmentIds * @return ShipmentResult[] */ protected static function checkShipmentIdsBeforeDelete(array $shipmentIds) { return self::checkShipmentIdsBeforeUpdate($shipmentIds); } /** * @param int[] $shipmentIds * @return ShipmentResult[] * @throws \Bitrix\Main\ArgumentException */ protected static function checkShipmentIdsBeforeUpdate(array $shipmentIds) { $result = array(); $positiveIds = self::filterPositiveIds($shipmentIds); foreach(array_diff($shipmentIds, $positiveIds) as $id) { $shpRes = new ShipmentResult($id); $shpRes->addError( new Main\Error( Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SHIPMENT_ID').' "'.$id.'"') ); $result[] = $shpRes; } $addedIds = self::filterAddedIds($positiveIds); foreach(array_diff($positiveIds, $addedIds) as $id) { $shpRes = new ShipmentResult($id); $shpRes->addError( new Main\Error( Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SHIPMENT_NOT_IN_REQUEST', array('#SHIPMENT_ID#' => $id) ))); $result[] = $shpRes; } $existingIds = self::filterExistIds($addedIds); foreach(array_diff($addedIds, $existingIds) as $id) { $shpRes = new ShipmentResult($id); $shpRes->addError( new Main\Error( Loc::getMessage('SALE_DLVR_REQ_MNGR_SHP_NOT_FOUND', array('#SHIPMENT_ID#' => $id) ))); $result[] = $shpRes; } return $result; } /** * @param int $shipmentId * @return bool */ public static function isShipmentSent($shipmentId) { return intval(self::getRequestIdByShipmentId($shipmentId)) > 0; } /** * @param int $shipmentId * @return int Request ID * @throws Main\ArgumentException */ public static function getRequestIdByShipmentId($shipmentId) { $result = 0; $res = ShipmentTable::getList(array( 'filter' => array( '=SHIPMENT_ID' => $shipmentId, ) )); if($row = $res->fetch()) $result = $row['REQUEST_ID']; return $result; } /** * @param int $requestId * @param int [] $shipmentIds * @return Result * @throws \Exception */ public static function addShipmentsToDeliveryRequest($requestId, array $shipmentIds) { $result = new Result(); if(empty($requestId)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_REQ_ID'))); return $result; } if(empty($shipmentIds)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SHP_ID_LIST_EMPTY'))); return $result; } if(!($deliveryRequestHandler = self::getDeliveryRequestHandlerByRequestId($requestId))) { $result->addError( new Main\Error( Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SHP_ADD2').'. '. Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_REQ_OBJ', "", $requestId ))); return $result; } $checkResults = self::checkShipmentIdsBeforeAdd($shipmentIds); foreach($checkResults as $res) { if($res->isSuccess()) continue; $result->addResult( self::processShipmentResult( $res )); unset($shipmentIds[array_search($res->getInternalId(), $shipmentIds)]); } if(empty($shipmentIds)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SHP_ABSENT'))); return $result; } $res = $deliveryRequestHandler->addShipments($requestId, $shipmentIds); if($res->isSuccess()) { $result->addResults($res->getResults()); } else { $result->addErrors($res->getErrors()); foreach($res->getShipmentResults() as $sRes) $result->addResult(self::processShipmentResult($sRes)); return $result; } $results = $result->getResults(); if(!is_array($results) || empty($results)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_RES_UNKNOWN'))); return $result; } $successResCount = 0; /** @var RequestResult $reqRes */ foreach($results as $resId => $reqRes) { if($reqRes instanceof ShipmentResult) { $results[$resId] = self::processShipmentResult($reqRes, $requestId); } elseif($reqRes instanceof RequestResult) { $reqShpResults = $reqRes->getShipmentResults(); foreach($reqShpResults as $id => $shpRes) { $reqShpResults[$id] = self::processShipmentResult($shpRes, $requestId); if($shpRes->isSuccess()) $successResCount++; } $reqRes->setResults($reqShpResults); $results[$resId] = $reqRes; } else { $result->addError( new Main\Error( Loc::getMessage( 'SALE_DLVR_REQ_MNGR_RES_WRONG', array( '#CLASS_NAME#' => get_class($reqRes), '#REQUEST_ID#' => $requestId ) ) ) ); continue; } } if($successResCount <= 0) $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SHP_ABSENT2'))); $result->setResults($results); return $result; } /** * @param int $requestId * @param int [] $shipmentIds * @return Result * @throws \Exception */ public static function updateShipmentsFromDeliveryRequest($requestId, array $shipmentIds) { $result = new Result(); if(empty($requestId)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_REQ_ID'))); return $result; } if(empty($shipmentIds)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SHP_ID_LIST_EMPTY'))); return $result; } $checkResults = self::checkShipmentIdsBeforeUpdate($shipmentIds); foreach($checkResults as $res) { if($res->isSuccess()) continue; $result->addResult( self::processShipmentResult($res, $requestId) ); unset($shipmentIds[array_search($res->getInternalId(), $shipmentIds)]); } if(empty($shipmentIds)) { $result->addError( new Main\Error( Loc::getMessage( 'SALE_DLVR_REQ_MNGR_ERROR_SHP_UPD', array('#REQUEST_LINK#' => Helper::getRequestViewLink($requestId)) ))); return $result; } $deliveryRequestHandler = self::getDeliveryRequestHandlerByRequestId($requestId); if(!$deliveryRequestHandler) { $result->addError( new Main\Error( Loc::getMessage( 'SALE_DLVR_REQ_MNGR_ERROR_SHP_UPD', array('#REQUEST_LINK#' => Helper::getRequestViewLink($requestId)) ).'. '. Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_REQ_OBJ') )); return $result; } $res = $deliveryRequestHandler->updateShipments($requestId, $shipmentIds); $result->addResults($res->getResults()); if(!$res->isSuccess()) { $result->addErrors($res->getErrors()); return $result; } $results = $res->getResults(); if(empty($results)) { $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_RES_EMPTY'))); return $result; } $resultsFinal = array(); foreach($results as $res) { if($res instanceof ShipmentResult) { $resultsFinal[] = self::processShipmentResult($res, $requestId); } elseif($res instanceof RequestResult) { $reqShpResults = $res->getShipmentResults(); foreach($reqShpResults as $id => $shpRes) { $shpRes = self::processShipmentResult($shpRes, $requestId); if($shpRes->isSuccess()) { $shpInternalId = intval($shpRes->getInternalId()); //Unset mark about changed shipments self::unSetMarkerShipmentChanged($shpInternalId); $dbRes = self::saveShipmentResult($shpRes->getInternalId(), $shpRes); if(!$dbRes->isSuccess()) $shpRes->addErrors($dbRes->getErrors()); } $resultsFinal[] = $shpRes; } } else { $result->addError( new Main\Error( Loc::getMessage('SALE_DLVR_REQ_MNGR_RES_WRONG_UPD') )); continue; } } $result->setResults($resultsFinal); return $result; } /** * @param $shipmentId * @param ShipmentResult $shipmentResult * @return Result * @throws Main\ArgumentException * @throws Main\ArgumentNullException * @throws Main\ArgumentOutOfRangeException * @throws Main\NotSupportedException * @throws Main\ObjectNotFoundException * @throws \Exception */ protected static function saveShipmentResult($shipmentId, ShipmentResult $shipmentResult) { $result = new Result(); $shipments = Helper::getShipmentsByIds(array($shipmentId)); if($shipments[$shipmentId]) { $shipments[$shipmentId]->setFields(array( 'TRACKING_NUMBER' => $shipmentResult->getTrackingNumber(), 'DELIVERY_DOC_NUM' => $shipmentResult->getDeliveryDocNum(), 'DELIVERY_DOC_DATE' => $shipmentResult->getDeliveryDocDate() )); $res = $shipments[$shipmentId]->save(); if(!$res->isSuccess()) $result->addError(new Main\Error(Loc::getMessage('SALE_DLVR_REQ_MNGR_ERROR_SAVE_SHIPMENT').'"'.$shipmentId.'"')); } else { $result->addError( new Main\Error( Loc::getMessage( 'SALE_DLVR_REQ_MNGR_SHP_NOT_FOUND', array('#SHIPMENT_ID#' => $shipmentId) ))); } return $result; } /** * @param Order $order * @param Shipment $shipment */ public static function onBeforeShipmentSave(&$order, &$shipment) { if(self::isShipmentSent($shipment->getId())) { self::setMarkerShipmentChanged($order, $shipment); } } /** * @param Shipment $shipment */ public static function onBeforeShipmentDelete(&$shipment) { $shipmentId = $shipment->getId(); if(self::isShipmentSent($shipmentId)) { self::deleteShipmentsFromDeliveryRequest( self::getRequestIdByShipmentId($shipmentId), array($shipmentId) ); } } /** * @param Order $order * @param Shipment $shipment */ protected static function setMarkerShipmentChanged(&$order, &$shipment) { $r = new \Bitrix\Sale\Result(); $r->addWarning( new ResultWarning( Loc::getMessage( 'SALE_DLVR_REQ_MNGR_NOT_UPDATED' ), 'DELIVERY_REQUEST_NOT_UPDATED' )); EntityMarker::addMarker($order, $shipment, $r); $shipment->setField('MARKED', 'Y'); } /** * @param int $shipmentId */ protected static function unSetMarkerShipmentChanged($shipmentId) { EntityMarker::deleteByFilter(array( '=ENTITY_TYPE' => EntityMarker::ENTITY_TYPE_SHIPMENT, '=ENTITY_ID' => $shipmentId, '=CODE' => 'DELIVERY_REQUEST_NOT_UPDATED' )); } public static function initJs() { \CJSCore::RegisterExt('sale_delivery_requests', array( 'js' => '/bitrix/js/sale/delivery_request.js', 'lang' => '/bitrix/modules/sale/lang/' . LANGUAGE_ID . '/admin/js/sale_delivery_requests.php', 'rel' => array('core', 'ajax') )); \CUtil::InitJSCore(array('sale_delivery_requests')); } }