diff --git a/models/account_invoice.py b/models/account_invoice.py
index 263076cab85c86691deca55bd2da207cb9438e89..f9cf02df769014f42e6d46efa98d1c4e5caad861 100755
--- a/models/account_invoice.py
+++ b/models/account_invoice.py
@@ -46,6 +46,9 @@ class ScopAccountInvoice(models.Model):
         related='partner_id.ur_id',
         store=True
     )
+    contribution_id = fields.Many2one(
+        comodel_name='scop.contribution',
+        string='Ligne de cotisation')
     nb_quarter = fields.Selection(
         string='Nombre de trimestres de cotisation',
         selection=[(1, '1'),
@@ -81,18 +84,6 @@ class ScopAccountInvoice(models.Model):
     # ------------------------------------------------------
     # Override Parent
     # ------------------------------------------------------
-    def get_last_maturity_date(self, months, account_move_line_ids):
-        """
-        Get the last maturity date from account_move_line
-        for a certain period (months = [])
-        :param months:
-        :param account_move_line_ids:
-        :return: last date_maturity
-        """
-        line_ids = account_move_line_ids.filtered(
-            lambda l: l.date_maturity.month in months)
-        return line_ids[-1].date_maturity if line_ids else None
-
     @api.multi
     def action_invoice_open(self):
         """
@@ -101,7 +92,7 @@ class ScopAccountInvoice(models.Model):
         """
         results = super(ScopAccountInvoice, self).action_invoice_open()
         for inv in self:
-            if inv.is_contribution and inv.type == 'out_invoice':
+            if inv.is_contribution:
                 inv.set_scop_contribution()
         return results
 
@@ -251,37 +242,39 @@ class ScopAccountInvoice(models.Model):
         """
         Création d'une ligne dans scop.contribution
         """
-        for inv in self:
-            if inv.is_contribution:
-                year = inv.year
-                account_type_receivable_ids = inv.env[
-                    'account.account'].search([
-                        ('user_type_id', '=', inv.env.ref(
-                            'account.data_account_type_receivable').id)
-                ]).mapped('id')
-                account_move_line_ids = inv.env['account.move.line'].search([
-                    ('invoice_id', '=', inv.id),
-                    ('account_id', 'in', account_type_receivable_ids)
-                ]).filtered(lambda l: l.date_maturity.year == year)
+        self.ensure_one()
+        if self.is_contribution:
+            year = self.year
+            # Get existing contribution for this year
+            contrib_id = self.env['scop.contribution'].search([
+                ('partner_id', '=', self.partner_id.id),
+                ('year', '=', year),
+                ('type_id', '=', self.type_contribution_id.id)
+            ])
 
-                inv.env['scop.contribution'].create({
-                    'partner_id': inv.partner_id.id,
-                    'type_id': inv.type_contribution_id.id,
-                    'year': inv.year,
+            # Create scop.contribution line if not exists
+            # for year, partner and type
+            if not contrib_id:
+                contrib_line = self.env['scop.contribution'].create({
+                    'partner_id': self.partner_id.id,
+                    'type_id': self.type_contribution_id.id,
+                    'year': self.year,
                     'calculation_date': fields.Datetime.now(),
-                    'amount_calculated': inv.amount_total,
-                    'amount_called': inv.amount_total,
-                    'spreading': inv.nb_quarter,
-                    'spreading': len(
-                        account_move_line_ids.mapped('date_maturity')),
-                    'quarter_1': inv.get_last_maturity_date(
-                        [1, 2, 3], account_move_line_ids),
-                    'quarter_2': inv.get_last_maturity_date(
-                        [4, 5, 6], account_move_line_ids),
-                    'quarter_3': inv.get_last_maturity_date(
-                        [7, 8, 9], account_move_line_ids),
-                    'quarter_4': inv.get_last_maturity_date(
-                        [10, 11, 12], account_move_line_ids),
-                    'invoice_id': inv.id,
+                    'amount_calculated': self.amount_total,
+                    'amount_called': self.amount_total,
+                    'spreading': self.nb_quarter,
+                    'invoice_id': self.id,
                 })
-        return True
+            else:
+                contrib_line = self.set_scop_contribution_hook(contrib_id)
+            self.contribution_id = contrib_line.id
+            return contrib_line
+        return False
+
+    def set_scop_contribution_hook(self, contrib_id):
+        """
+        Function that can be inherited if a contrib line already exists
+        :param contrib_id: scop.contribution line
+        :return: scop.contribution
+        """
+        return contrib_id
diff --git a/models/scop_contribution.py b/models/scop_contribution.py
index 1755bc8fcddc73b35f8b9f51e7f680058b06159a..8c192c05d4df2b05c63c0e48acb3631e2525738b 100644
--- a/models/scop_contribution.py
+++ b/models/scop_contribution.py
@@ -7,10 +7,15 @@ from odoo import models, fields, api
 class ScopContributions(models.Model):
     _inherit = "scop.contribution"
 
+    # TODO: remove after migration
     invoice_id = fields.Many2one(
         comodel_name='account.invoice',
         string='Facture liée',
         ondelete='cascade')
+    invoice_ids = fields.One2many(
+        comodel_name='account.invoice',
+        inverse_name='contribution_id',
+        string='Factures liées')
     amount_paid = fields.Float(
         compute='_compute_amount_paid', store=True)
     amount_remaining = fields.Float(
@@ -25,13 +30,14 @@ class ScopContributions(models.Model):
     @api.multi
     def _compute_amount_paid(self):
         for r in self:
-            r.amount_paid = r.invoice_id.amount_total - r.amount_remaining
+            r.amount_paid = r.amount_called - r.amount_remaining
 
-    @api.depends('invoice_id.residual')
+    @api.depends('invoice_ids', 'invoice_ids.residual_signed')
     @api.multi
     def _compute_amount_remaining_previous(self):
         for r in self:
-            r.amount_remaining = r.invoice_id.residual
+            r.amount_remaining = sum(
+                r.invoice_ids.mapped('residual_signed'))
 
     @api.multi
     def _compute_is_exempt(self):
@@ -54,8 +60,6 @@ class ScopContributions(models.Model):
             ('refund_invoice_id', '=', self.invoice_id.id),
             ('state', 'in', ['open', 'paid'])
         ])
-        print(refund_ids)
-        print(tree_id)
         return {
             'type': 'ir.actions.act_window',
             'name': 'Exonérations',
diff --git a/models/scop_cotisation.py b/models/scop_cotisation.py
index 0399544d84b53d90a2e631d651669c7d94c4b9ed..8165d9e3b2895e05fe22e1359a401a1a7c31a9d9 100644
--- a/models/scop_cotisation.py
+++ b/models/scop_cotisation.py
@@ -81,9 +81,24 @@ class ScopCotisation(models.AbstractModel):
     # ------------------------------------------------------
     # Global functions
     # ------------------------------------------------------
-    def create_contribution(self, product, partner, type_contribution,
-                            liasse=None, amount=0, date=False,
-                            journal_id=False, account_id=False):
+    def create_contribution(
+            self, product, partner, type_contribution, liasse=None, amount=0,
+            date=False, journal_id=False, account_id=False,
+            type_invoice='out_invoice', is_regul=False):
+        """
+        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 date: date invoice
+        :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']
         InvoiceLine = self.env['account.invoice.line']
 
@@ -92,7 +107,7 @@ class ScopCotisation(models.AbstractModel):
             ('year', '=', self.year),
             ('type_contribution_id', '=', type_contribution)
         ])
-        if not exisiting_invoice:
+        if not exisiting_invoice or is_regul:
             date_invoice = date if date else self.date_cotisation
             journal_id = self.company_id.contribution_journal_id \
                 if not journal_id else journal_id
@@ -101,7 +116,7 @@ class ScopCotisation(models.AbstractModel):
             member_invoice = Invoice.create({
                 'partner_id': partner.id,
                 'liasse_fiscale_id': liasse.id,
-                'type': 'out_invoice',
+                'type': type_invoice,
                 'year': self.year,
                 'is_contribution': True,
                 'type_contribution_id': type_contribution,
@@ -120,7 +135,7 @@ class ScopCotisation(models.AbstractModel):
             ('invoice_id', '=', member_invoice.id),
             ('product_id', '=', product.id)
         ])
-        if not exisiting_invoice_line_ids:
+        if not exisiting_invoice_line_ids or is_regul:
             InvoiceLine.create({
                 'invoice_id': member_invoice.id,
                 'product_id': product.id,