From 4eb532b92acc2fd1c3b6b1dbd70aad37a94b15a1 Mon Sep 17 00:00:00 2001
From: jordan <jordan@le-filament.com>
Date: Mon, 13 Dec 2021 17:53:43 +0100
Subject: [PATCH] [update] remove and create invoices instead of update in
 bordereau

---
 models/scop_bordereau_cg.py                   | 129 +++++++-----------
 models/scop_cotisation_cg.py                  |  56 ++++----
 wizard/scop_bordereau_update_confirm.py       |   2 +-
 wizard/scop_bordereau_update_liasse_wizard.py |   5 +-
 4 files changed, 80 insertions(+), 112 deletions(-)

diff --git a/models/scop_bordereau_cg.py b/models/scop_bordereau_cg.py
index 39cfc31..69db362 100644
--- a/models/scop_bordereau_cg.py
+++ b/models/scop_bordereau_cg.py
@@ -440,25 +440,13 @@ class Bordereau(models.Model):
                 'context': ctx,
             }
 
-    @api.multi
-    def update_cotiz_and_lines(self):
-        for bordereau in self:
-            if bordereau.state == 'new':
-                bordereau.create_cotiz_and_lines()
-
     def update_bordereau_with_liasse(self):
         """
         Supprime ou ajoute les appels de cotisations en fonction du
         nombre de trimestres choisi et de la liasse
         :return:
         """
-        self.update_cotiz_and_lines()
-        for i in range(0, 4 - self.nb_quarter):
-            invoices_quarter_i = self.invoice_ids.filtered(
-                lambda inv: inv.cotiz_quarter == i + 1
-            )
-            if invoices_quarter_i:
-                invoices_quarter_i.unlink()
+        self.create_cotiz_and_lines()
 
     @api.multi
     def open_payment(self):
@@ -551,6 +539,7 @@ class Bordereau(models.Model):
             'version': self.version + 1,
             'date_regul': ongoing_version.date,
             'comment_regul': ongoing_version.comment,
+            'is_regul': True,
         })
         ongoing_version.write({
             'state': 'validated',
@@ -593,7 +582,14 @@ class Bordereau(models.Model):
     # ------------------------------------------------------
     # Global Functions
     # ------------------------------------------------------
-    def create_cotiz_and_lines(self, is_regul=False):
+    def create_cotiz_and_lines(self):
+        """
+        - Supprime les factures existantes si besoin
+        - Crée les appels de cotisation par trimestre
+        """
+
+        if self.invoice_ids:
+            self.invoice_ids.unlink()
 
         partner = self.partner_id
         liasse = self.liasse_fiscale_id
@@ -611,7 +607,8 @@ class Bordereau(models.Model):
             amount_cg = self.env['scop.liasse.fiscale']. \
                 get_values_for_cotiz_cg(partner)['plancher1']
         self.create_contribution(
-            product_cg_id, type_cotisation_cg, amount_cg, is_regul=is_regul)
+            product_cg_id, type_cotisation_cg, amount_cg
+        )
         self.env.cr.commit()
 
         # Invoice UR et Fédé
@@ -634,7 +631,8 @@ class Bordereau(models.Model):
                     get_plancher_cotiz()['fede_com']
             self.create_contribution(
                 product_fede_com_id, type_cotisation_fede_com, amount_fede_com,
-                journal_ur_or_fede, account_id, is_regul=is_regul)
+                journal_ur_or_fede, account_id
+            )
             self.env.cr.commit()
 
         # Invoice cotiz Fede CAE
@@ -653,7 +651,7 @@ class Bordereau(models.Model):
                     get_plancher_cotiz()['fede_cae']
             self.create_contribution(
                 product_fede_cae_id, type_cotisation_fede_cae, amount_fede_cae,
-                journal_ur_or_fede, account_id, is_regul=is_regul
+                journal_ur_or_fede, account_id
             )
             self.env.cr.commit()
 
@@ -672,7 +670,7 @@ class Bordereau(models.Model):
                     get_plancher_cotiz()['ur_hdf']
             self.create_contribution(
                 product_hdf_id, type_cotisation_ur, amount_hdf,
-                journal_ur_or_fede, account_id, is_regul=is_regul
+                journal_ur_or_fede, account_id
             )
             self.env.cr.commit()
 
@@ -691,24 +689,21 @@ class Bordereau(models.Model):
                     get_plancher_cotiz()['ur_med']
             self.create_contribution(
                 product_med_id, type_cotisation_ur, amount_med,
-                journal_ur_or_fede, account_id, is_regul=is_regul)
+                journal_ur_or_fede, account_id
+            )
             self.env.cr.commit()
 
     def create_contribution(
             self, product, type_contribution, amount=0,
-            journal_id=False, account_id=False, type_invoice='out_invoice',
-            is_regul=False):
+            journal_id=False, account_id=False, type_invoice='out_invoice'):
         """
         Create invoice from Contribution Base
         :param product: product_id
-        :param partner: partner_id
         :param type_contribution: type_contribution (CG, UR, Fédé)
-        :param liasse: liasse_fiscale_id (reference)
         :param amount: contribution amount (float)
         :param journal_id: journal
         :param account_id: customer_account_id
         :param type_invoice: invoice or refund
-        :param is_regul: used for CG Scop regul
         :return: invoice
         """
         Invoice = self.env['account.invoice']
@@ -728,49 +723,30 @@ class Bordereau(models.Model):
 
         for i in range(1, self.nb_quarter + 1):
             cotiz_quarter = (4 - self.nb_quarter) + i
-            domain = [('partner_id', '=', partner.id),
-                      ('year', '=', self.year),
-                      ('type_contribution_id', '=', type_contribution),
-                      ('bordereau_id', '=', self.id),
-                      ('cotiz_quarter', '=', cotiz_quarter)]
-
-            existing_invoice = Invoice.search(domain)
-
-            if not existing_invoice or is_regul:
-                journal_id = self.company_id.contribution_journal_id \
-                    if not journal_id else journal_id
-                account_id = partner.property_account_receivable_id \
-                    if not account_id else account_id
-                member_invoice = Invoice.create({
-                    'partner_id': partner.id,
-                    'liasse_fiscale_id': liasse.id,
-                    'type': type_invoice,
-                    'year': self.year,
-                    'is_contribution': True,
-                    'type_contribution_id': type_contribution,
-                    'journal_id': journal_id.id,
-                    'state': 'draft',
-                    'account_id': account_id.id,
-                    'payment_mode_id': partner.customer_payment_mode_id.id,
-                    'date_invoice': self.date_cotisation,
-                    'date_due': quarters[cotiz_quarter - 1],
-                    'bordereau_id': self.id,
-                    'amount_cg_calculated': amount,
-                    'cotiz_quarter': cotiz_quarter,
-                })
-            else:
-                member_invoice = existing_invoice
-                member_invoice.write({
-                    'liasse_fiscale_id': liasse.id,
-                    'amount_cg_calculated': amount,
-                    'cotiz_quarter': cotiz_quarter,
-                })
 
-            # Création de la ligne CG Scop
-            exisiting_invoice_line_ids = InvoiceLine.search([
-                ('invoice_id', '=', member_invoice.id),
-                ('product_id', '=', product.id)
-            ])
+            journal_id = self.company_id.contribution_journal_id \
+                if not journal_id else journal_id
+            account_id = partner.property_account_receivable_id \
+                if not account_id else account_id
+            member_invoice = Invoice.create({
+                'partner_id': partner.id,
+                'liasse_fiscale_id': liasse.id,
+                'type': type_invoice,
+                'year': self.year,
+                'is_contribution': True,
+                'type_contribution_id': type_contribution,
+                'journal_id': journal_id.id,
+                'state': 'draft',
+                'account_id': account_id.id,
+                'payment_mode_id': partner.customer_payment_mode_id.id,
+                'date_invoice': self.date_cotisation,
+                'date_due': quarters[cotiz_quarter - 1],
+                'bordereau_id': self.id,
+                'amount_cg_calculated': amount,
+                'cotiz_quarter': cotiz_quarter,
+            })
+
+            # Création de la ligne de cotisation
             price_unit = amount / 4
 
             # TODO: Specific CAE calculation : to be deleted when 2022 is generated
@@ -781,19 +757,14 @@ class Bordereau(models.Model):
                     price_unit = (amount - 25) / 3
             # ... End specific CAE 2022
 
-            if not exisiting_invoice_line_ids or is_regul:
-                InvoiceLine.create({
-                    'invoice_id': member_invoice.id,
-                    'product_id': product.id,
-                    'account_id': product.property_account_income_id.id,
-                    'invoice_line_tax_ids': [(6, 0, product.taxes_id.ids)],
-                    'name': product.name + " T" + str(cotiz_quarter),
-                    'price_unit': price_unit
-                })
-            else:
-                exisiting_invoice_line_ids[0].write({
-                    'price_unit': price_unit
-                })
+            InvoiceLine.create({
+                'invoice_id': member_invoice.id,
+                'product_id': product.id,
+                'account_id': product.property_account_income_id.id,
+                'invoice_line_tax_ids': [(6, 0, product.taxes_id.ids)],
+                'name': product.name + " T" + str(cotiz_quarter),
+                'price_unit': price_unit
+            })
 
     def check_ongoing_version(self):
         """
diff --git a/models/scop_cotisation_cg.py b/models/scop_cotisation_cg.py
index 266efce..15fe11b 100644
--- a/models/scop_cotisation_cg.py
+++ b/models/scop_cotisation_cg.py
@@ -320,8 +320,7 @@ class ScopCotisation(models.Model):
             'target': 'current',
         }
 
-    def create_bordereau(
-            self, member, nb_quarter, liasse=None, date=False, is_regul=False):
+    def create_bordereau(self, member, nb_quarter, liasse=None, date=False):
         """
         Création du bordereau de cotisations
         :param member:
@@ -330,35 +329,30 @@ class ScopCotisation(models.Model):
         :param date:
         :return bordereau_id:
         """
-        bordereau = self.env['scop.bordereau'].search([
-            ('partner_id', '=', member.id),
-            ('year', '=', self.year),
-        ])
-        if not bordereau or is_regul:
-            # Variables to calculate cotiz
-            staff_id = self.get_last_staff_id(member)
-            if staff_id:
-                staff_shareholder_count = staff_id.staff_shareholder_count
-                staff_count = staff_id.staff_count
-                staff_average = staff_id.staff_average
-            else:
-                staff_shareholder_count = 0
-                staff_count = 0
-                staff_average = 0
-            date_invoice = date if date else self.date_cotisation
-
-            bordereau = self.env['scop.bordereau'].create({
-                'partner_id': member.id,
-                'payment_mode_id': member.customer_payment_mode_id.id,
-                'base_cotisation_cg': self.id,
-                'liasse_fiscale_id': liasse.id if liasse else None,
-                'year_liasse': liasse.year if liasse else 0,
-                'date_cotisation': date_invoice,
-                'nb_quarter': nb_quarter,
-                'staff_count': staff_count,
-                'staff_shareholder_count': staff_shareholder_count,
-                'staff_average': staff_average,
-            })
+        # Variables to calculate cotiz
+        staff_id = self.get_last_staff_id(member)
+        if staff_id:
+            staff_shareholder_count = staff_id.staff_shareholder_count
+            staff_count = staff_id.staff_count
+            staff_average = staff_id.staff_average
+        else:
+            staff_shareholder_count = 0
+            staff_count = 0
+            staff_average = 0
+        date_invoice = date if date else self.date_cotisation
+
+        bordereau = self.env['scop.bordereau'].create({
+            'partner_id': member.id,
+            'payment_mode_id': member.customer_payment_mode_id.id,
+            'base_cotisation_cg': self.id,
+            'liasse_fiscale_id': liasse.id if liasse else None,
+            'year_liasse': liasse.year if liasse else 0,
+            'date_cotisation': date_invoice,
+            'nb_quarter': nb_quarter,
+            'staff_count': staff_count,
+            'staff_shareholder_count': staff_shareholder_count,
+            'staff_average': staff_average,
+        })
         bordereau.create_cotiz_and_lines()
         return bordereau.id
 
diff --git a/wizard/scop_bordereau_update_confirm.py b/wizard/scop_bordereau_update_confirm.py
index 0779da1..d14e35b 100644
--- a/wizard/scop_bordereau_update_confirm.py
+++ b/wizard/scop_bordereau_update_confirm.py
@@ -22,5 +22,5 @@ class ScopBordereauUpdate(models.TransientModel):
             if record.state != 'new':
                 raise UserError(_("Impossible de mettre à jour un bordereau "
                                   "qui n'est pas à l'état de brouillon"))
-            record.update_cotiz_and_lines()
+            record.create_cotiz_and_lines()
         return {'type': 'ir.actions.act_window_close'}
diff --git a/wizard/scop_bordereau_update_liasse_wizard.py b/wizard/scop_bordereau_update_liasse_wizard.py
index ec2fce1..be934a3 100644
--- a/wizard/scop_bordereau_update_liasse_wizard.py
+++ b/wizard/scop_bordereau_update_liasse_wizard.py
@@ -2,6 +2,7 @@
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
 
 from odoo import fields, models, api
+from odoo.exceptions import UserError
 
 
 class ScopBordereauChangeLiasse(models.TransientModel):
@@ -145,9 +146,11 @@ class ScopBordereauChangeLiasse(models.TransientModel):
     # ------------------------------------------------------
     def update_liasse_fiscale(self):
         bordereau_id = self.bordereau_id
+        if not self.liasse_fiscale_new_id:
+            raise UserError('Merci de choisir une nouvelle liasse fiscale.')
         # Link new liasse fiscale to bordereau
         bordereau_id.update({
             'liasse_fiscale_id': self.liasse_fiscale_new_id,
         })
-        bordereau_id.update_cotiz_and_lines()
+        bordereau_id.create_cotiz_and_lines()
         return {'type': 'ir.actions.act_window_close'}
-- 
GitLab