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

[add] reports payments and refund

parent f1fccb7f
Branches
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -25,5 +25,7 @@
"wizard/scop_bordereau_update_confirm_view.xml",
"wizard/scop_bordereau_validate_confirm_view.xml",
"report/report_scop_bordereau.xml",
"report/report_scop_bordereau_payments.xml",
"report/report_scop_bordereau_refund.xml",
]
}
......@@ -411,9 +411,12 @@ class Bordereau(models.Model):
"""
MoveLine = self.env['account.move.line']
for bordereau in self:
inv_ids = bordereau.invoice_ids.ids
inv_ids = bordereau.invoice_ids
if bordereau.is_regul:
inv_ids = inv_ids.filtered(
lambda i: i.type == 'out_invoice')
move_lines = MoveLine.search([
('invoice_id', 'in', inv_ids),
('invoice_id', 'in', inv_ids.ids),
('account_id.internal_type', '=', 'receivable')],
order='date_maturity',
)
......@@ -441,36 +444,24 @@ class Bordereau(models.Model):
MoveLine = self.env['account.move.line']
for bordereau in self:
inv_ids = bordereau.invoice_ids.ids
move_lines = MoveLine.search([
('invoice_id', 'in', inv_ids),
schedule_plan = MoveLine.read_group(
[('invoice_id', 'in', inv_ids),
('account_id.internal_type', '=', 'receivable')],
order='date_maturity',
fields=['date_maturity', 'credit', 'debit', 'amount_residual'],
groupby=['date_maturity:day'],
orderby='date_maturity',
lazy=False
)
schedule = list(dict.fromkeys(move_lines.mapped('date_maturity')))
schedule.sort()
schedule_plan = []
total_amount = 0
total_paid = 0
for date in schedule:
amount = 0
amount_paid = 0
for item in move_lines:
if item.date_maturity == date:
amount += item.debit - item.credit
if item.full_reconcile_id.reconciled_line_ids:
aml_payment = item.full_reconcile_id.reconciled_line_ids - move_lines
amount_paid += sum(aml_payment.mapped('credit')) - sum(aml_payment.mapped('debit'))
total_amount += amount
total_paid += amount_paid
schedule_plan.append({
'date': date.strftime('%d/%m/%Y'),
'amount': amount,
'amount_paid': amount_paid,
})
total_amount = sum(list(map(
lambda l: l.get('debit'), schedule_plan)))
total_residual = sum(list(map(
lambda l: l.get('amount_residual'), schedule_plan)))
total_paid = total_amount - total_residual
return {
'plan': schedule_plan,
'total_amount': total_amount,
'total_paid': total_paid
'total_paid': total_paid,
'total_residual': total_residual
}
def get_contribution_type(self):
......@@ -478,13 +469,35 @@ class Bordereau(models.Model):
Get contribution by type
:return: dict type_contribution and amount
"""
domain = [('id', 'in', self.invoice_ids.ids)]
if self.is_regul:
domain.append(('type', '=', 'out_invoice'))
return self.invoice_ids.read_group(
domain,
['type_contribution_id', 'amount_total_signed'],
['type_contribution_id'])
def get_contribution_type_refund(self):
"""
Get contribution by type for refund
:return: dict type_contribution and amount
"""
return self.invoice_ids.read_group(
[('id', 'in', self.invoice_ids.ids)],
[('id', 'in', self.invoice_ids.ids), ('type', '=', 'out_refund')],
['type_contribution_id', 'amount_total_signed'],
['type_contribution_id'])
# return self.invoice_ids.mapped(lambda c: {
# 'type_contribution': c.type_contribution_id.name,
# 'amount': c.amount_total_signed})
def get_move_reconciled(self, payment):
"""
Check if payment is reconciled
:param payment: account.payment object
:return: True or payment_id
"""
rec = True
for aml in payment.move_line_ids.filtered(lambda x: x.account_id.reconcile):
if not aml.reconciled:
rec = payment.id
return rec
# Email
def get_recipients(self):
......
......@@ -35,14 +35,6 @@
<t t-if="o.partner_id.cedex"> <span t-field="o.partner_id.cedex"/></t>
</div>
</div>
<t t-if="o.is_regul">
<div class="row">
<div class="col-12" style="test-align: justify;">
Une régularisation du bordereau initial a été effectuée pour le motif suivant : <span t-field="o.comment_regul"/><br/>
Date de régularisation : <span t-field="o.date_regul"/>
</div>
</div>
</t>
<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
......@@ -72,7 +64,13 @@
<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>
<t t-if="o.is_regul">
<strong><span t-esc="sum(o.invoice_ids.filtered(lambda i: i.type == 'out_invoice').mapped('amount_total_signed'))" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/></strong>
</t>
<t t-else="">
<strong><span t-field="o.amount_total_cotiz" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/></strong>
</t>
</td>
</tr>
</table>
</p>
......@@ -159,44 +157,6 @@
</t>
</template>
<template id="report_bordereau_document_with_payments" inherit_id="cgscop_cotisation_cg.report_bordereau_document" primary="True">
<xpath expr="//p[@id='schedule_table']" position="replace">
<p id="schedule_table_with_payments">
<t t-set="schedule_line" t-value="o.get_bordereau_move_line_with_payments()" />
<table class="table table-sm table-striped" style="border: none;">
<tr>
<th>Date d'échéance</th>
<th class="text-right">Montant appelé</th>
<th class="text-right">Montant réglé</th>
</tr>
<tr t-foreach="schedule_line.get('plan')" 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>
<td class="text-right" style="border: none; background: inherit; color: inherit;"><t t-esc="line.get('amount_paid')" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/></td>
</tr>
</table>
<table class="table table-sm table-striped" style="border: none;">
<tr>
<th>Total appelé</th>
<th class="text-right">Total réglé</th>
<th class="text-right">Montant dû</th>
</tr>
<tr style="border-bottom: 1px solid #ccc;">
<td style="border: none; background: inherit; color: inherit;">
<t t-esc="schedule_line.get('total_amount')" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/>
</td>
<td class="text-right" style="border: none; background: inherit; color: inherit;">
<t t-esc="schedule_line.get('total_paid')" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/>
</td>
<td class="text-right" style="border: none; background: inherit; color: inherit;">
<t t-esc="schedule_line.get('total_amount') - schedule_line.get('total_paid')" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/>
</td>
</tr>
</table>
</p>
</xpath>
</template>
<template id="report_bordereau">
<t t-call="web.html_container">
<t t-set="docs" t-value="docs.with_context(lang='fr')"/>
......@@ -206,15 +166,6 @@
</t>
</template>
<template id="report_bordereau_with_payments">
<t t-call="web.html_container">
<t t-set="docs" t-value="docs.with_context(lang='fr')"/>
<t t-foreach="docs" t-as="o">
<t t-call="cgscop_cotisation_cg.report_bordereau_document_with_payments" t-lang="fr"/>
</t>
</t>
</template>
<!-- QWeb Reports -->
<report
id="cgscop_bordereau_report"
......@@ -224,14 +175,6 @@
name="cgscop_cotisation_cg.report_bordereau"
file="cgscop_cotisation_cg.report_bordereau"
/>
<report
id="cgscop_bordereau_report_with_payments"
model="scop.bordereau"
string="Bordereau de Cotisation CG avec paiement"
report_type="qweb-pdf"
name="cgscop_cotisation_cg.report_bordereau_with_payments"
file="cgscop_cotisation_cg.report_bordereau_with_payments"
/>
</data>
</odoo>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<template id="report_bordereau_document_with_payments">
<t t-call="web.external_layout">
<t t-set="o" t-value="o.with_context(lang='fr')" />
<div class="page" style="font-size: 14px;">
<div class="row">
<div class="col-12 text-center">
<h2 style="color: #E5074D;">
Etat des paiements de cotisation <span t-esc="str(o.year)"/>
</h2>
</div>
</div>
<div class="row">
<div class="col-12">
<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"/><t t-if="o.is_regul">-<span t-field="o.version"/></t>
</p>
</div>
</div>
<div class="row">
<div class="col-6 offset-6 mt16 mb32">
<span t-field="o.partner_id.name" style="text-transform: uppercase; font-weight: 600;"/><br/>
<span t-field="o.partner_id.street" /><br/>
<t t-if="o.partner_id.street2"><span t-field="o.partner_id.street2"/><br/></t>
<t t-if="o.partner_id.street3"><span t-field="o.partner_id.street3"/><br/></t>
<span t-field="o.partner_id.zip" /> <span t-field="o.partner_id.city" style="text-transform: uppercase;"/>
<t t-if="o.partner_id.cedex"> <span t-field="o.partner_id.cedex"/></t>
</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_id')[1]"/></td>
<td class="text-right" style="border: none; background: inherit; color: inherit;"><t t-esc="line.get('amount_total_signed')" 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>
<h5 style="font-weight: 600;">Échéancier</h5>
<p id="schedule_table_with_payments">
<t t-set="schedule_line" t-value="o.get_bordereau_move_line_with_payments()" />
<table class="table table-sm table-striped" style="border: none;">
<tr>
<th>Date d'échéance</th>
<th class="text-right">Montant appelé</th>
<th class="text-right">Montant réglé</th>
</tr>
<tr t-foreach="schedule_line.get('plan')" t-as="line" style="border-bottom: 1px solid #ccc;">
<td style="border: none; background: inherit; color: inherit;"><t t-esc="line.get('date_maturity:day')"/></td>
<td class="text-right" style="border: none; background: inherit; color: inherit;"><t t-esc="line.get('debit')" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/></td>
<td class="text-right" style="border: none; background: inherit; color: inherit;"><t t-esc="line.get('debit') - line.get('amount_residual')" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/></td>
</tr>
</table>
<table class="table table-sm table-striped" style="border: none;">
<tr>
<th>Total appelé</th>
<th class="text-right">Total réglé</th>
<th class="text-right">Montant dû</th>
</tr>
<tr style="border-bottom: 1px solid #ccc;">
<td style="border: none; background: inherit; color: inherit;">
<t t-esc="schedule_line.get('total_amount')" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/>
</td>
<td class="text-right" style="border: none; background: inherit; color: inherit;">
<t t-esc="schedule_line.get('total_paid')" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/>
</td>
<td class="text-right" style="border: none; background: inherit; color: inherit;">
<t t-esc="schedule_line.get('total_residual')" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/>
</td>
</tr>
</table>
</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>
</t>
</template>
<template id="report_bordereau_with_payments">
<t t-call="web.html_container">
<t t-set="docs" t-value="docs.with_context(lang='fr')"/>
<t t-foreach="docs" t-as="o">
<t t-call="cgscop_cotisation_cg.report_bordereau_document_with_payments" t-lang="fr"/>
</t>
</t>
</template>
<!-- QWeb Reports -->
<report
id="cgscop_bordereau_report_with_payments"
model="scop.bordereau"
string="Etat des paiements"
report_type="qweb-pdf"
name="cgscop_cotisation_cg.report_bordereau_with_payments"
file="cgscop_cotisation_cg.report_bordereau_with_payments"
/>
</data>
</odoo>
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<template id="report_bordereau_document_refund">
<t t-call="web.external_layout">
<t t-set="o" t-value="o.with_context(lang='fr')" />
<div class="page" style="font-size: 14px;">
<div class="row">
<div class="col-12 text-center">
<h2 style="color: #E5074D;">
Avoir sur 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_regul" t-options="{'widget': 'date', 'format': 'd MMMM YYYY'}"/>
</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"/><t t-if="o.is_regul">-<span t-field="o.version"/></t>
</p>
</div>
</div>
<div class="row">
<div class="col-6 offset-6 mt16 mb32">
<span t-field="o.partner_id.name" style="text-transform: uppercase; font-weight: 600;"/><br/>
<span t-field="o.partner_id.street" /><br/>
<t t-if="o.partner_id.street2"><span t-field="o.partner_id.street2"/><br/></t>
<t t-if="o.partner_id.street3"><span t-field="o.partner_id.street3"/><br/></t>
<span t-field="o.partner_id.zip" /> <span t-field="o.partner_id.city" style="text-transform: uppercase;"/>
<t t-if="o.partner_id.cedex"> <span t-field="o.partner_id.cedex"/></t>
</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_refund()" />
<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_id')[1]"/></td>
<td class="text-right" style="border: none; background: inherit; color: inherit;"><t t-esc="line.get('amount_total_signed')" 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 avoir 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-esc="sum(list(map(lambda l: l.get('amount_total_signed'), amount_line)))" t-options="{'widget': 'monetary', 'display_currency': o.company_id.currency_id}"/>
</td>
</tr>
</table>
</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>
</t>
</template>
<template id="report_bordereau_refund">
<t t-call="web.html_container">
<t t-set="docs" t-value="docs.with_context(lang='fr')"/>
<t t-foreach="docs" t-as="o">
<t t-call="cgscop_cotisation_cg.report_bordereau_document_refund" t-lang="fr"/>
</t>
</t>
</template>
<!-- QWeb Reports -->
<report
id="cgscop_bordereau_report_refund"
model="scop.bordereau"
string="Avoir de Cotisation CG"
report_type="qweb-pdf"
name="cgscop_cotisation_cg.report_bordereau_refund"
file="cgscop_cotisation_cg.report_bordereau_refund"
groups="cgscop_partner.group_cg_administrator"
/>
</data>
</odoo>
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