Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • lefilament/cgscop/cgscop_cotisation
  • hsilvant/cgscop_cotisation
2 results
Select Git revision
Show changes
Commits on Source (3)
......@@ -6,6 +6,8 @@ exclude: |
^setup/|/static/description/index\.html$|
# We don't want to mess with tool-generated files
.svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/|
# Maybe reactivate this when all README files include prettier ignore tags?
^README\.md$|
# Library files can have extraneous formatting (even minimized)
/static/(src/)?lib/|
# Repos using Sphinx to generate docs don't need prettying
......@@ -25,8 +27,13 @@ repos:
entry: found forbidden files; remove them
language: fail
files: "\\.rej$"
- id: en-po-files
name: en.po files cannot exist
entry: found a en.po file
language: fail
files: '[a-zA-Z0-9_]*/i18n/en\.po$'
- repo: https://github.com/oca/maintainer-tools
rev: 7d8a9f9ad73db0976fb03cbee43d953bc29b89e9
rev: ab1d7f6
hooks:
# update the NOT INSTALLABLE ADDONS section above
- id: oca-update-pre-commit-excluded-addons
......@@ -48,10 +55,11 @@ repos:
hooks:
- id: black
- repo: https://github.com/pre-commit/mirrors-prettier
rev: v2.6.2
rev: v2.1.2
hooks:
- id: prettier
name: prettier (with plugin-xml)
exclude: ^datas/
additional_dependencies:
- "prettier@2.1.2"
- "@prettier/plugin-xml@0.12.0"
......@@ -59,7 +67,7 @@ repos:
- --plugin=@prettier/plugin-xml
files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$
- repo: https://github.com/pre-commit/mirrors-eslint
rev: v8.15.0
rev: v7.8.1
hooks:
- id: eslint
verbose: true
......@@ -67,7 +75,7 @@ repos:
- --color
- --fix
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.2.0
rev: v3.2.0
hooks:
- id: trailing-whitespace
# exclude autogenerated files
......@@ -89,37 +97,33 @@ repos:
- id: mixed-line-ending
args: ["--fix=lf"]
- repo: https://github.com/asottile/pyupgrade
rev: v2.32.1
rev: v2.7.2
hooks:
- id: pyupgrade
args: ["--keep-percent-format"]
- repo: https://github.com/PyCQA/isort
rev: 5.10.1
rev: 5.12.0
hooks:
- id: isort
name: isort except __init__.py
args:
- --settings=.
exclude: /__init__\.py$
- repo: https://gitlab.com/PyCQA/flake8
rev: 3.9.2
- repo: https://github.com/PyCQA/flake8
rev: 3.8.3
hooks:
- id: flake8
name: flake8
additional_dependencies: ["flake8-bugbear==20.1.4"]
- repo: https://github.com/PyCQA/pylint
rev: v2.11.1
- repo: https://github.com/OCA/pylint-odoo
rev: 7.0.2
hooks:
- id: pylint
- id: pylint_odoo
name: pylint with optional checks
args:
- --rcfile=.pylintrc
- --exit-zero
verbose: true
additional_dependencies: &pylint_deps
- pylint-odoo==5.0.5
- id: pylint
name: pylint with mandatory checks
- id: pylint_odoo
args:
- --rcfile=.pylintrc-mandatory
additional_dependencies: *pylint_deps
......@@ -4,48 +4,56 @@
<!-- Email d'avis de prélèvement -->
<record id="email_template_payment_order" model="mail.template">
<field name="name">CG SCOP : Prélèvements</field>
<field
name="model_id"
ref="account_payment_order.model_account_payment_order"
/>
<field
name="email_from"
>"Confédération Générale des Scop et Scic" &lt;administratif.cg@scop.coop&gt;</field>
<field
name="reply_to"
>"Confédération Générale des Scop et Scic" &lt;administratif.cg@scop.coop&gt;</field>
<field name="model_id" ref="account_payment_order.model_account_payment_order"/>
<field name="email_from">"Confédération Générale des Scop et Scic" &lt;administratif.cg@scop.coop&gt;</field>
<field name="reply_to">"Confédération Générale des Scop et Scic" &lt;administratif.cg@scop.coop&gt;</field>
<field name="partner_to">${object.get_recipients()}</field>
<field name="subject">CG SCOP : Avis de prélèvement</field>
<field name="body_html" type="html">
<div style="margin: 0px; padding: 0px;">
<p style="margin: 0px; padding: 0px; font-size: 13px;">
<p>${object.get_email_values().get("partner_id").member_number} - ${object.get_email_values().get("partner_id").name}</p>
<p>&#160;</p>
<p>Chère Coopératrice, Cher Coopérateur,</p>
<p>&#160;</p>
<p
>Vous avez choisi de régler vos cotisations à la Confédération générale des Scop et des Scic par prélèvement bancaire.</p>
<p
>Nous vous informons que nous allons procéder le ${object.get_email_values().get("date").strftime('%d/%m/%Y')} à un prélèvement sur votre compte ${object.get_email_values().get("bank")} de ${format_amount(object.get_email_values().get("total"), object.company_currency_id)}</p>
<p>&#160;</p>
<p>
Vous avez choisi de régler vos cotisations à la Confédération générale des Scop et des Scic par prélèvement bancaire.
</p>
<p>
Nous vous informons que nous avons procédé ce jour à un ordre de prélèvement qui sera présenté au débit de votre compte le ${object.get_email_values().get("date").strftime('%d/%m/%Y')}.
</p>
<p>&#160;</p>
<p>
Le mandat de prélèvement enregistré pour votre coopérative est le suivant : ${object.get_email_values().get("bank")}
</p>
<p>&#160;</p>
<p>
Ce courriel vous est envoyé à titre informatif, l’ordre de prélèvement ne peut plus être arrêté en banque, sauf par vos soins en prenant contact avec votre établissement bancaire.
</p>
<p>Dans ce cas, nous vous remercions de bien vouloir nous en informer.</p>
<p>&#160;</p>
<p>
En cas de difficulté économique, nous vous invitons également à vous rapprocher de votre délégation régionale.
</p>
<p>&#160;</p>
<p>
Ce prélèvement correspond au paiement des cotisations :
<ul>
% for line in object.get_email_values().get("deadline"):
% set quarter = "er" if line.get("cotiz_quarter") == "1" else "ème"
% set quarter = "er" if line.get("quarter") == "1" else "ème"
<li>
${line.get("cotiz_quarter")}${quarter} Trimestre ${line.get("year")} : ${format_amount(line.get("amount_total_signed"), object.company_currency_id)}
${line.get("quarter")}${quarter} Trimestre ${line.get("year")} : ${format_amount(line.get("amount"), object.company_currency_id)}
</li>
% endfor
</ul>
</p>
<p>&#160;</p>
<p
>Nous vous rappelons que les bordereaux de cotisations sont désormais mis à disposition dans <a
href="https://extranet.scop.coop/"
>votre espace extranet</a> et ne sont plus transmis par courrier.</p>
<p>
Pour toute question relative à vos cotisations appelées par la CGSCOP, notre équipe est à votre disposition par téléphone au 01 44 85 47 00 ou par courriel à <a
href="mailto:administratif.cg@scop.coop"
>administratif.cg@scop.coop</a>.
Nous vous rappelons que les bordereaux de cotisations sont mis à disposition dans <a href="https://extranet.scop.coop/">votre espace extranet</a> et ne sont plus transmis par courrier.
</p>
<p>
Pour toute question relative à vos cotisations appelées par la CGSCOP, notre équipe est à votre disposition par téléphone au 01 44 85 47 00 ou par courriel à <a href="mailto:administratif.cg@scop.coop">administratif.cg@scop.coop</a>.
</p>
<p>&#160;</p>
<p
......
......@@ -44,20 +44,44 @@ class AccountBankingMandate(models.Model):
)
return invoice_ids
def _change_invoice_mandate(self, invoice):
def _change_invoice_mandate(self, invoice_ids):
"""
Affecte le mandat courant pur la facture passée en paramètre
:param invoice : objet account.move
"""
payment_mode = self.env["account.payment.mode"].search(
[("payment_method_id.code", "=", "sepa_direct_debit")]
[
("payment_method_id.code", "=", "sepa_direct_debit"),
("company_id", "=", self.env.company.id),
]
)
if not payment_mode:
raise UserError(_("Aucun mode de prélèvement SEPA configuré."))
invoice.update(
{
"payment_mode_id": payment_mode.id,
"partner_bank_id": self.partner_bank_id.id,
"mandate_id": self.id,
}
for invoice in invoice_ids:
invoice.update(
{
"payment_mode_id": payment_mode.id,
"partner_bank_id": self.partner_bank_id.id,
"mandate_id": self.id,
}
)
def _remove_invoice_mandate(self, invoice_ids):
"""
Supprime le mandat courant pur la facture passée en paramètre
:param invoice : objet account.move
"""
payment_mode = self.env["account.payment.mode"].search(
[("name", "ilike", "Virement"), ("company_id", "=", self.env.company.id)],
limit=1,
)
for invoice in invoice_ids:
invoice.update(
{
"payment_mode_id": payment_mode.id if payment_mode else None,
"partner_bank_id": False,
"mandate_id": False,
}
)
self.partner_id.customer_payment_mode_id = payment_mode
# Copyright 2020 Le Filament
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from itertools import groupby
from odoo import _, fields, models
from odoo.exceptions import UserError, ValidationError
......@@ -33,8 +35,11 @@ class AccountPaymentOrder(models.Model):
def _compute_bank_line_amount(self):
for po in self:
po.bank_line_amount = sum(po.payment_ids.filtered(
lambda p: not p.reversed_entry_id).mapped("amount_total_signed"))
po.bank_line_amount = sum(
po.payment_ids.filtered(lambda p: not p.reversed_entry_id).mapped(
"amount_total_signed"
)
)
def _compute_attachment_ids(self):
Attachment = self.env["ir.attachment"]
......@@ -124,11 +129,7 @@ class AccountPaymentOrder(models.Model):
try:
template = self.env.ref("cgscop_cotisation.email_template_payment_order")
except Exception:
raise UserError(
_(
"Aucun modèle d'e-mail n'a été trouvé."
)
)
raise UserError(_("Aucun modèle d'e-mail n'a été trouvé."))
# Get partners
partner_ids = self.payment_line_ids.mapped("partner_id")
for partner in partner_ids:
......@@ -178,20 +179,32 @@ class AccountPaymentOrder(models.Model):
partner_line_ids = self.payment_line_ids.filtered(
lambda l: l.partner_id == partner_id
)
invoice_ids = partner_line_ids.mapped("move_line_id.move_id").filtered(
"is_contribution"
)
quarter_detail = []
quarter_agg = []
for line in partner_line_ids:
invoice_id = line.move_line_id.move_id
quarter_detail.append(
("%s-%s" % (invoice_id.year, invoice_id.cotiz_quarter), line.amount_currency)
)
quarter_detail.sort(key=lambda x: x[0])
for quarter, values in groupby(quarter_detail, key=lambda x: x[0]):
amount = 0
for val in values:
amount += val[1]
quarter_agg.append({
"year": quarter[0:4],
"quarter": quarter[-1],
"amount": amount,
})
return {
"partner_id": partner_id,
"total": sum(partner_line_ids.mapped("amount_currency")),
"date": partner_line_ids.mapped("date")[0],
"bank": partner_line_ids.mapped("partner_bank_id.acc_number")[0],
"deadline": invoice_ids.read_group(
domain=[("id", "in", invoice_ids.ids)],
fields=["year", "cotiz_quarter", "amount_total_signed"],
groupby=["year", "cotiz_quarter"],
orderby="year,cotiz_quarter",
lazy=False,
),
"deadline": quarter_agg,
}
def get_recipients(self):
......
......@@ -26,8 +26,18 @@
class="btn-outline-info"
style="margin-left: 15px;"
string="Affecter ce mandat aux factures ouvertes"
context="{'action_type': 'update_mandate'}"
attrs="{'invisible': [('state', '!=', 'valid')]}"
/>
<button
name="set_invoice_mandate"
type="object"
class="btn-outline-danger"
style="margin-left: 15px;"
string="Affecter 'Virement' aux factures et cotisations ouvertes"
context="{'action_type': 'remove_mandate'}"
attrs="{'invisible': [('state', 'not in', ['expired', 'cancel'])]}"
/>
</div>
</xpath>
</field>
......
......@@ -134,18 +134,35 @@
<!-- />-->
</tree>
<form>
<h1><field name="name"/></h1>
<h1><field name="name" /></h1>
<group>
<group>
<field name="datas" filename="name" attrs="{'invisible':[('type','=','url')]}" string="Télécharger le fichier"/>
<field name="name" invisible="1" attrs="{'invisible':[('type','=','url')]}" class="oe_inline oe_right"/>
<field name="url" widget="url" attrs="{'invisible':[('type','=','binary')]}"/>
<field name="mimetype" groups="base.group_no_one"/>
<field name="type"/>
<field
name="datas"
filename="name"
attrs="{'invisible':[('type','=','url')]}"
string="Télécharger le fichier"
/>
<field
name="name"
invisible="1"
attrs="{'invisible':[('type','=','url')]}"
class="oe_inline oe_right"
/>
<field
name="url"
widget="url"
attrs="{'invisible':[('type','=','binary')]}"
/>
<field
name="mimetype"
groups="base.group_no_one"
/>
<field name="type" />
</group>
<group>
<field name="create_uid"/>
<field name="create_date"/>
<field name="create_uid" />
<field name="create_date" />
</group>
</group>
</form>
......
......@@ -4,3 +4,4 @@
from . import account_banking_mandate_change_wizard
from . import account_move_reversal
from . import account_payment_line_create
from . import scop_deces_wizard
......@@ -35,5 +35,8 @@ class AccountBankingMandateChange(models.TransientModel):
)
def change_mandate(self):
for invoice in self.invoice_ids:
self.mandate_id._change_invoice_mandate(invoice)
if self.env.context.get("action_type") == "update_mandate":
self.mandate_id._change_invoice_mandate(self.invoice_ids)
elif self.env.context.get("action_type") == "remove_mandate":
self.mandate_id._remove_invoice_mandate(self.invoice_ids)
......@@ -32,6 +32,8 @@
string="Partenaire"
/>
<field name="invoice_date_due" />
<field name="payment_mode_id" optional="show" />
<field name="mandate_id" optional="show" />
<field name="amount_untaxed_signed" string="Total HT" />
<field
name="amount_total_signed"
......@@ -63,6 +65,15 @@
string="Affecter le mandat"
class="btn-primary"
confirm="Valider le changement de mandat ?"
invisible="context.get('action_type') != 'update_mandate'"
/>
<button
name="change_mandate"
type="object"
string="Supprimer le mandat"
class="btn-danger"
confirm="Valider la suppression des mandats et le passage en virement ?"
invisible="context.get('action_type') != 'remove_mandate'"
/>
<button special="cancel" string="Cancel" />
</footer>
......
# © 2020 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import models
class ScopDecesWizard(models.TransientModel):
_inherit = "scop.deces.wizard"
def deces_action(self):
super().deces_action()
partner_id = self.env["res.partner"].browse(self.partner_id)
mandate_ids = self.env["account.banking.mandate"].search(
[
("partner_id", "=", partner_id.id),
("state", "=", "valid"),
("company_id", "=", self.env.company.id),
]
)
if mandate_ids:
for mandate in mandate_ids:
mandate.update({"state": "expired"})
invoice_ids = self.env["account.move"].search(
[
("mandate_id", "=", mandate.id),
("move_type", "in", ("out_invoice", "out_refund")),
("state", "in", ("draft", "posted")),
("payment_state", "in", ("draft", "not_paid", "partial")),
]
)
mandate._remove_invoice_mandate(invoice_ids)