From 42982803ecfefd2f66abd5ae77b0c0b072f7971e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20-=20Le=20Filament?= <remi@le-filament.com>
Date: Tue, 4 Feb 2025 20:56:51 +0100
Subject: [PATCH 1/4] [ADD] simplify payment term

---
 __manifest__.py                         |  3 +-
 migrations/16.0.4.0.0/post-migration.py | 11 ++++++
 models/__init__.py                      |  9 ++---
 models/account_payment_term.py          | 38 ++++++++++++++++++++
 security/ir.model.access.csv            |  2 ++
 views/account_payment_term_views.xml    | 48 +++++++++++++++++++++++++
 views/menu_views.xml                    |  8 +++++
 7 files changed, 114 insertions(+), 5 deletions(-)
 create mode 100644 migrations/16.0.4.0.0/post-migration.py
 create mode 100644 models/account_payment_term.py
 create mode 100644 views/account_payment_term_views.xml

diff --git a/__manifest__.py b/__manifest__.py
index 01ae5bf..7802a49 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -3,7 +3,7 @@
     "summary": "Gestion de la facturation sur les opérations",
     "author": "Le Filament, Odoo SA",
     "website": "https://le-filament.com",
-    "version": "16.0.3.0.0",
+    "version": "16.0.4.0.0",
     "license": "AGPL-3",
     "depends": [
         "account_banking_sepa_direct_debit",
@@ -34,6 +34,7 @@
         "views/account_banking_mandate_views.xml",
         "views/account_move_views.xml",
         "views/account_payment_order_views.xml",
+        "views/account_payment_term_views.xml",
         "views/res_bank_views.xml",
         "views/res_company_views.xml",
         "views/res_config_settings_views.xml",
diff --git a/migrations/16.0.4.0.0/post-migration.py b/migrations/16.0.4.0.0/post-migration.py
new file mode 100644
index 0000000..27a1ed0
--- /dev/null
+++ b/migrations/16.0.4.0.0/post-migration.py
@@ -0,0 +1,11 @@
+# Copyright 2023- Le Filament (https://le-filament.com)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
+from openupgradelib import openupgrade
+
+
+@openupgrade.migrate()
+def migrate(env, version):
+    # Initialize account.payment.term days_offset field
+    for term in env["account.payment.term"].search([]):
+        balance_line = term.line_ids.filtered(lambda line: line.value == "balance")[0]
+        term.write({"days_offset": balance_line.months * 30 + balance_line.days})
diff --git a/models/__init__.py b/models/__init__.py
index d4805cc..00d5171 100644
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -1,13 +1,14 @@
 from . import account_move
 from . import account_move_line
+from . import account_payment_order
+from . import account_payment_term
+from . import acc_accise_category
 from . import acc_counter_period
 from . import acc_operation
+from . import acc_operation_role
 from . import acc_price_conf
 from . import base_document_layout
+from . import ir_actions_report
 from . import res_company
 from . import res_config_settings
-from . import ir_actions_report
 from . import res_partner
-from . import acc_operation_role
-from . import acc_accise_category
-from . import account_payment_order
diff --git a/models/account_payment_term.py b/models/account_payment_term.py
new file mode 100644
index 0000000..6a9824e
--- /dev/null
+++ b/models/account_payment_term.py
@@ -0,0 +1,38 @@
+from dateutil.relativedelta import relativedelta
+
+from odoo import fields, models
+
+
+class AccountPaymentTerm(models.Model):
+    _inherit = "account.payment.term"
+
+    days_offset = fields.Integer("Délai en jours")
+
+    def _compute_terms(
+        self,
+        date_ref,
+        currency,
+        company,
+        tax_amount,
+        tax_amount_currency,
+        sign,
+        untaxed_amount,
+        untaxed_amount_currency,
+        cash_rounding=None,
+    ):
+        """
+        Override default function in order to only calculate offset based on days_offset
+        """
+        return [
+            {
+                "date": fields.Date.from_string(date_ref)
+                + relativedelta(days=self.days_offset),
+                "has_discount": 0.0,
+                "discount_date": None,
+                "discount_amount_currency": 0.0,
+                "discount_balance": 0.0,
+                "discount_percentage": 0.0,
+                "foreign_amount": untaxed_amount_currency,
+                "company_amount": untaxed_amount,
+            }
+        ]
diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv
index 35eabf3..e707edc 100644
--- a/security/ir.model.access.csv
+++ b/security/ir.model.access.csv
@@ -12,3 +12,5 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
 "access_acc_account_journal_group_operation_admin_invoice","account_journal group_operation_admin_invoice","account.model_account_journal","oacc_account.group_operation_admin_invoice",1,0,0,0
 "access_acc_account_partial_reconcile_group_operation_admin_invoice","account_partial_reconcile group_operation_admin_invoice","account.model_account_partial_reconcile","oacc_account.group_operation_admin_invoice",1,0,0,0
 "base.access_res_bank_group_partner_manager","Full access on res.bank to Account Payment group","base.model_res_bank","account_payment_order.group_account_payment",1,0,0,0
+"access_acc_account_payment_term_group_operation_admin_invoice","account_payment_term group_operation_admin_invoice","account.model_account_payment_term","oacc_account.group_operation_admin_invoice",1,1,1,1
+"access_acc_account_payment_term_line_group_operation_admin_invoice","account_payment_term_line group_operation_admin_invoice","account.model_account_payment_term_line","oacc_account.group_operation_admin_invoice",0,0,1,1
diff --git a/views/account_payment_term_views.xml b/views/account_payment_term_views.xml
new file mode 100644
index 0000000..48321f3
--- /dev/null
+++ b/views/account_payment_term_views.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!--
+  Copyright 2024- Le Filament (https://le-filament.com)
+  License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+  -->
+<odoo>
+    <record id="account_payment_term_form_oacc_inherit" model="ir.ui.view">
+        <field name="name">account.payment.term.form.oacc</field>
+        <field name="model">account.payment.term</field>
+        <field name="inherit_id" ref="account.view_payment_term_form" />
+        <field name="priority" eval="101" />
+        <field name="arch" type="xml">
+            <field name="name" position="after">
+                <field name="days_offset" />
+            </field>
+            <xpath expr="//label[@for='display_on_invoice']" position="attributes">
+                <attribute name="invisible">1</attribute>
+            </xpath>
+            <field name="display_on_invoice" position="attributes">
+                <attribute name="invisible">1</attribute>
+            </field>
+            <xpath expr="//separator" position="attributes">
+                <attribute name="invisible">1</attribute>
+            </xpath>
+            <xpath expr="//p[hasclass('text-muted')]" position="attributes">
+                <attribute name="invisible">1</attribute>
+            </xpath>
+            <field name="line_ids" position="attributes">
+                <attribute name="invisible">1</attribute>
+            </field>
+            <xpath expr="//field[@name='example_invalid']/.." position="attributes">
+                <attribute name="invisible">1</attribute>
+            </xpath>
+        </field>
+    </record>
+    <record id="view_payment_term_tree_oacc_inherit" model="ir.ui.view">
+        <field name="name">account.payment.term.tree.oacc</field>
+        <field name="model">account.payment.term</field>
+        <field name="inherit_id" ref="account.view_payment_term_tree" />
+        <field name="priority" eval="101" />
+        <field name="arch" type="xml">
+            <field name="name" position="after">
+                <field name="days_offset" />
+            </field>
+        </field>
+    </record>
+</odoo>
diff --git a/views/menu_views.xml b/views/menu_views.xml
index 32454ad..4b3f37c 100644
--- a/views/menu_views.xml
+++ b/views/menu_views.xml
@@ -38,6 +38,14 @@
         name="Ordres de prélèvement"
     />
 
+    <!-- Menu Elocoop / Facturation / Conditions de paiement -->
+    <menuitem
+        parent="menu_acc_invoice"
+        id="menu_acc_invoicing_payment_term"
+        sequence="40"
+        name="Conditions de paiement"
+        action="account.action_payment_term_form"
+    />
 
     <!-- Menu Elocoop / Configuration / Facturation -->
     <menuitem
-- 
GitLab


From b26d725279e57c91b9d1b0812193cc2d1d897e02 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20-=20Le=20Filament?= <remi@le-filament.com>
Date: Wed, 5 Feb 2025 09:05:03 +0100
Subject: [PATCH 2/4] [ADD] display field on partner and force company

---
 migrations/16.0.4.0.0/post-migration.py | 4 +++-
 models/account_payment_term.py          | 5 ++++-
 views/account_payment_term_views.xml    | 3 +++
 views/res_partner_views.xml             | 9 +++++++++
 4 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/migrations/16.0.4.0.0/post-migration.py b/migrations/16.0.4.0.0/post-migration.py
index 27a1ed0..0314892 100644
--- a/migrations/16.0.4.0.0/post-migration.py
+++ b/migrations/16.0.4.0.0/post-migration.py
@@ -6,6 +6,8 @@ from openupgradelib import openupgrade
 @openupgrade.migrate()
 def migrate(env, version):
     # Initialize account.payment.term days_offset field
-    for term in env["account.payment.term"].search([]):
+    all_terms = env["account.payment.term"].search([])
+    all_terms.filtered(lambda term: not term.company_id).write({"active": False})
+    for term in all_terms:
         balance_line = term.line_ids.filtered(lambda line: line.value == "balance")[0]
         term.write({"days_offset": balance_line.months * 30 + balance_line.days})
diff --git a/models/account_payment_term.py b/models/account_payment_term.py
index 6a9824e..c8c92fb 100644
--- a/models/account_payment_term.py
+++ b/models/account_payment_term.py
@@ -6,7 +6,10 @@ from odoo import fields, models
 class AccountPaymentTerm(models.Model):
     _inherit = "account.payment.term"
 
-    days_offset = fields.Integer("Délai en jours")
+    # set default company instead of None
+    company_id = fields.Many2one("res.company", default=lambda self: self.env.company)
+
+    days_offset = fields.Integer("Délai de paiement (jours)")
 
     def _compute_terms(
         self,
diff --git a/views/account_payment_term_views.xml b/views/account_payment_term_views.xml
index 48321f3..2ba4b0e 100644
--- a/views/account_payment_term_views.xml
+++ b/views/account_payment_term_views.xml
@@ -14,6 +14,9 @@
             <field name="name" position="after">
                 <field name="days_offset" />
             </field>
+            <xpath expr="//field[@name='company_id']" position="attributes">
+                <attribute name="required">1</attribute>
+            </xpath>
             <xpath expr="//label[@for='display_on_invoice']" position="attributes">
                 <attribute name="invisible">1</attribute>
             </xpath>
diff --git a/views/res_partner_views.xml b/views/res_partner_views.xml
index 337dce9..6a75e24 100644
--- a/views/res_partner_views.xml
+++ b/views/res_partner_views.xml
@@ -194,6 +194,15 @@
                     name="groups"
                 >account.group_account_invoice,account.group_account_readonly</attribute>
             </xpath>
+            <!-- group_operation_admin_invoice autoriser la modification de la condition de paiement -->
+            <xpath
+                expr="//page[@name='sales_purchases']//group[@name='sale']//field[@name='property_payment_term_id']"
+                position="attributes"
+            >
+                <attribute
+                    name="groups"
+                >account.group_account_invoice,account.group_account_readonly,oacc_account.group_operation_admin_invoice</attribute>
+            </xpath>
             <xpath expr="//page[@name='accounting']" position="attributes">
                 <attribute
                     name="groups"
-- 
GitLab


From 32b3dfd6ec67fc2aec988d265dba43a83de4e323 Mon Sep 17 00:00:00 2001
From: Julien Ortet <julien@le-filament.com>
Date: Tue, 28 Jan 2025 15:10:44 +0100
Subject: [PATCH 3/4] [UPD] cancel payment order with super ID

---
 models/account_payment_order.py | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/models/account_payment_order.py b/models/account_payment_order.py
index 81d4a19..09a8a2d 100644
--- a/models/account_payment_order.py
+++ b/models/account_payment_order.py
@@ -12,3 +12,6 @@ class AccountPaymentOrder(models.Model):
         Re-generate the account payments.
         """
         return super(AccountPaymentOrder, self.with_user(SUPERUSER_ID)).draft2open()
+
+    def action_cancel(self):
+        return super(AccountPaymentOrder, self.with_user(SUPERUSER_ID)).action_cancel()
-- 
GitLab


From 834c70f717279316b7371ffa26cbed3defba2bcc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20-=20Le=20Filament?= <remi@le-filament.com>
Date: Thu, 6 Feb 2025 12:57:02 +0100
Subject: [PATCH 4/4] [FIX] add missing taxes

---
 models/account_payment_term.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/models/account_payment_term.py b/models/account_payment_term.py
index c8c92fb..ffa4c6d 100644
--- a/models/account_payment_term.py
+++ b/models/account_payment_term.py
@@ -35,7 +35,7 @@ class AccountPaymentTerm(models.Model):
                 "discount_amount_currency": 0.0,
                 "discount_balance": 0.0,
                 "discount_percentage": 0.0,
-                "foreign_amount": untaxed_amount_currency,
-                "company_amount": untaxed_amount,
+                "foreign_amount": untaxed_amount_currency + tax_amount_currency,
+                "company_amount": untaxed_amount + tax_amount,
             }
         ]
-- 
GitLab