Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
77c6e82
[ADD] l10n_it_edi_extension: permit to have preview of e-invoice
Borruso Oct 18, 2024
a62b759
[ADD] l10n_it_edi_extension: adding tags in xml
Borruso Oct 18, 2024
0555709
[ADD] l10n_it_edi_extension: permit import e-invoice details
Borruso Feb 14, 2025
8300ab1
[ADD] l10n_it_edi_extension: manage compute fiscal code on partner
Borruso Apr 11, 2025
d229415
[ADD] l10n_it_edi_extension: adding pre/post init hook
Borruso Mar 21, 2025
c714ced
[IMP] l10n_it_edi_extension: add readme
odooNextev Apr 28, 2025
df0df2a
[IMP] l10n_it_edi_extension: Import multiple invoices
monen17 May 2, 2025
4f967c3
[IMP] l10n_it_edi_extension: Create partner when not found
SirAionTech Sep 12, 2024
4ae6e8d
[IMP] l10n_it_edi_extension: Flag for create partner
Jul 25, 2025
5a110e5
[IMP] l10n_it_edi_extension: improve readme
odooNextev May 26, 2025
7b0863b
[IMP] l10n_it_edi_extension: Import detail level
monen17 May 19, 2025
772b065
[FIX] l10n_it_edi_extension: Migration script for fc, rea and rd
odooNextev Jul 11, 2025
4b1fb1a
[REF] l10n_it_edi_extension: Tax representative and intermediary crea…
Borruso Jul 25, 2025
f7535dc
[REF] l10n_it_edi_extension: Update partner from attachment
Borruso Jul 25, 2025
3264133
[FIX] l10n_it_edi_extension: Restore province onchange
monen17 Jul 18, 2025
23ea253
[FIX] l10n_it_edi_extension: Align README with behavior
monen17 Jul 18, 2025
380c0a3
[IMP] l10n_it_edi_extension: Align Fiscal Code to 16.0 behavior
odooNextev Jul 18, 2025
a2ea6de
[IMP] l10n_it_edi_extension: Search only needed record
monen17 Jul 18, 2025
13c3640
[REF] l10n_it_edi_extension: Amounts checking methods
monen17 Jul 18, 2025
798803f
[IMP] l10n_it_edi_extension: Only one StabileOrganizzazione exists
monen17 Jul 18, 2025
6ea7335
[IMP] l10n_it_edi_extension: In tests use valid Fiscal Code and VAT
monen17 Jul 19, 2025
2aac373
[IMP] l10n_it_edi_extension: partner_firstname is available
monen17 Jul 19, 2025
12e186f
[REF] l10n_it_edi_extension: Partner creation by role
monen17 Jul 19, 2025
190b98a
[FIX] l10n_it_edi_extension: In tests, create partner by default
monen17 Jul 25, 2025
cdca0dc
[IMP] l10n_it_edi_extension: Only update found partner
monen17 Jul 25, 2025
5491796
[IMP] l10n_it_edi_extension: Use same data on creation and update
monen17 Jul 25, 2025
2dca269
[FIX] l10n_it_edi_extension: Create partner flag visualization
monen17 Jul 29, 2025
ba264ee
FIX l10n_it_edi_extension centered PDF preview
eLBati Sep 5, 2025
cfc35da
IMP l10n_it_edi_extension avoiding importing TerzoIntermediarioOSogge…
eLBati Sep 5, 2025
27c4868
Added translation using Weblate (Italian)
mymage Sep 8, 2025
325ed66
[IMP] l10n_it_edi_extension: add admin_ref to res.partner
blackne0n Sep 5, 2025
78e65f4
Translated using Weblate (Italian)
mymage Sep 9, 2025
9e35d1f
Translated using Weblate (Italian)
mymage Sep 15, 2025
1de6c3d
[FIX] l10n_it_edi_extension: fix add_fields argument
lorenzoallegrucci Sep 19, 2025
fb44d2a
[REF] l10n_it_edi_extension: Extract common values from import tests
monen17 Sep 12, 2025
501b619
[IMP] l10n_it_edi_extension: Add test for narration export
monen17 Sep 12, 2025
dc99b32
[IMP] l10n_it_edi_extension: adding IndirizzoResa in XML
Borruso Nov 6, 2025
ac97bd7
[FIX] l10n_it_edi_extension: do not update VAT when importing XML
eLBati Nov 28, 2025
2cd7a38
[FIX] l10n_it_edi_extension: PDF preview for signed files
TheMule71 Jan 15, 2026
cbe9b76
[IMP] l10n_it_edi_extension: pre-commit auto fixes
Borruso Jan 25, 2026
6055750
[MIG] l10n_it_edi_extension: Migration to 19.0
Borruso Jan 26, 2026
9b6dc93
[FIX] l10n_it_edi_extension: prevent MissingError by deferring line d…
odooNextev Jan 22, 2026
891b5c3
[FIX] l10n_it_edi_extension: fix sequence position `DatiTrasporto`
Borruso Dec 12, 2025
3f9777f
[IMP] l10n_it_edi_extension: manage intra/extra UE addresses
Borruso Jan 23, 2026
9111983
[FIX][18.0] l10n_it_edi_extension: check all in import zip
TheMule71 Feb 12, 2026
8abc297
FIX l10n_it_edi_extension: Element text are different for node /Fattu…
eLBati Feb 25, 2026
c245282
[IMP] l10n_it_edi_extension: Preview for Electronic Bills
monen17 Feb 23, 2026
8e8d985
[IMP] l10n_it_edi_extension: E-bills default Product
tafaRU Nov 7, 2025
6dfeebf
[IMP] l10n_it_edi_extension: add AltriDatiGestionali (2.2.1.16) expor…
stenext Feb 19, 2026
ca9093e
[REF] l10n_it_edi_extension: In tests, allow to reuse zip extraction
monen17 Mar 23, 2026
d158a05
[FIX] l10n_it_edi_extension: Import zip use sale tax
monen17 Mar 23, 2026
8809334
[FIX] l10n_it_edi_extension: imported invoices skipped and not notified
marcelofrare Apr 2, 2026
0398125
[IMP] l10n_it_edi_extension: adapt FatturaPA import to core
micheledic May 14, 2026
fcd5c7f
[FIX] l10n_it_edi_extension: No exception if wrong company
monen17 Feb 23, 2026
c86e32c
[IMP] l10n_it_edi_extension: code cleanup
TheMule71 Jun 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
539 changes: 539 additions & 0 deletions l10n_it_edi_extension/README.rst

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions l10n_it_edi_extension/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Copyright 2025 Giuseppe Borruso - Dinamiche Aziendali srl
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from . import controllers
from . import models
from . import wizards
35 changes: 35 additions & 0 deletions l10n_it_edi_extension/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Copyright 2025 Giuseppe Borruso - Dinamiche Aziendali srl
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

{
"name": "Italy - E-invoicing - Base Feature",
"version": "19.0.1.0.0",
"category": "Accounting/Localizations/EDI",
"development_status": "Beta",
"summary": "E-invoice base feature",
"author": "Giuseppe Borruso, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/l10n-italy",
"license": "AGPL-3",
"external_dependencies": {
"python": [
"codicefiscale",
],
},
"depends": [
"account",
"l10n_it_edi",
"partner_firstname",
],
"data": [
"security/ir.model.access.csv",
"data/invoice_it_template.xml",
"data/res.city.it.code.csv",
"views/l10n_it_edi_move_line_other_data_view.xml",
"views/l10n_it_view.xml",
"views/res_partner_view.xml",
"views/company_view.xml",
"wizards/compute_fc_view.xml",
"wizards/l10n_it_edi_import_file_wizard.xml",
],
"installable": True,
}
1 change: 1 addition & 0 deletions l10n_it_edi_extension/controllers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import portal
97 changes: 97 additions & 0 deletions l10n_it_edi_extension/controllers/portal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# Copyright 2025 Giuseppe Borruso - Dinamiche Aziendali srl
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

import logging
from io import BytesIO

from lxml import etree

from odoo import api, tools
from odoo.exceptions import UserError
from odoo.http import Controller, request, route

from odoo.addons.l10n_it_edi.tools.remove_signature import remove_signature

_logger = logging.getLogger(__name__)


class FatturaPAController(Controller):
@api.model
def get_fatturapa_preview_style_name(self):
"""Hook to have a clean inheritance."""
return "FoglioStileAssoSoftware.xsl"

def get_xml_string(self, doc_data):
# from _decode_edi_l10n_it_edi()
# for files with a Cades signature, _decode_edi_l10n_it_edi() returns the
# orginal (signed) contents and a list of etree subtrees, each starting
# from FatturaElettronicaBody, neither of which is useful to us here
#
# so we copy the code snipped that's useful to us
# 8<
def parse_xml(parser, name, content):
try:
return etree.fromstring(content, parser)
except (etree.ParseError, ValueError) as e:
_logger.info("XML parsing of %s failed: %s", name, e)

name = doc_data.get("filename", "")
content = doc_data.get("content", b"")
parser = etree.XMLParser(recover=True, resolve_entities=False)
if (xml_tree := parse_xml(parser, name, content)) is None:
# The file may have a Cades signature, trying to remove it
if (xml_tree := parse_xml(parser, name, remove_signature(content))) is None:
_logger.info("Italian EDI invoice file %s cannot be decoded.", name)
return []
# >8

xml_string = etree.tostring(
xml_tree, pretty_print=True, encoding="unicode"
).encode()
return xml_string

def get_fattura_elettronica_preview(self, doc_data):
xsl_path = tools.misc.file_path(
f"l10n_it_edi_extension/data/{self.get_fatturapa_preview_style_name()}"
)
xslt = etree.parse(xsl_path)

xml_string = self.get_xml_string(doc_data)
xml_file = BytesIO(xml_string)
recovering_parser = etree.XMLParser(recover=True, resolve_entities=False)
dom = etree.parse(xml_file, parser=recovering_parser)
transform = etree.XSLT(xslt)
newdom = transform(dom)
return etree.tostring(newdom, pretty_print=True, encoding="unicode")

@route(
[
"/fatturapa/preview/<invoice_id>",
],
type="http",
auth="user",
website=True,
)
def fatturapa_preview(self, invoice_id, **data):
invoice = request.env["account.move"].sudo().browse(int(invoice_id))

if doc_data := invoice._get_invoice_legal_documents(
"fatturapa", allow_fallback=True
):
if errors := doc_data.get("errors"):
raise UserError(
request.env._(
"Error while creating XML:\n- %s", "\n- ".join(errors)
)
)

html = self.get_fattura_elettronica_preview(doc_data)
if isinstance(html, bytes):
html = html.decode()
pdf = request.env["ir.actions.report"]._run_wkhtmltopdf([html])

pdfhttpheaders = [
("Content-Type", "application/pdf"),
("Content-Length", len(pdf)),
]
return request.make_response(pdf, headers=pdfhttpheaders)
Loading
Loading