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