Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/cvetdv.ru/bitrix/modules/sale/lib/controller/ |
Upload File : |
<?php namespace Bitrix\Sale\Controller; use Bitrix\Main\Engine\AutoWire\ExactParameter; use Bitrix\Main\Engine\Response\DataType\Page; use Bitrix\Main\Entity\ExpressionField; use Bitrix\Main\Error; use Bitrix\Main\Result; use Bitrix\Main\UI\PageNavigation; use Bitrix\Sale\Internals\CollectionFilterIterator; use Bitrix\Sale\PayableItem; use Bitrix\Sale\PayableItemCollection; use Bitrix\Sale\PayableShipmentItem; use Bitrix\Sale\PaymentCollection; use Bitrix\Sale\Registry; class PaymentItemShipment extends ControllerBase { public function getPrimaryAutoWiredParameter(): ExactParameter { return new ExactParameter( PayableShipmentItem::class, 'paymentItem', function($className, $id) { $registry = Registry::getInstance(Registry::REGISTRY_TYPE_ORDER); /** @var PayableItemCollection $payableItemCollection */ $payableItemCollection = $registry->get(Registry::ENTITY_PAYABLE_ITEM_COLLECTION); $pi = $payableItemCollection::getList([ 'select'=>['PAYMENT_ID'], 'filter'=>[ 'ID'=>$id, 'ENTITY_TYPE'=>PayableShipmentItem::getEntityType() ], ]); if($piRow = $pi->fetch()) { $registry = Registry::getInstance(Registry::REGISTRY_TYPE_ORDER); /** @var \Bitrix\Sale\Payment $paymentClass */ $paymentClass = $registry->getPaymentClassName(); $r = $paymentClass::getList([ 'select'=>['ORDER_ID'], 'filter'=>['ID'=>$piRow['PAYMENT_ID']] ]); if($row = $r->fetch()) { /** @var \Bitrix\Sale\Order $orderClass */ $orderClass = $registry->getOrderClassName(); $order = $orderClass::load($row['ORDER_ID']); $payment = $order->getPaymentCollection()->getItemById($piRow['PAYMENT_ID']); $payableItemCollection = $payment->getPayableItemCollection(); /** @var PayableItem $item */ foreach ($payableItemCollection as $item) { if($item->getId() == $id) { return $item; } } } else { $this->addError(new Error('payment is not exists', 200640400001)); } } $this->addError(new Error('payment item is not exists', 201240400001)); return null; } ); } //region Actions public function getFieldsAction(): array { $view = $this->getViewManager() ->getView($this); return ['PAYMENT_ITEM_SHIPMENT'=>$view->prepareFieldInfos( $view->getFields() )]; } public function getAction(PayableShipmentItem $paymentItem): array { return ['PAYMENT_ITEM_SHIPMENT'=>$paymentItem->toArray()]; } /** * @param $select * @param $filter * @param $order * @param PageNavigation $pageNavigation * @return Page * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ObjectPropertyException * @throws \Bitrix\Main\SystemException */ public function listAction(PageNavigation $pageNavigation, array $select = [], array $filter = [], array $order = []): Page { $select = empty($select) ? ['*'] : $select; $order = empty($order) ? ['ID' => 'ASC'] : $order; $filter['ENTITY_TYPE'] = PayableShipmentItem::getEntityType(); $registry = Registry::getInstance(Registry::REGISTRY_TYPE_ORDER); /** @var PayableItemCollection $payableItemCollection */ $payableItemCollection = $registry->get(Registry::ENTITY_PAYABLE_ITEM_COLLECTION); $paymentItems = $payableItemCollection::getList( [ 'select' => $select, 'filter' => $filter, 'order' => $order, 'offset' => $pageNavigation->getOffset(), 'limit' => $pageNavigation->getLimit(), ] )->fetchAll(); return new Page('PAYMENT_ITEMS_SHIPMENT', $paymentItems, function() use ($filter) { $registry = Registry::getInstance(Registry::REGISTRY_TYPE_ORDER); /** @var PayableItemCollection $payableItemCollection */ $payableItemCollection = $registry->get(Registry::ENTITY_PAYABLE_ITEM_COLLECTION); return (int) $payableItemCollection::getList([ 'select' => ['CNT'], 'filter' => $filter, 'runtime' => [ new ExpressionField('CNT', 'COUNT(ID)') ] ])->fetch()['CNT']; }); } public function addAction(array $fields): ?array { $result = new Result(); $paymentItem = null; $registry = Registry::getInstance(Registry::REGISTRY_TYPE_ORDER); $shipmentId = (int)$fields['SHIPMENT_ID']; $paymentId = (int)$fields['PAYMENT_ID']; unset($fields['PAYMENT_ID'], $fields['SHIPMENT_ID']); /** @var \Bitrix\Sale\Shipment $shipmentClass */ $shipmentClass = $registry->getShipmentClassName(); $r = $shipmentClass::getList([ 'select' => ['ORDER_ID'], 'filter' => ['ID' => $shipmentId], ]); if ($row = $r->fetch()) { /** @var \Bitrix\Sale\Order $orderClass */ $orderClass = $registry->getOrderClassName(); $order = $orderClass::load($row['ORDER_ID']); /** @var \Bitrix\Sale\Shipment $shipment */ $shipment = $order->getShipmentCollection()->getItemById($shipmentId); $payment = null; $collection = $order->getPaymentCollection(); if ($paymentId > 0) { $payment = $collection->getItemById($paymentId); if ($payment) { $paymentItems = $payment->getPayableItemCollection()->getShipments(); if (!$this->isExistShipment($paymentItems, $shipment)) { /** @var PayableShipmentItem $paymentItem */ $paymentItem = $payment->getPayableItemCollection()->createItemByShipment($shipment); $result = $paymentItem->setFields($fields); if ($result->isSuccess() && !$result->hasWarnings()) { $r = $this->save($paymentItem); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } else { $result->addError(new Error('Duplicate entry for key [shipmentId, paymentId]', 201250000001)); } } } if (!$payment) { $result->addError(new Error('payment not exists', 201240400002)); } } else { $result->addError(new Error('shipment not exists', 201240400003)); } if (!$result->isSuccess()) { $this->addErrors($result->getErrors()); return null; } elseif ($result->hasWarnings()) { $this->addErrors($result->getWarnings()); return null; } elseif ($paymentItem instanceof PayableItem) { return ['PAYMENT_ITEM_SHIPMENT' => $paymentItem->toArray()]; } else { return ['PAYMENT_ITEM_SHIPMENT' => $paymentItem]; } } public function updateAction(PayableShipmentItem $paymentItem, array $fields): ?array { $r = $paymentItem->setFields($fields); if($r->isSuccess() == false) { $this->addErrors($r->getErrors()); return null; } elseif($r->hasWarnings()) { $this->addErrors($r->getWarnings()); return null; } else { $r = $this->save($paymentItem); if(!$r->isSuccess()) { $this->addErrors($r->getErrors()); return null; } else { return ['PAYMENT_ITEM_SHIPMENT'=>$paymentItem->toArray()]; } } } public function deleteAction(PayableShipmentItem $paymentItem): ?bool { $r = $paymentItem->delete(); if($r->isSuccess() == false) { $this->addErrors($r->getErrors()); return null; } elseif($r->hasWarnings()) { $this->addErrors($r->getWarnings()); return null; } else { $r = $this->save($paymentItem); if(!$r->isSuccess()) { $this->addErrors($r->getErrors()); return null; } else { return true; } } } //endregion private function save(PayableShipmentItem $paymentItem): Result { $result = new Result(); /** @var PayableItemCollection $collectionPaymentItems */ $collectionPaymentItems = $paymentItem->getCollection(); /** @var \Bitrix\Sale\Payment $payment */ $payment = $collectionPaymentItems->getPayment(); /** @var PaymentCollection $collectionPayments */ $collectionPayments = $payment->getCollection(); $order = $collectionPayments->getOrder(); $r = $order->save(); if(!$r->isSuccess()) { $result->addErrors($r->getErrors()); } elseif($r->hasWarnings()) { $result->addErrors($r->getWarnings()); } return $result; } protected function isExistShipment(CollectionFilterIterator $paymentItems, \Bitrix\Sale\Shipment $shipment): bool { foreach ($paymentItems as $paymentItem) { /** @var \Bitrix\Sale\Shipment $entityShipment */ $entityShipment = $paymentItem->getEntityObject(); if ($shipment->getInternalIndex() === $entityShipment->getInternalIndex()) { return true; } } return false; } protected function checkModifyPermissionEntity(): Result { $r = new Result(); $saleModulePermissions = self::getApplication()->GetGroupRight("sale"); if ($saleModulePermissions < "W") { $r->addError(new Error('Access Denied', 200040300020)); } return $r; } protected function checkReadPermissionEntity(): Result { $r = new Result(); $saleModulePermissions = self::getApplication()->GetGroupRight("sale"); if ($saleModulePermissions == "D") { $r->addError(new Error('Access Denied', 200040300010)); } return $r; } }