Skip to content
Extraits de code Groupes Projets
Valider a430e9fc rédigé par jordan's avatar jordan
Parcourir les fichiers

[add] wizard génération cotiz nouveaux adhérents

parent 241ecc2a
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -19,5 +19,6 @@ ...@@ -19,5 +19,6 @@
"views/scop_bordereau_cg.xml", "views/scop_bordereau_cg.xml",
"views/scop_cotisation_cg.xml", "views/scop_cotisation_cg.xml",
"views/union_regionale.xml", "views/union_regionale.xml",
"wizard/scop_cotisation_cg_wizard.xml",
] ]
} }
...@@ -30,7 +30,8 @@ ...@@ -30,7 +30,8 @@
<form string="Cotisations"> <form string="Cotisations">
<header> <header>
<button name="cotiz_view" type="object" string="Accéder aux appels de cotisations"/> <button name="cotiz_view" type="object" string="Accéder aux appels de cotisations"/>
<button string="Calculer les cotisations" type="object" name="cotiz_generate" class="oe_highlight" states="new,ongoing"/> <button name="cotiz_generate" type="object" string="Calculer les cotisatisons de renouvellement" class="oe_highlight" states="new,ongoing"/>
<button name="cotiz_generate_wizard" type="object" string="Calculer les cotisatisons des nouveaux adhérents" class="oe_highlight" states="new,ongoing"/>
<field name="state" widget="statusbar" clickable="False"/> <field name="state" widget="statusbar" clickable="False"/>
</header> </header>
<sheet> <sheet>
......
...@@ -2,3 +2,4 @@ ...@@ -2,3 +2,4 @@
# 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 . import account_invoice_refund from . import account_invoice_refund
from . import scop_cotisation_cg_wizard
# © 2021 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging
import threading
from odoo import api, fields, models, exceptions, registry
_logger = logging.getLogger(__name__)
class ScopCotisationWizard(models.TransientModel):
_name = 'scop.cotisation.cg.wizard'
_description = "Wizard: Génération des cotisations nouveaux adhérents"
year = fields.Char(
string='Année',
required=True)
cotisation_cg_id = fields.Many2one(
comodel_name='scop.cotisation.cg',
string='Base de cotisation')
nb_quarter = fields.Selection(
string='Nombre de trimestres de cotisation',
selection=[('1', '1'),
('2', '2'),
('3', '3'),
('4', '4')],
default='4',
required=True)
type = fields.Selection([
('all', 'Toutes les coop nouvelles adhérentes'),
('selected', 'Sélectionner des coop')],
string='Type de création',
default='all'
)
partner_ids = fields.Many2many(
comodel_name='res.partner',
string='Coopératives'
)
# ------------------------------------------------------
# Button function
# ------------------------------------------------------
@api.onchange('type')
def onchange_domain_partner_ids(self):
if self.type == 'selected':
# TODO : Vérifier la bonne utilisation du contexte ?
# Mieux utiliser cotisaion_cg_id ?
invoiced_members = self.env['scop.cotisation.cg'].search([
('year', '=', self.year)]).invoice_ids.mapped('partner_id')
return {'domain': {'partner_ids': [
('is_company', '=', True),
('id', 'not in', invoiced_members.mapped('id'))
]}}
# ------------------------------------------------------
# Button function
# ------------------------------------------------------
@api.multi
def cotiz_generate_new_adherents(self):
if not self.env.user.company_id.is_contribution_cg:
raise exceptions.UserError(
"La gestion des cotisations CGScop n'est pas configurée.")
if self.type == 'selected':
members = self.partner_ids
else:
members = self.cotisation_cg_id.get_new_members()
invoiced_members = self.cotisation_cg_id. \
invoice_ids.mapped('partner_id')
members_to_invoice = members - invoiced_members
if len(members_to_invoice) > 0:
message = (
"<h3>Appels de cotisation " + str(self.year) +
"</h3> <hr/>" +
"<br/>Cotisations nouveaux adhérents à générer : " +
str(len(members_to_invoice)) +
"<p>Les appels de cotisation sont en cours de "
"création...</p> "
)
message_id = self.env['message.wizard'].create(
{'message': message})
# Création de la task
cotiz_cg_task = self.env['scop.cotisation.task'].create({
'year': self.year,
'cotiz_to_create': len(members_to_invoice),
'message': "En cours de création",
'status': 'in_process'
})
cotiz_cg_task.env.cr.commit()
# Lancement du calcul en arrière plan
threaded_cotiz = threading.Thread(
target=self._process_cotiz_generate,
args=(members_to_invoice, cotiz_cg_task, self.nb_quarter))
threaded_cotiz.start()
else:
message = ("<p class='text-center'>Tous les appels de cotisations "
"pour les nouveaux adhérents connus ont déjà été "
"créés !</p>")
message_id = self.env['message.wizard'].create(
{'message': message})
return {
'name': 'Génération des appels de cotisation nouveaux adhérents',
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'message.wizard',
'res_id': message_id.id,
'target': 'new'
}
# ------------------------------------------------------
# Threading task
# ------------------------------------------------------
def _process_cotiz_generate(self, partner_ids,
cotiz_cg_task, nb_quarter):
"""
Process de génération des cotiz Aura en background
"""
cotiz_created = 0
cotiz_to_create = len(partner_ids)
with api.Environment.manage():
with registry(self.env.cr.dbname).cursor() as new_cr:
# Def new env
new_env = api.Environment(
new_cr, self.env.uid, self.env.context
)
# Def new var in new env
task = cotiz_cg_task.with_env(new_env)
new_self = self.with_env(new_env)
# Definition of specific params
Cotiz_cg = new_self.cotisation_cg_id
# CG
product_cg_id = Cotiz_cg.company_id.contribution_cg_id
type_cotisation_cg = new_self.env.ref(
'cgscop_partner.riga_14397').id
# Fede
product_fede_id = Cotiz_cg.company_id.contribution_fede_id
type_cotisation_fede = new_self.env.ref(
'cgscop_partner.riga_14398').id
# UR HDF
product_hdf_id = Cotiz_cg.company_id.contribution_hdf_id
ur_hdf = new_self.env.ref('cgscop_partner.riga_14232').id
# UR Med
product_med_id = Cotiz_cg.company_id.contribution_med_id
ur_med = new_self.env.ref('cgscop_partner.riga_14238').id
#
type_cotisation_ur = new_self.env.ref(
'cgscop_partner.riga_14399').id
# Creation of cotiz invoice for each member
for member_id in partner_ids:
member = member_id.with_env(new_env)
try:
liasse_id = Cotiz_cg.get_liasse(member)
# Bordereau
bordereau_id = Cotiz_cg.create_bordereau(member)
# Invoice cotiz CG
amount_cg = Cotiz_cg.get_cotiz_cg(member, liasse_id)
invoice_cotiz_cg = Cotiz_cg.create_contribution(
product_cg_id, member, liasse_id, amount_cg)
invoice_cotiz_cg.write({
'type_contribution_id': type_cotisation_cg,
'cotisation_cg_id': Cotiz_cg.id,
'bordereau_id': bordereau_id.id,
'amount_cg_calculated': amount_cg
})
invoice_cotiz_cg.env.cr.commit()
# Invoice cotiz Fede
if member.is_federation_com:
amount_fede = Cotiz_cg.get_cotiz_fede(
member, liasse_id)
invoice_cotiz_fede = Cotiz_cg.create_contribution(
product_fede_id, member, liasse_id,
amount_fede)
invoice_cotiz_fede.write({
'type_contribution_id': type_cotisation_fede,
'cotisation_cg_id': Cotiz_cg.id,
'bordereau_id': bordereau_id.id,
'amount_cg_calculated': amount_fede
})
invoice_cotiz_fede.env.cr.commit()
# Invoice cotiz UR HDF
if member.ur_id.id == ur_hdf:
amount_hdf = Cotiz_cg.get_cotiz_hdf(
member, liasse_id)
invoice_cotiz_hdf = Cotiz_cg.create_contribution(
product_hdf_id, member, liasse_id,
amount_hdf)
invoice_cotiz_hdf.write({
'type_contribution_id': type_cotisation_ur,
'cotisation_cg_id': Cotiz_cg.id,
'bordereau_id': bordereau_id.id,
'amount_cg_calculated': amount_hdf
})
invoice_cotiz_hdf.env.cr.commit()
# Invoice cotiz UR Med
if member.ur_id.id == ur_med:
amount_med = Cotiz_cg.get_cotiz_med(
member, liasse_id)
invoice_cotiz_med = Cotiz_cg.create_contribution(
product_med_id, member, liasse_id, amount_med)
invoice_cotiz_med.write({
'type_contribution_id': type_cotisation_ur,
'cotisation_cg_id': Cotiz_cg.id,
'bordereau_id': bordereau_id.id,
'amount_cg_calculated': amount_med
})
invoice_cotiz_med.env.cr.commit()
cotiz_created += 1
task.write({
'cotiz_created': cotiz_created,
})
if cotiz_created == cotiz_to_create:
task.write({
'message': "Tous les appels de cotisaions ont"
" été créés",
'status': "done"
})
task.env.cr.commit()
except Exception as e:
_logger.exception(str(e))
task.write({
'cotiz_created': cotiz_created,
'message': "%d / %d ont été créés" % (
cotiz_created, cotiz_to_create),
'is_error': True,
'status': "done"
})
task.env.cr.commit()
<?xml version="1.0"?>
<!-- Copyright 2021 Le Filament
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
<odoo>
<data>
<record model="ir.ui.view" id="scop_cotisation_cg_wizard_form_view">
<field name="name">scop.cotisation.cg.wizard.form</field>
<field name="model">scop.cotisation.cg.wizard</field>
<field name="arch" type="xml">
<form string="Générer les cotisation pour les nouveaux adhérents">
<group>
<field name="year" required="1" invisible="1"/>
<field name="nb_quarter" required="1"/>
<field name="type" widget="radio"/>
<field name="partner_ids" attrs="{'invisible': [('type', '=', 'all')]}" widget="many2many_tags" options="{'no_create': True, 'no_open': True}"/>
</group>
<footer>
<button name="cotiz_generate_new_adherents" type="object"
string="Générer les cotisations" class="oe_highlight"/>
<button special="cancel" string="Cancel"/>
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_genere_cotisation_cg_new_adherents">
<field name="name">Générer les cotisations nouveaux adhérents</field>
<field name="res_model">scop.cotisation.cg.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="scop_cotisation_cg_wizard_form_view"/>
<field name="target">new</field>
</record>
</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