Discount.php 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Model\Order\Invoice\Total;
  7. class Discount extends AbstractTotal
  8. {
  9. /**
  10. * @param \Magento\Sales\Model\Order\Invoice $invoice
  11. * @return $this
  12. */
  13. public function collect(\Magento\Sales\Model\Order\Invoice $invoice)
  14. {
  15. $invoice->setDiscountAmount(0);
  16. $invoice->setBaseDiscountAmount(0);
  17. $totalDiscountAmount = 0;
  18. $baseTotalDiscountAmount = 0;
  19. /**
  20. * Checking if shipping discount was added in previous invoices.
  21. * So basically if we have invoice with positive discount and it
  22. * was not canceled we don't add shipping discount to this one.
  23. */
  24. $addShippingDiscount = true;
  25. foreach ($invoice->getOrder()->getInvoiceCollection() as $previousInvoice) {
  26. if ($previousInvoice->getDiscountAmount()) {
  27. $addShippingDiscount = false;
  28. }
  29. }
  30. if ($addShippingDiscount) {
  31. $totalDiscountAmount = $totalDiscountAmount + $invoice->getOrder()->getShippingDiscountAmount();
  32. $baseTotalDiscountAmount = $baseTotalDiscountAmount +
  33. $invoice->getOrder()->getBaseShippingDiscountAmount();
  34. }
  35. /** @var $item \Magento\Sales\Model\Order\Invoice\Item */
  36. foreach ($invoice->getAllItems() as $item) {
  37. $orderItem = $item->getOrderItem();
  38. if ($orderItem->isDummy()) {
  39. continue;
  40. }
  41. $orderItemDiscount = (double)$orderItem->getDiscountAmount();
  42. $baseOrderItemDiscount = (double)$orderItem->getBaseDiscountAmount();
  43. $orderItemQty = $orderItem->getQtyOrdered();
  44. if ($orderItemDiscount && $orderItemQty) {
  45. /**
  46. * Resolve rounding problems
  47. */
  48. $discount = $orderItemDiscount - $orderItem->getDiscountInvoiced();
  49. $baseDiscount = $baseOrderItemDiscount - $orderItem->getBaseDiscountInvoiced();
  50. if (!$item->isLast()) {
  51. $activeQty = $orderItemQty - $orderItem->getQtyInvoiced();
  52. $discount = $invoice->roundPrice($discount / $activeQty * $item->getQty(), 'regular', true);
  53. $baseDiscount = $invoice->roundPrice($baseDiscount / $activeQty * $item->getQty(), 'base', true);
  54. }
  55. $item->setDiscountAmount($discount);
  56. $item->setBaseDiscountAmount($baseDiscount);
  57. $totalDiscountAmount += $discount;
  58. $baseTotalDiscountAmount += $baseDiscount;
  59. }
  60. }
  61. $invoice->setDiscountAmount(-$totalDiscountAmount);
  62. $invoice->setBaseDiscountAmount(-$baseTotalDiscountAmount);
  63. $invoice->setGrandTotal($invoice->getGrandTotal() - $totalDiscountAmount);
  64. $invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() - $baseTotalDiscountAmount);
  65. return $this;
  66. }
  67. }