19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:31:21 +01:00
parent 7dc55599c6
commit 7f43bbbfcc
650 changed files with 45260 additions and 33436 deletions

View file

@ -1,81 +1,21 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import base64
import io
import re
import xlwt
from odoo import fields, models
from odoo.tools.misc import format_date
from odoo.addons.l10n_ph import utils
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",
"zip_code": "zip",
"nature": "tax_description",
"ATC": "atc",
"income_payment": "price_subtotal",
"ewt_rate": "amount",
"tax_amount": "tax_amount",
}
class Generate2307Wizard(models.TransientModel):
_name = "l10n_ph_2307.wizard"
class L10n_Ph_2307Wizard(models.TransientModel):
_name = 'l10n_ph_2307.wizard'
_description = "Exports 2307 data to a XLS file."
moves_to_export = fields.Many2many("account.move", string="Joural To Include")
generate_xls_file = fields.Binary(
xls_file = fields.Binary(
"Generated file",
help="Technical field used to temporarily hold the generated XLS file before its downloaded."
)
def _write_single_row(self, worksheet, worksheet_row, values):
for index, field in enumerate(COLUMN_HEADER_MAP.values()):
worksheet.write(worksheet_row, index, label=values[field])
def _write_rows(self, worksheet, moves):
worksheet_row = 0
for move in moves:
worksheet_row += 1
partner = move.commercial_partner_id
partner_address_info = [partner.street, partner.street2, partner.city, partner.state_id.name, partner.country_id.name]
first_name = middle_name = last_name = ''
if partner.company_type == 'person':
first_name = partner.first_name or ''
middle_name = partner.middle_name or ''
last_name = partner.last_name or ''
values = {
'invoice_date': format_date(self.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.name if partner.company_type == 'company' else '',
'first_name': first_name,
'middle_name': middle_name,
'last_name': last_name,
'address': ', '.join([val for val in partner_address_info if val]),
'zip': partner.zip or '',
}
aggregated_taxes = move._prepare_invoice_aggregated_taxes()
for invoice_line, tax_details_for_line in aggregated_taxes['tax_details_per_record'].items():
for tax_detail in tax_details_for_line['tax_details'].values():
tax = tax_detail['tax']
if not tax.l10n_ph_atc:
continue
values['tax_description'] = tax.description or ''
values['atc'] = tax.l10n_ph_atc
values['price_subtotal'] = tax_detail['base_amount']
values['amount'] = tax.amount
values['tax_amount'] = tax_detail['tax_amount']
self._write_single_row(worksheet, worksheet_row, values)
worksheet_row += 1
def action_generate(self):
""" Generate a xls format file for importing to
https://bir-excel-uploader.com/excel-file-to-bir-dat-format/#bir-form-2307-settings.
@ -84,21 +24,10 @@ class Generate2307Wizard(models.TransientModel):
"""
self.ensure_one()
file_data = io.BytesIO()
workbook = xlwt.Workbook(encoding='utf-8')
worksheet = workbook.add_sheet('Form2307')
for index, col_header in enumerate(COLUMN_HEADER_MAP.keys()):
worksheet.write(0, index, label=col_header)
self._write_rows(worksheet, self.moves_to_export)
workbook.save(file_data)
file_data.seek(0)
self.generate_xls_file = base64.b64encode(file_data.read())
self.xls_file = base64.b64encode(utils._export_bir_2307('Form2307', self.moves_to_export, file_format='xls'))
return {
"type": "ir.actions.act_url",
"target": "self",
"url": "/web/content?model=l10n_ph_2307.wizard&download=true&field=generate_xls_file&filename=Form_2307.xls&id={}".format(self.id),
"url": f"/web/content?model=l10n_ph_2307.wizard&download=true&field=xls_file&filename=Form_2307.xls&id={self.id}",
}

View file

@ -8,21 +8,21 @@
This will export a XLS file for BIR 2307.
<group>
<field name="moves_to_export" nolabel="1" readonly="1" colspan="2">
<tree>
<list>
<field name="name" optional="show"/>
<field name="invoice_partner_display_name" string="Vendor"/>
<field name="invoice_date" string="Bill Date"/>
<field name="invoice_date" string="Bill Date" readonly="state != 'draft'"/>
<field name="invoice_date_due"/>
<field name="currency_id" invisible="1"/>
<field name="currency_id" column_invisible="True" readonly="state in ['cancel', 'posted']"/>
<field name="amount_tax_signed" string="Tax" sum="Total" optional="hide" modifiers="{'readonly':true}" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="amount_total_signed" string="Total" sum="Total" decoration-bf="1" optional="show" widget="monetary" options="{'currency_field': 'currency_id'}"/>
<field name="state" widget="badge" decoration-success="state == 'posted'" decoration-info="state == 'draft'" optional="show" on_change="1" modifiers="{'readonly':true, 'required':true}"/>
</tree>
</list>
</field>
</group>
<footer>
<button string="Generate" type="object" name="action_generate" class="btn btn-primary" data-hotkey="q"/>
<button string="Cancel" special="cancel" data-hotkey="z" class="btn btn-secondary"/>
<button string="Cancel" special="cancel" data-hotkey="x" class="btn btn-secondary"/>
</footer>
</form>
</field>