Initial commit: Odoo 18.0-20251222 extra-addons
Some checks failed
pre-commit / pre-commit (push) Has been cancelled
tests / Detect unreleased dependencies (push) Has been cancelled
tests / test with OCB (push) Has been cancelled
tests / test with Odoo (push) Has been cancelled

This commit is contained in:
tocmo0nlord
2026-03-13 20:43:25 +00:00
parent 36e847a7df
commit adbe430761
9472 changed files with 1265727 additions and 0 deletions

View File

@@ -0,0 +1,123 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
=========================
Update Invoice's Due Date
=========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:773a3823f4faaeb482effe218b27b09dde0cd2b6139c28e14fa4c006d9ba5830
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/license-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/18.0/account_invoice_date_due
: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-18-0/account-invoicing-18-0-account_invoice_date_due
: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=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module sets the invoice's due date field as editable (Even if the
invoice state is done and a Payment Term is set).
When the field is edited, the invoice's due date is updated, along with
the related invoice lines.
**Table of contents**
.. contents::
:local:
Configuration
=============
To be able to edit this field, the user needs to have access to the
group ``Allow to change due date``.
Usage
=====
To edit the invoice's due date, we have several scenarios:
- A Payment Term is set. In this case, no extra field will be shown
while in draft, as the standard flow allows us to edit the Payment
Term directly, or delete it and set a due date manually. Once the
invoice is posted, a new field will be shown in the view above the
Payment Term, allowing the due date to be changed.
- No Payment Term is set, and the due date is set manually. In this
case, the due date is editable while in draft, as with the standard
Odoo flow. However, once posted, the field will remain editable.
(All the above are considering the user belongs to the security group
refered in "Configuration")
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-invoicing/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 <https://github.com/OCA/account-invoicing/issues/new?body=module:%20account_invoice_date_due%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
-------
* Vauxoo
Contributors
------------
- Luis González <lgonzalez@vauxoo.com>
- Luis Torres <luis_t@vauxoo.com>
- `Tecnativa <https://www.tecnativa.com>`__:
- João Marques
- Juan Carlos Oñate
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.
.. |maintainer-luisg123v| image:: https://github.com/luisg123v.png?size=40px
:target: https://github.com/luisg123v
:alt: luisg123v
.. |maintainer-CarlosRoca13| image:: https://github.com/CarlosRoca13.png?size=40px
:target: https://github.com/CarlosRoca13
:alt: CarlosRoca13
Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-luisg123v| |maintainer-CarlosRoca13|
This module is part of the `OCA/account-invoicing <https://github.com/OCA/account-invoicing/tree/18.0/account_invoice_date_due>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -0,0 +1,3 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import models

View File

@@ -0,0 +1,16 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Update Invoice's Due Date",
"version": "18.0.1.0.1",
"author": "Vauxoo, Odoo Community Association (OCA)",
"maintainers": ["luisg123v", "CarlosRoca13"],
"category": "Accounting",
"website": "https://github.com/OCA/account-invoicing",
"license": "AGPL-3",
"depends": ["account"],
"demo": [],
"data": ["security/security.xml", "views/account_move_date_due.xml"],
"installable": True,
"auto_install": False,
}

View File

@@ -0,0 +1,43 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_date_due
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_invoice_date_due
#: model:res.groups,name:account_invoice_date_due.allow_to_change_due_date
msgid "Allow to change due date"
msgstr ""
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_bank_statement_line__invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move__invoice_date_due
#: model_terms:ir.ui.view,arch_db:account_invoice_date_due.view_move_form
msgid "Due Date"
msgstr ""
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_bank_statement_line__invoice_date_due_payment_term
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move__invoice_date_due_payment_term
msgid "Due Date Payment Term"
msgstr ""
#. module: account_invoice_date_due
#: model:ir.model,name:account_invoice_date_due.model_account_move
msgid "Journal Entry"
msgstr ""
#. module: account_invoice_date_due
#. odoo-python
#: code:addons/account_invoice_date_due/models/account_move.py:0
msgid "You are not allowed to change the due date."
msgstr ""

View File

@@ -0,0 +1,39 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_date_due
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2022-08-09 10:07+0000\n"
"Last-Translator: jabelchi <jabelchi@gmail.com>\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: account_invoice_date_due
#: model:res.groups,name:account_invoice_date_due.allow_to_change_due_date
msgid "Allow to change due date"
msgstr "Permet canviar data de venciment"
#. module: account_invoice_date_due
#: model_terms:ir.ui.view,arch_db:account_invoice_date_due.view_move_form
msgid "Due Date"
msgstr "Data de venciment"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_bank_statement_line__invoice_date_due_payment_term
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move__invoice_date_due_payment_term
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_payment__invoice_date_due_payment_term
msgid "Due Date Payment Term"
msgstr "Termini de pagament del venciment"
#. module: account_invoice_date_due
#: model:ir.model,name:account_invoice_date_due.model_account_move
msgid "Journal Entry"
msgstr "Assentament comptable"

View File

@@ -0,0 +1,81 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_date_due
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-31 10:06+0000\n"
"Last-Translator: Niels Göttsch <ng@ife.de>\n"
"Language-Team: none\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.10.2\n"
#. module: account_invoice_date_due
#: model:res.groups,name:account_invoice_date_due.allow_to_change_due_date
msgid "Allow to change due date"
msgstr "Fälligkeitsdatum in Rechnungen ändern"
#. module: account_invoice_date_due
#: model_terms:ir.ui.view,arch_db:account_invoice_date_due.view_move_form
msgid "Due Date"
msgstr "Fälligkeitsdatum"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move__invoice_date_due_payment_term
msgid "Due Date Payment Term"
msgstr "Fälligkeitsdatum Zahlungsbedingung"
#. module: account_invoice_date_due
#: model:ir.model,name:account_invoice_date_due.model_account_move
msgid "Journal Entries"
msgstr "Journalbuchungen"
#~ msgid "Cancel"
#~ msgstr "Abbrechen"
#~ msgid "Change due date"
#~ msgstr "Fälligkeitsdatum ändern"
#~ msgid "Created by"
#~ msgstr "Erstellt von"
#~ msgid "Created on"
#~ msgstr "Erstellt am"
#~ msgid "Display Name"
#~ msgstr "Anzeigename"
#~ msgid "ID"
#~ msgstr "ID"
#~ msgid "Last Modified on"
#~ msgstr "Zuletzt geändert am"
#~ msgid "Last Updated by"
#~ msgstr "Zuletzt aktualisiert von"
#~ msgid "Last Updated on"
#~ msgstr "Zuletzt aktualisiert am"
#~ msgid "New Due Date"
#~ msgstr "Neues Fälligkeitsdatum"
#~ msgid "New date to be set to the invoice's due date."
#~ msgstr ""
#~ "Dies ist das Datum, das als neues Fälligkeitsdatum der Rechnung gesetzt "
#~ "werden soll."
#~ msgid "Set Due Date"
#~ msgstr "Fälligkeitsdatum ändern"
#~ msgid "Set a new due date on selected invoices."
#~ msgstr "Neues Fälligkeitsdatum bei den ausgewählten Rechnungen setzen."
#~ msgid "Wizard to set due date"
#~ msgstr "Assistent für das Ändern des Fälligkeitsdatums"

View File

@@ -0,0 +1,93 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_date_due
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-14 19:17+0000\n"
"PO-Revision-Date: 2021-03-11 13:45+0000\n"
"Last-Translator: Ana Suárez <ana.suarez@qubiq.es>\n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: account_invoice_date_due
#: model:res.groups,name:account_invoice_date_due.allow_to_change_due_date
msgid "Allow to change due date"
msgstr "Permitir actualizar la fecha de vencimiento"
#. module: account_invoice_date_due
#: model_terms:ir.ui.view,arch_db:account_invoice_date_due.wizard_set_due_date
msgid "Cancel"
msgstr "Cancelar"
#. module: account_invoice_date_due
#: model:ir.actions.act_window,name:account_invoice_date_due.action_show_wizard_set_due_date
msgid "Change due date"
msgstr "Cambiar fecha de vencimiento"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_invoice_set_due_date__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_invoice_set_due_date__create_date
msgid "Created on"
msgstr "Creado el"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_invoice_set_due_date__display_name
msgid "Display Name"
msgstr "Nombre mostrado"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_invoice_set_due_date__id
msgid "ID"
msgstr "ID"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_invoice_set_due_date____last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_invoice_set_due_date__write_uid
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_invoice_set_due_date__write_date
msgid "Last Updated on"
msgstr "Última actualización el"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_invoice_set_due_date__date_due
msgid "New Due Date"
msgstr "Nueva Fecha de Vencimiento"
#. module: account_invoice_date_due
#: model:ir.model.fields,help:account_invoice_date_due.field_account_invoice_set_due_date__date_due
msgid "New date to be set to the invoice's due date."
msgstr "Nueva fecha a establecer para la fecha de vencimiento de la factura."
#. module: account_invoice_date_due
#: model_terms:ir.ui.view,arch_db:account_invoice_date_due.wizard_set_due_date
msgid "Set Due Date"
msgstr "Colocar Fecha de Vencimiento"
#. module: account_invoice_date_due
#: model_terms:ir.ui.view,arch_db:account_invoice_date_due.wizard_set_due_date
msgid "Set a new due date on selected invoices."
msgstr "Colocar una nueva fecha de vencimiento a las facturas seleccionadas."
#. module: account_invoice_date_due
#: model:ir.model,name:account_invoice_date_due.model_account_invoice_set_due_date
msgid "Wizard to set due date"
msgstr "Asistente para configurar nueva fecha de vencimiento"

View File

@@ -0,0 +1,54 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_date_due
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-07-16 17:49+0000\n"
"Last-Translator: Yves Le Doeuff <yld@alliasys.fr>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: account_invoice_date_due
#: model:res.groups,name:account_invoice_date_due.allow_to_change_due_date
msgid "Allow to change due date"
msgstr "Autoriser le changement de date d'échéance"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move__display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: account_invoice_date_due
#: model_terms:ir.ui.view,arch_db:account_invoice_date_due.view_move_form
msgid "Due Date"
msgstr "Date d'échéance"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_bank_statement_line__invoice_date_due_payment_term
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move__invoice_date_due_payment_term
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_payment__invoice_date_due_payment_term
msgid "Due Date Payment Term"
msgstr "Date d'échéance des conditions de paiement"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move__id
msgid "ID"
msgstr ""
#. module: account_invoice_date_due
#: model:ir.model,name:account_invoice_date_due.model_account_move
msgid "Journal Entry"
msgstr "Ecriture"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move____last_update
msgid "Last Modified on"
msgstr "Dernière modification"

View File

@@ -0,0 +1,61 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_date_due
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-04-15 17:46+0000\n"
"Last-Translator: Yves Le Doeuff <yld@alliasys.fr>\n"
"Language-Team: none\n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: account_invoice_date_due
#: model:res.groups,name:account_invoice_date_due.allow_to_change_due_date
msgid "Allow to change due date"
msgstr "Autoriser le changement de date d'échéance"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move__display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: account_invoice_date_due
#: model_terms:ir.ui.view,arch_db:account_invoice_date_due.view_move_form
msgid "Due Date"
msgstr "Date d'échéance"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_bank_statement_line__invoice_date_due_payment_term
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move__invoice_date_due_payment_term
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_payment__invoice_date_due_payment_term
msgid "Due Date Payment Term"
msgstr "Date d'échéance des conditions de paiement"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move__id
msgid "ID"
msgstr ""
#. module: account_invoice_date_due
#: model:ir.model,name:account_invoice_date_due.model_account_move
msgid "Journal Entry"
msgstr "Ecriture"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move____last_update
msgid "Last Modified on"
msgstr "Dernière modification"
#. module: account_invoice_date_due
#. odoo-python
#: code:addons/account_invoice_date_due/models/account_move.py:0
#, python-format
msgid "You are not allowed to change the due date."
msgstr "Vous n'êtes pas autorisé à modifier la date d'échéance."

View File

@@ -0,0 +1,49 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_invoice_date_due
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-24 10:06+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.10.2\n"
#. module: account_invoice_date_due
#: model:res.groups,name:account_invoice_date_due.allow_to_change_due_date
msgid "Allow to change due date"
msgstr "Consenti modifica scadenza"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_bank_statement_line__invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move__invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_payment__invoice_date_due
#: model_terms:ir.ui.view,arch_db:account_invoice_date_due.view_move_form
msgid "Due Date"
msgstr "Scadenza"
#. module: account_invoice_date_due
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_bank_statement_line__invoice_date_due_payment_term
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_move__invoice_date_due_payment_term
#: model:ir.model.fields,field_description:account_invoice_date_due.field_account_payment__invoice_date_due_payment_term
msgid "Due Date Payment Term"
msgstr "Scadenza termine pagamento"
#. module: account_invoice_date_due
#: model:ir.model,name:account_invoice_date_due.model_account_move
msgid "Journal Entry"
msgstr "Registrazione contabile"
#. module: account_invoice_date_due
#. odoo-python
#: code:addons/account_invoice_date_due/models/account_move.py:0
#, python-format
msgid "You are not allowed to change the due date."
msgstr "Non si è abilitati alla modifica della scadenza."

View File

@@ -0,0 +1,3 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import account_move

View File

@@ -0,0 +1,47 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, fields, models
from odoo.exceptions import UserError
class AccountMove(models.Model):
_inherit = "account.move"
# Show invoice date due even when payment term is defined
invoice_date_due_payment_term = fields.Date(
related="invoice_date_due", string="Due Date Payment Term"
)
invoice_date_due = fields.Date(
string="Due Date",
compute="_compute_invoice_date_due",
inverse="_inverse_invoice_date_due",
)
def _inverse_invoice_date_due(self):
for invoice in self:
if invoice.state == "posted":
if not self.env.user.has_group(
"account_invoice_date_due.allow_to_change_due_date"
):
raise UserError(
self.env._("You are not allowed to change the due date.")
)
@api.onchange("invoice_date_due_payment_term")
def _onchange_invoice_date_due_payment_term(self):
"""Propagate from Payment term due date to original field"""
if self.invoice_date_due_payment_term:
self.invoice_date_due = self.invoice_date_due_payment_term
def write(self, vals):
res = super().write(vals)
# Propagate due date to move lines
# that correspond to the receivable/payable account
posted_moves = self.filtered(lambda x: x.state == "posted")
if "invoice_date_due" in vals and posted_moves:
payment_term_lines = posted_moves.line_ids.filtered(
lambda line: line.account_id.account_type
in ("asset_receivable", "liability_payable")
)
payment_term_lines.write({"date_maturity": vals["invoice_date_due"]})
return res

View File

@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View File

@@ -0,0 +1,2 @@
To be able to edit this field, the user needs to have access to the
group `Allow to change due date`.

View File

@@ -0,0 +1,5 @@
- Luis González \<<lgonzalez@vauxoo.com>\>
- Luis Torres \<<luis_t@vauxoo.com>\>
- [Tecnativa](https://www.tecnativa.com):
- João Marques
- Juan Carlos Oñate

View File

@@ -0,0 +1,5 @@
This module sets the invoice's due date field as editable (Even if the
invoice state is done and a Payment Term is set).
When the field is edited, the invoice's due date is updated, along with
the related invoice lines.

View File

@@ -0,0 +1,13 @@
To edit the invoice's due date, we have several scenarios:
- A Payment Term is set. In this case, no extra field will be shown
while in draft, as the standard flow allows us to edit the Payment
Term directly, or delete it and set a due date manually. Once the
invoice is posted, a new field will be shown in the view above the
Payment Term, allowing the due date to be changed.
- No Payment Term is set, and the due date is set manually. In this
case, the due date is editable while in draft, as with the standard
Odoo flow. However, once posted, the field will remain editable.
(All the above are considering the user belongs to the security group
refered in "Configuration")

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="allow_to_change_due_date" model="res.groups">
<field name="name">Allow to change due date</field>
</record>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,463 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>README.rst</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document">
<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="update-invoice-s-due-date">
<h1>Update Invoices Due Date</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:773a3823f4faaeb482effe218b27b09dde0cd2b6139c28e14fa4c006d9ba5830
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/account-invoicing/tree/18.0/account_invoice_date_due"><img alt="OCA/account-invoicing" src="https://img.shields.io/badge/github-OCA%2Faccount--invoicing-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/account-invoicing-18-0/account-invoicing-18-0-account_invoice_date_due"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/account-invoicing&amp;target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module sets the invoices due date field as editable (Even if the
invoice state is done and a Payment Term is set).</p>
<p>When the field is edited, the invoices due date is updated, along with
the related invoice lines.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#configuration" id="toc-entry-1">Configuration</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="configuration">
<h2><a class="toc-backref" href="#toc-entry-1">Configuration</a></h2>
<p>To be able to edit this field, the user needs to have access to the
group <tt class="docutils literal">Allow to change due date</tt>.</p>
</div>
<div class="section" id="usage">
<h2><a class="toc-backref" href="#toc-entry-2">Usage</a></h2>
<p>To edit the invoices due date, we have several scenarios:</p>
<ul class="simple">
<li>A Payment Term is set. In this case, no extra field will be shown
while in draft, as the standard flow allows us to edit the Payment
Term directly, or delete it and set a due date manually. Once the
invoice is posted, a new field will be shown in the view above the
Payment Term, allowing the due date to be changed.</li>
<li>No Payment Term is set, and the due date is set manually. In this
case, the due date is editable while in draft, as with the standard
Odoo flow. However, once posted, the field will remain editable.</li>
</ul>
<p>(All the above are considering the user belongs to the security group
refered in “Configuration”)</p>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h2>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-invoicing/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/account-invoicing/issues/new?body=module:%20account_invoice_date_due%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h2><a class="toc-backref" href="#toc-entry-4">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-5">Authors</a></h3>
<ul class="simple">
<li>Vauxoo</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-6">Contributors</a></h3>
<ul class="simple">
<li>Luis González &lt;<a class="reference external" href="mailto:lgonzalez&#64;vauxoo.com">lgonzalez&#64;vauxoo.com</a>&gt;</li>
<li>Luis Torres &lt;<a class="reference external" href="mailto:luis_t&#64;vauxoo.com">luis_t&#64;vauxoo.com</a>&gt;</li>
<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
<li>João Marques</li>
<li>Juan Carlos Oñate</li>
</ul>
</li>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h3>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>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.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainers</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/luisg123v"><img alt="luisg123v" src="https://github.com/luisg123v.png?size=40px" /></a> <a class="reference external image-reference" href="https://github.com/CarlosRoca13"><img alt="CarlosRoca13" src="https://github.com/CarlosRoca13.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-invoicing/tree/18.0/account_invoice_date_due">OCA/account-invoicing</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,3 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import test_account_invoice_date_due

View File

@@ -0,0 +1,194 @@
# Copyright 2021 Tecnativa - João Marques
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from datetime import datetime, timedelta
from odoo import fields
from odoo.exceptions import UserError
from odoo.tests import Form
from odoo.addons.base.tests.common import BaseCommon
class TestAccountInvoiceDateDue(BaseCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
group = cls.env.ref("account_invoice_date_due.allow_to_change_due_date")
acc_group = cls.env.ref("account.group_account_manager")
# Loose dependency on stock to avoid perm issues.
# We don't really care about such permissions in this context!
# Eg:
# odoo.exceptions.AccessError:
# You are not allowed to access 'Stock Valuation Layer'
# (stock.valuation.layer) records.
stock_group = (
cls.env.ref("stock.group_stock_manager", False) or cls.env["res.groups"]
)
cls.user_w_access = cls.env["res.users"].create(
{
"name": "Test User w/ access",
"login": "user_w_access",
"email": "somebody@somewhere.com",
"groups_id": [(6, 0, (group + acc_group + stock_group).ids)],
}
)
# Create new user not allowed to change invoice due date
cls.user_wo_access = cls.env["res.users"].create(
{
"name": "Test User wo/ access",
"login": "user_wo_access",
"groups_id": [(6, 0, (acc_group + stock_group).ids)],
}
)
cls.sale_journal = cls.env["account.journal"].search(
[("type", "=", "sale")], limit=1
)
move_form = Form(
cls.env["account.move"].with_context(
default_move_type="out_invoice",
default_journal_id=cls.sale_journal.id,
)
)
move_form.invoice_date = fields.Date.today()
move_form.partner_id = cls.env["res.partner"].create({"name": "test partner"})
with move_form.invoice_line_ids.new() as line_form:
line_form.name = "move test"
line_form.price_unit = 1000.0
with move_form.invoice_line_ids.new() as line_form:
line_form.name = "move test"
line_form.price_unit = -1000.0
cls.move = move_form.save()
def _compare_records(self, rec1, rec2, ignore=None):
diff_fields = []
for field in rec1:
if field in ignore:
continue
if rec1[field] != rec2[field]:
diff_fields.append(field)
return set(diff_fields)
def test_invoice_date_due_is_editable(self):
old_move_state = self.move.read()[0]
move_edit_form = Form(self.move.with_user(self.user_w_access))
ten_days_from_now = fields.Date.to_string(datetime.today() + timedelta(days=10))
move_edit_form.invoice_date_due = ten_days_from_now
self.move = move_edit_form.save()
# Read all fields as sudo to get them independently of the user.
# Other modules can add security groups in account.move fields
self.assertEqual(
self._compare_records(
old_move_state,
self.move.sudo().read()[0],
ignore={
"write_uid",
"message_is_follower",
"needed_terms",
"is_manually_modified",
},
),
# Assert only this field is changed
{"invoice_date_due_payment_term", "invoice_date_due"},
)
self.assertEqual(
fields.Date.to_string(self.move.invoice_date_due), ten_days_from_now
)
# Post and should remain editable
self.move.action_post()
old_move_state = self.move.read()[0]
move_edit_form = Form(self.move.with_user(self.user_w_access))
twenty_days_from_now = fields.Date.to_string(
datetime.today() + timedelta(days=20)
)
move_edit_form.invoice_date_due = twenty_days_from_now
self.move = move_edit_form.save()
self.assertEqual(
fields.Date.to_string(self.move.invoice_date_due), twenty_days_from_now
)
# Check that the change has been propagated to the corresponding invoice line
self.assertEqual(
len(
self.move.line_ids.filtered(
lambda line: fields.Date.to_string(line.date_maturity)
== twenty_days_from_now
and line.account_id.account_type
in ("asset_receivable", "liability_payable")
)
),
1,
)
self.assertEqual(
self._compare_records(
old_move_state,
self.move.sudo().read()[0],
ignore={
"write_uid",
"message_is_follower",
"message_ids",
"needed_terms",
"hide_post_button",
},
),
# Assert only this field is changed
{"invoice_date_due_payment_term", "invoice_date_due"},
)
def test_invoice_date_due_is_editable_w_payment_term(self):
move_edit_form = Form(self.move.with_user(self.user_w_access))
move_edit_form.invoice_payment_term_id = self.env.ref(
"account.account_payment_term_15days"
)
self.move = move_edit_form.save()
# Post and should remain editable even w/ payment term
twenty_days_from_now = fields.Date.to_string(
datetime.today() + timedelta(days=20)
)
self.move.action_post()
old_move_state = self.move.read()[0]
move_edit_form = Form(self.move.with_user(self.user_w_access))
move_edit_form.invoice_date_due_payment_term = twenty_days_from_now
self.move = move_edit_form.save()
# Check that the change has been propagated to the corresponding invoice line
self.assertEqual(
len(
self.move.line_ids.filtered(
lambda line: fields.Date.to_string(line.date_maturity)
== twenty_days_from_now
and line.account_id.account_type
in ("asset_receivable", "liability_payable")
)
),
1,
)
self.assertEqual(
self._compare_records(
old_move_state,
self.move.sudo().read()[0],
ignore={"write_uid", "message_is_follower", "message_ids"},
),
# Assert only this field is changed
{"invoice_date_due_payment_term", "invoice_date_due"},
)
def test_invoice_date_due_is_not_editable_for_user_wo_access(self):
move_edit_form = Form(self.move.with_user(self.user_wo_access))
ten_days_from_now = fields.Date.to_string(datetime.today() + timedelta(days=10))
move_edit_form.invoice_date_due = ten_days_from_now
self.move = move_edit_form.save()
self.assertEqual(
fields.Date.to_string(self.move.invoice_date_due), ten_days_from_now
) # Should be editable while in draft
# Post and should not be editable for this user
self.move.action_post()
move_edit_form = Form(self.move.with_user(self.user_wo_access))
twenty_days_from_now = fields.Date.to_string(
datetime.today() + timedelta(days=20)
)
move_edit_form.invoice_date_due = twenty_days_from_now
with self.assertRaisesRegex(
UserError, "You are not allowed to change the due date."
):
move_edit_form.save()

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo>
<record id="view_move_form" model="ir.ui.view">
<field name="name">account.move.form</field>
<field name="model">account.move</field>
<field name="inherit_id" ref="account.view_move_form" />
<field name="arch" type="xml">
<field name="invoice_date" position="after">
<field
name="invoice_date_due_payment_term"
string="Due Date"
groups="account_invoice_date_due.allow_to_change_due_date"
readonly="state not in ['posted', 'draft']"
invisible="state == 'draft' or not invoice_payment_term_id"
/>
</field>
<field name="invoice_date_due" position="attributes">
<attribute
name="groups"
>!account_invoice_date_due.allow_to_change_due_date</attribute>
</field>
<field name="invoice_date_due" position="after">
<field
name="invoice_date_due"
groups="account_invoice_date_due.allow_to_change_due_date"
readonly="state not in ['posted', 'draft']"
invisible="invoice_payment_term_id"
/>
</field>
</field>
</record>
</odoo>