diff --git a/l10n_ro_message_spv/models/message_spv.py b/l10n_ro_message_spv/models/message_spv.py index c1b2b4e70..a9df0dcbe 100644 --- a/l10n_ro_message_spv/models/message_spv.py +++ b/l10n_ro_message_spv/models/message_spv.py @@ -26,6 +26,8 @@ class MessageSPV(models.Model): [ ("in_invoice", "In Invoice"), ("out_invoice", "Out Invoice"), + ("out_receipt", "Out Receipt"), + ("in_receipt", "In Receipt"), ("message", "Message"), ("error", "Error"), ], @@ -124,7 +126,7 @@ def download_from_spv(self): attachment = self.env["ir.attachment"].sudo().create(attachment_value) if message.attachment_id: - message.attachment_id.unlink() + message.attachment_id.sudo().unlink() message.write({"file_name": file_name, "attachment_id": attachment.id}) if message.state == "draft": message.state = "downloaded" @@ -133,16 +135,27 @@ def download_from_spv(self): def get_xml_fom_zip(self): for message in self: - if not message.attachment_id: + attachment = message.attachment_id.sudo() + if not attachment: continue - zip_ref = zipfile.ZipFile(io.BytesIO(message.attachment_id.raw)) + zip_ref = zipfile.ZipFile(io.BytesIO(attachment.raw)) xml_file = [f for f in zip_ref.namelist() if "semnatura" not in f] file_name = f"{message.request_id}.xml" if xml_file: file_name = xml_file[0] - xml_file = zip_ref.read(file_name) - if not xml_file: + xml_bytes = zip_ref.open(file_name) + # xml_file = zip_ref.read(file_name) + if not xml_bytes: continue + + # xml_bytes = zip_ref.open(xml_file) + recovering_parser = etree.XMLParser(recover=True) + + root = etree.parse(xml_bytes, parser=recovering_parser) + + xml_file = etree.tostring( + root, pretty_print=True, xml_declaration=True, encoding="UTF-8" + ) attachment_value = { "name": file_name, "raw": xml_file, @@ -152,12 +165,30 @@ def get_xml_fom_zip(self): if message.attachment_xml_id: message.attachment_xml_id.sudo().unlink() - xml_tree = etree.fromstring(xml_file) + xml_tree = etree.fromstring(xml_file, parser=recovering_parser) + + type_code_node = xml_tree.find("./{*}InvoiceTypeCode") + if type_code_node is not None: + type_code = type_code_node.text + if type_code == "751": + if message.message_type == "in_invoice": + message.message_type = "in_receipt" + elif message.message_type == "out_invoice": + message.message_type = "out_receipt" + ref_node = xml_tree.find("./{*}ID") ref = message.ref if ref_node is not None: ref = ref_node.text + currency = message.currency_id + currency_node = xml_tree.find("./{*}DocumentCurrencyCode") + if currency_node is not None: + currency_code = currency_node.text + currency = self.env["res.currency"].search( + [("name", "=", currency_code)] + ) + amount = False amount_note = xml_tree.find( ".//{*}LegalMonetaryTotal/{*}TaxInclusiveAmount" @@ -177,6 +208,7 @@ def get_xml_fom_zip(self): "attachment_xml_id": attachment_xml.id, "ref": ref, "amount": amount, + "currency_id": currency.id or message.currency_id.id, } ) @@ -270,7 +302,7 @@ def get_invoice_from_move(self): move_type = ("out_invoice", "out_refund") domain = [ - ("partner_id", "=", message.partner_id.id), + ("commercial_partner_id", "=", message.partner_id.id), ("ref", "=", message.ref), ("move_type", "in", move_type), ] @@ -428,7 +460,7 @@ def get_embedded_pdf(self): if not message.attachment_xml_id: message.get_xml_fom_zip() - xml_file = message.attachment_xml_id.raw + xml_file = message.attachment_xml_id.sudo().raw xml_tree = etree.fromstring(xml_file) additional_docs = xml_tree.findall( "./{*}AdditionalDocumentReference" @@ -458,7 +490,7 @@ def get_embedded_pdf(self): } ) if message.attachment_embedded_pdf_id: - message.attachment_embedded_pdf_id.unlink() + message.attachment_embedded_pdf_id.sudo().unlink() message.write({"attachment_embedded_pdf_id": attachment.id}) def action_download_attachment(self): @@ -488,7 +520,6 @@ def _action_download(self, attachment_id): } def get_partner(self): - for message in self.filtered(lambda m: not m.partner_id): if message.cif: domain = [("vat", "like", message.cif), ("is_company", "=", True)] @@ -502,3 +533,15 @@ def get_partner(self): } ) message.write({"partner_id": partner.id}) + + def show_invoice(self): + invoices = self.mapped("invoice_id") + action = { + "type": "ir.actions.act_window", + "res_model": "account.move", + "view_mode": "tree", + "views": [(False, "list"), (False, "form")], + "domain": [("id", "in", invoices.ids)], + } + + return action diff --git a/l10n_ro_message_spv/views/message_spv_view.xml b/l10n_ro_message_spv/views/message_spv_view.xml index 4d469db36..0026cf836 100644 --- a/l10n_ro_message_spv/views/message_spv_view.xml +++ b/l10n_ro_message_spv/views/message_spv_view.xml @@ -20,6 +20,7 @@ string="Create Invoice" type="object" /> +