/** * Send email to customer * * @param Creditmemo $creditmemo * @param bool $notify * @param string $comment * @return bool */ public function send(Creditmemo $creditmemo, $notify = true, $comment = '') { $order = $creditmemo->getOrder(); $this->templateContainer->setTemplateVars(['order' => $creditmemo->getOrder(), 'invoice' => $creditmemo, 'comment' => $comment, 'billing' => $order->getBillingAddress(), 'payment_html' => $this->getPaymentHtml($order), 'store' => $order->getStore()]); $result = $this->checkAndSend($order, $notify); if ($result) { $creditmemo->setEmailSent(true); $this->creditmemoResource->saveAttribute($creditmemo, 'email_sent'); } return $result; }
public function testGetOrder() { $orderId = 100000041; $this->creditmemo->setOrderId($orderId); $entityName = 'creditmemo'; $order = $this->getMock('Magento\\Sales\\Model\\Order', ['load', 'setHistoryEntityName', '__wakeUp'], [], '', false); $this->creditmemo->setOrderId($orderId); $order->expects($this->atLeastOnce())->method('setHistoryEntityName')->with($entityName)->will($this->returnSelf()); $order->expects($this->atLeastOnce())->method('load')->with($orderId)->will($this->returnValue($order)); $this->orderFactory->expects($this->atLeastOnce())->method('create')->will($this->returnValue($order)); $this->assertEquals($order, $this->creditmemo->getOrder()); }
/** * @param \Magento\Sales\Model\Order\Creditmemo $creditmemo * @return $this */ public function collect(\Magento\Sales\Model\Order\Creditmemo $creditmemo) { $creditmemo->setFee(0); $creditmemo->setBaseFee(0); $amount = $creditmemo->getOrder()->getFee(); $creditmemo->setFee($amount); $amount = $creditmemo->getOrder()->getBaseFee(); $creditmemo->setBaseFee($amount); $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $creditmemo->getFee()); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $creditmemo->getBaseFee()); return $this; }
/** * Prepare order data for refund * * @param \Magento\Sales\Model\Order\Creditmemo $creditmemo * @return void */ protected function prepareOrder(\Magento\Sales\Model\Order\Creditmemo $creditmemo) { $order = $creditmemo->getOrder(); $baseOrderRefund = $this->priceCurrency->round($order->getBaseTotalRefunded() + $creditmemo->getBaseGrandTotal()); $orderRefund = $this->priceCurrency->round($order->getTotalRefunded() + $creditmemo->getGrandTotal()); $order->setBaseTotalRefunded($baseOrderRefund); $order->setTotalRefunded($orderRefund); $order->setBaseSubtotalRefunded($order->getBaseSubtotalRefunded() + $creditmemo->getBaseSubtotal()); $order->setSubtotalRefunded($order->getSubtotalRefunded() + $creditmemo->getSubtotal()); $order->setBaseTaxRefunded($order->getBaseTaxRefunded() + $creditmemo->getBaseTaxAmount()); $order->setTaxRefunded($order->getTaxRefunded() + $creditmemo->getTaxAmount()); $order->setBaseDiscountTaxCompensationRefunded($order->getBaseDiscountTaxCompensationRefunded() + $creditmemo->getBaseDiscountTaxCompensationAmount()); $order->setDiscountTaxCompensationRefunded($order->getDiscountTaxCompensationRefunded() + $creditmemo->getDiscountTaxCompensationAmount()); $order->setBaseShippingRefunded($order->getBaseShippingRefunded() + $creditmemo->getBaseShippingAmount()); $order->setShippingRefunded($order->getShippingRefunded() + $creditmemo->getShippingAmount()); $order->setBaseShippingTaxRefunded($order->getBaseShippingTaxRefunded() + $creditmemo->getBaseShippingTaxAmount()); $order->setShippingTaxRefunded($order->getShippingTaxRefunded() + $creditmemo->getShippingTaxAmount()); $order->setAdjustmentPositive($order->getAdjustmentPositive() + $creditmemo->getAdjustmentPositive()); $order->setBaseAdjustmentPositive($order->getBaseAdjustmentPositive() + $creditmemo->getBaseAdjustmentPositive()); $order->setAdjustmentNegative($order->getAdjustmentNegative() + $creditmemo->getAdjustmentNegative()); $order->setBaseAdjustmentNegative($order->getBaseAdjustmentNegative() + $creditmemo->getBaseAdjustmentNegative()); $order->setDiscountRefunded($order->getDiscountRefunded() + $creditmemo->getDiscountAmount()); $order->setBaseDiscountRefunded($order->getBaseDiscountRefunded() + $creditmemo->getBaseDiscountAmount()); if ($creditmemo->getDoTransaction()) { $order->setTotalOnlineRefunded($order->getTotalOnlineRefunded() + $creditmemo->getGrandTotal()); $order->setBaseTotalOnlineRefunded($order->getBaseTotalOnlineRefunded() + $creditmemo->getBaseGrandTotal()); } else { $order->setTotalOfflineRefunded($order->getTotalOfflineRefunded() + $creditmemo->getGrandTotal()); $order->setBaseTotalOfflineRefunded($order->getBaseTotalOfflineRefunded() + $creditmemo->getBaseGrandTotal()); } $order->setBaseTotalInvoicedCost($order->getBaseTotalInvoicedCost() - $creditmemo->getBaseCost()); }
/** * @param \Magento\Sales\Model\Order\Creditmemo $creditmemo * @return $this * @throws \Magento\Framework\Exception\LocalizedException */ public function collect(\Magento\Sales\Model\Order\Creditmemo $creditmemo) { $order = $creditmemo->getOrder(); $allowedAmount = $order->getShippingAmount() - $order->getShippingRefunded(); $baseAllowedAmount = $order->getBaseShippingAmount() - $order->getBaseShippingRefunded(); $orderShippingAmount = $order->getShippingAmount(); $orderBaseShippingAmount = $order->getBaseShippingAmount(); $orderShippingInclTax = $order->getShippingInclTax(); $orderBaseShippingInclTax = $order->getBaseShippingInclTax(); $shippingAmount = $baseShippingAmount = $shippingInclTax = $baseShippingInclTax = 0; /** * Check if shipping amount was specified (from invoice or another source). * Using has magic method to allow setting 0 as shipping amount. */ if ($creditmemo->hasBaseShippingAmount()) { $baseShippingAmount = $this->priceCurrency->round($creditmemo->getBaseShippingAmount()); /* * Rounded allowed shipping refund amount is the highest acceptable shipping refund amount. * Shipping refund amount shouldn't cause errors, if it doesn't exceed that limit. * Note: ($x < $y + 0.0001) means ($x <= $y) for floats */ if ($baseShippingAmount < $this->priceCurrency->round($baseAllowedAmount) + 0.0001) { $ratio = 0; if ($orderBaseShippingAmount > 0) { $ratio = $baseShippingAmount / $orderBaseShippingAmount; } /* * Shipping refund amount should be equated to allowed refund amount, * if it exceeds that limit. * Note: ($x > $y - 0.0001) means ($x >= $y) for floats */ if ($baseShippingAmount > $baseAllowedAmount - 0.0001) { $shippingAmount = $allowedAmount; $baseShippingAmount = $baseAllowedAmount; } else { $shippingAmount = $this->priceCurrency->round($orderShippingAmount * $ratio); } $shippingInclTax = $this->priceCurrency->round($orderShippingInclTax * $ratio); $baseShippingInclTax = $this->priceCurrency->round($orderBaseShippingInclTax * $ratio); } else { $baseAllowedAmount = $order->getBaseCurrency()->format($baseAllowedAmount, null, false); throw new \Magento\Framework\Exception\LocalizedException(__('Maximum shipping amount allowed to refund is: %1', $baseAllowedAmount)); } } else { $shippingAmount = $allowedAmount; $baseShippingAmount = $baseAllowedAmount; $allowedTaxAmount = $order->getShippingTaxAmount() - $order->getShippingTaxRefunded(); $baseAllowedTaxAmount = $order->getBaseShippingTaxAmount() - $order->getBaseShippingTaxRefunded(); $shippingInclTax = $this->priceCurrency->round($allowedAmount + $allowedTaxAmount); $baseShippingInclTax = $this->priceCurrency->round($baseAllowedAmount + $baseAllowedTaxAmount); } $creditmemo->setShippingAmount($shippingAmount); $creditmemo->setBaseShippingAmount($baseShippingAmount); $creditmemo->setShippingInclTax($shippingInclTax); $creditmemo->setBaseShippingInclTax($baseShippingInclTax); $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $shippingAmount); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseShippingAmount); return $this; }
/** * Send email to customer * * @param Creditmemo $creditmemo * @param bool $notify * @param string $comment * @return bool */ public function send(Creditmemo $creditmemo, $notify = true, $comment = '') { $order = $creditmemo->getOrder(); $transport = ['order' => $order, 'creditmemo' => $creditmemo, 'comment' => $comment, 'billing' => $order->getBillingAddress(), 'store' => $order->getStore(), 'formattedShippingAddress' => $this->getFormattedShippingAddress($order), 'formattedBillingAddress' => $this->getFormattedBillingAddress($order)]; $this->eventManager->dispatch('email_creditmemo_comment_set_template_vars_before', ['sender' => $this, 'transport' => $transport]); $this->templateContainer->setTemplateVars($transport); return $this->checkAndSend($order, $notify); }
/** * @param \Magento\Sales\Model\Order\Creditmemo $creditmemo * @return $this */ public function collect(\Magento\Sales\Model\Order\Creditmemo $creditmemo) { $order = $creditmemo->getOrder(); $amount = $order->getFinanceCostAmount(); $baseAmount = $order->getBaseFinanceCostAmount(); if ($amount) { $creditmemo->setFinanceCostAmount($amount); $creditmemo->setBaseFinanceCostAmount($baseAmount); $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $amount); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseAmount); } return $this; }
/** * Send email to customer * * @param Creditmemo $creditmemo * @param bool $notify * @param string $comment * @return bool */ public function send(Creditmemo $creditmemo, $notify = true, $comment = '') { $order = $creditmemo->getOrder(); if ($order->getShippingAddress()) { $formattedShippingAddress = $this->addressRenderer->format($order->getShippingAddress(), 'html'); } else { $formattedShippingAddress = ''; } $formattedBillingAddress = $this->addressRenderer->format($order->getBillingAddress(), 'html'); $transport = new \Magento\Framework\Object(['template_vars' => ['order' => $order, 'creditmemo' => $creditmemo, 'comment' => $comment, 'billing' => $order->getBillingAddress(), 'store' => $order->getStore(), 'formattedShippingAddress' => $formattedShippingAddress, 'formattedBillingAddress' => $formattedBillingAddress]]); $this->eventManager->dispatch('email_creditmemo_comment_set_template_vars_before', ['sender' => $this, 'transport' => $transport]); $this->templateContainer->setTemplateVars($transport->getTemplateVars()); return $this->checkAndSend($order, $notify); }
/** * @param \Magento\Sales\Model\Order\Creditmemo $creditmemo * @return $this */ public function collect(\Magento\Sales\Model\Order\Creditmemo $creditmemo) { $creditmemo->setDiscountAmount(0); $creditmemo->setBaseDiscountAmount(0); $order = $creditmemo->getOrder(); $totalDiscountAmount = 0; $baseTotalDiscountAmount = 0; /** * Calculate how much shipping discount should be applied * basing on how much shipping should be refunded. */ $baseShippingAmount = $creditmemo->getBaseShippingAmount(); if ($baseShippingAmount) { $baseShippingDiscount = $baseShippingAmount * $order->getBaseShippingDiscountAmount() / $order->getBaseShippingAmount(); $shippingDiscount = $order->getShippingAmount() * $baseShippingDiscount / $order->getBaseShippingAmount(); $totalDiscountAmount = $totalDiscountAmount + $shippingDiscount; $baseTotalDiscountAmount = $baseTotalDiscountAmount + $baseShippingDiscount; } /** @var $item \Magento\Sales\Model\Order\Invoice\Item */ foreach ($creditmemo->getAllItems() as $item) { $orderItem = $item->getOrderItem(); if ($orderItem->isDummy()) { continue; } $orderItemDiscount = (double) $orderItem->getDiscountInvoiced(); $baseOrderItemDiscount = (double) $orderItem->getBaseDiscountInvoiced(); $orderItemQty = $orderItem->getQtyInvoiced(); if ($orderItemDiscount && $orderItemQty) { $discount = $orderItemDiscount - $orderItem->getDiscountRefunded(); $baseDiscount = $baseOrderItemDiscount - $orderItem->getBaseDiscountRefunded(); if (!$item->isLast()) { $availableQty = $orderItemQty - $orderItem->getQtyRefunded(); $discount = $creditmemo->roundPrice($discount / $availableQty * $item->getQty(), 'regular', true); $baseDiscount = $creditmemo->roundPrice($baseDiscount / $availableQty * $item->getQty(), 'base', true); } $item->setDiscountAmount($discount); $item->setBaseDiscountAmount($baseDiscount); $totalDiscountAmount += $discount; $baseTotalDiscountAmount += $baseDiscount; } } $creditmemo->setDiscountAmount(-$totalDiscountAmount); $creditmemo->setBaseDiscountAmount(-$baseTotalDiscountAmount); $creditmemo->setGrandTotal($creditmemo->getGrandTotal() - $totalDiscountAmount); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() - $baseTotalDiscountAmount); return $this; }
/** * Send email to customer * * @param Creditmemo $creditmemo * @param bool $notify * @param string $comment * @return bool */ public function send(Creditmemo $creditmemo, $notify = true, $comment = '') { $order = $creditmemo->getOrder(); $this->templateContainer->setTemplateVars(['order' => $order, 'creditmemo' => $creditmemo, 'comment' => $comment, 'billing' => $order->getBillingAddress(), 'store' => $order->getStore()]); return $this->checkAndSend($order, $notify); }
/** * @param \Magento\Sales\Model\Order\Creditmemo $creditmemo * @return $this * * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function collect(\Magento\Sales\Model\Order\Creditmemo $creditmemo) { $shippingTaxAmount = 0; $baseShippingTaxAmount = 0; $totalTax = 0; $baseTotalTax = 0; $totalDiscountTaxCompensation = 0; $baseTotalDiscountTaxCompensation = 0; $order = $creditmemo->getOrder(); /** @var $item \Magento\Sales\Model\Order\Creditmemo\Item */ foreach ($creditmemo->getAllItems() as $item) { $orderItem = $item->getOrderItem(); if ($orderItem->isDummy() || $item->getQty() <= 0) { continue; } $orderItemTax = (double) $orderItem->getTaxInvoiced(); $baseOrderItemTax = (double) $orderItem->getBaseTaxInvoiced(); $orderItemQty = (double) $orderItem->getQtyInvoiced(); if ($orderItemTax && $orderItemQty) { /** * Check item tax amount */ $tax = $orderItemTax - $orderItem->getTaxRefunded(); $baseTax = $baseOrderItemTax - $orderItem->getBaseTaxRefunded(); $discountTaxCompensation = $orderItem->getDiscountTaxCompensationInvoiced() - $orderItem->getDiscountTaxCompensationRefunded(); $baseDiscountTaxCompensation = $orderItem->getBaseDiscountTaxCompensationInvoiced() - $orderItem->getBaseDiscountTaxCompensationRefunded(); if (!$item->isLast()) { $availableQty = $orderItemQty - $orderItem->getQtyRefunded(); $tax = $creditmemo->roundPrice($tax / $availableQty * $item->getQty()); $baseTax = $creditmemo->roundPrice($baseTax / $availableQty * $item->getQty(), 'base'); $discountTaxCompensation = $creditmemo->roundPrice($discountTaxCompensation / $availableQty * $item->getQty()); $baseDiscountTaxCompensation = $creditmemo->roundPrice($baseDiscountTaxCompensation / $availableQty * $item->getQty(), 'base'); } $item->setTaxAmount($tax); $item->setBaseTaxAmount($baseTax); $item->setDiscountTaxCompensationAmount($discountTaxCompensation); $item->setBaseDiscountTaxCompensationAmount($baseDiscountTaxCompensation); $totalTax += $tax; $baseTotalTax += $baseTax; $totalDiscountTaxCompensation += $discountTaxCompensation; $baseTotalDiscountTaxCompensation += $baseDiscountTaxCompensation; } } $isPartialShippingRefunded = false; if ($invoice = $creditmemo->getInvoice()) { //recalculate tax amounts in case if refund shipping value was changed if ($order->getBaseShippingAmount() && $creditmemo->getBaseShippingAmount()) { $taxFactor = $creditmemo->getBaseShippingAmount() / $order->getBaseShippingAmount(); $shippingTaxAmount = $invoice->getShippingTaxAmount() * $taxFactor; $baseShippingTaxAmount = $invoice->getBaseShippingTaxAmount() * $taxFactor; $totalDiscountTaxCompensation += $invoice->getShippingDiscountTaxCompensationAmount() * $taxFactor; $baseTotalDiscountTaxCompensation += $invoice->getBaseShippingDiscountTaxCompensationAmnt() * $taxFactor; $shippingDiscountTaxCompensationAmount = $invoice->getShippingDiscountTaxCompensationAmount() * $taxFactor; $baseShippingDiscountTaxCompensationAmount = $invoice->getBaseShippingDiscountTaxCompensationAmnt() * $taxFactor; $shippingTaxAmount = $creditmemo->roundPrice($shippingTaxAmount); $baseShippingTaxAmount = $creditmemo->roundPrice($baseShippingTaxAmount, 'base'); $totalDiscountTaxCompensation = $creditmemo->roundPrice($totalDiscountTaxCompensation); $baseTotalDiscountTaxCompensation = $creditmemo->roundPrice($baseTotalDiscountTaxCompensation, 'base'); $shippingDiscountTaxCompensationAmount = $creditmemo->roundPrice($shippingDiscountTaxCompensationAmount); $baseShippingDiscountTaxCompensationAmount = $creditmemo->roundPrice($baseShippingDiscountTaxCompensationAmount, 'base'); if ($taxFactor < 1 && $invoice->getShippingTaxAmount() > 0) { $isPartialShippingRefunded = true; } $totalTax += $shippingTaxAmount; $baseTotalTax += $baseShippingTaxAmount; } } else { $orderShippingAmount = $order->getShippingAmount(); $baseOrderShippingAmount = $order->getBaseShippingAmount(); $baseOrderShippingRefundedAmount = $order->getBaseShippingRefunded(); $shippingTaxAmount = 0; $baseShippingTaxAmount = 0; $shippingDiscountTaxCompensationAmount = 0; $baseShippingDiscountTaxCompensationAmount = 0; $shippingDelta = $baseOrderShippingAmount - $baseOrderShippingRefundedAmount; if ($shippingDelta > $creditmemo->getBaseShippingAmount()) { $part = $creditmemo->getShippingAmount() / $orderShippingAmount; $basePart = $creditmemo->getBaseShippingAmount() / $baseOrderShippingAmount; $shippingTaxAmount = $order->getShippingTaxAmount() * $part; $baseShippingTaxAmount = $order->getBaseShippingTaxAmount() * $basePart; $shippingDiscountTaxCompensationAmount = $order->getShippingDiscountTaxCompensationAmount() * $part; $baseShippingDiscountTaxCompensationAmount = $order->getBaseShippingDiscountTaxCompensationAmnt() * $basePart; $shippingTaxAmount = $creditmemo->roundPrice($shippingTaxAmount); $baseShippingTaxAmount = $creditmemo->roundPrice($baseShippingTaxAmount, 'base'); $shippingDiscountTaxCompensationAmount = $creditmemo->roundPrice($shippingDiscountTaxCompensationAmount); $baseShippingDiscountTaxCompensationAmount = $creditmemo->roundPrice($baseShippingDiscountTaxCompensationAmount, 'base'); if ($part < 1 && $order->getShippingTaxAmount() > 0) { $isPartialShippingRefunded = true; } } elseif ($shippingDelta == $creditmemo->getBaseShippingAmount()) { $shippingTaxAmount = $order->getShippingTaxAmount() - $order->getShippingTaxRefunded(); $baseShippingTaxAmount = $order->getBaseShippingTaxAmount() - $order->getBaseShippingTaxRefunded(); $shippingDiscountTaxCompensationAmount = $order->getShippingDiscountTaxCompensationAmount() - $order->getShippingDiscountTaxCompensationRefunded(); $baseShippingDiscountTaxCompensationAmount = $order->getBaseShippingDiscountTaxCompensationAmnt() - $order->getBaseShippingDiscountTaxCompensationRefunded(); } $totalTax += $shippingTaxAmount; $baseTotalTax += $baseShippingTaxAmount; $totalDiscountTaxCompensation += $shippingDiscountTaxCompensationAmount; $baseTotalDiscountTaxCompensation += $baseShippingDiscountTaxCompensationAmount; } $allowedTax = $order->getTaxInvoiced() - $order->getTaxRefunded() - $creditmemo->getTaxAmount(); $allowedBaseTax = $order->getBaseTaxInvoiced() - $order->getBaseTaxRefunded() - $creditmemo->getBaseTaxAmount(); $allowedDiscountTaxCompensation = $order->getDiscountTaxCompensationInvoiced() + $order->getShippingDiscountTaxCompensationAmount() - $order->getDiscountTaxCompensationRefunded() - $order->getShippingDiscountTaxCompensationRefunded() - $creditmemo->getDiscountTaxCompensationAmount() - $creditmemo->getShippingDiscountTaxCompensationAmount(); $allowedBaseDiscountTaxCompensation = $order->getBaseDiscountTaxCompensationInvoiced() + $order->getBaseShippingDiscountTaxCompensationAmnt() - $order->getBaseDiscountTaxCompensationRefunded() - $order->getBaseShippingDiscountTaxCompensationRefunded() - $creditmemo->getBaseShippingDiscountTaxCompensationAmnt() - $creditmemo->getBaseDiscountTaxCompensationAmount(); if ($creditmemo->isLast() && !$isPartialShippingRefunded) { $totalTax = $allowedTax; $baseTotalTax = $allowedBaseTax; $totalDiscountTaxCompensation = $allowedDiscountTaxCompensation; $baseTotalDiscountTaxCompensation = $allowedBaseDiscountTaxCompensation; } else { $totalTax = min($allowedTax, $totalTax); $baseTotalTax = min($allowedBaseTax, $baseTotalTax); $totalDiscountTaxCompensation = min($allowedDiscountTaxCompensation, $totalDiscountTaxCompensation); $baseTotalDiscountTaxCompensation = min($allowedBaseDiscountTaxCompensation, $baseTotalDiscountTaxCompensation); } $creditmemo->setTaxAmount($creditmemo->getTaxAmount() + $totalTax); $creditmemo->setBaseTaxAmount($creditmemo->getBaseTaxAmount() + $baseTotalTax); $creditmemo->setDiscountTaxCompensationAmount($totalDiscountTaxCompensation); $creditmemo->setBaseDiscountTaxCompensationAmount($baseTotalDiscountTaxCompensation); $creditmemo->setShippingTaxAmount($shippingTaxAmount); $creditmemo->setBaseShippingTaxAmount($baseShippingTaxAmount); $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $totalTax + $totalDiscountTaxCompensation); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseTotalTax + $baseTotalDiscountTaxCompensation); return $this; }
/** * @param \Magento\Sales\Model\Order\Creditmemo $creditmemo * @return $this * @throws \Magento\Framework\Exception\LocalizedException */ public function collect(\Magento\Sales\Model\Order\Creditmemo $creditmemo) { $order = $creditmemo->getOrder(); // amounts without tax $orderShippingAmount = $order->getShippingAmount(); $orderBaseShippingAmount = $order->getBaseShippingAmount(); $allowedAmount = $orderShippingAmount - $order->getShippingRefunded(); $baseAllowedAmount = $orderBaseShippingAmount - $order->getBaseShippingRefunded(); // amounts including tax $orderShippingInclTax = $order->getShippingInclTax(); $orderBaseShippingInclTax = $order->getBaseShippingInclTax(); $allowedTaxAmount = $order->getShippingTaxAmount() - $order->getShippingTaxRefunded(); $baseAllowedTaxAmount = $order->getBaseShippingTaxAmount() - $order->getBaseShippingTaxRefunded(); $allowedAmountInclTax = $allowedAmount + $allowedTaxAmount; $baseAllowedAmountInclTax = $baseAllowedAmount + $baseAllowedTaxAmount; // for the credit memo $shippingAmount = $baseShippingAmount = $shippingInclTax = $baseShippingInclTax = 0; // Check if the desired shipping amount to refund was specified (from invoice or another source). if ($creditmemo->hasBaseShippingAmount()) { // For the conditional logic, we will either use amounts that always include tax -OR- never include tax. // The logic uses the 'base' currency to be consistent with what the user (admin) provided as input. $useAmountsWithTax = $this->isSuppliedShippingAmountInclTax($order); // Since the user (admin) supplied 'desiredAmount' it already has tax -OR- does not include tax $desiredAmount = $this->priceCurrency->round($creditmemo->getBaseShippingAmount()); $maxAllowedAmount = $useAmountsWithTax ? $baseAllowedAmountInclTax : $baseAllowedAmount; $originalTotalAmount = $useAmountsWithTax ? $orderBaseShippingInclTax : $orderBaseShippingAmount; // Note: ($x < $y + 0.0001) means ($x <= $y) for floats if ($desiredAmount < $this->priceCurrency->round($maxAllowedAmount) + 0.0001) { // since the admin is returning less than the allowed amount, compute the ratio being returned $ratio = 0; if ($originalTotalAmount > 0) { $ratio = $desiredAmount / $originalTotalAmount; } // capture amounts without tax // Note: ($x > $y - 0.0001) means ($x >= $y) for floats if ($desiredAmount > $maxAllowedAmount - 0.0001) { $shippingAmount = $allowedAmount; $baseShippingAmount = $baseAllowedAmount; } else { $shippingAmount = $this->priceCurrency->round($orderShippingAmount * $ratio); $baseShippingAmount = $this->priceCurrency->round($orderBaseShippingAmount * $ratio); } $shippingInclTax = $this->priceCurrency->round($orderShippingInclTax * $ratio); $baseShippingInclTax = $this->priceCurrency->round($orderBaseShippingInclTax * $ratio); } else { $maxAllowedAmount = $order->getBaseCurrency()->format($maxAllowedAmount, null, false); throw new \Magento\Framework\Exception\LocalizedException(__('Maximum shipping amount allowed to refund is: %1', $maxAllowedAmount)); } } else { $shippingAmount = $allowedAmount; $baseShippingAmount = $baseAllowedAmount; $shippingInclTax = $this->priceCurrency->round($allowedAmountInclTax); $baseShippingInclTax = $this->priceCurrency->round($baseAllowedAmountInclTax); } $creditmemo->setShippingAmount($shippingAmount); $creditmemo->setBaseShippingAmount($baseShippingAmount); $creditmemo->setShippingInclTax($shippingInclTax); $creditmemo->setBaseShippingInclTax($baseShippingInclTax); $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $shippingAmount); $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseShippingAmount); return $this; }
/** * Sends order creditmemo email to the customer. * * Email will be sent immediately in two cases: * * - if asynchronous email sending is disabled in global settings * - if $forceSyncMode parameter is set to TRUE * * Otherwise, email will be sent later during running of * corresponding cron job. * * @param Creditmemo $creditmemo * @param bool $forceSyncMode * @return bool */ public function send(Creditmemo $creditmemo, $forceSyncMode = false) { $creditmemo->setSendEmail(true); if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) { $order = $creditmemo->getOrder(); if ($order->getShippingAddress()) { $formattedShippingAddress = $this->addressRenderer->format($order->getShippingAddress(), 'html'); } else { $formattedShippingAddress = ''; } $formattedBillingAddress = $this->addressRenderer->format($order->getBillingAddress(), 'html'); $transport = new \Magento\Framework\Object(['template_vars' => ['order' => $order, 'creditmemo' => $creditmemo, 'comment' => $creditmemo->getCustomerNoteNotify() ? $creditmemo->getCustomerNote() : '', 'billing' => $order->getBillingAddress(), 'payment_html' => $this->getPaymentHtml($order), 'store' => $order->getStore(), 'formattedShippingAddress' => $formattedShippingAddress, 'formattedBillingAddress' => $formattedBillingAddress]]); $this->eventManager->dispatch('email_creditmemo_set_template_vars_before', ['sender' => $this, 'transport' => $transport]); $this->templateContainer->setTemplateVars($transport->getTemplateVars()); if ($this->checkAndSend($order)) { $creditmemo->setEmailSent(true); $this->creditmemoResource->saveAttribute($creditmemo, ['send_email', 'email_sent']); return true; } } $this->creditmemoResource->saveAttribute($creditmemo, 'send_email'); return false; }