/** * @param \Magento\Sales\Model\Order\Invoice $invoice * @return $this */ public function collect(\Magento\Sales\Model\Order\Invoice $invoice) { $invoice->setShippingAmount(0); $invoice->setBaseShippingAmount(0); $orderShippingAmount = $invoice->getOrder()->getShippingAmount(); $baseOrderShippingAmount = $invoice->getOrder()->getBaseShippingAmount(); $shippingInclTax = $invoice->getOrder()->getShippingInclTax(); $baseShippingInclTax = $invoice->getOrder()->getBaseShippingInclTax(); if ($orderShippingAmount) { /** * Check shipping amount in previous invoices */ foreach ($invoice->getOrder()->getInvoiceCollection() as $previousInvoice) { if ((double) $previousInvoice->getShippingAmount() && !$previousInvoice->isCanceled()) { return $this; } } $invoice->setShippingAmount($orderShippingAmount); $invoice->setBaseShippingAmount($baseOrderShippingAmount); $invoice->setShippingInclTax($shippingInclTax); $invoice->setBaseShippingInclTax($baseShippingInclTax); $invoice->setGrandTotal($invoice->getGrandTotal() + $orderShippingAmount); $invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() + $baseOrderShippingAmount); } return $this; }
public function testGetOrder() { $orderId = 100000041; $this->model->setOrderId($orderId); $entityName = 'invoice'; $this->orderMock->expects($this->atLeastOnce())->method('setHistoryEntityName')->with($entityName)->will($this->returnSelf()); $this->assertEquals($this->orderMock, $this->model->getOrder()); }
/** * Collect invoice subtotal * * @param \Magento\Sales\Model\Order\Invoice $invoice * @return $this */ public function collect(\Magento\Sales\Model\Order\Invoice $invoice) { $subtotal = 0; $baseSubtotal = 0; $subtotalInclTax = 0; $baseSubtotalInclTax = 0; $order = $invoice->getOrder(); foreach ($invoice->getAllItems() as $item) { if ($item->getOrderItem()->isDummy()) { continue; } $item->calcRowTotal(); $subtotal += $item->getRowTotal(); $baseSubtotal += $item->getBaseRowTotal(); $subtotalInclTax += $item->getRowTotalInclTax(); $baseSubtotalInclTax += $item->getBaseRowTotalInclTax(); } $allowedSubtotal = $order->getSubtotal() - $order->getSubtotalInvoiced(); $baseAllowedSubtotal = $order->getBaseSubtotal() - $order->getBaseSubtotalInvoiced(); $allowedSubtotalInclTax = $allowedSubtotal + $order->getHiddenTaxAmount() + $order->getTaxAmount() - $order->getTaxInvoiced() - $order->getHiddenTaxInvoiced(); $baseAllowedSubtotalInclTax = $baseAllowedSubtotal + $order->getBaseHiddenTaxAmount() + $order->getBaseTaxAmount() - $order->getBaseTaxInvoiced() - $order->getBaseHiddenTaxInvoiced(); /** * Check if shipping tax calculation is included to current invoice. */ $includeShippingTax = true; foreach ($invoice->getOrder()->getInvoiceCollection() as $previousInvoice) { if ($previousInvoice->getShippingAmount() && !$previousInvoice->isCanceled()) { $includeShippingTax = false; break; } } if ($includeShippingTax) { $allowedSubtotalInclTax -= $order->getShippingTaxAmount(); $baseAllowedSubtotalInclTax -= $order->getBaseShippingTaxAmount(); } else { $allowedSubtotalInclTax += $order->getShippingHiddenTaxAmount(); $baseAllowedSubtotalInclTax += $order->getBaseShippingHiddenTaxAmount(); } if ($invoice->isLast()) { $subtotal = $allowedSubtotal; $baseSubtotal = $baseAllowedSubtotal; $subtotalInclTax = $allowedSubtotalInclTax; $baseSubtotalInclTax = $baseAllowedSubtotalInclTax; } else { $subtotal = min($allowedSubtotal, $subtotal); $baseSubtotal = min($baseAllowedSubtotal, $baseSubtotal); $subtotalInclTax = min($allowedSubtotalInclTax, $subtotalInclTax); $baseSubtotalInclTax = min($baseAllowedSubtotalInclTax, $baseSubtotalInclTax); } $invoice->setSubtotal($subtotal); $invoice->setBaseSubtotal($baseSubtotal); $invoice->setSubtotalInclTax($subtotalInclTax); $invoice->setBaseSubtotalInclTax($baseSubtotalInclTax); $invoice->setGrandTotal($invoice->getGrandTotal() + $subtotal); $invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() + $baseSubtotal); return $this; }
/** * @param \Magento\Sales\Model\Order\Invoice $invoice * @return $this */ public function collect(\Magento\Sales\Model\Order\Invoice $invoice) { $invoice->setDiscountAmount(0); $invoice->setBaseDiscountAmount(0); $totalDiscountAmount = 0; $baseTotalDiscountAmount = 0; /** * Checking if shipping discount was added in previous invoices. * So basically if we have invoice with positive discount and it * was not canceled we don't add shipping discount to this one. */ $addShippingDiscount = true; foreach ($invoice->getOrder()->getInvoiceCollection() as $previousInvoice) { if ($previousInvoice->getDiscountAmount()) { $addShippingDiscount = false; } } if ($addShippingDiscount) { $totalDiscountAmount = $totalDiscountAmount + $invoice->getOrder()->getShippingDiscountAmount(); $baseTotalDiscountAmount = $baseTotalDiscountAmount + $invoice->getOrder()->getBaseShippingDiscountAmount(); } /** @var $item \Magento\Sales\Model\Order\Invoice\Item */ foreach ($invoice->getAllItems() as $item) { $orderItem = $item->getOrderItem(); if ($orderItem->isDummy()) { continue; } $orderItemDiscount = (double) $orderItem->getDiscountAmount(); $baseOrderItemDiscount = (double) $orderItem->getBaseDiscountAmount(); $orderItemQty = $orderItem->getQtyOrdered(); if ($orderItemDiscount && $orderItemQty) { /** * Resolve rounding problems */ $discount = $orderItemDiscount - $orderItem->getDiscountInvoiced(); $baseDiscount = $baseOrderItemDiscount - $orderItem->getBaseDiscountInvoiced(); if (!$item->isLast()) { $activeQty = $orderItemQty - $orderItem->getQtyInvoiced(); $discount = $invoice->roundPrice($discount / $activeQty * $item->getQty(), 'regular', true); $baseDiscount = $invoice->roundPrice($baseDiscount / $activeQty * $item->getQty(), 'base', true); } $item->setDiscountAmount($discount); $item->setBaseDiscountAmount($baseDiscount); $totalDiscountAmount += $discount; $baseTotalDiscountAmount += $baseDiscount; } } $invoice->setDiscountAmount(-$totalDiscountAmount); $invoice->setBaseDiscountAmount(-$baseTotalDiscountAmount); $invoice->setGrandTotal($invoice->getGrandTotal() - $totalDiscountAmount); $invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() - $baseTotalDiscountAmount); return $this; }
/** * @param \Magento\Sales\Model\Order\Invoice $invoice * @return $this */ public function collect(\Magento\Sales\Model\Order\Invoice $invoice) { $invoice->setFee(0); $invoice->setBaseFee(0); $amount = $invoice->getOrder()->getFee(); $invoice->setFee($amount); $amount = $invoice->getOrder()->getBaseFee(); $invoice->setBaseFee($amount); $invoice->setGrandTotal($invoice->getGrandTotal() + $invoice->getFee()); $invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() + $invoice->getFee()); return $this; }
/** * Send email to customer * * @param Invoice $invoice * @param bool $notify * @param string $comment * @return bool */ public function send(Invoice $invoice, $notify = true, $comment = '') { $order = $invoice->getOrder(); $transport = ['order' => $order, 'invoice' => $invoice, 'comment' => $comment, 'billing' => $order->getBillingAddress(), 'store' => $order->getStore(), 'formattedShippingAddress' => $this->getFormattedShippingAddress($order), 'formattedBillingAddress' => $this->getFormattedBillingAddress($order)]; $this->eventManager->dispatch('email_invoice_comment_set_template_vars_before', ['sender' => $this, 'transport' => $transport]); $this->templateContainer->setTemplateVars($transport); return $this->checkAndSend($order, $notify); }
/** * Prepare shipment * * @param \Magento\Sales\Model\Order\Invoice $invoice * @return \Magento\Sales\Model\Order\Shipment|false */ protected function _prepareShipment($invoice) { $invoiceData = $this->getRequest()->getParam('invoice'); $shipment = $this->shipmentFactory->create($invoice->getOrder(), isset($invoiceData['items']) ? $invoiceData['items'] : [], $this->getRequest()->getPost('tracking')); if (!$shipment->getTotalQty()) { return false; } return $shipment->register(); }
/** * Send email to customer * * @param Invoice $invoice * @param bool $notify * @param string $comment * @return bool */ public function send(Invoice $invoice, $notify = true, $comment = '') { $order = $invoice->getOrder(); $this->templateContainer->setTemplateVars(['order' => $order, 'invoice' => $invoice, 'comment' => $comment, 'billing' => $order->getBillingAddress(), 'payment_html' => $this->getPaymentHtml($order), 'store' => $order->getStore()]); $result = $this->checkAndSend($order, $notify); if ($result) { $invoice->setEmailSent(true); $this->invoiceResource->saveAttribute($invoice, 'email_sent'); } return $result; }
/** * @param \Magento\Sales\Model\Order\Invoice $invoice * * @return $this */ public function collect(\Magento\Sales\Model\Order\Invoice $invoice) { $order = $invoice->getOrder(); $amount = $order->getFinanceCostAmount(); $baseAmount = $order->getBaseFinanceCostAmount(); if ($amount) { $invoice->setFinanceCostAmount($amount); $invoice->setBaseFinanceCostAmount($baseAmount); $invoice->setGrandTotal($invoice->getGrandTotal() + $amount); $invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() + $baseAmount); } return $this; }
public function testSetOrder() { $orderId = 1111; $storeId = 2221; $this->orderMock->setId($orderId); $this->orderMock->setStoreId($storeId); $this->assertNull($this->model->getOrderId()); $this->assertNull($this->model->getStoreId()); $this->assertEquals($this->model, $this->model->setOrder($this->orderMock)); $this->assertEquals($this->orderMock, $this->model->getOrder()); $this->assertEquals($orderId, $this->model->getOrderId()); $this->assertEquals($storeId, $this->model->getStoreId()); }
/** * Send email to customer * * @param Invoice $invoice * @param bool $notify * @param string $comment * @return bool */ public function send(Invoice $invoice, $notify = true, $comment = '') { $order = $invoice->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, 'invoice' => $invoice, 'comment' => $comment, 'billing' => $order->getBillingAddress(), 'store' => $order->getStore(), 'formattedShippingAddress' => $formattedShippingAddress, 'formattedBillingAddress' => $formattedBillingAddress]]); $this->eventManager->dispatch('email_invoice_comment_set_template_vars_before', ['sender' => $this, 'transport' => $transport]); $this->templateContainer->setTemplateVars($transport->getTemplateVars()); return $this->checkAndSend($order, $notify); }
/** * Prepare shipment * * @param \Magento\Sales\Model\Order\Invoice $invoice * @return \Magento\Sales\Model\Order\Shipment|false */ protected function _prepareShipment($invoice) { $savedQtys = []; $data = $this->getRequest()->getParam('invoice'); if (isset($data['items'])) { $savedQtys = $data['items']; } $shipment = $this->_objectManager->create('Magento\\Sales\\Model\\Service\\Order', ['order' => $invoice->getOrder()])->prepareShipment($savedQtys); if (!$shipment->getTotalQty()) { return false; } $shipment->register(); $tracks = $this->getRequest()->getPost('tracking'); if ($tracks) { foreach ($tracks as $data) { $track = $this->_objectManager->create('Magento\\Sales\\Model\\Order\\Shipment\\Track')->addData($data); $shipment->addTrack($track); } } return $shipment; }
/** * Collect invoice subtotal * * @param \Magento\Sales\Model\Order\Invoice $invoice * @return $this */ public function collect(\Magento\Sales\Model\Order\Invoice $invoice) { $subtotal = 0; $baseSubtotal = 0; $subtotalInclTax = 0; $baseSubtotalInclTax = 0; $order = $invoice->getOrder(); foreach ($invoice->getAllItems() as $item) { if ($item->getOrderItem()->isDummy()) { continue; } $item->calcRowTotal(); $subtotal += $item->getRowTotal(); $baseSubtotal += $item->getBaseRowTotal(); $subtotalInclTax += $item->getRowTotalInclTax(); $baseSubtotalInclTax += $item->getBaseRowTotalInclTax(); } $allowedSubtotal = $order->getSubtotal() - $order->getSubtotalInvoiced(); $baseAllowedSubtotal = $order->getBaseSubtotal() - $order->getBaseSubtotalInvoiced(); //Note: The $subtotalInclTax and $baseSubtotalInclTax are not adjusted from those provide by the line items //because the "InclTax" is displayed before any tax adjustments based on discounts, shipping, etc. if ($invoice->isLast()) { $subtotal = $allowedSubtotal; $baseSubtotal = $baseAllowedSubtotal; } else { $subtotal = min($allowedSubtotal, $subtotal); $baseSubtotal = min($baseAllowedSubtotal, $baseSubtotal); } $invoice->setSubtotal($subtotal); $invoice->setBaseSubtotal($baseSubtotal); $invoice->setSubtotalInclTax($subtotalInclTax); $invoice->setBaseSubtotalInclTax($baseSubtotalInclTax); $invoice->setGrandTotal($invoice->getGrandTotal() + $subtotal); $invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() + $baseSubtotal); return $this; }
/** * Collect Weee amounts for the invoice * * @param \Magento\Sales\Model\Order\Invoice $invoice * @return $this * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function collect(\Magento\Sales\Model\Order\Invoice $invoice) { $store = $invoice->getStore(); $order = $invoice->getOrder(); $totalWeeeAmount = 0; $baseTotalWeeeAmount = 0; $totalWeeeAmountInclTax = 0; $baseTotalWeeeAmountInclTax = 0; $totalWeeeTaxAmount = 0; $baseTotalWeeeTaxAmount = 0; /** @var \Magento\Sales\Model\Order\Invoice\Item $item */ foreach ($invoice->getAllItems() as $item) { $orderItem = $item->getOrderItem(); $orderItemQty = $orderItem->getQtyOrdered(); if (!$orderItemQty || $orderItem->isDummy() || $item->getQty() <= 0) { continue; } $ratio = $item->getQty() / $orderItemQty; $orderItemWeeeAmount = $orderItem->getWeeeTaxAppliedRowAmount(); $orderItemBaseWeeeAmount = $orderItem->getBaseWeeeTaxAppliedRowAmnt(); $weeeAmount = $invoice->roundPrice($orderItemWeeeAmount * $ratio); $baseWeeeAmount = $invoice->roundPrice($orderItemBaseWeeeAmount * $ratio, 'base'); $orderItemWeeeInclTax = $this->_weeeData->getRowWeeeTaxInclTax($orderItem); $orderItemBaseWeeeInclTax = $this->_weeeData->getBaseRowWeeeTaxInclTax($orderItem); $weeeAmountInclTax = $invoice->roundPrice($orderItemWeeeInclTax * $ratio); $baseWeeeAmountInclTax = $invoice->roundPrice($orderItemBaseWeeeInclTax * $ratio, 'base'); $orderItemWeeeTax = $orderItemWeeeInclTax - $orderItemWeeeAmount; $itemWeeeTax = $weeeAmountInclTax - $weeeAmount; $itemBaseWeeeTax = $baseWeeeAmountInclTax - $baseWeeeAmount; if ($item->isLast()) { $weeeAmount = $orderItemWeeeAmount - $this->_weeeData->getWeeeAmountInvoiced($orderItem); $baseWeeeAmount = $orderItemBaseWeeeAmount - $this->_weeeData->getBaseWeeeAmountInvoiced($orderItem); $itemWeeeTax = $orderItemWeeeTax - $this->_weeeData->getWeeeTaxAmountInvoiced($orderItem); $itemBaseWeeeTax = $orderItemWeeeTax - $this->_weeeData->getBaseWeeeTaxAmountInvoiced($orderItem); } $totalWeeeTaxAmount += $itemWeeeTax; $baseTotalWeeeTaxAmount += $itemBaseWeeeTax; //Set the ratio of the tax amount in invoice item compared to tax amount in order item //This information is needed to calculate tax per tax rate later if ($orderItemWeeeTax != 0) { $taxRatio = []; if ($item->getTaxRatio()) { $taxRatio = unserialize($item->getTaxRatio()); } $taxRatio[\Magento\Weee\Model\Total\Quote\Weee::ITEM_TYPE] = $itemWeeeTax / $orderItemWeeeTax; $item->setTaxRatio(serialize($taxRatio)); } $item->setWeeeTaxAppliedRowAmount($weeeAmount); $item->setBaseWeeeTaxAppliedRowAmount($baseWeeeAmount); $newApplied = []; $applied = $this->_weeeData->getApplied($orderItem); foreach ($applied as $one) { $title = (string) $one['title']; $one['base_row_amount'] = $invoice->roundPrice($one['base_row_amount'] * $ratio, $title . '_base'); $one['row_amount'] = $invoice->roundPrice($one['row_amount'] * $ratio, $title); $one['base_row_amount_incl_tax'] = $invoice->roundPrice($one['base_row_amount_incl_tax'] * $ratio, $title . '_base'); $one['row_amount_incl_tax'] = $invoice->roundPrice($one['row_amount_incl_tax'] * $ratio, $title); $newApplied[] = $one; } $this->_weeeData->setApplied($item, $newApplied); //Update order item $newApplied = []; $applied = $this->_weeeData->getApplied($orderItem); foreach ($applied as $one) { if (isset($one[WeeeHelper::KEY_BASE_WEEE_AMOUNT_INVOICED])) { $one[WeeeHelper::KEY_BASE_WEEE_AMOUNT_INVOICED] = $one[WeeeHelper::KEY_BASE_WEEE_AMOUNT_INVOICED] + $baseWeeeAmount; } else { $one[WeeeHelper::KEY_BASE_WEEE_AMOUNT_INVOICED] = $baseWeeeAmount; } if (isset($one[WeeeHelper::KEY_WEEE_AMOUNT_INVOICED])) { $one[WeeeHelper::KEY_WEEE_AMOUNT_INVOICED] = $one[WeeeHelper::KEY_WEEE_AMOUNT_INVOICED] + $weeeAmount; } else { $one[WeeeHelper::KEY_WEEE_AMOUNT_INVOICED] = $weeeAmount; } if (isset($one[WeeeHelper::KEY_BASE_WEEE_TAX_AMOUNT_INVOICED])) { $one[WeeeHelper::KEY_BASE_WEEE_TAX_AMOUNT_INVOICED] = $one[WeeeHelper::KEY_BASE_WEEE_TAX_AMOUNT_INVOICED] + $itemWeeeTax; } else { $one[WeeeHelper::KEY_BASE_WEEE_TAX_AMOUNT_INVOICED] = $itemWeeeTax; } if (isset($one[WeeeHelper::KEY_WEEE_TAX_AMOUNT_INVOICED])) { $one[WeeeHelper::KEY_WEEE_TAX_AMOUNT_INVOICED] = $one[WeeeHelper::KEY_WEEE_TAX_AMOUNT_INVOICED] + $itemBaseWeeeTax; } else { $one[WeeeHelper::KEY_WEEE_TAX_AMOUNT_INVOICED] = $itemBaseWeeeTax; } $newApplied[] = $one; } $this->_weeeData->setApplied($orderItem, $newApplied); $item->setWeeeTaxRowDisposition($item->getWeeeTaxDisposition() * $item->getQty()); $item->setBaseWeeeTaxRowDisposition($item->getBaseWeeeTaxDisposition() * $item->getQty()); $totalWeeeAmount += $weeeAmount; $baseTotalWeeeAmount += $baseWeeeAmount; $totalWeeeAmountInclTax += $weeeAmountInclTax; $baseTotalWeeeAmountInclTax += $baseWeeeAmountInclTax; } $allowedTax = $order->getTaxAmount() - $order->getTaxInvoiced() - $invoice->getTaxAmount(); $allowedBaseTax = $order->getBaseTaxAmount() - $order->getBaseTaxInvoiced() - $invoice->getBaseTaxAmount(); $totalWeeeTaxAmount = min($totalWeeeTaxAmount, $allowedTax); $baseTotalWeeeTaxAmount = min($baseTotalWeeeTaxAmount, $allowedBaseTax); $invoice->setTaxAmount($invoice->getTaxAmount() + $totalWeeeTaxAmount); $invoice->setBaseTaxAmount($invoice->getBaseTaxAmount() + $baseTotalWeeeTaxAmount); // Add FPT to subtotal and grand total if ($this->_weeeData->includeInSubtotal($store)) { $order = $invoice->getOrder(); $allowedSubtotal = $order->getSubtotal() - $order->getSubtotalInvoiced() - $invoice->getSubtotal(); $allowedBaseSubtotal = $order->getBaseSubtotal() - $order->getBaseSubtotalInvoiced() - $invoice->getBaseSubtotal(); $totalWeeeAmount = min($allowedSubtotal, $totalWeeeAmount); $baseTotalWeeeAmount = min($allowedBaseSubtotal, $baseTotalWeeeAmount); $invoice->setSubtotal($invoice->getSubtotal() + $totalWeeeAmount); $invoice->setBaseSubtotal($invoice->getBaseSubtotal() + $baseTotalWeeeAmount); } if (!$invoice->isLast()) { // need to add the Weee amounts including all their taxes $invoice->setSubtotalInclTax($invoice->getSubtotalInclTax() + $totalWeeeAmountInclTax); $invoice->setBaseSubtotalInclTax($invoice->getBaseSubtotalInclTax() + $baseTotalWeeeAmountInclTax); } else { // since the Subtotal Incl Tax line will already have the taxes on Weee, just add the non-taxable amounts $invoice->setSubtotalInclTax($invoice->getSubtotalInclTax() + $totalWeeeAmount); $invoice->setBaseSubtotalInclTax($invoice->getBaseSubtotalInclTax() + $baseTotalWeeeAmount); } $invoice->setGrandTotal($invoice->getGrandTotal() + $totalWeeeAmount + $totalWeeeTaxAmount); $invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() + $baseTotalWeeeAmount + $baseTotalWeeeTaxAmount); return $this; }
/** * Prepare order creditmemo based on invoice and requested params * * @param \Magento\Sales\Model\Order\Invoice $invoice * @param array $data * @return Creditmemo * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function createByInvoice(\Magento\Sales\Model\Order\Invoice $invoice, array $data = []) { $order = $invoice->getOrder(); $totalQty = 0; $qtys = isset($data['qtys']) ? $data['qtys'] : []; $creditmemo = $this->convertor->toCreditmemo($order); $creditmemo->setInvoice($invoice); $invoiceQtysRefunded = []; foreach ($invoice->getOrder()->getCreditmemosCollection() as $createdCreditmemo) { if ($createdCreditmemo->getState() != Creditmemo::STATE_CANCELED && $createdCreditmemo->getInvoiceId() == $invoice->getId()) { foreach ($createdCreditmemo->getAllItems() as $createdCreditmemoItem) { $orderItemId = $createdCreditmemoItem->getOrderItem()->getId(); if (isset($invoiceQtysRefunded[$orderItemId])) { $invoiceQtysRefunded[$orderItemId] += $createdCreditmemoItem->getQty(); } else { $invoiceQtysRefunded[$orderItemId] = $createdCreditmemoItem->getQty(); } } } } $invoiceQtysRefundLimits = []; foreach ($invoice->getAllItems() as $invoiceItem) { $invoiceQtyCanBeRefunded = $invoiceItem->getQty(); $orderItemId = $invoiceItem->getOrderItem()->getId(); if (isset($invoiceQtysRefunded[$orderItemId])) { $invoiceQtyCanBeRefunded = $invoiceQtyCanBeRefunded - $invoiceQtysRefunded[$orderItemId]; } $invoiceQtysRefundLimits[$orderItemId] = $invoiceQtyCanBeRefunded; } foreach ($invoice->getAllItems() as $invoiceItem) { $orderItem = $invoiceItem->getOrderItem(); if (!$this->canRefundItem($orderItem, $qtys, $invoiceQtysRefundLimits)) { continue; } $item = $this->convertor->itemToCreditmemoItem($orderItem); if ($orderItem->isDummy()) { $qty = 1; } else { if (isset($qtys[$orderItem->getId()])) { $qty = (double) $qtys[$orderItem->getId()]; } elseif (!count($qtys)) { $qty = $orderItem->getQtyToRefund(); } else { continue; } if (isset($invoiceQtysRefundLimits[$orderItem->getId()])) { $qty = min($qty, $invoiceQtysRefundLimits[$orderItem->getId()]); } } $qty = min($qty, $invoiceItem->getQty()); $totalQty += $qty; $item->setQty($qty); $creditmemo->addItem($item); } $creditmemo->setTotalQty($totalQty); $this->initData($creditmemo, $data); if (!isset($data['shipping_amount'])) { $isShippingInclTax = $this->taxConfig->displaySalesShippingInclTax($order->getStoreId()); if ($isShippingInclTax) { $baseAllowedAmount = $order->getBaseShippingInclTax() - $order->getBaseShippingRefunded() - $order->getBaseShippingTaxRefunded(); } else { $baseAllowedAmount = $order->getBaseShippingAmount() - $order->getBaseShippingRefunded(); $baseAllowedAmount = min($baseAllowedAmount, $invoice->getBaseShippingAmount()); } $creditmemo->setBaseShippingAmount($baseAllowedAmount); } $creditmemo->collectTotals(); return $creditmemo; }
/** * Sends order invoice 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 Invoice $invoice * @param bool $forceSyncMode * @return bool */ public function send(Invoice $invoice, $forceSyncMode = false) { $invoice->setSendEmail(true); if (!$this->globalConfig->getValue('sales_email/general/async_sending') || $forceSyncMode) { $order = $invoice->getOrder(); $transport = ['order' => $order, 'invoice' => $invoice, 'comment' => $invoice->getCustomerNoteNotify() ? $invoice->getCustomerNote() : '', 'billing' => $order->getBillingAddress(), 'payment_html' => $this->getPaymentHtml($order), 'store' => $order->getStore(), 'formattedShippingAddress' => $this->getFormattedShippingAddress($order), 'formattedBillingAddress' => $this->getFormattedBillingAddress($order)]; $this->eventManager->dispatch('email_invoice_set_template_vars_before', ['sender' => $this, 'transport' => $transport]); $this->templateContainer->setTemplateVars($transport); if ($this->checkAndSend($order)) { $invoice->setEmailSent(true); $this->invoiceResource->saveAttribute($invoice, ['send_email', 'email_sent']); return true; } } $this->invoiceResource->saveAttribute($invoice, 'send_email'); return false; }
/** * Collect Weee amounts for the invoice * * @param \Magento\Sales\Model\Order\Invoice $invoice * @return $this */ public function collect(\Magento\Sales\Model\Order\Invoice $invoice) { $store = $invoice->getStore(); $totalTax = 0; $baseTotalTax = 0; $weeeInclTax = 0; $baseWeeeInclTax = 0; foreach ($invoice->getAllItems() as $item) { $orderItem = $item->getOrderItem(); $orderItemQty = $orderItem->getQtyOrdered(); if (!$orderItemQty || $orderItem->isDummy()) { continue; } $weeeTaxAmount = $item->getWeeeTaxAppliedAmount() * $item->getQty(); $baseWeeeTaxAmount = $item->getBaseWeeeTaxAppliedAmount() * $item->getQty(); $weeeTaxAmountInclTax = $this->_weeeData->getWeeeTaxInclTax($item) * $item->getQty(); $baseWeeeTaxAmountInclTax = $this->_weeeData->getBaseWeeeTaxInclTax($item) * $item->getQty(); $item->setWeeeTaxAppliedRowAmount($weeeTaxAmount); $item->setBaseWeeeTaxAppliedRowAmount($baseWeeeTaxAmount); $newApplied = array(); $applied = $this->_weeeData->getApplied($item); foreach ($applied as $one) { $one['base_row_amount'] = $one['base_amount'] * $item->getQty(); $one['row_amount'] = $one['amount'] * $item->getQty(); $one['base_row_amount_incl_tax'] = $one['base_amount_incl_tax'] * $item->getQty(); $one['row_amount_incl_tax'] = $one['amount_incl_tax'] * $item->getQty(); $newApplied[] = $one; } $this->_weeeData->setApplied($item, $newApplied); $item->setWeeeTaxRowDisposition($item->getWeeeTaxDisposition() * $item->getQty()); $item->setBaseWeeeTaxRowDisposition($item->getBaseWeeeTaxDisposition() * $item->getQty()); $totalTax += $weeeTaxAmount; $baseTotalTax += $baseWeeeTaxAmount; $weeeInclTax += $weeeTaxAmountInclTax; $baseWeeeInclTax += $baseWeeeTaxAmountInclTax; } // Add FPT to subtotal and grand total if ($this->_weeeData->includeInSubtotal($store)) { $order = $invoice->getOrder(); $allowedSubtotal = $order->getSubtotal() - $order->getSubtotalInvoiced() - $invoice->getSubtotal(); $allowedBaseSubtotal = $order->getBaseSubtotal() - $order->getBaseSubtotalInvoiced() - $invoice->getBaseSubtotal(); $totalTax = min($allowedSubtotal, $totalTax); $baseTotalTax = min($allowedBaseSubtotal, $baseTotalTax); $invoice->setSubtotal($invoice->getSubtotal() + $totalTax); $invoice->setBaseSubtotal($invoice->getBaseSubtotal() + $baseTotalTax); } $useWeeeInclTax = true; if ($this->_weeeData->isTaxIncluded($store) && $invoice->isLast()) { $useWeeeInclTax = false; } if ($useWeeeInclTax) { // need to add the Weee amounts including all their taxes $invoice->setSubtotalInclTax($invoice->getSubtotalInclTax() + $weeeInclTax); $invoice->setBaseSubtotalInclTax($invoice->getBaseSubtotalInclTax() + $baseWeeeInclTax); } else { // since the Subtotal Incl Tax line will already have the taxes on Weee, just add the non-taxable amounts $invoice->setSubtotalInclTax($invoice->getSubtotalInclTax() + $totalTax); $invoice->setBaseSubtotalInclTax($invoice->getBaseSubtotalInclTax() + $baseTotalTax); } $invoice->setGrandTotal($invoice->getGrandTotal() + $totalTax); $invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() + $baseTotalTax); return $this; }
/** * Check if shipping tax calculation can be included to current invoice * * @param \Magento\Sales\Model\Order\Invoice $invoice * @return bool */ protected function _canIncludeShipping($invoice) { $includeShippingTax = true; /** * Check shipping amount in previous invoices */ foreach ($invoice->getOrder()->getInvoiceCollection() as $previousInvoice) { if ($previousInvoice->getShippingAmount() && !$previousInvoice->isCanceled()) { $includeShippingTax = false; } } return $includeShippingTax; }
/** * Send email to customer * * @param Invoice $invoice * @param bool $notify * @param string $comment * @return bool */ public function send(Invoice $invoice, $notify = true, $comment = '') { $order = $invoice->getOrder(); $this->templateContainer->setTemplateVars(['order' => $order, 'invoice' => $invoice, 'comment' => $comment, 'billing' => $order->getBillingAddress(), 'store' => $order->getStore()]); return $this->checkAndSend($order, $notify); }