diff --git a/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/README.rst b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/README.rst new file mode 100644 index 00000000000..b45d7bd771e --- /dev/null +++ b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/README.rst @@ -0,0 +1,80 @@ +============================================================== +Partner Invoicing Mode At Shipping Group By Partner By Carrier +============================================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:b83769b79c6e2dbf6e686c211541069b17c042a19582ccc533aa334f71497ba0 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--invoicing-lightgray.png?logo=github + :target: https://github.com/OCA/account-invoicing/tree/16.0/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier + :alt: OCA/account-invoicing +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/account-invoicing-16-0/account-invoicing-16-0-partner_invoicing_mode_at_shipping_group_by_partner_by_carrier + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/account-invoicing&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +As the ``stock_picking_group_by_partner_by_carrier`` module does not use +the ``sale_id`` field on the ``stock.picking`` module, there is no more +trigger to create the invoice at picking validation. + +This module handles that use case restablishing the trigger. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* ACSONE SA/NV + +Contributors +------------ + +- Denis Roussel denis.roussel@acsone.eu + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/account-invoicing `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/__init__.py b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/__manifest__.py b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/__manifest__.py new file mode 100644 index 00000000000..13e400051ea --- /dev/null +++ b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2025 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Partner Invoicing Mode At Shipping Group By Partner By Carrier", + "summary": """This module allows to take into account the non use of + sale_id field on stock picking""", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "ACSONE SA/NV, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/account-invoicing", + "depends": [ + "partner_invoicing_mode_at_shipping", + "stock_picking_group_by_partner_by_carrier", + ], + "auto_install": True, +} diff --git a/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/models/__init__.py b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/models/__init__.py new file mode 100644 index 00000000000..ae4c27227f1 --- /dev/null +++ b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/models/__init__.py @@ -0,0 +1 @@ +from . import stock_picking diff --git a/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/models/stock_picking.py b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/models/stock_picking.py new file mode 100644 index 00000000000..9b347f747f9 --- /dev/null +++ b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/models/stock_picking.py @@ -0,0 +1,24 @@ +# Copyright 2025 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models + + +class StockPicking(models.Model): + + _inherit = "stock.picking" + + def _invoice_at_shipping(self): + self.ensure_one() + # As we cannot base the logic on sale_id field (it is set to void in grouping module), + # and as the invoicing mode and one_invoice_per_shipping are commercial fields + # (same value for all partner hierarchy), we check if any value is set + return self.picking_type_code == "outgoing" and ( + any( + ( + partner.invoicing_mode == "at_shipping" + or partner.invoicing_mode.one_invoice_per_shipping + ) + for partner in self.move_ids.sale_line_id.order_id.partner_invoice_id + ) + ) diff --git a/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/readme/CONTRIBUTORS.md b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..4e7e6847269 --- /dev/null +++ b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Denis Roussel diff --git a/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/readme/DESCRIPTION.md b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/readme/DESCRIPTION.md new file mode 100644 index 00000000000..dc27e9db261 --- /dev/null +++ b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/readme/DESCRIPTION.md @@ -0,0 +1,5 @@ +As the `stock_picking_group_by_partner_by_carrier` module does not use the `sale_id` field +on the `stock.picking` module, there is no more trigger to create the invoice at +picking validation. + +This module handles that use case restablishing the trigger. diff --git a/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/static/description/index.html b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/static/description/index.html new file mode 100644 index 00000000000..ab1668b1d65 --- /dev/null +++ b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/static/description/index.html @@ -0,0 +1,426 @@ + + + + + +Partner Invoicing Mode At Shipping Group By Partner By Carrier + + + +
+

Partner Invoicing Mode At Shipping Group By Partner By Carrier

+ + +

Beta License: AGPL-3 OCA/account-invoicing Translate me on Weblate Try me on Runboat

+

As the stock_picking_group_by_partner_by_carrier module does not use +the sale_id field on the stock.picking module, there is no more +trigger to create the invoice at picking validation.

+

This module handles that use case restablishing the trigger.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/account-invoicing project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/tests/__init__.py b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/tests/__init__.py new file mode 100644 index 00000000000..0b2e966bb06 --- /dev/null +++ b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/tests/__init__.py @@ -0,0 +1 @@ +from . import test_invoice_at_shipping diff --git a/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/tests/test_invoice_at_shipping.py b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/tests/test_invoice_at_shipping.py new file mode 100644 index 00000000000..175484054c4 --- /dev/null +++ b/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/tests/test_invoice_at_shipping.py @@ -0,0 +1,86 @@ +# Copyright 2025 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo.addons.base.tests.common import BaseCommon +from odoo.addons.queue_job.tests.common import trap_jobs + + +class TestInvoiceAtShipping(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.warehouse = cls.env.ref("stock.warehouse0") + cls.warehouse.group_shippings = True + cls.product = cls.env["product.product"].create( + { + "name": "Test Product", + "type": "product", + } + ) + cls.env["stock.quant"].with_context(inventory_mode=True).create( + { + "location_id": cls.warehouse.lot_stock_id.id, + "product_id": cls.product.id, + "inventory_quantity": 50.0, + } + )._apply_inventory() + + @classmethod + def _create_order(cls): + return cls.env["sale.order"].create( + { + "partner_id": cls.partner.id, + "partner_invoice_id": cls.partner.id, + "partner_shipping_id": cls.partner.id, + "order_line": [ + ( + 0, + 0, + { + "name": "Line one", + "product_id": cls.product.id, + "product_uom_qty": 4, + "product_uom": cls.product.uom_id.id, + "price_unit": 123, + }, + ) + ], + "pricelist_id": cls.env.ref("product.list0").id, + } + ) + + def test_invoice_at_shipping(self): + self.partner.invoicing_mode = "at_shipping" + self.so1 = self._create_order() + self.so1.action_confirm() + self.assertTrue(self.so1.picking_ids) + + self.so2 = self._create_order() + self.so2.action_confirm() + self.assertEqual(self.so1.picking_ids, self.so2.picking_ids) + + self.assertEqual(2, len(self.so1.picking_ids.move_ids)) + + self.so2.order_line.move_ids.move_line_ids.write( + {"qty_done": self.so2.order_line.move_ids.product_uom_qty} + ) + with trap_jobs() as trap: + self.so2.order_line.move_ids.picking_id._action_done() + trap.assert_jobs_count(1) + trap.perform_enqueued_jobs() + self.assertEqual(self.so2.order_line.move_ids.picking_id.state, "done") + self.assertTrue(self.so2.order_line.move_ids.picking_id.backorder_ids) + self.assertEqual( + self.so1.order_line.move_ids.picking_id, + self.so2.order_line.move_ids.picking_id.backorder_ids, + ) + self.so1.order_line.move_ids.move_line_ids.write( + {"qty_done": self.so1.order_line.move_ids.product_uom_qty} + ) + with trap_jobs() as trap: + self.so1.order_line.move_ids.picking_id._action_done() + trap.assert_jobs_count(1) + trap.perform_enqueued_jobs() + + self.assertEqual(1, len(self.so2.invoice_ids)) + self.assertEqual(1, len(self.so1.invoice_ids)) + self.assertNotEqual(self.so2.invoice_ids, self.so1.invoice_ids) diff --git a/setup/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/odoo/addons/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier b/setup/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/odoo/addons/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier new file mode 120000 index 00000000000..ec05d407777 --- /dev/null +++ b/setup/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/odoo/addons/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier @@ -0,0 +1 @@ +../../../../partner_invoicing_mode_at_shipping_group_by_partner_by_carrier \ No newline at end of file diff --git a/setup/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/setup.py b/setup/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/setup.py new file mode 100644 index 00000000000..28c57bb6403 --- /dev/null +++ b/setup/partner_invoicing_mode_at_shipping_group_by_partner_by_carrier/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)