Odoo18-Base/addons/l10n_ph/utils.py

81 lines
3.1 KiB
Python
Raw Permalink Normal View History

2025-01-06 10:57:38 +07:00
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import io
import re
import xlwt
import xlsxwriter
from odoo.tools.misc import format_date
COLUMN_HEADER_MAP = {
"Reporting_Month": "invoice_date",
"Vendor_TIN": "vat",
"branchCode": "branch_code",
"companyName": "company_name",
"surName": "last_name",
"firstName": "first_name",
"middleName": "middle_name",
"address": "address",
"nature": "product_name",
"ATC": "atc",
"income_payment": "price_subtotal",
"ewt_rate": "amount",
"tax_amount": "tax_amount",
}
def write_row(self, row, col, data):
for token in data:
self.write(row, col, token)
col += 1
xlwt.Worksheet.write_row = write_row
def _export_bir_2307(sheet_title, moves, file_format='xlsx'):
output = io.BytesIO()
if file_format == 'xls':
workbook = xlwt.Workbook(encoding='utf-8')
worksheet = workbook.add_sheet(sheet_title)
else:
workbook = xlsxwriter.Workbook(output, {
'in_memory': True,
'strings_to_formulas': False, # As we need to give a default value when using formulas, we need to handle them manually so this is not needed.
})
worksheet = workbook.add_worksheet(sheet_title)
worksheet.write_row(0, 0, list(COLUMN_HEADER_MAP.keys()))
worksheet_row = 1
for move in moves:
partner = move.partner_id
partner_address_info = [partner.street, partner.street2, partner.city, partner.state_id.name, partner.country_id.name]
values = {
'invoice_date': format_date(move.env, move.invoice_date, date_format="MM/dd/yyyy"),
'vat': re.sub(r'-', '', partner.vat)[:9] if partner.vat else '',
'branch_code': partner.branch_code or '000',
'company_name': partner.commercial_partner_id.name,
'first_name': partner.first_name or '',
'middle_name': partner.middle_name or '',
'last_name': partner.last_name or '',
'address': ', '.join([val for val in partner_address_info if val])
}
for invoice_line in move.invoice_line_ids.filtered(lambda line: line.display_type not in ('line_note', 'line_section')):
for tax in invoice_line.tax_ids.filtered(lambda x: x.l10n_ph_atc):
product_name = invoice_line.product_id.name or invoice_line.name
values['product_name'] = re.sub(r'[()]', '', product_name) if product_name else ""
values['atc'] = tax.l10n_ph_atc
values['price_subtotal'] = invoice_line.price_subtotal
values['amount'] = abs(tax.amount)
values['tax_amount'] = abs(tax.compute_all(invoice_line.price_unit, currency=invoice_line.currency_id, quantity=invoice_line.quantity, product=invoice_line.product_id, partner=move.partner_id)['taxes'][0]['amount'])
worksheet.write_row(worksheet_row, 0, [values[field] for field in COLUMN_HEADER_MAP.values()])
worksheet_row += 1
if file_format == 'xls':
workbook.save(output)
else:
workbook.close()
output.seek(0)
return output.read()