ShippingDiscount.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\SalesRule\Model\Quote\Address\Total;
  8. use Magento\Quote\Api\Data\ShippingAssignmentInterface as ShippingAssignment;
  9. use Magento\Quote\Model\Quote;
  10. use Magento\Quote\Model\Quote\Address\Total;
  11. use Magento\SalesRule\Model\Quote\Discount as DiscountCollector;
  12. use Magento\SalesRule\Model\Validator;
  13. /**
  14. * Total collector for shipping discounts.
  15. */
  16. class ShippingDiscount extends \Magento\Quote\Model\Quote\Address\Total\AbstractTotal
  17. {
  18. /**
  19. * @var Validator
  20. */
  21. private $calculator;
  22. /**
  23. * @param Validator $calculator
  24. */
  25. public function __construct(Validator $calculator)
  26. {
  27. $this->calculator = $calculator;
  28. }
  29. /**
  30. * @inheritdoc
  31. *
  32. * @param Quote $quote
  33. * @param ShippingAssignment $shippingAssignment
  34. * @param Total $total
  35. * @return ShippingDiscount
  36. */
  37. public function collect(Quote $quote, ShippingAssignment $shippingAssignment, Total $total): self
  38. {
  39. parent::collect($quote, $shippingAssignment, $total);
  40. $address = $shippingAssignment->getShipping()->getAddress();
  41. $this->calculator->reset($address);
  42. $items = $shippingAssignment->getItems();
  43. if (!count($items)) {
  44. return $this;
  45. }
  46. $address->setShippingDiscountAmount(0);
  47. $address->setBaseShippingDiscountAmount(0);
  48. if ($address->getShippingAmount()) {
  49. $this->calculator->processShippingAmount($address);
  50. $total->addTotalAmount(DiscountCollector::COLLECTOR_TYPE_CODE, -$address->getShippingDiscountAmount());
  51. $total->addBaseTotalAmount(
  52. DiscountCollector::COLLECTOR_TYPE_CODE,
  53. -$address->getBaseShippingDiscountAmount()
  54. );
  55. $total->setShippingDiscountAmount($address->getShippingDiscountAmount());
  56. $total->setBaseShippingDiscountAmount($address->getBaseShippingDiscountAmount());
  57. $this->calculator->prepareDescription($address);
  58. $total->setDiscountDescription($address->getDiscountDescription());
  59. $total->setSubtotalWithDiscount($total->getSubtotal() + $total->getDiscountAmount());
  60. $total->setBaseSubtotalWithDiscount($total->getBaseSubtotal() + $total->getBaseDiscountAmount());
  61. $address->setDiscountAmount($total->getDiscountAmount());
  62. $address->setBaseDiscountAmount($total->getBaseDiscountAmount());
  63. }
  64. return $this;
  65. }
  66. /**
  67. * @inheritdoc
  68. *
  69. * @param \Magento\Quote\Model\Quote $quote
  70. * @param \Magento\Quote\Model\Quote\Address\Total $total
  71. * @return array
  72. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  73. */
  74. public function fetch(Quote $quote, Total $total): array
  75. {
  76. $result = [];
  77. $amount = $total->getDiscountAmount();
  78. if ($amount != 0) {
  79. $description = $total->getDiscountDescription() ?: '';
  80. $result = [
  81. 'code' => DiscountCollector::COLLECTOR_TYPE_CODE,
  82. 'title' => strlen($description) ? __('Discount (%1)', $description) : __('Discount'),
  83. 'value' => $amount
  84. ];
  85. }
  86. return $result;
  87. }
  88. }