diff --git a/__manifest__.py b/__manifest__.py
index 2dc5e4a2a1eee070489c02b372b4b678916401a6..6f9b93b3b7d432091beb569b2edeb08f7c4dbad6 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -9,6 +9,7 @@
     "installable": True,
     "depends": [
         "cgscop_partner",
+        "cgscop_cotisation",
         "multi_company_menu",
     ],
     "data": [
diff --git a/report/__init__.py b/report/__init__.py
index 8c22d988445f27931957c835d2c9de28eed45521..cf825a9ca3cbdccc94e7818788d5dc2a74ab1847 100755
--- a/report/__init__.py
+++ b/report/__init__.py
@@ -2,3 +2,4 @@
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
 from . import account_invoice_all
+from . import scop_contribution_report
diff --git a/report/account_invoice_all.py b/report/account_invoice_all.py
index 27aa6ca5eda574a6e12a504cef371eb2b893c8ce..f025fb73b38de0cd98b46228e9b67a225ed2dae9 100644
--- a/report/account_invoice_all.py
+++ b/report/account_invoice_all.py
@@ -1,18 +1,20 @@
 # © 2022 Le Filament (<http://www.le-filament.com>)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
-from odoo import models
+from odoo import models, api
 
 
 class ScopAccountInvoiceIDFReport(models.Model):
     _inherit = "account.invoice.all"
 
-    def _select(self):
-        select_str = super(ScopAccountInvoiceIDFReport, self)._select()
+    # ------------------------------------------------------
+    # Query
+    # ------------------------------------------------------
+    def _subquery(self):
+        select_str = super(ScopAccountInvoiceIDFReport, self)._subquery()
         select_str += """
                 UNION ALL (
                 SELECT
-                    id,
                     null as invoice_id,
                     writing_date as date_invoice,
                     writing_date as date_due,
@@ -36,3 +38,35 @@ class ScopAccountInvoiceIDFReport(models.Model):
                 )
         """
         return select_str
+
+    # ------------------------------------------------------
+    # Computed fields
+    # ------------------------------------------------------
+    @api.multi
+    def _compute_lines(self):
+        for inv in self:
+            ur_idf_id = self.env.ref('cgscop_partner.riga_14231')
+            if not inv.invoice_id and inv.partner_id.ur_id == ur_idf_id:
+                invoice_idf_id = self.env['scop.invoice.idf'].sudo().search([
+                    ('partner_id', '=', inv.partner_id.id),
+                    ('writing_date', '=', inv.date_invoice),
+                    ('acc_doc', '=', inv.number),
+                    ('type', '=', 'inv'),
+                ])
+                if len(invoice_idf_id) == 1:
+                    inv.lines = "<table class='table table-hover table-striped table-sm'>" \
+                                "<thead class='thead-light'><tr><th>Description</th><th>Quantité</th><th>P.U</th>" \
+                                "<th>Total HT</th><th>Total TTC</th></tr></thead><tbody>" + \
+                                ''.join(
+                                    invoice_idf_id.mapped(
+                                        lambda l: ("<tr><td>" + l.name.replace(
+                                            '\n', '<br/>') + "</td>" +
+                                                   "<td></td>" +
+                                                   "<td>" + str(
+                                                    l.debit) + "</td>" +
+                                                   "<td>" + str(
+                                                    l.debit) + "</td>" +
+                                                   "<td>" + str(
+                                                    l.debit) + "</td></tr>"))) + "</tbody></table>"
+            if not inv.lines:
+                super(ScopAccountInvoiceIDFReport, inv)._compute_lines()
diff --git a/report/scop_contribution_report.py b/report/scop_contribution_report.py
new file mode 100644
index 0000000000000000000000000000000000000000..4075c0e547defa08639a436fd2ab914d30eb83c8
--- /dev/null
+++ b/report/scop_contribution_report.py
@@ -0,0 +1,61 @@
+# © 2022 Le Filament (<http://www.le-filament.com>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import models, fields
+
+
+class ScopContributionReport(models.Model):
+    _inherit = "scop.contribution.report"
+
+    source = fields.Selection(
+        selection_add=[
+            ('idf', 'IDF')])
+
+    # ------------------------------------------------------
+    # Query
+    # ------------------------------------------------------
+    def _subquery(self):
+        contribution_ur_id = self.env.ref('cgscop_partner.riga_14399').id
+        query = super(ScopContributionReport, self)._subquery()
+        query += """
+            UNION ALL (
+                SELECT
+                    'idf' as source,
+                    year,
+                    %s as type_contribution_id,
+                    partner_id,
+                    debit AS amount_called,
+                    debit - amount_residual AS amount_paid,
+                    amount_residual AS amount_due
+                FROM
+                    scop_cotisation_idf
+                WHERE
+                    type = 'inv'
+                )
+        """ % contribution_ur_id
+        return query
+
+    # ------------------------------------------------------
+    # Business functions
+    # ------------------------------------------------------
+    def _get_payment(self):
+        self.ensure_one()
+        if self.source == 'idf':
+            payment_ids = self.env['scop.cotisation.idf'].sudo().search([
+                ('year', '=', self.year),
+                ('partner_id', '=', self.partner_id.id),
+                ('type', '!=', 'inv'),
+            ])
+            if payment_ids:
+                payments = payment_ids.mapped(lambda p: {
+                    'date': p.writing_date,
+                    'name': p.name,
+                    'ref': p.piece,
+                    'credit': p.credit,
+                })
+                payments_html = self._get_html_table(payments)
+            else:
+                payments_html = "<p>Il n'y a pas de paiements associés à cette cotisation</p>"
+            return payments_html
+        else:
+            return super(ScopContributionReport, self)._get_payment()