Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 6080cd348a28044e0f21cf407c0ddd778a0f83f9
  • 14.0 par défaut
  • 13.0
  • 12.0 protégée
4 résultats

ir.model.access.csv

Blame
  • 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