Sélectionner une révision Git
cgscop_fond_ingenierie_demande.py 15,11 Kio
# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
FOND_TYPE = [('FI',"Fonds d'ingénierie"), ('ME',"Fonds de Mentorat")]
from odoo import models, fields, api, exceptions, modules, tools
import datetime
class CgscopFondIngenierieDemande(models.Model):
_inherit = ['mail.thread','mail.activity.mixin']
_name = "cgscop_fond_ingenierie.demande"
_description = "Demandes de subvention au fonds d'ingenierie"
_order = 'number'
_rec_name = 'number'
def _default_ur(self):
return self.env['res.company']._ur_default_get()
number = fields.Char(
string='Numéro de demande',
readonly=True)
fond_type = fields.Selection(
selection=FOND_TYPE,
string="Type de fonds")
etat = fields.Selection(
selection=[('created',"Créée"), ('confirmed',"Confirmée"), ('accepted',"Acceptée"), ('payed',"Versée"),('refused',"Ajournée"), ('canceled',"Abandonnée")],
string='Statut de la demande',
default='created',
track_visibility=True,
)
active = fields.Boolean(
string='Actif',
default=True)
ur_id = fields.Many2one(
'union.regionale',
string='Union Régionale',
index=True,
on_delete='restrict',
default=_default_ur,
track_visibility='onchange')
current_user_ur_id = fields.Many2one(
'union.regionale',
string="Union Régionale de l'utilisateur",
compute='_compute_current_user_ur_id',
search='_search_current_user_ur_id')
current_user_is_fi_admin = fields.Boolean(
string="Admin fonds investissement",
compute='_is_fi_admin')
currency_id = fields.Many2one(
comodel_name='res.currency',
string="Company Currency",
compute='_compute_currency_id',
store=False )
followup_delegate_id = fields.Many2one(
'res.users',
string='Délégué référent',
domain=[('active', '=', True)],
on_delete='restrict',
track_visibility='onchange')
partner_id = fields.Many2one(
comodel_name='res.partner',
string='Coopérative',
domain=[('is_company', '=', True),('membership_status', '=', 'member')],
ondelete='cascade',
delegate=True,
index=True)
cooperative_form_id = fields.Many2one(
'res.partner.cooperative.form',
string="Forme coopérative",
related='partner_id.cooperative_form_id',
on_delete='restrict',
store=False)
member_number_int = fields.Integer(
"No adhérent",
related='partner_id.member_number_int',
store=False)
staff_last = fields.Integer(
string="Dernier effectif connu",
related='partner_id.staff_last',
store=False)
partner_ca = fields.Monetary(
string='Dernier CA connu',
currency_field='currency_id',
compute="_get_partner_ca",
store=False)
partner_dirigeants = fields.Text(
string='Dirigeant',
compute="_get_partner_dirigeants",
store=False)
instance_validation = fields.Boolean(
string='Validé par les instances',
default=False,
track_visibility='onchange')
prestataire = fields.Char(
string='Raison sociale du prestataire')
presta_street = fields.Char("Rue", track_visibility='onchange')
presta_street2 = fields.Char("Rue 2", track_visibility='onchange')
presta_street3 = fields.Char("Rue 3", track_visibility='onchange')
presta_zip = fields.Char("CP", change_default=True, track_visibility='onchange')
presta_zip_id = fields.Many2one('res.city.zip', 'ZIP Location')
presta_city = fields.Char("Ville", track_visibility='onchange')
presta_cedex = fields.Char("Cedex", track_visibility='onchange')
presta_country_id = fields.Many2one('res.country', string='Country',
ondelete='restrict',
track_visibility='onchange')
presta_is_coop = fields.Boolean("Coopérative adhérente", track_visibility='onchange')
intervenant = fields.Char(
string="Nom de l'intervenant",
track_visibility='onchange')
no_convention = fields.Char(
string='Numéro de convention',
track_visibility='onchange',
readonly=True)
nb_jours = fields.Integer(
string='Nombre de jours',
track_visibility='onchange')
montant_prestation = fields.Monetary(
string='Montant de la prestation (HT)',
currency_field='currency_id',
track_visibility='onchange')
date_demande = fields.Date(
string='Date de la demande',
default=fields.Date.today(),
index=True,
track_visibility='onchange')
fond_id = fields.Many2one(
comodel_name='cgscop_fond_ingenierie.fond',
string='Fonds',
ondelete='cascade', index=True)
fond_annee = fields.Integer(
string="Année du fonds",
related='fond_id.annee')
fond_annee_char = fields.Char(
string="Année du fonds (char)",
compute='_compute_fond_annee_char',
store=False)
montant_demande = fields.Monetary(
string='Montant de la demande',
currency_field='currency_id',
compute="get_montant_demande" )
date_acceptation = fields.Date(
string="Date d'acceptation",
index=True,
track_visibility='onchange')
montant_accepted = fields.Monetary(
string='Montant accepté',
currency_field='currency_id',
track_visibility='onchange' )
date_CR_prestation = fields.Date(
string='Date récéption CR de la prestation',
index=True,
track_visibility='onchange')
montant_verse = fields.Monetary(
string='Montant versé',
currency_field='currency_id',
track_visibility='onchange')
date_versement = fields.Date(
string='Date du versement',
index=True,
track_visibility='onchange')
date_refus = fields.Date(
string="Date de l'ajournement",
track_visibility='onchange')
motif_refus = fields.Text(
string="Motif de l'ajournmenet",
track_visibility='onchange')
coop_activity = fields.Text(
string='Activité de la coopérative',
track_visibility='onchange')
sante_eco = fields.Text(
string='Santé économique',
track_visibility='onchange')
projet_desc = fields.Text(
string='Description du projet',
track_visibility='onchange')
besoin_accomp = fields.Text(
string="Besoins d'accompagnement",
track_visibility='onchange')
# ------------------------------------------------------
# Contraintes
# ------------------------------------------------------
# Montant accpted <= montant demande
@api.constrains('montant_accepted')
def _check_montant_accepted(self):
for rec in self:
if rec.montant_accepted > rec.montant_demande:
raise exceptions.ValidationError("Le montant accepté doit être inférieur ou égal au montant de la demande")
#....................................................................................
# Calcul de l'ur_id de l'utilisateur connecté
#....................................................................................
@api.model
def _compute_current_user_ur_id(self):
for partner in self:
partner.current_user_ur_id = self.env.user.company_id.ur_id.id
def _search_current_user_ur_id(self, operator, value):
return [('ur_id', '=', self.env.user.company_id.ur_id.id)]
#....................................................................................
# Calcul la devise
#....................................................................................
@api.model
def _compute_currency_id(self):
for rec in self:
rec.currency_id = self.env.user.company_id.currency_id.id
#....................................................................................
# Détermine si l'user connecté appartient au groupe fi_admin
#....................................................................................
@api.model
def _is_fi_admin(self):
for dmd in self:
if self.env.user.has_group('cgscop_fond_ingenierie.cgscop_fond_ingenierie_admin') :
dmd.current_user_is_fi_admin = True
else:
dmd.current_user_is_fi_admin = False
# ------------------------------------------------------
# Button
# ------------------------------------------------------
#....................................................................................
# Confirmation de la demande
#....................................................................................
@api.multi
def fi_demande_confirm(self):
for rec in self:
wannee = rec.date_demande.year
# On vérifie qu'il n'existe pas déjà des demandes pour cette coop et cette année
dmds = self.env['cgscop_fond_ingenierie.demande'].search([('fond_annee','=',wannee),('fond_type','=',rec.fond_type),('partner_id', '=', rec.partner_id.id)])
if (len(dmds)!=0):
raise exceptions.ValidationError("Il existe déjà une demande pour cette coopérative pour l'année " + str(wannee) + " et le type " + str(rec.fond_type))
# On liste les fonds pour récupérer celui de l'année de demande
fds = self.env['cgscop_fond_ingenierie.fond'].search([('annee','=',wannee),('fond_type','=',rec.fond_type)])
if (len(fds)==0):
raise exceptions.ValidationError("Aucun fonds trouvé pour l'année " + str(wannee) + " et le type " + str(rec.fond_type))
else:
rec.fond_id= fds[0].id
# On change l'état e
rec.etat = 'confirmed'
#....................................................................................
# Acceptation de la demande
#....................................................................................
@api.multi
def fi_demande_accept(self):
for rec in self:
rec.date_acceptation = datetime.date.today()
rec.etat = 'accepted'
rec.montant_accepted = rec.montant_demande
rec.no_convention = self.env['ir.sequence'].next_by_code('fond_ingenierie_convention_seq')
#....................................................................................
# Abandon de la demande
#....................................................................................
@api.multi
def fi_demande_cancel(self):
for rec in self:
rec.etat = 'canceled'
#....................................................................................
# Affichage de la demande
#....................................................................................
def view_dmd(self):
form_id = self.env.ref(
"cgscop_fond_ingenierie.cgscop_fi_demande_form")
return {
'type': 'ir.actions.act_window',
'res_model': 'cgscop_fond_ingenierie.demande',
'view_mode': 'form',
'views': [[form_id.id, 'form']],
'res_id': self.id,
'target': 'current',
'flags': {
'default_buttons': False,
'mode': 'readonly',
}
}
#....................................................................................
# Override create
#....................................................................................
@api.model
def create(self, values):
# On récupère le no de demande
number = self.env['ir.sequence'].next_by_code('fond_ingenierie_demande_seq')
values['number']= number
# On crée le record
res = super(CgscopFondIngenierieDemande, self).create(values)
return res
#....................................................................................
# Calcul du montant de la subvention
#....................................................................................
@api.multi
@api.depends('montant_prestation')
def get_montant_demande(self):
for rec in self:
rec.montant_demande = rec.montant_prestation * 80 / 100
if rec.montant_demande > 3200:
rec.montant_demande = 3200
#....................................................................................
# Calcul de l'année du fond en string
#....................................................................................
@api.multi
@api.depends('fond_annee')
def _compute_fond_annee_char(self):
for rec in self:
rec.fond_annee_char = str(rec.fond_annee)
#....................................................................................
# Détermine la liste des dirigents
#....................................................................................
@api.multi
@api.depends('partner_id')
def _get_partner_dirigeants(self):
for rec in self:
rec.partner_dirigeants=""
if rec.partner_id:
for director in rec.partner_id.director_ids:
if len(rec.partner_dirigeants)>0:
rec.partner_dirigeants = rec.partner_dirigeants + ", "
rec.partner_dirigeants = rec.partner_dirigeants + director.name
#....................................................................................
# Récupère le dernier CA connu
#....................................................................................
@api.multi
@api.depends('partner_id')
def _get_partner_ca(self):
for rec in self:
rec.partner_ca = 0
if rec.partner_id:
lfs = rec.partner_id.liasse_fiscale_ids.search(
[['partner_id', '=', rec.partner_id.id], ['revenue_cg', '>', 0]],
limit=1,
order='year desc')
if lfs:
rec.partner_ca = lfs[0].revenue_cg
#....................................................................................
# Calcul des champs adresses
#....................................................................................
@api.onchange('presta_zip_id')
def _onchange_zip_id(self):
if self.presta_zip_id:
self.presta_zip = self.presta_zip_id.name
self.presta_city = self.presta_zip_id.city_id.name
self.presta_country_id = self.presta_zip_id.city_id.country_id
self.presta_state_id = self.presta_zip_id.city_id.state_id