You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

145 lines
6.0 KiB

from odoo import models, fields, api, _
from odoo.exceptions import UserError
class StatusActionMixin(models.AbstractModel):
_name = "beesdoo.shift.action_mixin"
cooperator_id = fields.Many2one('res.partner', default=lambda self: self.env['res.partner'].browse(self._context.get('active_id')), required=True)
def _check(self, group='beesdoo_shift.group_shift_management'):
self.ensure_one()
if not self.env.user.has_group(group):
raise UserError(_("You don't have the required access for this operation."))
if self.cooperator_id == self.env.user.partner_id and not self.env.user.has_group('beesdoo_shift.group_cooperative_admin'):
raise UserError(_("You cannot perform this operation on yourself"))
return self.with_context(real_uid=self._uid)
class Subscribe(models.TransientModel):
_name = 'beesdoo.shift.subscribe'
_inherit = 'beesdoo.shift.action_mixin'
def _get_date(self):
date = self.env['res.partner'].browse(self._context.get('active_id')).info_session_date
if not date:
return fields.Date.today()
else:
return date
def _get_info_session_date(self):
date = (self.env['res.partner']
.browse(self._context.get('active_id'))
.info_session_date)
if date and self._get_info_session_followed():
return date
else:
return False
def _get_info_session_followed(self):
session_followed = (self.env['res.partner']
.browse(self._context.get('active_id'))
.info_session)
return session_followed
def _get_shift(self):
shifts = self.env['res.partner'].browse(self._context.get('active_id')).subscribed_shift_ids
if shifts:
return shifts[0]
return
def _get_nb_shifts(self):
return len(self.env['res.partner'].browse(self._context.get('active_id')).subscribed_shift_ids)
def _get_super(self):
return self.env['res.partner'].browse(self._context.get('active_id')).super
def _get_mode(self):
return self.env['res.partner'].browse(self._context.get('active_id')).working_mode
def _get_reset_counter_default(self):
partner = self.env['res.partner'].browse(self._context.get('active_id'))
return partner.state == 'unsubscribed' and partner.working_mode == 'regular'
info_session = fields.Boolean(string="Followed an information session", default=_get_info_session_followed)
info_session_date = fields.Date(string="Date of information session", default=_get_info_session_date)
super = fields.Boolean(string="Super Cooperator", default=_get_super)
working_mode = fields.Selection(
[
('regular', 'Regular worker'),
('irregular', 'Irregular worker'),
('exempt', 'Exempted'),
], default=_get_mode
)
exempt_reason_id = fields.Many2one('cooperative.exempt.reason', 'Exempt Reason')
shift_id = fields.Many2one('beesdoo.shift.template', default=_get_shift)
nb_shifts = fields.Integer(string='Number of shifts', default=_get_nb_shifts)
reset_counter = fields.Boolean(default=_get_reset_counter_default)
reset_compensation_counter = fields.Boolean(default=False)
unsubscribed = fields.Boolean(default=False, string="Are you sure to unsubscribe this cooperator")
irregular_start_date = fields.Date(string="Start Date", default=fields.Date.today)
resigning = fields.Boolean(default=False, help="Want to leave the beescoop")
@api.multi
def unsubscribe(self):
self = self._check()
if not self.unsubscribed:
return
status_id = self.env['cooperative.status'].search([('cooperator_id', '=', self.cooperator_id.id)])
data = {
'unsubscribed': True,
'cooperator_id': self.cooperator_id.id,
'resigning': self.resigning,
}
if status_id:
status_id.sudo().write(data)
else:
self.env['cooperative.status'].sudo().create(data)
@api.multi
def subscribe(self):
self = self._check()
if self.shift_id and self.shift_id.remaining_worker <= 0:
raise UserError(_('There is no remaining space for this shift'))
if self.shift_id:
#Remove existing shift then subscribe to the new shift
self.cooperator_id.sudo().write({'subscribed_shift_ids' : [(6,0, [self.shift_id.id])]})
if self.working_mode != 'regular':
#Remove existing shift then subscribe to the new shift
self.cooperator_id.sudo().write({'subscribed_shift_ids': [(5,)]})
data = {
'info_session': self.info_session,
'info_session_date': self.info_session_date,
'working_mode': self.working_mode,
'exempt_reason_id' : self.exempt_reason_id.id,
'super': self.super,
'cooperator_id': self.cooperator_id.id,
'unsubscribed': False,
'irregular_start_date': self.irregular_start_date,
'irregular_absence_date': False,
'irregular_absence_counter': 0,
}
if self.reset_counter:
data['sr'] = 0
data['extension_start_time'] = False
data['alert_start_time'] = False
data['time_extension'] = 0
if self.reset_compensation_counter:
data['sc'] = 0
coop_status_obj = self.env['cooperative.status']
status_id = coop_status_obj.search(
[('cooperator_id', '=', self.cooperator_id.id)])
if status_id:
status_id.sudo().write(data)
else:
status_id = coop_status_obj.sudo().create(data)
# Normally the write method is not necessary here.
# But it does not work without it. You have to make 2 registration
# to a shift to keep information like "Worker mode, session info
# ,...
status_id.sudo().write(data)
return True