Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 89012c04b962972253441951e96bb041cbce518a
  • 12.0 par défaut protégée
2 résultats

calendar.py

Blame
  • Bifurcation depuis Le Filament / Confédération Générale des SCOP / cgscop_calendar
    Le projet source a une visibilité limitée.
    calendar.py 8,55 Kio
    # © 2019 Le Filament (<http://www.le-filament.com>)
    # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
    
    import pytz
    from datetime import timedelta
    
    from odoo import models, fields, api
    from odoo.exceptions import UserError
    
    
    class CGScopCalendar(models.Model):
        _inherit = 'calendar.event'
    
        @api.model
        def _default_coop_id(self):
            if self.env.context.get('default_res_model') == 'res.partner':
                if self.env.context.get('default_res_id'):
                    return self.env['res.partner'].browse(self.env.context.get('default_res_id'))
            return False
    
        def _default_ur(self):
            return self.env['res.company']._ur_default_get()
    
        partner_ids = fields.Many2many(domain=[
            ('user_ids', '!=', False)])
        type = fields.Selection([
            ('outside', 'Extérieur'),
            ('ur', 'UR'),
            ('absent', 'Absence, Congés, Divers')],
            string="Type de Réunion")
        location = fields.Text()
        coop_id = fields.Many2one(
            comodel_name='res.partner',
            string='Contact',
            domain=[('is_company', '=', 'True')],
            default=_default_coop_id)
        project_id = fields.Many2one(
            comodel_name="project.project",
            string="Code Activité UR",
            domain=[('allow_timesheets', '=', True)])
        cgscop_timesheet_code_id = fields.Many2one(
            related='project_id.cgscop_timesheet_code_id',
            string='Code Activité National',
            store=True)
        ur_financial_system_id = fields.Many2one(
            comodel_name='ur.financial.system',
            string='Dispositif Financier')
        ur_regional_convention_id = fields.Many2one(
            comodel_name='ur.regional.convention',
            string='Convention Régionale')
        ur_id = fields.Many2one(
            'union.regionale',
            string='Union Régionale',
            index=True,
            ondelete='restrict',
            default=_default_ur)
        ur_financial_system_nb = fields.Integer(
            string="Nb Dispositifs Financiers",
            compute="_compute_ur_system_nb")
        ur_regional_convention_nb = fields.Integer(
            string="Nb conventions régionales",
            compute="_compute_ur_system_nb")
    
        # ------------------------------------------------------
        # Compute
        # ------------------------------------------------------
        @api.depends('ur_id')
        def _compute_ur_system_nb(self):
            for event in self:
                # Calcul nombre de dispositifs financiers
                financial_system = event.env['ur.financial.system'].search([
                    ('ur_id', '=', event.ur_id.id)])
                event.ur_financial_system_nb = len(
                    financial_system)
                # Calcul nombre de conventions
                regional_convention = event.env['ur.regional.convention'].search([
                    ('ur_id', '=', event.ur_id.id)])
                event.ur_regional_convention_nb = len(
                    regional_convention)
    
        # ------------------------------------------------------
        # Onchange
        # ------------------------------------------------------
        @api.onchange('project_id')
        def _onchange_project_id(self):
            if self.project_id.partner_id:
                self.coop_id = self.project_id.partner_id
    
        @api.onchange('coop_id')
        def _onchange_coop_id(self):
            address = ''
            if self.coop_id.street:
                address += self.coop_id.street + '\n'
            if self.coop_id.street2:
                address += self.coop_id.street2 + '\n'
            if self.coop_id.street3:
                address += self.coop_id.street3 + '\n'
            if self.coop_id.zip:
                address += self.coop_id.zip + ' '
            if self.coop_id.city:
                address += self.coop_id.city
            self.location = address
            if not self.coop_id.ur_financial_system_date or \
               fields.Datetime.now() > self.coop_id.ur_financial_system_date:
                self.ur_financial_system_id = self.coop_id.ur_financial_system_id
            if not self.coop_id.ur_regional_convention_date or \
               fields.Datetime.now() > self.coop_id.ur_regional_convention_date:
                self.ur_regional_convention_id = self.coop_id.ur_regional_convention_id
    
        # ------------------------------------------------------
        # Fonction boutons
        # ------------------------------------------------------
        @api.multi
        def create_timesheet(self):
            """ Crée une ligne de temps à partir de l'entrée d'agenda
            """
            for event in self:
                if not event.project_id.analytic_account_id:
                    raise UserError("Le code activité UR doit être \
                                    renseigné sur chaque entrée d'agenda")
                else:
                    values = {
                        'user_id': self.env.user.id,
                        'project_id': event.project_id.id,
                        'account_id': event.project_id.analytic_account_id.id,
                        'ur_financial_system_id': event.ur_financial_system_id.id,
                        'name': event.name,
                        'company_id': self.env.user.company_id.id,
                        'partner_id': event.coop_id.id,
                        'event_id': event.id,
                    }
                    # Gestion des évènements sur toute la journée
                    if event.allday:
                        # Création d'une ligne de 8h pour chaque jour
                        for i in range((event.stop - event.start).days + 1):
                            values['date'] = event.start + timedelta(days=i)
                            values['unit_amount'] = 8.0
                            self.env['account.analytic.line'].create(values)
                    # Gestion des évènements sur plusieurs jours non flagués allday
                    if (event.stop - event.start).days > 0:
                        user_tz = self.env.user.tz
                        local = pytz.timezone(user_tz)
                        # Pour chaque jour
                        for i in range((event.stop - event.start).days + 1):
                            day = event.start + timedelta(days=i)
                            # si premier jour calcul heures
                            if i == 0:
                                end_day_tz = local.localize(
                                    day.replace(hour=18))
                                start_tz = fields.Datetime.context_timestamp(
                                    record=self.env.user,
                                    timestamp=event.start)
                                hours_cal = (end_day_tz - start_tz).seconds//3600
                                hours = hours_cal if hours_cal <= 8 else 8.0
                            # si dernier jour
                            elif i == (event.stop - event.start).days:
                                start_day_tz = local.localize(
                                    day.replace(hour=8))
                                stop_tz = fields.Datetime.context_timestamp(
                                    record=self.env.user,
                                    timestamp=event.stop)
                                hours_cal = (stop_tz - start_day_tz).seconds//3600
                                hours = hours_cal if hours_cal <= 8 else 8.0
                            else:
                                hours = 8.0
                            values['date'] = day
                            values['unit_amount'] = hours
                            self.env['account.analytic.line'].create(values)
                    # Gestion des évènements classiques
                    else:
                        values['date'] = event.start
                        values['unit_amount'] = event.duration
                        self.env['account.analytic.line'].create(values)
    
        @api.multi
        def duplicate_entry(self):
            """
                Duplique la ligne de temps
            """
            for event in self:
                return {
                    'type': 'ir.actions.act_window',
                    'res_model': 'calendar.event',
                    'view_type': 'form',
                    'view_mode': 'form',
                    'target': 'new',
                    'context': {
                        'default_project_id': event.project_id.id,
                        'default_name': event.name,
                        'default_coop_id': event.coop_id.id,
                        'default_partner_ids': event.partner_ids.ids,
                        'default_start': event.start,
                        'default_duration': event.duration,
                        'default_stop': event.stop,
                        'default_allday': event.allday,
                        'default_type': event.type,
                        'default_ur_financial_system_id': event.ur_financial_system_id.id,
                    },
                    'flags': {'form': {
                        'action_buttons': False,
                        'options': {
                            'mode': 'edit'}}},
                }