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.

226 lines
9.7 KiB

7 years ago
[ADD] Improve Shift management après avoir généré les shifts pour une semaine, rediriger vers les shifts générés : ok Ajouter un supercoopérateur au niveau du template de shift. Pas de champs related car il faut pouvoir gérer les remplacements entre supercoopérateurs. : Rajouter un boolean sur res.users pour dire qu'ils sont super coopérateur du coup on peut choisir qu'un utilisateur super coopérateur : Ok Sur la vue des shifts, permettre de sélectionner un ensemble de shifts pour pouvoir changer son supercoopérateur en une action : Ok Avoir une vue des shifts par défaut plus lisible que le calendrier : KANBAN avec TODAY par défaut et les colonnes selon le type de shift : ok Dans la vue KANBAN du planning des semaines, faire un tri sur la start date pour que ça ressemble à une vue calendrier :ok Droits d'accès : 3 groupes : modifier un shift existant et confirmer son statut : absence/présence générer et supprimer des shifts à partir du template modifier le template des semaines et gérer la config En réfléchissant à ceux qui vont gérer les présences : il faudrait avoir une vue facile sur les shifts du jour et une manière simple de dire présent/absent/remplacé pour l'ensemble des coopérateurs présents (éviter de devoir chaque fois sélectionner le shift, cliquer sur le statut, aller au shift suivant, cliquer sur le statut...). J'ai fait un nouveau point de menu avec une vue Kanban grouper par status, il suffit de faire du drag and drop pour changer le status, les shifts sont aussi filtré sur aujourd'hui et seulement ceux ayant un worker assigné.
8 years ago
[ADD] Improve Shift management après avoir généré les shifts pour une semaine, rediriger vers les shifts générés : ok Ajouter un supercoopérateur au niveau du template de shift. Pas de champs related car il faut pouvoir gérer les remplacements entre supercoopérateurs. : Rajouter un boolean sur res.users pour dire qu'ils sont super coopérateur du coup on peut choisir qu'un utilisateur super coopérateur : Ok Sur la vue des shifts, permettre de sélectionner un ensemble de shifts pour pouvoir changer son supercoopérateur en une action : Ok Avoir une vue des shifts par défaut plus lisible que le calendrier : KANBAN avec TODAY par défaut et les colonnes selon le type de shift : ok Dans la vue KANBAN du planning des semaines, faire un tri sur la start date pour que ça ressemble à une vue calendrier :ok Droits d'accès : 3 groupes : modifier un shift existant et confirmer son statut : absence/présence générer et supprimer des shifts à partir du template modifier le template des semaines et gérer la config En réfléchissant à ceux qui vont gérer les présences : il faudrait avoir une vue facile sur les shifts du jour et une manière simple de dire présent/absent/remplacé pour l'ensemble des coopérateurs présents (éviter de devoir chaque fois sélectionner le shift, cliquer sur le statut, aller au shift suivant, cliquer sur le statut...). J'ai fait un nouveau point de menu avec une vue Kanban grouper par status, il suffit de faire du drag and drop pour changer le status, les shifts sont aussi filtré sur aujourd'hui et seulement ceux ayant un worker assigné.
8 years ago
[ADD] Improve Shift management après avoir généré les shifts pour une semaine, rediriger vers les shifts générés : ok Ajouter un supercoopérateur au niveau du template de shift. Pas de champs related car il faut pouvoir gérer les remplacements entre supercoopérateurs. : Rajouter un boolean sur res.users pour dire qu'ils sont super coopérateur du coup on peut choisir qu'un utilisateur super coopérateur : Ok Sur la vue des shifts, permettre de sélectionner un ensemble de shifts pour pouvoir changer son supercoopérateur en une action : Ok Avoir une vue des shifts par défaut plus lisible que le calendrier : KANBAN avec TODAY par défaut et les colonnes selon le type de shift : ok Dans la vue KANBAN du planning des semaines, faire un tri sur la start date pour que ça ressemble à une vue calendrier :ok Droits d'accès : 3 groupes : modifier un shift existant et confirmer son statut : absence/présence générer et supprimer des shifts à partir du template modifier le template des semaines et gérer la config En réfléchissant à ceux qui vont gérer les présences : il faudrait avoir une vue facile sur les shifts du jour et une manière simple de dire présent/absent/remplacé pour l'ensemble des coopérateurs présents (éviter de devoir chaque fois sélectionner le shift, cliquer sur le statut, aller au shift suivant, cliquer sur le statut...). J'ai fait un nouveau point de menu avec une vue Kanban grouper par status, il suffit de faire du drag and drop pour changer le status, les shifts sont aussi filtré sur aujourd'hui et seulement ceux ayant un worker assigné.
8 years ago
[ADD] Improve Shift management après avoir généré les shifts pour une semaine, rediriger vers les shifts générés : ok Ajouter un supercoopérateur au niveau du template de shift. Pas de champs related car il faut pouvoir gérer les remplacements entre supercoopérateurs. : Rajouter un boolean sur res.users pour dire qu'ils sont super coopérateur du coup on peut choisir qu'un utilisateur super coopérateur : Ok Sur la vue des shifts, permettre de sélectionner un ensemble de shifts pour pouvoir changer son supercoopérateur en une action : Ok Avoir une vue des shifts par défaut plus lisible que le calendrier : KANBAN avec TODAY par défaut et les colonnes selon le type de shift : ok Dans la vue KANBAN du planning des semaines, faire un tri sur la start date pour que ça ressemble à une vue calendrier :ok Droits d'accès : 3 groupes : modifier un shift existant et confirmer son statut : absence/présence générer et supprimer des shifts à partir du template modifier le template des semaines et gérer la config En réfléchissant à ceux qui vont gérer les présences : il faudrait avoir une vue facile sur les shifts du jour et une manière simple de dire présent/absent/remplacé pour l'ensemble des coopérateurs présents (éviter de devoir chaque fois sélectionner le shift, cliquer sur le statut, aller au shift suivant, cliquer sur le statut...). J'ai fait un nouveau point de menu avec une vue Kanban grouper par status, il suffit de faire du drag and drop pour changer le status, les shifts sont aussi filtré sur aujourd'hui et seulement ceux ayant un worker assigné.
8 years ago
[ADD] Improve Shift management après avoir généré les shifts pour une semaine, rediriger vers les shifts générés : ok Ajouter un supercoopérateur au niveau du template de shift. Pas de champs related car il faut pouvoir gérer les remplacements entre supercoopérateurs. : Rajouter un boolean sur res.users pour dire qu'ils sont super coopérateur du coup on peut choisir qu'un utilisateur super coopérateur : Ok Sur la vue des shifts, permettre de sélectionner un ensemble de shifts pour pouvoir changer son supercoopérateur en une action : Ok Avoir une vue des shifts par défaut plus lisible que le calendrier : KANBAN avec TODAY par défaut et les colonnes selon le type de shift : ok Dans la vue KANBAN du planning des semaines, faire un tri sur la start date pour que ça ressemble à une vue calendrier :ok Droits d'accès : 3 groupes : modifier un shift existant et confirmer son statut : absence/présence générer et supprimer des shifts à partir du template modifier le template des semaines et gérer la config En réfléchissant à ceux qui vont gérer les présences : il faudrait avoir une vue facile sur les shifts du jour et une manière simple de dire présent/absent/remplacé pour l'ensemble des coopérateurs présents (éviter de devoir chaque fois sélectionner le shift, cliquer sur le statut, aller au shift suivant, cliquer sur le statut...). J'ai fait un nouveau point de menu avec une vue Kanban grouper par status, il suffit de faire du drag and drop pour changer le status, les shifts sont aussi filtré sur aujourd'hui et seulement ceux ayant un worker assigné.
8 years ago
  1. # -*- coding: utf-8 -*-
  2. from openerp import models, fields, api, _
  3. from openerp.exceptions import UserError, ValidationError
  4. import json
  5. class TaskStage(models.Model):
  6. _name = 'beesdoo.shift.stage'
  7. _order = 'sequence asc'
  8. name = fields.Char()
  9. sequence = fields.Integer()
  10. color = fields.Integer()
  11. code = fields.Char(readonly=True)
  12. @api.multi
  13. def unlink(self):
  14. raise UserError(_("You Cannot delete Task Stage"))
  15. class Task(models.Model):
  16. _name = 'beesdoo.shift.shift'
  17. _inherit = ['mail.thread']
  18. _order = "start_time asc"
  19. name = fields.Char(track_visibility='always')
  20. task_template_id = fields.Many2one('beesdoo.shift.template')
  21. planning_id = fields.Many2one(related='task_template_id.planning_id', store=True)
  22. task_type_id = fields.Many2one('beesdoo.shift.type', string="Task Type")
  23. worker_id = fields.Many2one('res.partner', track_visibility='onchange',
  24. domain=[
  25. ('eater', '=', 'worker_eater'),
  26. ('working_mode', 'in', ('regular', 'irregular')),
  27. ('state', 'not in', ('unsubscribed', 'resigning')),
  28. ])
  29. start_time = fields.Datetime(track_visibility='always', index=True)
  30. end_time = fields.Datetime(track_visibility='always')
  31. stage_id = fields.Many2one('beesdoo.shift.stage', required=True, track_visibility='onchange', default=lambda self: self.env.ref('beesdoo_shift.open'))
  32. super_coop_id = fields.Many2one('res.users', string="Super Cooperative", domain=[('partner_id.super', '=', True)], track_visibility='onchange')
  33. color = fields.Integer(related="stage_id.color", readonly=True)
  34. # TODO: Maybe is_regular and is_compensation must be merged in a
  35. # selection field as they are mutually exclusive.
  36. is_regular = fields.Boolean(default=False, string="Regular shift")
  37. is_compensation = fields.Boolean(default=False, string="Compensation shift")
  38. replaced_id = fields.Many2one('res.partner', track_visibility='onchange', domain=[('eater', '=', 'worker_eater')])
  39. revert_info = fields.Text(copy=False)
  40. working_mode = fields.Selection(related='worker_id.working_mode')
  41. @api.constrains('is_regular', 'is_compensation', 'worker_id')
  42. def _check_compensation(self):
  43. for task in self:
  44. if task.working_mode == 'regular':
  45. if (task.is_regular == task.is_compensation
  46. or not (task.is_regular or task.is_compensation)):
  47. raise ValidationError(
  48. "You must choose between Regular Shift or "
  49. "Compensation Shift."
  50. )
  51. @api.onchange('worker_id')
  52. def _onchange_worker_id(self):
  53. for task in self:
  54. if task.working_mode != 'regular':
  55. task.is_regular = False
  56. task.is_compensation = False
  57. def message_auto_subscribe(self, updated_fields, values=None):
  58. self._add_follower(values)
  59. return super(Task, self).message_auto_subscribe(updated_fields, values=values)
  60. def _add_follower(self, vals):
  61. if vals.get('worker_id'):
  62. worker = self.env['res.partner'].browse(vals['worker_id'])
  63. self.message_subscribe(partner_ids=worker.ids)
  64. @api.model
  65. def _read_group_stage_id(self, ids, domain, read_group_order=None, access_rights_uid=None):
  66. res = self.env['beesdoo.shift.stage'].search([]).name_get()
  67. fold = dict.fromkeys([r[0] for r in res], False)
  68. return res, fold
  69. _group_by_full = {
  70. 'stage_id': _read_group_stage_id,
  71. }
  72. #TODO button to replaced someone
  73. @api.model
  74. def unsubscribe_from_today(self, worker_ids, today=None, end_date=None):
  75. today = today or fields.Date.today()
  76. today += ' 00:00:00'
  77. if end_date:
  78. end_date += ' 23:59:59'
  79. # date_domain = [('worker_id', 'in', worker_ids), ('start_time', '>=', today)]
  80. date_domain = [('start_time', '>=', today)]
  81. if end_date:
  82. date_domain.append(('end_time', '<=', end_date))
  83. to_unsubscribe = self.search([('worker_id', 'in', worker_ids)] + date_domain)
  84. to_unsubscribe.write({'worker_id': False, 'is_regular': False})
  85. # What about replacement ?
  86. # Remove worker, replaced_id and regular
  87. to_unsubscribe_replace = self.search([('replaced_id', 'in', worker_ids)] + date_domain)
  88. to_unsubscribe_replace.write({'worker_id': False, 'is_regular': False, 'replaced_id': False})
  89. # If worker is Super cooperator, remove it from planning
  90. super_coop_ids = self.env['res.users'].search(
  91. [('partner_id', 'in', worker_ids), ('super', '=', True)]).ids
  92. if super_coop_ids:
  93. to_unsubscribe_super_coop = self.search(
  94. [('super_coop_id', 'in', super_coop_ids)] + date_domain)
  95. to_unsubscribe_super_coop.write({'super_coop_id': False,
  96. 'is_regular': False})
  97. @api.multi
  98. def write(self, vals):
  99. """
  100. Overwrite write to track stage change
  101. If worker is changer:
  102. Revert for the current worker
  103. Change the worker info
  104. Compute stage change for the new worker
  105. """
  106. if 'worker_id' in vals:
  107. for rec in self:
  108. if rec.worker_id.id != vals['worker_id']:
  109. rec._revert()
  110. # To satisfy the constrains on worker_id, it must be
  111. # accompanied by the change in is_regular and
  112. # is_compensation field.
  113. super(Task, rec).write({
  114. 'worker_id': vals['worker_id'],
  115. 'is_regular': vals.get('is_regular', rec.is_regular),
  116. 'is_compensation': vals.get('is_compensation',
  117. rec.is_compensation),
  118. })
  119. rec._update_stage(rec.stage_id.id)
  120. if 'stage_id' in vals:
  121. for rec in self:
  122. if vals['stage_id'] != rec.stage_id.id:
  123. rec._update_stage(vals['stage_id'])
  124. return super(Task, self).write(vals)
  125. def _set_revert_info(self, data, status):
  126. data_new = {
  127. 'status_id': status.id,
  128. 'data' : {k: data.get(k, 0) * -1 for k in ['sr', 'sc', 'irregular_absence_counter']}
  129. }
  130. if data.get('irregular_absence_date'):
  131. data_new['data']['irregular_absence_date'] = False
  132. self.write({'revert_info': json.dumps(data_new)})
  133. def _revert(self):
  134. if not self.revert_info:
  135. return
  136. data = json.loads(self.revert_info)
  137. self.env['cooperative.status'].browse(data['status_id']).sudo()._change_counter(data['data'])
  138. self.revert_info = False
  139. def _update_stage(self, new_stage):
  140. self.ensure_one()
  141. self._revert()
  142. update = int(self.env['ir.config_parameter'].get_param('always_update', False))
  143. new_stage = self.env['beesdoo.shift.stage'].browse(new_stage)
  144. data = {}
  145. DONE = self.env.ref('beesdoo_shift.done')
  146. ABSENT = self.env.ref('beesdoo_shift.absent')
  147. EXCUSED = self.env.ref('beesdoo_shift.excused')
  148. NECESSITY = self.env.ref('beesdoo_shift.excused_necessity')
  149. if not (self.worker_id or self.replaced_id) and new_stage in (DONE, ABSENT, EXCUSED, NECESSITY):
  150. raise UserError(_("You cannot change to the status %s if the is no worker defined on the shift") % new_stage.name)
  151. if update or not (self.worker_id or self.replaced_id):
  152. return
  153. if self.worker_id.working_mode == 'regular':
  154. if not self.replaced_id: #No replacement case
  155. status = self.worker_id.cooperative_status_ids[0]
  156. else:
  157. status = self.replaced_id.cooperative_status_ids[0]
  158. if new_stage == DONE and not self.is_regular:
  159. if status.sr < 0:
  160. data['sr'] = 1
  161. elif status.sc < 0:
  162. data['sc'] = 1
  163. else:
  164. data['sr'] = 1
  165. if new_stage == ABSENT and not self.replaced_id:
  166. data['sr'] = - 1
  167. if status.sr <= 0:
  168. data['sc'] = -1
  169. if new_stage == ABSENT and self.replaced_id:
  170. data['sr'] = -1
  171. if new_stage == EXCUSED:
  172. data['sr'] = -1
  173. elif self.worker_id.working_mode == 'irregular':
  174. status = self.worker_id.cooperative_status_ids[0]
  175. alert_start_time = fields.Date.from_string(
  176. self.worker_id.cooperative_status_ids[0].alert_start_time
  177. )
  178. start_time = fields.Date.from_string(self.start_time)
  179. sr = self.worker_id.cooperative_status_ids[0].sr
  180. if new_stage == DONE or new_stage == NECESSITY:
  181. if start_time <= alert_start_time and sr >= -2:
  182. data['sr'] = 2
  183. else:
  184. data['sr'] = 1
  185. data['irregular_absence_date'] = False
  186. data['irregular_absence_counter'] = 1 if status.irregular_absence_counter < 0 else 0
  187. if new_stage == ABSENT or new_stage == EXCUSED:
  188. data['sr'] = -1
  189. data['irregular_absence_date'] = self.start_time[:10]
  190. data['irregular_absence_counter'] = -1
  191. else:
  192. raise UserError(_("The worker has not a proper working mode define, please check the worker is subscribed"))
  193. status.sudo()._change_counter(data)
  194. self._set_revert_info(data, status)