From 8e7c117bd9f10145e2a46f304a3d48627a4b821a Mon Sep 17 00:00:00 2001 From: Lars Kusch Date: Wed, 15 May 2024 16:58:21 +0200 Subject: [PATCH] More fixes for item discounts --- .../EDocument/Standards/ZugferdEDokument.php | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/app/Services/EDocument/Standards/ZugferdEDokument.php b/app/Services/EDocument/Standards/ZugferdEDokument.php index 121de4b253c6..773411499b07 100644 --- a/app/Services/EDocument/Standards/ZugferdEDokument.php +++ b/app/Services/EDocument/Standards/ZugferdEDokument.php @@ -11,10 +11,10 @@ namespace App\Services\EDocument\Standards; +use App\DataMapper\InvoiceItem; use App\Models\Credit; use App\Models\Invoice; use App\Models\Product; -use App\Models\PurchaseOrder; use App\Models\Quote; use App\Services\AbstractService; use horstoeko\zugferd\codelists\ZugferdDutyTaxFeeCategories; @@ -120,10 +120,10 @@ class ZugferdEDokument extends AbstractService } $invoicing_data = $this->document->calc(); - + $total_position_discount = 0.0; //Create line items and calculate taxes foreach ($this->document->line_items as $index => $item) { - /** @var \App\DataMapper\InvoiceItem $item **/ + /** @var InvoiceItem $item **/ $this->xdocument->addNewPosition($index) ->setDocumentPositionGrossPrice($item->gross_line_total+$item->discount) ->setDocumentPositionNetPrice($item->line_total); @@ -145,15 +145,19 @@ class ZugferdEDokument extends AbstractService } else { $this->xdocument->setDocumentPositionQuantity($item->quantity, "H87"); } - $linenetamount = $item->line_total; -/* if ($item->discount > 0) { + $line_discount = 0.0; + if ($item->discount > 0) { if ($this->document->is_amount_discount) { - $linenetamount -= $item->discount; + $line_discount -= $item->discount; } else { - $linenetamount -= $linenetamount * ($item->discount / 100); + $line_discount -= $item->line_total * ($item->discount / 100); } - }*/ - $this->xdocument->setDocumentPositionLineSummation($linenetamount, $item->discount); + $this->xdocument->addDocumentPositionAllowanceCharge( abs($line_discount), false); + $total_position_discount += abs($line_discount); + } + + + $this->xdocument->setDocumentPositionLineSummation($item->line_total, $item->discount); // According to european law, each line item can only have one tax rate if (!(empty($item->tax_name1) && empty($item->tax_name2) && empty($item->tax_name3))) { $taxtype = $this->getTaxType($item->tax_id); @@ -163,47 +167,47 @@ class ZugferdEDokument extends AbstractService } else { $this->xdocument->addDocumentPositionTax($taxtype, 'VAT', $item->tax_rate1); } - $this->addtoTaxMap($taxtype, $linenetamount, $item->tax_rate1); + $this->addtoTaxMap($taxtype, $item->line_total, $item->tax_rate1); } elseif (!empty($item->tax_name2)) { if ($taxtype == ZugferdDutyTaxFeeCategories::VAT_EXEMPT_FOR_EEA_INTRACOMMUNITY_SUPPLY_OF_GOODS_AND_SERVICES){ $this->xdocument->addDocumentPositionTax($taxtype, 'VAT', $item->tax_rate2, exemptionReason: ctrans('texts.intracommunity_suply')); } else { $this->xdocument->addDocumentPositionTax($taxtype, 'VAT', $item->tax_rate2); } - $this->addtoTaxMap($taxtype, $linenetamount, $item->tax_rate2); + $this->addtoTaxMap($taxtype, $item->line_total, $item->tax_rate2); } elseif (!empty($item->tax_name3)) { if ($taxtype == ZugferdDutyTaxFeeCategories::VAT_EXEMPT_FOR_EEA_INTRACOMMUNITY_SUPPLY_OF_GOODS_AND_SERVICES){ $this->xdocument->addDocumentPositionTax($taxtype, 'VAT', $item->tax_rate3, exemptionReason: ctrans('texts.intracommunity_suply')); } else { $this->xdocument->addDocumentPositionTax($taxtype, 'VAT', $item->tax_rate3); } - $this->addtoTaxMap($taxtype, $linenetamount, $item->tax_rate3); + $this->addtoTaxMap($taxtype, $item->line_total, $item->tax_rate3); } else { - // nlog("Can't add correct tax position"); + nlog("Can't add correct tax position"); } } else { if (!empty($this->document->tax_name1)) { $taxtype = $this->getTaxType($this->document->tax_name1); $this->xdocument->addDocumentPositionTax($taxtype, 'VAT', $this->document->tax_rate1); - $this->addtoTaxMap($taxtype, $linenetamount, $this->document->tax_rate1); + $this->addtoTaxMap($taxtype, $item->line_total, $this->document->tax_rate1); } elseif (!empty($this->document->tax_name2)) { $taxtype = $this->getTaxType($this->document->tax_name2); $this->xdocument->addDocumentPositionTax($taxtype, 'VAT', $this->document->tax_rate2); - $this->addtoTaxMap($taxtype, $linenetamount, $this->document->tax_rate2); + $this->addtoTaxMap($taxtype, $item->line_total, $this->document->tax_rate2); } elseif (!empty($this->document->tax_name3)) { $taxtype = $this->getTaxType($this->document->tax_name3); $this->xdocument->addDocumentPositionTax($taxtype, 'VAT', $this->document->tax_rate3); - $this->addtoTaxMap($taxtype, $linenetamount, $this->document->tax_rate3); + $this->addtoTaxMap($taxtype, $item->line_total, $this->document->tax_rate3); } else { $taxtype = ZugferdDutyTaxFeeCategories::ZERO_RATED_GOODS; $this->xdocument->addDocumentPositionTax($taxtype, 'VAT', 0); - $this->addtoTaxMap($taxtype, $linenetamount, 0); + $this->addtoTaxMap($taxtype, $item->line_total, 0); // nlog("Can't add correct tax position"); } } } - $this->xdocument->setDocumentSummation($this->document->amount, $this->document->balance, $invoicing_data->getSubTotal(), $invoicing_data->getTotalSurcharges(), $invoicing_data->getTotalDiscount(), $invoicing_data->getSubTotal(), $invoicing_data->getItemTotalTaxes(), 0.0, $this->document->amount - $this->document->balance); + $this->xdocument->setDocumentSummation($this->document->amount, $this->document->balance, $invoicing_data->getSubTotal(), $invoicing_data->getTotalSurcharges(), $invoicing_data->getTotalDiscount()+$total_position_discount, $invoicing_data->getSubTotal(), $invoicing_data->getItemTotalTaxes(), 0.0, $this->document->amount - $this->document->balance); foreach ($this->tax_map as $item) { if ($item["tax_type"] == ZugferdDutyTaxFeeCategories::VAT_EXEMPT_FOR_EEA_INTRACOMMUNITY_SUPPLY_OF_GOODS_AND_SERVICES){