diff --git a/__manifest__.py b/__manifest__.py
index 1a7e0b92c5662de335b24f8c8c03793082f8c580..837f4a3ac45bde05c0cb2b1448a4a59f00322017 100755
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -15,6 +15,7 @@
         "security/security_rules.xml",
         "security/ir.model.access.csv",
         "views/res_config_settings.xml",
+        "views/scop_bordereau_cg.xml",
         "views/scop_cotisation_cg.xml",
         "views/union_regionale.xml",
     ]
diff --git a/models/__init__.py b/models/__init__.py
index b695ef99bc7a9e71bd0e13b39c0a2db297485dbb..acfb330ac3a306fb874954cfd949a61a302c7f06 100755
--- a/models/__init__.py
+++ b/models/__init__.py
@@ -4,5 +4,6 @@
 from . import account_invoice
 from . import res_company
 from . import res_config_settings
+from . import scop_bordereau_cg
 from . import scop_cotisation_cg
 from . import union_regionale
diff --git a/models/account_invoice.py b/models/account_invoice.py
index f2a96c84e5a7169f5c8e0b9b412525fadb240be8..39462f78ca576c8322dfec2a139ae413b048a002 100644
--- a/models/account_invoice.py
+++ b/models/account_invoice.py
@@ -10,4 +10,8 @@ class ScopAccountInvoiceCG(models.Model):
     cotisation_cg_id = fields.Many2one(
         comodel_name='scop.cotisation.cg',
         string='Base de cotisation CG Scop')
-
+    bordereau_id = fields.Many2one(
+        comodel_name='scop.bordereau',
+        string='Bordereau de rattachement',
+        required=False,
+        ondelete='cascade')
diff --git a/models/scop_bordereau_cg.py b/models/scop_bordereau_cg.py
new file mode 100644
index 0000000000000000000000000000000000000000..d3a3a43ee2a4a8c354a58b93af2bf74a1115485c
--- /dev/null
+++ b/models/scop_bordereau_cg.py
@@ -0,0 +1,48 @@
+# © 2021 Le Filament (<http://www.le-filament.com>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+from odoo import fields, models, api
+
+
+class Bordereau (models.Model):
+    _name = 'scop.bordereau'
+    _description = 'Bordereau des cotisations CG'
+
+    name = fields.Char(
+        string='Nom',
+        compute='_compute_name')
+
+    base_cotisation_cg = fields.Many2one(
+        comodel_name='scop.cotisation.cg',
+        string='Base de cotisation CG',
+        required=False,
+        ondelete='cascade')
+    partner_id = fields.Many2one(
+        comodel_name='res.partner',
+        string='',
+        required=False)
+    payment_term_id = fields.Many2one(
+        comodel_name='account.payment.term',
+        string="Conditions de paiement",
+        required=True
+    )
+
+    account_invoice_ids = fields.One2many(
+        comodel_name='account.invoice',
+        inverse_name='bordereau_id',
+        string='Cotisations',
+        required=False)
+
+    state = fields.Selection([
+            ('new', 'Brouillon'),
+            ('ongoing', 'Validé'),
+            ('end', 'Payé')],
+            string="Statut",
+            default='new',
+            store=True)
+
+    @api.multi
+    def _compute_name(self):
+        for bordereau in self:
+            bordereau.name = "Bordereau %s - %s" % (
+                bordereau.partner_id.name,
+                bordereau.base_cotisation_cg.year)
diff --git a/models/scop_cotisation_cg.py b/models/scop_cotisation_cg.py
index d4a96d913df7d4925932895588fbe06885c802e1..7afad1ca2788a8a8c9d526bdfc1882ed7a5c965b 100644
--- a/models/scop_cotisation_cg.py
+++ b/models/scop_cotisation_cg.py
@@ -261,14 +261,19 @@ class ScopCotisation(models.Model):
         for member in members_to_invoice:
             liasse_id = self._get_liasse(member)
 
+            # Bordereau
+            bordereau_id = self.create_bordereau(member)
+
             # Invoice cotiz CG
             amount_cg = self.get_cotiz_cg(member, liasse_id)
             invoice_cotiz_cg = self.create_contribution(
                 product_cg, member, liasse_id, amount_cg)
             invoice_cotiz_cg.write({
                 'type_contribution_id': type_cotisation_cg.id,
-                'cotisation_cg_id': self.id
+                'cotisation_cg_id': self.id,
+                'bordereau_id': bordereau_id.id
             })
+
             # Invoice cotiz Fede
             if member.is_federation_com:
                 amount_fede = self.get_cotiz_fede(member, liasse_id)
@@ -276,7 +281,8 @@ class ScopCotisation(models.Model):
                     product_fede, member, liasse_id, amount_fede)
                 invoice_cotiz_fede.write({
                     'type_contribution_id': type_cotisation_fede.id,
-                    'cotisation_cg_id': self.id
+                    'cotisation_cg_id': self.id,
+                    'bordereau_id': bordereau_id.id
                 })
 
             # Invoice cotiz UR HDF
@@ -286,7 +292,8 @@ class ScopCotisation(models.Model):
                     product_hdf, member, liasse_id, amount_hdf)
                 invoice_cotiz_hdf.write({
                     'type_contribution_id': type_cotisation_ur.id,
-                    'cotisation_cg_id': self.id
+                    'cotisation_cg_id': self.id,
+                    'bordereau_id': bordereau_id.id
                 })
 
             # Invoice cotiz UR Med
@@ -296,7 +303,8 @@ class ScopCotisation(models.Model):
                     product_med, member, liasse_id, amount_med)
                 invoice_cotiz_med.write({
                     'type_contribution_id': type_cotisation_ur.id,
-                    'cotisation_cg_id': self.id
+                    'cotisation_cg_id': self.id,
+                    'bordereau_id': bordereau_id.id
                 })
 
         invoice_view = self.cotiz_view()
@@ -328,6 +336,25 @@ class ScopCotisation(models.Model):
             'target': 'current',
         }
 
+    def create_bordereau(self, member):
+        """
+        Création du bordereau de cotisations
+        :param member:
+        :return bordereau_id:
+        """
+        existing_bordereau = self.env['scop.bordereau'].search([
+            ('partner_id', '=', member.id)
+        ])
+        if not existing_bordereau:
+            bordereau = self.env['scop.bordereau'].create({
+                'partner_id': member.id,
+                'payment_term_id': self.payment_term_id.id,
+                'base_cotisation_cg': self.id,
+            })
+            return bordereau
+        else:
+            return existing_bordereau
+
     # ------------------------------------------------------
     # Global functions
     # ------------------------------------------------------
@@ -524,7 +551,8 @@ class ScopCotisation(models.Model):
 
         # Taux de sociétariat
         if partner.staff_ids:
-            staff_id = partner.staff_ids.sorted(key=lambda l: l.year)[-1]
+            staff_id = partner.staff_ids.sorted(
+                key=lambda l: l.effective_date)[-1]
             if staff_id.staff_count > 0:
                 societariat_rate =\
                     staff_id.staff_shareholder_count / staff_id.staff_count
diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv
index 3331cf3fb411860aadf156460bdc4a65510a2d9d..36996cc0cf79a2e5a9767ea4adc01eaee08221b6 100755
--- a/security/ir.model.access.csv
+++ b/security/ir.model.access.csv
@@ -1,3 +1,5 @@
 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
 access_scop_cotisation_cg,access_scop_cotisation_cg,model_scop_cotisation_cg,account.group_account_manager,1,1,1,0
 admin_access_scop_cotisation_cg,admin_access_scop_cotisation_cg,model_scop_cotisation_cg,cgscop_partner.group_cg_administrator,1,1,1,1
+access_scop_bordereau,access_scop_bordereau,model_scop_bordereau,account.group_account_manager,1,1,1,0
+admin_access_scop_bordereau,admin_access_scop_bordereau,model_scop_bordereau,cgscop_partner.group_cg_administrator,1,1,1,1
diff --git a/views/scop_bordereau_cg.xml b/views/scop_bordereau_cg.xml
new file mode 100644
index 0000000000000000000000000000000000000000..402abd348ce807aa9d1c1bf4ce1fffbb37a996f2
--- /dev/null
+++ b/views/scop_bordereau_cg.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2021 Le Filament
+     License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
+<odoo>
+    <data>
+
+        <record id="scop_bordereau_form_view" model="ir.ui.view">
+            <field name="name">scop.bordereau.form</field>
+            <field name="model">scop.bordereau</field>
+            <field name="arch" type="xml">
+                <form string="Bordereaux">
+                    <header>
+                        <field name="state" widget="statusbar" clickable="False"/>
+                    </header>
+                    <sheet>
+                        <div class="oe_title">
+                            <label for="name"/>
+                            <h1>
+                                <field name="name"
+                                       placeholder="Title"/>
+                            </h1>
+                        </div>
+                        <group>
+                            <group>
+                                <field name="partner_id"/>
+                                <field name="base_cotisation_cg"/>
+                            </group>
+                            <group>
+                                <field name="base_cotisation_cg"/>
+                                <field name="payment_term_id"/>
+                            </group>
+                            <group>
+                                <field name="account_invoice_ids"/>
+                            </group>
+                        </group>
+                    </sheet>
+                </form>
+            </field>
+        </record>
+
+        <record id="scop_bordereau_tree_view" model="ir.ui.view">
+            <field name="name">scop.bordereau.tree</field>
+            <field name="model">scop.bordereau</field>
+            <field name="arch" type="xml">
+                <tree string="Bordereaux">
+                    <field name="name"/>
+                    <field name="base_cotisation_cg"/>
+                </tree>
+            </field>
+        </record>
+
+        <!--        <record id="ModelName_search_view" model="ir.ui.view">-->
+        <!--            <field name="name">ProjectName.ModelName.search</field>-->
+        <!--            <field name="model">ProjectName.ModelName</field>-->
+        <!--            <field name="arch" type="xml">-->
+        <!--                <search string="ModelTitle">-->
+        <!--                    <group expand="1" string="Group By">-->
+        <!--                        <filter string="Example Field" name="example_field"-->
+        <!--                                domain="[]"-->
+        <!--                                context="{'group_by':'example_field'}"/>-->
+        <!--                    </group>-->
+        <!--                </search>-->
+        <!--            </field>-->
+        <!--        </record>-->
+
+        <record id="scop_bordereau_act_window" model="ir.actions.act_window">
+            <field name="name">Bodereaux</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">scop.bordereau</field>
+<!--            <field name="view_type">form</field>-->
+            <field name="view_mode">tree,form</field>
+        </record>
+
+        <menuitem name="Bordereaux" id="scop_bordereau_menu" parent="cgscop_cotisation.menu_scop_cotisation"
+                  action="scop_bordereau_act_window"/>
+
+    </data>
+</odoo>
\ No newline at end of file