From d26bb46d2df3ce7250a056b705e53f06897756ac Mon Sep 17 00:00:00 2001 From: Tobias Zehntner Date: Mon, 16 Feb 2026 08:51:43 +0100 Subject: [PATCH 1/2] [18.0][ADD] contract_invoice_force_date Allow the user to set a different date on the generated invoice than the contract's recurring date. --- contract_invoice_force_date/README.rst | 100 ++++ contract_invoice_force_date/__init__.py | 1 + contract_invoice_force_date/__manifest__.py | 17 + contract_invoice_force_date/pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 1 + .../readme/DESCRIPTION.md | 1 + contract_invoice_force_date/readme/HISTORY.md | 3 + contract_invoice_force_date/readme/USAGE.md | 9 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 450 ++++++++++++++++++ .../static/img/invoice.png | Bin 0 -> 41619 bytes .../static/img/invoice_wizard.png | Bin 0 -> 30820 bytes contract_invoice_force_date/tests/__init__.py | 1 + .../tests/test_contract_manual_invoice.py | 24 + .../wizards/__init__.py | 1 + .../contract_manually_create_invoice.py | 20 + .../contract_manually_create_invoice.xml | 20 + 17 files changed, 651 insertions(+) create mode 100644 contract_invoice_force_date/README.rst create mode 100644 contract_invoice_force_date/__init__.py create mode 100644 contract_invoice_force_date/__manifest__.py create mode 100644 contract_invoice_force_date/pyproject.toml create mode 100644 contract_invoice_force_date/readme/CONTRIBUTORS.md create mode 100644 contract_invoice_force_date/readme/DESCRIPTION.md create mode 100644 contract_invoice_force_date/readme/HISTORY.md create mode 100644 contract_invoice_force_date/readme/USAGE.md create mode 100644 contract_invoice_force_date/static/description/icon.png create mode 100644 contract_invoice_force_date/static/description/index.html create mode 100644 contract_invoice_force_date/static/img/invoice.png create mode 100644 contract_invoice_force_date/static/img/invoice_wizard.png create mode 100644 contract_invoice_force_date/tests/__init__.py create mode 100644 contract_invoice_force_date/tests/test_contract_manual_invoice.py create mode 100644 contract_invoice_force_date/wizards/__init__.py create mode 100644 contract_invoice_force_date/wizards/contract_manually_create_invoice.py create mode 100644 contract_invoice_force_date/wizards/contract_manually_create_invoice.xml diff --git a/contract_invoice_force_date/README.rst b/contract_invoice_force_date/README.rst new file mode 100644 index 0000000000..c63abe3930 --- /dev/null +++ b/contract_invoice_force_date/README.rst @@ -0,0 +1,100 @@ +=========================== +Contract Invoice Force Date +=========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:273df0ecaddc984d18706a149eb06a39fe986bb34c5bd1035a6c04e0d736be6d + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fcontract-lightgray.png?logo=github + :target: https://github.com/OCA/contract/tree/18.0/contract_invoice_force_date + :alt: OCA/contract +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/contract-18-0/contract-18-0-contract_invoice_force_date + :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/contract&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Allow the user to set a different date on the generated invoice than the +contract's recurring date. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +1. Go to *Accounting* > Customers/Vendors > Manually invoice contracts +2. In the popup, choose invoicing date to select contracts to invoice +3. If contracts are available to invoice, you can set **Date to set on + Invoice** |img.png| +4. **Create Invoices** +5. The invoices are generated with the date chosen |img_1.png| + +.. |img.png| image:: https://raw.githubusercontent.com/OCA/contract/18.0/contract_invoice_force_date/static/img/invoice_wizard.png +.. |img_1.png| image:: https://raw.githubusercontent.com/OCA/contract/18.0/contract_invoice_force_date/static/img/invoice.png + +Changelog +========= + +18.0.1.0.0 (2026-02-13) +----------------------- + +- Add module + +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 +------------ + +- Tobias Zehntner tobias.zehntner@acsone.eu (https://www.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/contract `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/contract_invoice_force_date/__init__.py b/contract_invoice_force_date/__init__.py new file mode 100644 index 0000000000..5cb1c49143 --- /dev/null +++ b/contract_invoice_force_date/__init__.py @@ -0,0 +1 @@ +from . import wizards diff --git a/contract_invoice_force_date/__manifest__.py b/contract_invoice_force_date/__manifest__.py new file mode 100644 index 0000000000..a528ee5875 --- /dev/null +++ b/contract_invoice_force_date/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Contract Invoice Force Date", + "summary": """Choose invoicing date when manually invoicing contracts""", + "version": "18.0.1.0.0", + "license": "AGPL-3", + "author": "ACSONE SA/NV,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/contract", + "depends": [ + "contract", + ], + "data": [ + "wizards/contract_manually_create_invoice.xml", + ], +} diff --git a/contract_invoice_force_date/pyproject.toml b/contract_invoice_force_date/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/contract_invoice_force_date/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/contract_invoice_force_date/readme/CONTRIBUTORS.md b/contract_invoice_force_date/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..bf0f2b8122 --- /dev/null +++ b/contract_invoice_force_date/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Tobias Zehntner (https://www.acsone.eu) diff --git a/contract_invoice_force_date/readme/DESCRIPTION.md b/contract_invoice_force_date/readme/DESCRIPTION.md new file mode 100644 index 0000000000..605c631c44 --- /dev/null +++ b/contract_invoice_force_date/readme/DESCRIPTION.md @@ -0,0 +1 @@ +Allow the user to set a different date on the generated invoice than the contract's recurring date. diff --git a/contract_invoice_force_date/readme/HISTORY.md b/contract_invoice_force_date/readme/HISTORY.md new file mode 100644 index 0000000000..83202fd65b --- /dev/null +++ b/contract_invoice_force_date/readme/HISTORY.md @@ -0,0 +1,3 @@ +## 18.0.1.0.0 (2026-02-13) + +- Add module diff --git a/contract_invoice_force_date/readme/USAGE.md b/contract_invoice_force_date/readme/USAGE.md new file mode 100644 index 0000000000..42bd677708 --- /dev/null +++ b/contract_invoice_force_date/readme/USAGE.md @@ -0,0 +1,9 @@ +To use this module, you need to: + +1. Go to *Accounting* > Customers/Vendors > Manually invoice contracts +1. In the popup, choose invoicing date to select contracts to invoice +1. If contracts are available to invoice, you can set **Date to set on Invoice** +![img.png](../static/img/invoice_wizard.png) +1. **Create Invoices** +1. The invoices are generated with the date chosen +![img_1.png](../static/img/invoice.png) diff --git a/contract_invoice_force_date/static/description/icon.png b/contract_invoice_force_date/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/contract_invoice_force_date/static/description/index.html b/contract_invoice_force_date/static/description/index.html new file mode 100644 index 0000000000..79e64d92db --- /dev/null +++ b/contract_invoice_force_date/static/description/index.html @@ -0,0 +1,450 @@ + + + + + +Contract Invoice Force Date + + + +
+

Contract Invoice Force Date

+ + +

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

+

Allow the user to set a different date on the generated invoice than the +contract’s recurring date.

+

Table of contents

+ +
+

Usage

+

To use this module, you need to:

+
    +
  1. Go to Accounting > Customers/Vendors > Manually invoice contracts
  2. +
  3. In the popup, choose invoicing date to select contracts to invoice
  4. +
  5. If contracts are available to invoice, you can set Date to set on +Invoice img.png
  6. +
  7. Create Invoices
  8. +
  9. The invoices are generated with the date chosen img_1.png
  10. +
+
+
+

Changelog

+
+

18.0.1.0.0 (2026-02-13)

+
    +
  • Add module
  • +
+
+
+
+

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
  • +
+
+ +
+

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/contract project on GitHub.

+

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

+
+
+
+ + diff --git a/contract_invoice_force_date/static/img/invoice.png b/contract_invoice_force_date/static/img/invoice.png new file mode 100644 index 0000000000000000000000000000000000000000..5ecf6da5d5d2d149c847957d65003f4e5ad26be4 GIT binary patch literal 41619 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 Tf97~@zd`>7OuJOmCgi^WNnL^3 literal 0 HcmV?d00001 diff --git a/contract_invoice_force_date/static/img/invoice_wizard.png b/contract_invoice_force_date/static/img/invoice_wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..ddec74a592c8ad056221af98c6546b531659d712 GIT binary patch literal 30820 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 literal 0 HcmV?d00001 diff --git a/contract_invoice_force_date/tests/__init__.py b/contract_invoice_force_date/tests/__init__.py new file mode 100644 index 0000000000..e1b1e42889 --- /dev/null +++ b/contract_invoice_force_date/tests/__init__.py @@ -0,0 +1 @@ +from . import test_contract_manual_invoice diff --git a/contract_invoice_force_date/tests/test_contract_manual_invoice.py b/contract_invoice_force_date/tests/test_contract_manual_invoice.py new file mode 100644 index 0000000000..935032db59 --- /dev/null +++ b/contract_invoice_force_date/tests/test_contract_manual_invoice.py @@ -0,0 +1,24 @@ +# Copyright 2026 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + + +from dateutil.relativedelta import relativedelta + +from odoo.addons.contract.tests.test_contract import TestContractBase + + +class TestContractInvoicing(TestContractBase): + """ + Tests for forced date on manual contract invoicing + """ + + def test_contract_manual_invoice_force_date(self): + tomorrow = self.today + relativedelta(days=1) + wizard = self.env["contract.manually.create.invoice"].create( + {"invoice_date": self.today} + ) + wizard.invoice_date_forced = tomorrow + action = wizard.create_invoice() + invoices = self.env["account.move"].search(action["domain"]) + for invoice in invoices: + self.assertEqual(invoice.invoice_date, tomorrow) diff --git a/contract_invoice_force_date/wizards/__init__.py b/contract_invoice_force_date/wizards/__init__.py new file mode 100644 index 0000000000..2e56cd6d03 --- /dev/null +++ b/contract_invoice_force_date/wizards/__init__.py @@ -0,0 +1 @@ +from . import contract_manually_create_invoice diff --git a/contract_invoice_force_date/wizards/contract_manually_create_invoice.py b/contract_invoice_force_date/wizards/contract_manually_create_invoice.py new file mode 100644 index 0000000000..d8f3547fb8 --- /dev/null +++ b/contract_invoice_force_date/wizards/contract_manually_create_invoice.py @@ -0,0 +1,20 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ContractManuallyCreateInvoice(models.TransientModel): + _inherit = "contract.manually.create.invoice" + + invoice_date_forced = fields.Date( + "Date to set on Invoice", + help="If specified, this date will be set on the generated invoices instead of " + "the contract's recurring date.", + ) + + def _create_invoices(self): + invoices = super()._create_invoices() + if self.invoice_date_forced: + invoices.write({"invoice_date": self.invoice_date_forced}) + return invoices diff --git a/contract_invoice_force_date/wizards/contract_manually_create_invoice.xml b/contract_invoice_force_date/wizards/contract_manually_create_invoice.xml new file mode 100644 index 0000000000..bcf8af932e --- /dev/null +++ b/contract_invoice_force_date/wizards/contract_manually_create_invoice.xml @@ -0,0 +1,20 @@ + + + + + contract.manually.create.invoice + + + + + + + + From 358b1e5fac3b2d2f5704e7dbee1aa1e28b3fa86c Mon Sep 17 00:00:00 2001 From: Tobias Zehntner Date: Mon, 16 Feb 2026 08:54:54 +0100 Subject: [PATCH 2/2] [18.0][ADD] contract_invoice_force_date_queue Ensure forced invoice dates are applied when invoices are generated with job queues. --- contract_invoice_force_date_queue/README.rst | 90 ++++ contract_invoice_force_date_queue/__init__.py | 2 + .../__manifest__.py | 16 + .../models/__init__.py | 1 + .../models/contract_contract.py | 24 + .../pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 1 + .../readme/DESCRIPTION.md | 1 + .../readme/HISTORY.md | 3 + .../readme/USAGE.md | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 443 ++++++++++++++++++ .../tests/__init__.py | 1 + .../test_contract_manual_invoice_queue.py | 45 ++ .../wizards/__init__.py | 1 + .../contract_manually_create_invoice.py | 14 + 16 files changed, 646 insertions(+) create mode 100644 contract_invoice_force_date_queue/README.rst create mode 100644 contract_invoice_force_date_queue/__init__.py create mode 100644 contract_invoice_force_date_queue/__manifest__.py create mode 100644 contract_invoice_force_date_queue/models/__init__.py create mode 100644 contract_invoice_force_date_queue/models/contract_contract.py create mode 100644 contract_invoice_force_date_queue/pyproject.toml create mode 100644 contract_invoice_force_date_queue/readme/CONTRIBUTORS.md create mode 100644 contract_invoice_force_date_queue/readme/DESCRIPTION.md create mode 100644 contract_invoice_force_date_queue/readme/HISTORY.md create mode 100644 contract_invoice_force_date_queue/readme/USAGE.md create mode 100644 contract_invoice_force_date_queue/static/description/icon.png create mode 100644 contract_invoice_force_date_queue/static/description/index.html create mode 100644 contract_invoice_force_date_queue/tests/__init__.py create mode 100644 contract_invoice_force_date_queue/tests/test_contract_manual_invoice_queue.py create mode 100644 contract_invoice_force_date_queue/wizards/__init__.py create mode 100644 contract_invoice_force_date_queue/wizards/contract_manually_create_invoice.py diff --git a/contract_invoice_force_date_queue/README.rst b/contract_invoice_force_date_queue/README.rst new file mode 100644 index 0000000000..5c8cfef290 --- /dev/null +++ b/contract_invoice_force_date_queue/README.rst @@ -0,0 +1,90 @@ +================================= +Contract Invoice Force Date Queue +================================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:8e145a66bc9513caaac6df3295680f8699e2b8b47ed9dbf5e978c70b107610a4 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fcontract-lightgray.png?logo=github + :target: https://github.com/OCA/contract/tree/18.0/contract_invoice_force_date_queue + :alt: OCA/contract +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/contract-18-0/contract-18-0-contract_invoice_force_date_queue + :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/contract&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Ensure forced invoice dates are applied when invoices are generated with +job queues. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + + This module does not impact the user interface. + +Changelog +========= + +18.0.1.0.0 (2026-02-13) +----------------------- + +- Add module + +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 +------------ + +- Tobias Zehntner tobias.zehntner@acsone.eu (https://www.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/contract `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/contract_invoice_force_date_queue/__init__.py b/contract_invoice_force_date_queue/__init__.py new file mode 100644 index 0000000000..aee8895e7a --- /dev/null +++ b/contract_invoice_force_date_queue/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/contract_invoice_force_date_queue/__manifest__.py b/contract_invoice_force_date_queue/__manifest__.py new file mode 100644 index 0000000000..fa09e59715 --- /dev/null +++ b/contract_invoice_force_date_queue/__manifest__.py @@ -0,0 +1,16 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Contract Invoice Force Date Queue", + "summary": """Bridge between contract_invoice_force_date and contract_queue_job""", + "version": "18.0.1.0.0", + "license": "AGPL-3", + "author": "ACSONE SA/NV,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/contract", + "depends": [ + "contract_invoice_force_date", + "contract_queue_job", + ], + "auto_install": True, +} diff --git a/contract_invoice_force_date_queue/models/__init__.py b/contract_invoice_force_date_queue/models/__init__.py new file mode 100644 index 0000000000..acc8a06b73 --- /dev/null +++ b/contract_invoice_force_date_queue/models/__init__.py @@ -0,0 +1 @@ +from . import contract_contract diff --git a/contract_invoice_force_date_queue/models/contract_contract.py b/contract_invoice_force_date_queue/models/contract_contract.py new file mode 100644 index 0000000000..e128f1a37b --- /dev/null +++ b/contract_invoice_force_date_queue/models/contract_contract.py @@ -0,0 +1,24 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class ContractContract(models.Model): + _inherit = "contract.contract" + + @api.model + def _job_prepare_context_before_enqueue_keys(self): + """ + Keys to keep in context of stored jobs + """ + return ( + *super()._job_prepare_context_before_enqueue_keys(), + "invoice_date_forced", + ) + + def _recurring_create_invoice(self, date_ref=False): + moves = super()._recurring_create_invoice(date_ref=date_ref) + if invoice_date := self.env.context.get("invoice_date_forced", False): + moves.write({"invoice_date": invoice_date}) + return moves diff --git a/contract_invoice_force_date_queue/pyproject.toml b/contract_invoice_force_date_queue/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/contract_invoice_force_date_queue/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/contract_invoice_force_date_queue/readme/CONTRIBUTORS.md b/contract_invoice_force_date_queue/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..bf0f2b8122 --- /dev/null +++ b/contract_invoice_force_date_queue/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Tobias Zehntner (https://www.acsone.eu) diff --git a/contract_invoice_force_date_queue/readme/DESCRIPTION.md b/contract_invoice_force_date_queue/readme/DESCRIPTION.md new file mode 100644 index 0000000000..57b13ce697 --- /dev/null +++ b/contract_invoice_force_date_queue/readme/DESCRIPTION.md @@ -0,0 +1 @@ +Ensure forced invoice dates are applied when invoices are generated with job queues. diff --git a/contract_invoice_force_date_queue/readme/HISTORY.md b/contract_invoice_force_date_queue/readme/HISTORY.md new file mode 100644 index 0000000000..83202fd65b --- /dev/null +++ b/contract_invoice_force_date_queue/readme/HISTORY.md @@ -0,0 +1,3 @@ +## 18.0.1.0.0 (2026-02-13) + +- Add module diff --git a/contract_invoice_force_date_queue/readme/USAGE.md b/contract_invoice_force_date_queue/readme/USAGE.md new file mode 100644 index 0000000000..11a4782c95 --- /dev/null +++ b/contract_invoice_force_date_queue/readme/USAGE.md @@ -0,0 +1 @@ +> This module does not impact the user interface. diff --git a/contract_invoice_force_date_queue/static/description/icon.png b/contract_invoice_force_date_queue/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/contract_invoice_force_date_queue/static/description/index.html b/contract_invoice_force_date_queue/static/description/index.html new file mode 100644 index 0000000000..0a73e50546 --- /dev/null +++ b/contract_invoice_force_date_queue/static/description/index.html @@ -0,0 +1,443 @@ + + + + + +Contract Invoice Force Date Queue + + + +
+

Contract Invoice Force Date Queue

+ + +

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

+

Ensure forced invoice dates are applied when invoices are generated with +job queues.

+

Table of contents

+ +
+

Usage

+
+This module does not impact the user interface.
+
+
+

Changelog

+
+

18.0.1.0.0 (2026-02-13)

+
    +
  • Add module
  • +
+
+
+
+

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
  • +
+
+ +
+

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/contract project on GitHub.

+

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

+
+
+
+ + diff --git a/contract_invoice_force_date_queue/tests/__init__.py b/contract_invoice_force_date_queue/tests/__init__.py new file mode 100644 index 0000000000..2ece1ce615 --- /dev/null +++ b/contract_invoice_force_date_queue/tests/__init__.py @@ -0,0 +1 @@ +from . import test_contract_manual_invoice_queue diff --git a/contract_invoice_force_date_queue/tests/test_contract_manual_invoice_queue.py b/contract_invoice_force_date_queue/tests/test_contract_manual_invoice_queue.py new file mode 100644 index 0000000000..ad8dbde5c5 --- /dev/null +++ b/contract_invoice_force_date_queue/tests/test_contract_manual_invoice_queue.py @@ -0,0 +1,45 @@ +# Copyright 2026 ACSONE SA/NV () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + + +from dateutil.relativedelta import relativedelta + +from odoo.addons.contract.tests.test_contract import TestContractBase +from odoo.addons.queue_job.tests.common import JobMixin + + +class TestContractInvoicing(TestContractBase, JobMixin): + """ + Tests for forced date on manual contract invoicing + """ + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env["ir.config_parameter"].sudo().set_param("contract.queue.job", "true") + + def test_contract_manual_invoice_force_date(self): + job_counter = self.job_counter() + tomorrow = self.today + relativedelta(days=1) + wizard = self.env["contract.manually.create.invoice"].create( + {"invoice_date": self.today} + ) + wizard.invoice_date_forced = tomorrow + wizard.create_invoice_queued() + self.assertEqual(job_counter.count_created(), 2) + self.perform_jobs(job_counter) + invoices = ( + self.env["account.move.line"] + .search( + [ + ( + "contract_line_id", + "in", + self.contract.contract_line_ids.ids, + ) + ] + ) + .mapped("move_id") + ) + for invoice in invoices: + self.assertEqual(invoice.invoice_date, tomorrow) diff --git a/contract_invoice_force_date_queue/wizards/__init__.py b/contract_invoice_force_date_queue/wizards/__init__.py new file mode 100644 index 0000000000..2e56cd6d03 --- /dev/null +++ b/contract_invoice_force_date_queue/wizards/__init__.py @@ -0,0 +1 @@ +from . import contract_manually_create_invoice diff --git a/contract_invoice_force_date_queue/wizards/contract_manually_create_invoice.py b/contract_invoice_force_date_queue/wizards/contract_manually_create_invoice.py new file mode 100644 index 0000000000..393371f6da --- /dev/null +++ b/contract_invoice_force_date_queue/wizards/contract_manually_create_invoice.py @@ -0,0 +1,14 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models + + +class ContractManuallyCreateInvoice(models.TransientModel): + _inherit = "contract.manually.create.invoice" + + def create_invoice_queued(self): + return super( + ContractManuallyCreateInvoice, + self.with_context(invoice_date_forced=self.invoice_date_forced), + ).create_invoice_queued()