Skip to content
Extraits de code Groupes Projets
Valider 2029f764 rédigé par Benjamin - Le Filament's avatar Benjamin - Le Filament
Parcourir les fichiers

[add] PDF bordereau

parent ada4b0fc
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
# © 2021 Le Filament (<http://www.le-filament.com>) # © 2021 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # 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 import fields, models, api
from odoo.exceptions import UserError from odoo.exceptions import UserError
...@@ -161,6 +164,10 @@ class Bordereau(models.Model): ...@@ -161,6 +164,10 @@ class Bordereau(models.Model):
wage_cg_retenu = fields.Float( wage_cg_retenu = fields.Float(
string='Montant masse salariale retenu', string='Montant masse salariale retenu',
track_visibility='onchange') track_visibility='onchange')
is_sdd = fields.Boolean(
'Au prélèvement',
compute='compute_is_sdd',
search='_search_is_sdd')
# Emails management # Emails management
recipient_ids = fields.One2many( recipient_ids = fields.One2many(
...@@ -231,6 +238,22 @@ class Bordereau(models.Model): ...@@ -231,6 +238,22 @@ class Bordereau(models.Model):
else: else:
bordereau.montant_assiette = bordereau.va_cg_retenu 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 # Button functions
# ------------------------------------------------------ # ------------------------------------------------------
...@@ -393,12 +416,33 @@ class Bordereau(models.Model): ...@@ -393,12 +416,33 @@ class Bordereau(models.Model):
Use "compute" function from account.move Use "compute" function from account.move
:return: dict with date as key and amount (float) as value :return: dict with date as key and amount (float) as value
""" """
MoveLine = self.env['account.move.line']
for bordereau in self: for bordereau in self:
totlines = bordereau.payment_term_id.with_context( inv_ids = bordereau.invoice_ids.ids
currency_id=self.base_cotisation_cg.company_currency_id.id). \ print(inv_ids)
compute(bordereau.amount_total_cotiz, schedule = MoveLine.read_group([
bordereau.date_cotisation)[0] ('invoice_id', 'in', inv_ids),
return totlines ('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 # Email
def get_recipients(self): def get_recipients(self):
......
...@@ -4,91 +4,144 @@ ...@@ -4,91 +4,144 @@
<template id="report_bordereau_document"> <template id="report_bordereau_document">
<t t-call="web.external_layout"> <t t-call="web.external_layout">
<div class="page"> <div class="page" style="font-size: 14px;">
<h2> Appel de cotisation <span t-esc="o.year"/> </h2> <div class="row">
<div> <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> <p>
Paris, le <span t-esc="context_timestamp(datetime.datetime.now()).strftime('%d %B %Y')"/> Paris, le <span t-esc="o.date_cotisation.strftime('%d %B %Y')"/>
</p> </p>
<p> <p>
N° adhérent : <t t-esc="o.partner_id.member_number_int"/><br/> N° adhérent : <t t-esc="str(o.partner_id.member_number_int)"/><br/>
Union régionale <t t-esc="o.partner_ur_id.name"/> Union régionale : <span t-field="o.partner_ur_id.name"/><br/>
N° Bordereau : <span t-field="o.name"/>
</p> </p>
</div> </div>
</div>
<t t-set="address"> <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}' /> <address t-field="o.partner_id" t-options='{"widget": "contact", "fields": ["address", "name"], "no_marker": True}' />
</t>
<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> </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"/>.
&amp;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>
<div class="row mb16">
<div> <div class="col-12" style="font-style: italic; test-align: justify;">
<table> 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
<t t-foreach="o.invoice_ids.sorted(key=lambda i: i.amount_total_signed, reverse=True)" t-as="cotiz"> </div>
<tr> </div>
<td> <div class="row">
<span t-field="cotiz.type_contribution_id.name"/> <div class="col-6" style="border: 1px solid #aaa;">
</td> <div></div>
<td> <h5 class="mt8" style="font-weight: 600;">Cotisations annuelles</h5>
<span t-field="cotiz.amount_total_signed"/> <p style="font-style: italic; font-size: 13px;">
</td> <t t-if="o.year_liasse_retenue">Calcul basé sur la liasse fiscale <span t-esc="str(o.year_liasse_retenue)" /><br/></t>
</tr> 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}" />.
</t> </p>
<tr> <p>
<td> <t t-set="amount_line" t-value="o.get_contribution_type()" />
Total cotisations annuelles <span t-esc="o.year"/> <table class="table table-sm" style="border: none;">
</td> <tr t-foreach="amount_line" t-as="line" style="border-bottom: 1px solid #ccc;">
<td> <td style="border: none; background: inherit; color: inherit;"><t t-esc="line.get('type_contribution')"/></td>
<span t-field="o.amount_total_cotiz"/>* <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>
</td>
</tr> </tr>
</table> </table>
* Inclus abonnement annuel à la Revue Participer au tarif préférentiel adhérent de 22 € TTC </p>
<p>
<h4>Echéancier de prélèvement</h4> <table class="table table-sm" style="border: none;">
<t t-set="move_line_ids" t-value="o.get_bordereau_move_line()"/> <tr style="border: none">
<table> <td style="border: none; background: inherit; color: inherit;">
<tr> <strong>Total cotisation annuelle <t t-esc="str(o.year)"/>*</strong>
<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> </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> </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> </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> </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>
<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 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 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>
<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> </div>
</div> </div>
</div>
</t> </t>
</template> </template>
...@@ -104,11 +157,11 @@ ...@@ -104,11 +157,11 @@
<report <report
id="cgscop_bordereau_report" id="cgscop_bordereau_report"
model="scop.bordereau" model="scop.bordereau"
string="CG Scop - Bordereau" string="Bordereau de Cotisation CG"
report_type="qweb-html" report_type="qweb-pdf"
name="cgscop_cotisation_cg.report_bordereau" name="cgscop_cotisation_cg.report_bordereau"
file="cgscop_cotisation_cg.report_bordereau" file="cgscop_cotisation_cg.report_bordereau"
menu="False" menu="True"
/> />
</data> </data>
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter