Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
InvoiceService.php
Go to the documentation of this file.
1 <?php
7 
10 
15 {
21  protected $repository;
22 
28  protected $commentRepository;
29 
35  protected $criteriaBuilder;
36 
42  protected $filterBuilder;
43 
49  protected $invoiceNotifier;
50 
54  protected $orderRepository;
55 
59  protected $orderConverter;
60 
72  public function __construct(
76  \Magento\Framework\Api\FilterBuilder $filterBuilder,
77  \Magento\Sales\Model\Order\InvoiceNotifier $notifier,
79  \Magento\Sales\Model\Convert\Order $orderConverter
80  ) {
81  $this->repository = $repository;
82  $this->commentRepository = $commentRepository;
83  $this->criteriaBuilder = $criteriaBuilder;
84  $this->filterBuilder = $filterBuilder;
85  $this->invoiceNotifier = $notifier;
86  $this->orderRepository = $orderRepository;
87  $this->orderConverter = $orderConverter;
88  }
89 
93  public function setCapture($id)
94  {
95  return (bool)$this->repository->get($id)->capture();
96  }
97 
101  public function getCommentsList($id)
102  {
103  $this->criteriaBuilder->addFilters(
104  [$this->filterBuilder->setField('parent_id')->setValue($id)->setConditionType('eq')->create()]
105  );
106  $searchCriteria = $this->criteriaBuilder->create();
107  return $this->commentRepository->getList($searchCriteria);
108  }
109 
113  public function notify($id)
114  {
115  $invoice = $this->repository->get($id);
116  return $this->invoiceNotifier->notify($invoice);
117  }
118 
122  public function setVoid($id)
123  {
124  return (bool)$this->repository->get($id)->void();
125  }
126 
135  public function prepareInvoice(Order $order, array $qtys = [])
136  {
137  $invoice = $this->orderConverter->toInvoice($order);
138  $totalQty = 0;
139  $qtys = $this->prepareItemsQty($order, $qtys);
140  foreach ($order->getAllItems() as $orderItem) {
141  if (!$this->_canInvoiceItem($orderItem, $qtys)) {
142  continue;
143  }
144  $item = $this->orderConverter->itemToInvoiceItem($orderItem);
145  if ($orderItem->isDummy()) {
146  $qty = $orderItem->getQtyOrdered() ? $orderItem->getQtyOrdered() : 1;
147  } elseif (isset($qtys[$orderItem->getId()])) {
148  $qty = (double) $qtys[$orderItem->getId()];
149  } elseif (empty($qtys)) {
150  $qty = $orderItem->getQtyToInvoice();
151  } else {
152  $qty = 0;
153  }
154  $totalQty += $qty;
155  $this->setInvoiceItemQuantity($item, $qty);
156  $invoice->addItem($item);
157  }
158  $invoice->setTotalQty($totalQty);
159  $invoice->collectTotals();
160  $order->getInvoiceCollection()->addItem($invoice);
161  return $invoice;
162  }
163 
171  private function prepareItemsQty(Order $order, array $qtys = [])
172  {
173  foreach ($order->getAllItems() as $orderItem) {
174  if (empty($qtys[$orderItem->getId()])) {
175  continue;
176  }
177  if ($orderItem->isDummy()) {
178  if ($orderItem->getHasChildren()) {
179  foreach ($orderItem->getChildrenItems() as $child) {
180  if (!isset($qtys[$child->getId()])) {
181  $qtys[$child->getId()] = $child->getQtyToInvoice();
182  }
183  }
184  } elseif ($orderItem->getParentItem()) {
185  $parent = $orderItem->getParentItem();
186  if (!isset($qtys[$parent->getId()])) {
187  $qtys[$parent->getId()] = $parent->getQtyToInvoice();
188  }
189  }
190  }
191  }
192 
193  return $qtys;
194  }
195 
204  protected function _canInvoiceItem(\Magento\Sales\Api\Data\OrderItemInterface $item, array $qtys = [])
205  {
206  if ($item->getLockedDoInvoice()) {
207  return false;
208  }
209  if ($item->isDummy()) {
210  if ($item->getHasChildren()) {
211  foreach ($item->getChildrenItems() as $child) {
212  if (empty($qtys)) {
213  if ($child->getQtyToInvoice() > 0) {
214  return true;
215  }
216  } else {
217  if (isset($qtys[$child->getId()]) && $qtys[$child->getId()] > 0) {
218  return true;
219  }
220  }
221  }
222  return false;
223  } elseif ($item->getParentItem()) {
224  $parent = $item->getParentItem();
225  if (empty($qtys)) {
226  return $parent->getQtyToInvoice() > 0;
227  } else {
228  return isset($qtys[$parent->getId()]) && $qtys[$parent->getId()] > 0;
229  }
230  }
231  } else {
232  return $item->getQtyToInvoice() > 0;
233  }
234  }
235 
244  protected function setInvoiceItemQuantity(\Magento\Sales\Api\Data\InvoiceItemInterface $item, $qty)
245  {
246  $qty = ($item->getOrderItem()->getIsQtyDecimal()) ? (double) $qty : (int) $qty;
247  $qty = $qty > 0 ? $qty : 0;
248 
252  $qtyToInvoice = sprintf("%F", $item->getOrderItem()->getQtyToInvoice());
253  $qty = sprintf("%F", $qty);
254  if ($qty > $qtyToInvoice && !$item->getOrderItem()->isDummy()) {
255  throw new \Magento\Framework\Exception\LocalizedException(
256  __('We found an invalid quantity to invoice item "%1".', $item->getName())
257  );
258  }
259 
260  $item->setQty($qty);
261 
262  return $this;
263  }
264 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$orderItem
Definition: order.php:30
$id
Definition: fieldset.phtml:14
$order
Definition: order.php:55
__()
Definition: __.php:13
$searchCriteria
$invoice
__construct(\Magento\Sales\Api\InvoiceRepositoryInterface $repository, \Magento\Sales\Api\InvoiceCommentRepositoryInterface $commentRepository, \Magento\Framework\Api\SearchCriteriaBuilder $criteriaBuilder, \Magento\Framework\Api\FilterBuilder $filterBuilder, \Magento\Sales\Model\Order\InvoiceNotifier $notifier, \Magento\Sales\Api\OrderRepositoryInterface $orderRepository, \Magento\Sales\Model\Convert\Order $orderConverter)
setInvoiceItemQuantity(\Magento\Sales\Api\Data\InvoiceItemInterface $item, $qty)
_canInvoiceItem(\Magento\Sales\Api\Data\OrderItemInterface $item, array $qtys=[])
prepareInvoice(Order $order, array $qtys=[])