diff --git a/ebill_postfinance/__manifest__.py b/ebill_postfinance/__manifest__.py index 53ebd3dc9..3e12ce926 100644 --- a/ebill_postfinance/__manifest__.py +++ b/ebill_postfinance/__manifest__.py @@ -17,7 +17,6 @@ "l10n_ch_qriban", "queue_job", "sale", - "sale_stock", ], "external_dependencies": { "python": [ diff --git a/ebill_postfinance/messages/invoice-yellowbill.jinja b/ebill_postfinance/messages/invoice-yellowbill.jinja index c4e6e9dd4..49aee5d00 100644 --- a/ebill_postfinance/messages/invoice-yellowbill.jinja +++ b/ebill_postfinance/messages/invoice-yellowbill.jinja @@ -191,16 +191,8 @@ {%- endif %} {% endfor %} - {% for picking in line.sale_line_ids.move_ids.mapped('picking_id') %} - {%- if picking.state != 'cancel' %} - {% set ref.position = ref.position + 1 %} - - {{ ref.position }} - DeliveryNoteNumber - {{ picking.name }} - - {%- endif %} - {% endfor %} + {% include invoice_line_stock_template ignore missing %} + {% endfor %} diff --git a/ebill_postfinance/models/ebill_postfinance_invoice_message.py b/ebill_postfinance/models/ebill_postfinance_invoice_message.py index 3af477674..747eea29a 100644 --- a/ebill_postfinance/models/ebill_postfinance_invoice_message.py +++ b/ebill_postfinance/models/ebill_postfinance_invoice_message.py @@ -293,6 +293,7 @@ def _get_payload_params_yb(self): "ebill_account_number": self.ebill_account_number, "discount_template": "", "discount": {}, + "invoice_line_stock_template": "", } amount_by_group = [] # Get the percentage of the tax from the name of the group diff --git a/ebill_postfinance/tests/common.py b/ebill_postfinance/tests/common.py index 89eee2006..a3349f1ff 100644 --- a/ebill_postfinance/tests/common.py +++ b/ebill_postfinance/tests/common.py @@ -163,11 +163,6 @@ def setUpClass(cls): ) cls.sale.action_confirm() cls.sale.date_order = "2019-06-01" - cls.pickings = cls.sale.order_line.move_ids.mapped("picking_id") - cls.pickings[0].name = "Picking Name" - for line in cls.pickings.move_lines.move_line_ids: - line.qty_done = line.product_qty - cls.pickings._action_done() # Generate the invoice from the sale order cls.invoice = cls.sale._create_invoices() # And add some more lines on the invoice diff --git a/ebill_postfinance/tests/examples/invoice_qr_yb.xml b/ebill_postfinance/tests/examples/invoice_qr_yb.xml index 5c8e1daf5..fa60b3c59 100644 --- a/ebill_postfinance/tests/examples/invoice_qr_yb.xml +++ b/ebill_postfinance/tests/examples/invoice_qr_yb.xml @@ -118,11 +118,6 @@ OrderNumberByBuyer CustomerRef - - 4 - DeliveryNoteNumber - Picking Name - NORMAL @@ -144,20 +139,15 @@ 0.0 0.0 - 5 + 4 OrderNumberBySupplier Order123 - 6 + 5 OrderNumberByBuyer CustomerRef - - 7 - DeliveryNoteNumber - Picking Name - NORMAL diff --git a/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py b/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py index f1fdba3ba..ea27e9038 100644 --- a/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py +++ b/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py @@ -25,6 +25,11 @@ def setUpClass(cls): def test_invoice_qr(self): """Check XML payload genetated for an invoice.""" + # If ebill_postfinance_stock is installed it will break the test + try: + self.invoice.invoice_line_ids.sale_line_ids.write({"move_ids": False}) + except Exception: + pass self.invoice.name = "INV_TEST_01" self.invoice.invoice_date_due = "2019-07-01" message = self.invoice.create_postfinance_ebill() diff --git a/ebill_postfinance_stock/__init__.py b/ebill_postfinance_stock/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/ebill_postfinance_stock/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/ebill_postfinance_stock/__manifest__.py b/ebill_postfinance_stock/__manifest__.py new file mode 100644 index 000000000..fdea40247 --- /dev/null +++ b/ebill_postfinance_stock/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "eBill Postfinance Stock", + "summary": """Add stock integration to Postfinance eBill""", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "author": "Camptocamp,Odoo Community Association (OCA)", + "maintainers": ["TDu"], + "website": "https://github.com/OCA/l10n-switzerland", + "depends": [ + "ebill_postfinance", + "sale_stock", + ], + "auto_install": True, +} diff --git a/ebill_postfinance_stock/messages/invoice-line-stock-yellowbill.jinja b/ebill_postfinance_stock/messages/invoice-line-stock-yellowbill.jinja new file mode 100644 index 000000000..521b51ec7 --- /dev/null +++ b/ebill_postfinance_stock/messages/invoice-line-stock-yellowbill.jinja @@ -0,0 +1,10 @@ +{% for picking in line.sale_line_ids.move_ids.mapped('picking_id') %} +{%- if picking.state != 'cancel' %} +{% set ref.position = ref.position + 1 %} + + {{ ref.position }} + DeliveryNoteNumber + {{ picking.name }} + +{%- endif %} +{% endfor %} diff --git a/ebill_postfinance_stock/models/__init__.py b/ebill_postfinance_stock/models/__init__.py new file mode 100644 index 000000000..6c45f0783 --- /dev/null +++ b/ebill_postfinance_stock/models/__init__.py @@ -0,0 +1 @@ +from . import ebill_postfinance_invoice_message diff --git a/ebill_postfinance_stock/models/ebill_postfinance_invoice_message.py b/ebill_postfinance_stock/models/ebill_postfinance_invoice_message.py new file mode 100644 index 000000000..89bda52eb --- /dev/null +++ b/ebill_postfinance_stock/models/ebill_postfinance_invoice_message.py @@ -0,0 +1,24 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +import os + +from odoo import models +from odoo.modules.module import get_module_root + +MODULE_PATH = get_module_root(os.path.dirname(__file__)) +INVOICE_LINE_STOCK_TEMPLATE = "invoice-line-stock-yellowbill.jinja" +TEMPLATE_DIR = [MODULE_PATH + "/messages"] + + +class EbillPostfinanceInvoiceMessage(models.Model): + _inherit = "ebill.postfinance.invoice.message" + + def _get_jinja_env(self, template_dir): + template_dir += TEMPLATE_DIR + return super()._get_jinja_env(template_dir) + + def _get_payload_params_yb(self): + params = super()._get_payload_params_yb() + params["invoice_line_stock_template"] = INVOICE_LINE_STOCK_TEMPLATE + return params diff --git a/ebill_postfinance_stock/readme/CONTRIBUTORS.rst b/ebill_postfinance_stock/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..0dd376fae --- /dev/null +++ b/ebill_postfinance_stock/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Thierry Ducrest diff --git a/ebill_postfinance_stock/readme/DESCRIPTION.rst b/ebill_postfinance_stock/readme/DESCRIPTION.rst new file mode 100644 index 000000000..4789bf4f1 --- /dev/null +++ b/ebill_postfinance_stock/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module adds some information related to delivery in the eBill Postfinance integration. diff --git a/ebill_postfinance_stock/tests/__init__.py b/ebill_postfinance_stock/tests/__init__.py new file mode 100644 index 000000000..d5235b1f0 --- /dev/null +++ b/ebill_postfinance_stock/tests/__init__.py @@ -0,0 +1 @@ +from . import test_ebill_postfinance_message_yb diff --git a/ebill_postfinance_stock/tests/test_ebill_postfinance_message_yb.py b/ebill_postfinance_stock/tests/test_ebill_postfinance_message_yb.py new file mode 100644 index 000000000..30d9b5fdf --- /dev/null +++ b/ebill_postfinance_stock/tests/test_ebill_postfinance_message_yb.py @@ -0,0 +1,60 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from string import Template + +from freezegun import freeze_time +from lxml import etree as ET + +from odoo.modules.module import get_module_path +from odoo.tools import file_open + +from odoo.addons.ebill_postfinance.tests.common import CommonCase + + +@freeze_time("2019-06-21 09:06:00") +class TestEbillPostfinanceMessageYB(CommonCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.schema_file = ( + get_module_path("ebill_postfinance") + "/messages/ybInvoice_V2.0.4.xsd" + ) + cls.pickings = cls.sale.order_line.move_ids.mapped("picking_id") + cls.pickings[0].name = "Picking Name" + for line in cls.pickings.move_lines.move_line_ids: + line.qty_done = line.product_qty + cls.pickings._action_done() + + def test_invoice_qr(self): + """Check XML payload genetated for an invoice.""" + self.invoice.name = "INV_TEST_01" + self.invoice.invoice_date_due = "2019-07-01" + message = self.invoice.create_postfinance_ebill() + message.set_transaction_id() + message.payload = message._generate_payload_yb() + # Validate the xml generated on top of the xsd schema + node = ET.fromstring(message.payload.encode("utf-8")) + self.assertXmlValidXSchema(node, xschema=None, filename=self.schema_file) + # Remove the PDF file data from the XML to ease diff check + lines = message.payload.splitlines() + for pos, line in enumerate(lines): + if line.find("MimeType") != -1: + lines.pop(pos) + break + payload = "\n".join(lines).encode("utf8") + # Prepare the XML file that is expected + expected_tmpl = Template( + file_open("ebill_postfinance_stock/tests/examples/invoice_qr_yb.xml").read() + ) + expected = expected_tmpl.substitute( + TRANSACTION_ID=message.transaction_id, CUSTOMER_ID=self.customer.id + ).encode("utf8") + # Remove the comments in the expected xml + expected_nocomment = [ + line + for line in expected.split(b"\n") + if not line.lstrip().startswith(b"