75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
"""
|
|
Fusion Accounting - EDI Import Wizard
|
|
|
|
Provides a transient model that lets users upload a UBL 2.1 or CII XML
|
|
file and create a draft invoice from its contents.
|
|
|
|
Original implementation by Nexa Systems Inc.
|
|
"""
|
|
|
|
import base64
|
|
import logging
|
|
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import UserError
|
|
|
|
_log = logging.getLogger(__name__)
|
|
|
|
|
|
class FusionEDIImportWizard(models.TransientModel):
|
|
"""
|
|
File-upload wizard for importing electronic invoices in UBL 2.1 or
|
|
UN/CEFACT CII format.
|
|
"""
|
|
|
|
_name = "fusion.edi.import.wizard"
|
|
_description = "Import EDI Invoice"
|
|
|
|
xml_file = fields.Binary(
|
|
string="XML File",
|
|
required=True,
|
|
help="Select a UBL 2.1 or CII XML invoice file to import.",
|
|
)
|
|
xml_filename = fields.Char(
|
|
string="File Name",
|
|
)
|
|
move_type = fields.Selection(
|
|
selection=[
|
|
("out_invoice", "Customer Invoice"),
|
|
("out_refund", "Customer Credit Note"),
|
|
("in_invoice", "Vendor Bill"),
|
|
("in_refund", "Vendor Credit Note"),
|
|
],
|
|
string="Document Type",
|
|
default="out_invoice",
|
|
help=(
|
|
"Fallback document type if the XML does not specify one. "
|
|
"The parser may override this based on the XML content."
|
|
),
|
|
)
|
|
|
|
def action_import(self):
|
|
"""Parse the uploaded XML and create a draft invoice.
|
|
|
|
Returns:
|
|
dict: A window action opening the newly created invoice.
|
|
"""
|
|
self.ensure_one()
|
|
if not self.xml_file:
|
|
raise UserError(_("Please select an XML file to import."))
|
|
|
|
xml_bytes = base64.b64decode(self.xml_file)
|
|
AccountMove = self.env["account.move"].with_context(
|
|
default_move_type=self.move_type,
|
|
)
|
|
move = AccountMove.create_invoice_from_xml(xml_bytes)
|
|
|
|
return {
|
|
"type": "ir.actions.act_window",
|
|
"name": _("Imported Invoice"),
|
|
"res_model": "account.move",
|
|
"res_id": move.id,
|
|
"view_mode": "form",
|
|
"target": "current",
|
|
}
|