diff --git a/models/scop_bordereau_cg.py b/models/scop_bordereau_cg.py index f7ea8b2ef8e7796454f22485009ec12205d21b97..0338a54542e39575b40c94ce2051c23be4162cae 100644 --- a/models/scop_bordereau_cg.py +++ b/models/scop_bordereau_cg.py @@ -1,5 +1,8 @@ # © 2021 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from datetime import datetime + from odoo import fields, models, api from odoo.exceptions import UserError @@ -161,6 +164,10 @@ class Bordereau(models.Model): wage_cg_retenu = fields.Float( string='Montant masse salariale retenu', track_visibility='onchange') + is_sdd = fields.Boolean( + 'Au prélèvement', + compute='compute_is_sdd', + search='_search_is_sdd') # Emails management recipient_ids = fields.One2many( @@ -231,6 +238,22 @@ class Bordereau(models.Model): else: bordereau.montant_assiette = bordereau.va_cg_retenu + @api.multi + def compute_is_sdd(self): + sdd_id = self.env.ref( + 'account_banking_sepa_direct_debit.sepa_direct_debit').id + for bdx in self: + if bdx.payment_mode_id and bdx.payment_mode_id.payment_method_id.id == sdd_id: + bdx.is_sdd = True + else: + bdx.is_sdd = False + + @api.multi + def _search_is_sdd(self, operator, value): + recs = self.search([]).filtered(lambda x: x.is_sdd is True) + if recs: + return [('id', 'in', [x.id for x in recs])] + # ------------------------------------------------------ # Button functions # ------------------------------------------------------ @@ -393,12 +416,33 @@ class Bordereau(models.Model): Use "compute" function from account.move :return: dict with date as key and amount (float) as value """ + MoveLine = self.env['account.move.line'] for bordereau in self: - totlines = bordereau.payment_term_id.with_context( - currency_id=self.base_cotisation_cg.company_currency_id.id). \ - compute(bordereau.amount_total_cotiz, - bordereau.date_cotisation)[0] - return totlines + inv_ids = bordereau.invoice_ids.ids + print(inv_ids) + schedule = MoveLine.read_group([ + ('invoice_id', 'in', inv_ids), + ('account_id.internal_type', '=', 'receivable')], + ['date_maturity', 'credit', 'debit'], + groupby=['date_maturity:day'], + orderby='date_maturity', + ) + schedule_plan = [ + { + 'date': datetime.strptime( + l['date_maturity:day'], '%d %b %Y').strftime('%d/%m/%Y'), + 'amount': l['debit'] - l['credit'] + } for l in schedule] + return schedule_plan + + def get_contribution_type(self): + """ + Get contribution by type + :return: dict type_contribution and amount + """ + return self.invoice_ids.mapped(lambda c: { + 'type_contribution': c.type_contribution_id.name, + 'amount': c.amount_total_signed}) # Email def get_recipients(self): diff --git a/report/report_scop_bordereau.xml b/report/report_scop_bordereau.xml index a4e1923b7d0e7d5ab8a8b9a27555d61ab9a52238..e0c8c7e57b626b65105354c465ae841498310063 100644 --- a/report/report_scop_bordereau.xml +++ b/report/report_scop_bordereau.xml @@ -4,90 +4,143 @@ <template id="report_bordereau_document"> <t t-call="web.external_layout"> - <div class="page"> - <h2> Appel de cotisation <span t-esc="o.year"/> </h2> - <div> - <p> - Paris, le <span t-esc="context_timestamp(datetime.datetime.now()).strftime('%d %B %Y')"/> - </p> - <p> - N° adhérent : <t t-esc="o.partner_id.member_number_int"/><br/> - Union régionale <t t-esc="o.partner_ur_id.name"/> - </p> + <div class="page" style="font-size: 14px;"> + <div class="row"> + <div class="col-12 text-center"> + <h2 style="color: #E5074D;"> + Appel de cotisation <span t-esc="str(o.year)"/> + </h2> + </div> </div> + <div class="row"> + <div class="col-12"> + <p> + Paris, le <span t-esc="o.date_cotisation.strftime('%d %B %Y')"/> + </p> + <p> + N° adhérent : <t t-esc="str(o.partner_id.member_number_int)"/><br/> + Union régionale : <span t-field="o.partner_ur_id.name"/><br/> + N° Bordereau : <span t-field="o.name"/> + </p> + </div> + </div> + <div class="row"> + <div class="col-5 offset-5 text-right mt16 mb32" style="font-siez: 16px;"> + <address t-field="o.partner_id" t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": True}' /> + </div> + </div> + <div class="row mb16"> + <div class="col-12" style="font-style: italic; test-align: justify;"> + Les cotisations sont calculées annuellement en début d’année sur la base du dernier exercice connu. Le versement se fait par quart tous les trimestres. Merci de retourner ce bordereau à la CG Scop avec le règlement correspondant + </div> + </div> + <div class="row"> + <div class="col-6" style="border: 1px solid #aaa;"> + <div></div> + <h5 class="mt8" style="font-weight: 600;">Cotisations annuelles</h5> + <p style="font-style: italic; font-size: 13px;"> + <t t-if="o.year_liasse_retenue">Calcul basé sur la liasse fiscale <span t-esc="str(o.year_liasse_retenue)" /><br/></t> + Assiette base <span t-field="o.type_assiette_retenu" /> : <span t-field="o.montant_assiette" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}" />. + </p> + <p> + <t t-set="amount_line" t-value="o.get_contribution_type()" /> + <table class="table table-sm" style="border: none;"> + <tr t-foreach="amount_line" t-as="line" style="border-bottom: 1px solid #ccc;"> + <td style="border: none; background: inherit; color: inherit;"><t t-esc="line.get('type_contribution')"/></td> + <td class="text-right" style="border: none; background: inherit; color: inherit;"><t t-esc="line.get('amount')" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/></td> + </tr> + </table> + </p> + <p> + <table class="table table-sm" style="border: none;"> + <tr style="border: none"> + <td style="border: none; background: inherit; color: inherit;"> + <strong>Total cotisation annuelle <t t-esc="str(o.year)"/>*</strong> + </td> + <td class="text-right" style="border: none; background: inherit; color: inherit;"> + <strong></strong><span t-field="o.amount_total_cotiz" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/></td> + </tr> + </table> + </p> + <t t-if="o.is_sdd"> + <h5 style="font-weight: 600;">Échéancier de prélèvement</h5> + </t> + <t t-else=""> + <h5 style="font-weight: 600;">Échéancier de paiement</h5> + </t> + <p> + <t t-set="schedule_line" t-value="o.get_bordereau_move_line()" /> + <table class="table table-sm table-striped" style="border: none;"> + <tr t-foreach="schedule_line" t-as="line" style="border-bottom: 1px solid #ccc;"> + <td style="border: none; background: inherit; color: inherit;"><t t-esc="line.get('date')"/></td> + <td class="text-right" style="border: none; background: inherit; color: inherit;"><t t-esc="line.get('amount')" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/></td> + </tr> + </table> + </p> + <p t-if="o.is_sdd" style="font-size: 13px; font-weight: bold;"> + Référence Unique du Mandat : + <t t-esc="o.invoice_ids[0].mandate_id.unique_mandate_reference" /> + </p> + <t t-if="not o.is_sdd"> + <p class="small"> + Si vous souhaitez régler vos prochaines cotisations par prélèvement,merci de compléter et de nous retourner le document « Mandat de prélèvements SEPA » (disponible sur notre site) à l'adresse <a href="mailto:les-scop@scop.coop">les-scop@scop.coop</a>, accompagné d’un Relevé d’identité bancaire + </p> + </t> - <t t-set="address"> - <address t-field="o.partner_id" t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": True}' /> - </t> + <p class="small"> + <em>* Inclus abonnement annuel à la Revue Participer au tarif préférentiel adhérent de 22 € TTC</em> + </p> + <p style="font-size: 13px;"> + <em>IBAN: FR76 4255 9100 0008 0024 8837 710 - BIC : CCOPFRPPXXX</em> + </p> + </div> - <div> - <p>Les cotisations sont calculées annuellement en début - d’année sur la base du dernier exercice connu. Le - versement se fait par quart tous les trimestres. - Merci de retourner ce bordereau à la CG Scop avec - le règlement correspondant.<br/> - L’Union Sociale reste indépendante, merci de renseigner - la partie basse de ce bulletin qui la concerne et - de lui envoyer le règlement correspondant avec le - bas du bordereau. - </p> + <div class="col-6" style="margin-top: 220px;"> + <div style="border: 1px solid #aaa; padding: 15px;"> + CG Scop <br/> + 30, rue des Epinettes <br/> + 75017 PARIS + </div> + </div> </div> - <div> - <h4>Cotisations annuelles <span t-esc="o.year"/></h4> - <t t-if="o.montant_assiette > 0"> - Calcul basé sur la dernière liasse fiscale connue : année <t t-esc="o.liasse_fiscale_id.year"/>. - &nbsp;Assiette base <span t-field="o.type_assiette"/> : - <t t-esc="o.montant_assiette" t-options='{"widget": "monetary", "display_currency": o.company_currency_id}'/> - </t> - <t t-else=""> - Pas de liasse fiscale connue pour le calcul - </t> - </div> + <div style="page-break-before: always; font-size: 12px;"> + <div class="row"> + <div class="col-12"> + <p> + <strong>COTISATION A LA CONFÉDÉRATION GÉNÉRALE DES SCOP</strong> + </p> + <p> + La cotisation est calculée selon la méthode la plus favorable entre trois pour mille du chiffre d’affaires et sept pour mille de la valeur ajoutée.<br/> + La valeur ajoutée retenue est celle de la liasse fiscale ou, si elle n’est pas connue, la valeur ajoutée telle que définie par la Banque de France :<br/> + <i>Valeur ajoutée = total des chiffres d’affaires nets(FL) et subventions d’exploitation(FO) + production stockée(FM) + production immobilisée(FN) - achat de marchandises(FS) - variation de stock marchandises(FT) - achat de matières premières et autres approvisionnements(FU) - variation de stock matières premières et approvisionnements(FV) - autres achats et charges externes(FW)(déduction faite du personnel extérieur et des loyers de crédit - bail) - impôts et taxes(FX).</i> + </p> + <p> + Le calcul de la cotisation est établi une fois par an en début d’année à partir des comptes de résultat du dernier exercice connu, ou du prévisionnel pour les nouveaux adhérents qui n’ont pas encore de compte de résultat.<br/> + La cotisation est appelée trimestriellement par quart.<br/> + Plancher annuel: 300 € pour les SCOP dont le chiffre d’affaires est inférieur à 100 000 €, 600 € pour les autres. + </p> - <div> - <table> - <t t-foreach="o.invoice_ids.sorted(key=lambda i: i.amount_total_signed, reverse=True)" t-as="cotiz"> - <tr> - <td> - <span t-field="cotiz.type_contribution_id.name"/> - </td> - <td> - <span t-field="cotiz.amount_total_signed"/> - </td> - </tr> - </t> - <tr> - <td> - Total cotisations annuelles <span t-esc="o.year"/> - </td> - <td> - <span t-field="o.amount_total_cotiz"/>* - </td> - </tr> - </table> - * Inclus abonnement annuel à la Revue Participer au tarif préférentiel adhérent de 22 € TTC + <p class="mt64"> + <strong>COTISATION A LA FEDERATION DES SCOP DE LA COMMUNICATION</strong> + </p> + <p> + Toutes les coopératives adhérentes de la Confédération Générale des SCOP dont l’objet social se rattache aux secteurs de la communication graphique, audiovisuelle ou multimédia sont concernées.<br/> + L’assiette est la valeur ajoutée de la liasse fiscale ou, si elle n’est pas connue, la valeur ajoutée telle que définie par la Banque de France :<br/> + <i>Valeur ajoutée = total des chiffres d’affaires nets(FL) et subventions d’exploitation(FO) + production stockée(FM) + production immobilisée(FN) - achat de marchandises(FS) - variation de stock marchandises(FT) - achat de matières premières et autres approvisionnements(FU) - variation de stock matières premières et approvisionnements(FV) - autres achats et charges externes(FW)(déduction faite du personnel extérieur et des loyer de crédit - bail) - impôts et taxes(FX)</i> + </p> + <p> + Le calcul de la cotisation est établi une fois par an en début d’année à partir des comptes de résultat du dernier exercice connu.<br/> + Taux d’appel de 0,32 %.<br/> + <i>Appel de cotisation trimestriel = (valeur ajoutée x 0,32 %) / 4</i> + Pour les nouvelles coopératives qui n’ont pas encore de compte de résultat: 27 € par trimestre et par salarié.<br/> + Plancher annuel : 108 €<br/> + Plafond annuel : 18 428 €. + </p> + </div> + </div> - <h4>Echéancier de prélèvement</h4> - <t t-set="move_line_ids" t-value="o.get_bordereau_move_line()"/> - <table> - <tr> - <td>Date de prélèvement</td> - <td>Montant</td> - </tr> - <t t-foreach="move_line_ids" t-as="line"> - <tr> - <td> - <span t-esc="datetime.datetime.strptime(line[0], '%Y-%m-%d').strftime('%d %B %Y')"/> - </td> - <td> - <span t-esc="line[1]" t-options='{"widget": "monetary", "display_currency": o.company_currency_id}'/> - </td> - </tr> - </t> - </table> </div> - </div> </t> </template> @@ -104,11 +157,11 @@ <report id="cgscop_bordereau_report" model="scop.bordereau" - string="CG Scop - Bordereau" - report_type="qweb-html" + string="Bordereau de Cotisation CG" + report_type="qweb-pdf" name="cgscop_cotisation_cg.report_bordereau" file="cgscop_cotisation_cg.report_bordereau" - menu="False" + menu="True" /> </data>