summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIT Fixcomart <it@fixcomart.co.id>2025-05-17 02:41:35 +0000
committerIT Fixcomart <it@fixcomart.co.id>2025-05-17 02:41:35 +0000
commitb0e740a60dee28cba5d0e0e3efb0c19f76441d72 (patch)
treededc34acc0acbb5501872decb08819bc4aac13ac
parentd48f46e37e4ef86452c2ba2ab0d4732fb91a32a0 (diff)
parentf8811bdf897fe0176921cc01b0ee8c9b98c883d3 (diff)
Merged in add_sales_discount_in_xml_fp (pull request #305)
<miqdad>Add sales discount in xml fp
-rw-r--r--indoteknik_custom/models/coretax_fatur.py88
1 files changed, 64 insertions, 24 deletions
diff --git a/indoteknik_custom/models/coretax_fatur.py b/indoteknik_custom/models/coretax_fatur.py
index b4bffbd2..92ff1a72 100644
--- a/indoteknik_custom/models/coretax_fatur.py
+++ b/indoteknik_custom/models/coretax_fatur.py
@@ -4,19 +4,23 @@ from xml.dom import minidom
import base64
import re
+
class CoretaxFaktur(models.Model):
_name = 'coretax.faktur'
_description = 'Export Faktur ke XML'
-
- export_file = fields.Binary(string="Export File", )
- export_filename = fields.Char(string="Export File", )
-
+
+ export_file = fields.Binary(string="Export File", )
+ export_filename = fields.Char(string="Export File", )
+
+ DISCOUNT_ACCOUNT_ID = 463
+
def validate_and_format_number(slef, input_number):
# Hapus semua karakter non-digit
cleaned_number = re.sub(r'\D', '', input_number)
-
+
total_sum = sum(int(char) for char in cleaned_number)
- if total_sum == 0 :
+
+ if total_sum == 0:
return '0000000000000000'
# Hitung jumlah digit
@@ -39,22 +43,16 @@ class CoretaxFaktur(models.Model):
# Tambahkan elemen ListOfTaxInvoice
list_of_tax_invoice = ET.SubElement(root, 'ListOfTaxInvoice')
- # Dapatkan data faktur
- # inv_obj = self.env['account.move']
- # invoices = inv_obj.search([('is_efaktur_exported','=',True),
- # ('state','=','posted'),
- # ('efaktur_id','!=', False),
- # ('move_type','=','out_invoice')], limit = 5)
-
for invoice in invoices:
tax_invoice = ET.SubElement(list_of_tax_invoice, 'TaxInvoice')
buyerTIN = self.validate_and_format_number(invoice.partner_id.npwp)
nitku = invoice.partner_id.nitku
formula = nitku if nitku else buyerTIN.ljust(len(buyerTIN) + 6, '0')
- buyerIDTKU = formula if sum(int(char) for char in buyerTIN) > 0 else '000000'
+ buyerIDTKU = formula if sum(int(char) for char in buyerTIN) > 0 else '000000'
# Tambahkan elemen faktur
- ET.SubElement(tax_invoice, 'TaxInvoiceDate').text = invoice.invoice_date.strftime('%Y-%m-%d') if invoice.invoice_date else ''
+ ET.SubElement(tax_invoice, 'TaxInvoiceDate').text = invoice.invoice_date.strftime(
+ '%Y-%m-%d') if invoice.invoice_date else ''
ET.SubElement(tax_invoice, 'TaxInvoiceOpt').text = 'Normal'
ET.SubElement(tax_invoice, 'TrxCode').text = '04'
ET.SubElement(tax_invoice, 'AddInfo')
@@ -64,30 +62,72 @@ class CoretaxFaktur(models.Model):
ET.SubElement(tax_invoice, 'FacilityStamp')
ET.SubElement(tax_invoice, 'SellerIDTKU').text = '0742260227086000000000'
ET.SubElement(tax_invoice, 'BuyerTin').text = buyerTIN
- ET.SubElement(tax_invoice, 'BuyerDocument').text = 'TIN' if sum(int(char) for char in buyerTIN) > 0 else 'Other ID'
+ ET.SubElement(tax_invoice, 'BuyerDocument').text = 'TIN' if sum(
+ int(char) for char in buyerTIN) > 0 else 'Other ID'
ET.SubElement(tax_invoice, 'BuyerCountry').text = 'IDN'
- ET.SubElement(tax_invoice, 'BuyerDocumentNumber').text = '-' if sum(int(char) for char in buyerTIN) > 0 else str(invoice.partner_id.id)
+ ET.SubElement(tax_invoice, 'BuyerDocumentNumber').text = '-' if sum(
+ int(char) for char in buyerTIN) > 0 else str(invoice.partner_id.id)
ET.SubElement(tax_invoice, 'BuyerName').text = invoice.partner_id.nama_wajib_pajak or ''
ET.SubElement(tax_invoice, 'BuyerAdress').text = invoice.partner_id.alamat_lengkap_text or ''
ET.SubElement(tax_invoice, 'BuyerEmail').text = invoice.partner_id.email or ''
ET.SubElement(tax_invoice, 'BuyerIDTKU').text = buyerIDTKU
+ # Filter product
+ product_lines = invoice.invoice_line_ids.filtered(
+ lambda l: not l.display_type and hasattr(l, 'account_id') and
+ l.account_id and l.product_id and
+ l.account_id.id != self.DISCOUNT_ACCOUNT_ID and
+ l.quantity != -1
+ )
+
+ # Filter discount
+ discount_lines = invoice.invoice_line_ids.filtered(
+ lambda l: not l.display_type and (
+ (hasattr(l, 'account_id') and l.account_id and
+ l.account_id.id == self.DISCOUNT_ACCOUNT_ID) or
+ (l.quantity == -1)
+ )
+ )
+
+ # Calculate total product amount (before discount)
+ total_product_amount = sum(line.price_subtotal for line in product_lines)
+ if total_product_amount == 0:
+ total_product_amount = 1 # Avoid division by zero
+
+ # Calculate total discount amount
+ total_discount_amount = abs(sum(line.price_subtotal for line in discount_lines))
+
# Tambahkan elemen ListOfGoodService
list_of_good_service = ET.SubElement(tax_invoice, 'ListOfGoodService')
- for line in invoice.invoice_line_ids:
- otherTaxBase = round(line.price_subtotal * (11/12)) if line.price_subtotal else 0
+
+ for line in product_lines:
+ # Calculate prorated discount
+ line_proportion = line.price_subtotal / total_product_amount
+ line_discount = total_discount_amount * line_proportion
+
+ # unit_price = line.price_unit
+ subtotal = line.price_subtotal
+ quantity = line.quantity
+ total_discount = round(line_discount, 2)
+
+ # Calculate other tax values
+ otherTaxBase = round(subtotal * (11 / 12), 2) if subtotal else 0
+ vat_amount = round(otherTaxBase * 0.12, 2)
+
+ # Create the line in XML
good_service = ET.SubElement(list_of_good_service, 'GoodService')
ET.SubElement(good_service, 'Opt').text = 'A'
ET.SubElement(good_service, 'Code').text = '000000'
ET.SubElement(good_service, 'Name').text = line.name
ET.SubElement(good_service, 'Unit').text = 'UM.0018'
- ET.SubElement(good_service, 'Price').text = str(round(line.price_subtotal/line.quantity, 2)) if line.price_subtotal else '0'
- ET.SubElement(good_service, 'Qty').text = str(line.quantity)
- ET.SubElement(good_service, 'TotalDiscount').text = '0'
- ET.SubElement(good_service, 'TaxBase').text = str(round(line.price_subtotal)) if line.price_subtotal else '0'
+ ET.SubElement(good_service, 'Price').text = str(round(subtotal / quantity, 2)) if subtotal else '0'
+ ET.SubElement(good_service, 'Qty').text = str(quantity)
+ ET.SubElement(good_service, 'TotalDiscount').text = str(total_discount)
+ ET.SubElement(good_service, 'TaxBase').text = str(
+ round(subtotal)) if subtotal else '0'
ET.SubElement(good_service, 'OtherTaxBase').text = str(otherTaxBase)
ET.SubElement(good_service, 'VATRate').text = '12'
- ET.SubElement(good_service, 'VAT').text = str(round(otherTaxBase * 0.12, 2))
+ ET.SubElement(good_service, 'VAT').text = str(vat_amount)
ET.SubElement(good_service, 'STLGRate').text = '0'
ET.SubElement(good_service, 'STLG').text = '0'