Thibault Francois
4 years ago
7 changed files with 2179 additions and 5 deletions
-
10beesdoo_website_shift/views/my_shift_website_templates.xml
-
5macavrac_base/__manifest__.py
-
1746macavrac_base/i18n/fr_BE.po
-
1macavrac_base/models/__init__.py
-
257macavrac_base/models/planning.py
-
25macavrac_base/models/res_partner.py
-
140macavrac_base/views/shift.xml
1746
macavrac_base/i18n/fr_BE.po
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1 +1,2 @@ |
|||||
from . import res_partner |
from . import res_partner |
||||
|
from . import planning |
@ -0,0 +1,257 @@ |
|||||
|
from datetime import datetime |
||||
|
|
||||
|
from odoo import api, models, fields |
||||
|
from odoo.addons.beesdoo_shift.models.cooperative_status import add_days_delta |
||||
|
|
||||
|
class TaskType(models.Model): |
||||
|
_inherit = "beesdoo.shift.type" |
||||
|
|
||||
|
super_only = fields.Boolean('Referent Only') |
||||
|
|
||||
|
class TaskTemplate(models.Model): |
||||
|
_inherit = 'beesdoo.shift.template' |
||||
|
|
||||
|
super_only = fields.Boolean(related="task_type_id.super_only") |
||||
|
shift_presence_value = fields.Float(default=1.0) |
||||
|
|
||||
|
class WizardSubscribe(models.TransientModel): |
||||
|
_inherit = 'beesdoo.shift.subscribe' |
||||
|
|
||||
|
def _get_mode(self): |
||||
|
partner = self.env["res.partner"].browse(self._context.get("active_id")) |
||||
|
return partner.working_mode or 'irregular' |
||||
|
|
||||
|
working_mode = fields.Selection(selection=[ |
||||
|
("irregular", "worker"), |
||||
|
("exempt", "Exempted"), |
||||
|
], default=_get_mode) |
||||
|
|
||||
|
class Task(models.Model): |
||||
|
_inherit = 'beesdoo.shift.shift' |
||||
|
|
||||
|
can_unsubscribe = fields.Boolean(compute="_compute_can_unsubscribe") |
||||
|
super_only = fields.Boolean(related="task_type_id.super_only") |
||||
|
|
||||
|
def _get_selection_status(self): |
||||
|
return [ |
||||
|
("open","Confirmed"), |
||||
|
("done","Attended"), |
||||
|
("absent","Absent"), |
||||
|
("cancel","Cancelled") |
||||
|
] |
||||
|
|
||||
|
def _get_counter_date_state_change(self, new_state): |
||||
|
""" |
||||
|
Return the cooperator_status of the cooperator that need to be |
||||
|
change and data that need to be change. It does not perform the |
||||
|
change directly. The cooperator_status will be changed by the |
||||
|
_change_counter function. |
||||
|
|
||||
|
Check has been done to ensure that worker is legitimate. |
||||
|
""" |
||||
|
data = {} |
||||
|
status = self.worker_id.cooperative_status_ids[0] |
||||
|
if new_state == "done": |
||||
|
data['sr'] = self.task_template_id.shift_presence_value or 1.0 |
||||
|
|
||||
|
return data, status |
||||
|
|
||||
|
def _compute_can_unsubscribe(self): |
||||
|
for rec in self: |
||||
|
print(datetime.now()) |
||||
|
rec.can_unsubscribe = True |
||||
|
|
||||
|
|
||||
|
class CooperativeStatus(models.Model): |
||||
|
_inherit = 'cooperative.status' |
||||
|
|
||||
|
def _get_status(self): |
||||
|
return [ |
||||
|
("ok", "Up to Date"), |
||||
|
("alert", "Alerte"), |
||||
|
("suspended", "Suspended"), |
||||
|
("exempted", "Exempted"), |
||||
|
("unsubscribed", "Unsubscribed"), |
||||
|
("resigning", "Resigning"), |
||||
|
] |
||||
|
# TODO auto init for automatic migration |
||||
|
sr = fields.Float() |
||||
|
future_alert_date = fields.Date(compute="_compute_future_alert_date") |
||||
|
next_countdown_date = fields.Date(compute="_compute_next_countdown_date") |
||||
|
|
||||
|
######################################################## |
||||
|
# Method to override # |
||||
|
# To define the behavior of the status # |
||||
|
# # |
||||
|
# By default: everyone is always up to date # |
||||
|
######################################################## |
||||
|
|
||||
|
############################## |
||||
|
# Computed field section # |
||||
|
############################## |
||||
|
def _next_countdown_date(self, irregular_start_date, today): |
||||
|
""" |
||||
|
Return the next countdown date given irregular_start_date and |
||||
|
today dates. |
||||
|
This does not take holiday and other status into account. |
||||
|
""" |
||||
|
|
||||
|
delta = (today - irregular_start_date).days |
||||
|
if not delta % self._period: |
||||
|
return today |
||||
|
return add_days_delta(today, self._period - (delta % self._period)) |
||||
|
|
||||
|
|
||||
|
@api.depends( |
||||
|
"today", |
||||
|
"sr", |
||||
|
"temporary_exempt_start_date", |
||||
|
"temporary_exempt_end_date", |
||||
|
) |
||||
|
def _compute_future_alert_date(self): |
||||
|
"""Compute date before which the worker is up to date""" |
||||
|
for rec in self: |
||||
|
# Only for irregular worker |
||||
|
# Alert start time already set |
||||
|
real_today = rec.today |
||||
|
if rec.alert_start_time: |
||||
|
rec.future_alert_date = False |
||||
|
elif rec.working_mode != "irregular" or not rec.irregular_start_date: |
||||
|
rec.future_alert_date = False |
||||
|
else: |
||||
|
date = rec.today |
||||
|
counter = rec.sr |
||||
|
next_countdown_date = False |
||||
|
while counter >= 0: |
||||
|
next_countdown_date = self._next_countdown_date(rec.irregular_start_date, date) |
||||
|
rec.today = next_countdown_date |
||||
|
if rec.status != 'exempted': |
||||
|
counter -= 1 |
||||
|
rec.today = real_today |
||||
|
date = add_days_delta(next_countdown_date, 1) |
||||
|
rec.future_alert_date = next_countdown_date |
||||
|
rec.today = real_today |
||||
|
|
||||
|
|
||||
|
@api.depends( |
||||
|
"today", |
||||
|
"irregular_start_date", |
||||
|
"holiday_start_time", |
||||
|
"holiday_end_time", |
||||
|
"temporary_exempt_start_date", |
||||
|
"temporary_exempt_end_date", |
||||
|
) |
||||
|
def _compute_next_countdown_date(self): |
||||
|
""" |
||||
|
Compute the following countdown date. This date is the date when |
||||
|
the worker will see his counter changed du to the cron. This |
||||
|
date is like the birthday date of the worker that occurred each |
||||
|
PERIOD. |
||||
|
""" |
||||
|
for rec in self: |
||||
|
real_today = rec.today |
||||
|
# Only for irregular worker |
||||
|
if rec.working_mode != "irregular" or not rec.irregular_start_date: |
||||
|
rec.next_countdown_date = False |
||||
|
else: |
||||
|
next_countdown_date = rec.today |
||||
|
while True: |
||||
|
next_countdown_date = self._next_countdown_date(rec.irregular_start_date, next_countdown_date) |
||||
|
rec.today = next_countdown_date |
||||
|
if rec.status != 'exempted': |
||||
|
rec.next_countdown_date = next_countdown_date |
||||
|
rec.today = real_today |
||||
|
break |
||||
|
else: |
||||
|
next_countdown_date = add_days_delta(next_countdown_date, 1) |
||||
|
|
||||
|
##################################### |
||||
|
# Status Change implementation # |
||||
|
##################################### |
||||
|
|
||||
|
def _get_regular_status(self): |
||||
|
""" |
||||
|
Return the value of the status |
||||
|
for the regular worker |
||||
|
""" |
||||
|
ICP = self.env["ir.config_parameter"].sudo() |
||||
|
suspended_count = int(ICP.get_param("suspended_count", -2)) |
||||
|
unsubscribed_count = int(ICP.get_param("unsubscribed_count", -4)) |
||||
|
if (self.temporary_exempt_start_date |
||||
|
and self.temporary_exempt_end_date |
||||
|
and self.today >= self.temporary_exempt_start_date |
||||
|
and self.today <= self.temporary_exempt_end_date |
||||
|
): |
||||
|
return 'exempted' |
||||
|
if self.sr >= 0: |
||||
|
return 'ok' |
||||
|
|
||||
|
if self.sr <= unsubscribed_count: |
||||
|
return 'unsubscribed' |
||||
|
if self.sr <= suspended_count: |
||||
|
return 'suspended' |
||||
|
if self.sr < 0: |
||||
|
return 'alert' |
||||
|
return 'ok' |
||||
|
|
||||
|
def _get_irregular_status(self): |
||||
|
""" |
||||
|
Return the value of the status |
||||
|
for the irregular worker |
||||
|
""" |
||||
|
return self._get_regular_status() |
||||
|
|
||||
|
def _state_change(self, new_state): |
||||
|
""" |
||||
|
Hook to watch change in the state |
||||
|
""" |
||||
|
self.ensure_one() |
||||
|
if new_state == "unsubscribed" or new_state == "resigning": |
||||
|
# Remove worker from task_templates |
||||
|
self.cooperator_id.sudo().write( |
||||
|
{"subscribed_shift_ids": [(5, 0, 0)]} |
||||
|
) |
||||
|
# Remove worker from supercoop in task_templates |
||||
|
task_tpls = self.env["beesdoo.shift.template"].search( |
||||
|
[("super_coop_id", "in", self.cooperator_id.user_ids.ids)] |
||||
|
) |
||||
|
task_tpls.write({"super_coop_id": False}) |
||||
|
# Remove worker for future tasks (remove also supercoop) |
||||
|
self.env["beesdoo.shift.shift"].sudo().unsubscribe_from_today( |
||||
|
[self.cooperator_id.id], now=fields.Datetime.now() |
||||
|
) |
||||
|
if new_state == "alert": |
||||
|
self.write({"alert_start_time": self.today}) |
||||
|
|
||||
|
def _change_counter(self, data): |
||||
|
""" |
||||
|
Call when a shift state is changed |
||||
|
use data generated by _get_counter_date_state_change |
||||
|
""" |
||||
|
self.sr += data.get("sr", 0) |
||||
|
|
||||
|
|
||||
|
############################################### |
||||
|
###### Irregular Cron implementation ########## |
||||
|
############################################### |
||||
|
|
||||
|
def _get_irregular_worker_domain(self, today): |
||||
|
""" |
||||
|
return the domain the give the list |
||||
|
of valid irregular worker that should |
||||
|
get their counter changed by the cron |
||||
|
""" |
||||
|
return [ |
||||
|
("status", "not in", ["unsubscribed", "exempted", "resigning"]), |
||||
|
("irregular_start_date", "!=", False), |
||||
|
] |
||||
|
|
||||
|
def _change_irregular_counter(self): |
||||
|
""" |
||||
|
Define how the counter will change |
||||
|
for the irregular worker |
||||
|
where today - start_date is a multiple of the period |
||||
|
by default 28 days |
||||
|
""" |
||||
|
self.sr -= 1 |
||||
|
|
@ -0,0 +1,140 @@ |
|||||
|
<odoo> |
||||
|
<record model="ir.ui.view" id="type_view_form_inherit"> |
||||
|
<field name="name">Shift Type Form Inherit</field> |
||||
|
<field name="model">beesdoo.shift.type</field> |
||||
|
<field name="inherit_id" ref="beesdoo_shift.type_view_form" /> |
||||
|
<field name="arch" type="xml"> |
||||
|
<field name="name" position="after"> |
||||
|
<field name="super_only" /> |
||||
|
</field> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="task_template_view_form_inherit"> |
||||
|
<field name="name">Task Template Form Inherit</field> |
||||
|
<field name="model">beesdoo.shift.template</field> |
||||
|
<field name="inherit_id" ref="beesdoo_shift.task_template_view_form" /> |
||||
|
<field name="arch" type="xml"> |
||||
|
<field name="super_coop_id" position="attributes"> |
||||
|
<attribute name="invisible">1</attribute> |
||||
|
</field> |
||||
|
<field name="task_type_id" position="after"> |
||||
|
<field name="super_only" invisible="1" /> |
||||
|
<field name="shift_presence_value" /> |
||||
|
</field> |
||||
|
<field name="worker_ids" position="attributes"> |
||||
|
<attribute name="domain">[("is_worker", "=", True), ('need_referent', '=', super_only)]</attribute> |
||||
|
</field> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="task_view_form_inherit"> |
||||
|
<field name="name">Task Form inherit</field> |
||||
|
<field name="inherit_id" ref="beesdoo_shift.task_view_form" /> |
||||
|
<field name="model">beesdoo.shift.shift</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<field name="super_coop_id" position="attributes"> |
||||
|
<attribute name="invisible">1</attribute> |
||||
|
</field> |
||||
|
<field name="replaced_id" position="attributes"> |
||||
|
<attribute name="invisible">1</attribute> |
||||
|
</field> |
||||
|
<field name="is_regular" position="attributes"> |
||||
|
<attribute name="invisible">1</attribute> |
||||
|
</field> |
||||
|
<field name="is_compensation" position="attributes"> |
||||
|
<attribute name="invisible">1</attribute> |
||||
|
</field> |
||||
|
<field name="task_type_id" position="after"> |
||||
|
<field name="super_only" invisible="1" /> |
||||
|
</field> |
||||
|
<field name="worker_id" position="attributes"> |
||||
|
<attribute name="domain">[('cooperative_status_ids.status', 'not in', ('unsubscribed', 'resigning')), ('need_referent', '=', super_only)]</attribute> |
||||
|
</field> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="coop_status_form_view_inherit"> |
||||
|
<field name="name">Coop Status Form View Inherit</field> |
||||
|
<field name="inherit_id" ref="beesdoo_shift.coop_status_form_view" /> |
||||
|
<field name="model">cooperative.status</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<field name="irregular_start_date" position="attributes"> |
||||
|
<attribute name="attrs" ></attribute> |
||||
|
<attribute name="string">Start date</attribute> |
||||
|
</field> |
||||
|
<field name="sc" position="attributes"> |
||||
|
<attribute name="invisible" >1</attribute> |
||||
|
</field> |
||||
|
<field name="time_extension" position="attributes"> |
||||
|
<attribute name="invisible" >1</attribute> |
||||
|
</field> |
||||
|
<field name="extension_start_time" position="attributes"> |
||||
|
<attribute name="invisible" >1</attribute> |
||||
|
</field> |
||||
|
<field name="info_session" position="attributes"> |
||||
|
<attribute name="invisible" >1</attribute> |
||||
|
</field> |
||||
|
<field name="info_session_date" position="attributes"> |
||||
|
<attribute name="invisible" >1</attribute> |
||||
|
</field> |
||||
|
<field name="irregular_absence_counter" position="attributes"> |
||||
|
<attribute name="invisible" >1</attribute> |
||||
|
</field> |
||||
|
<field name="irregular_absence_date" position="attributes"> |
||||
|
<attribute name="invisible" >1</attribute> |
||||
|
</field> |
||||
|
<field name="holiday_start_time" position="attributes"> |
||||
|
<attribute name="invisible" >1</attribute> |
||||
|
</field> |
||||
|
<field name="holiday_end_time" position="attributes"> |
||||
|
<attribute name="invisible" >1</attribute> |
||||
|
</field> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record model="ir.ui.view" id="super_coop_partner_inherited_view_form"> |
||||
|
<field name="name">Partner Macavrac</field> |
||||
|
<field name="model">res.partner</field> |
||||
|
<field name="inherit_id" ref="beesdoo_shift.super_coop_partner_inherited_view_form"/> |
||||
|
<field name="priority">50</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<button name="coop_subscribe" string="Subscribe to shift" |
||||
|
class="oe_highlight" |
||||
|
type="object" |
||||
|
groups="beesdoo_shift.group_shift_management" |
||||
|
attrs="{'invisible': [('is_worker', '=', False)]}"/> |
||||
|
<button name="auto_extension" position="attributes"> |
||||
|
<attribute name="invisible">1</attribute> |
||||
|
</button> |
||||
|
<button name="manual_extension" position="attributes"> |
||||
|
<attribute name="invisible">1</attribute> |
||||
|
</button> |
||||
|
<button name="register_holiday" position="attributes"> |
||||
|
<attribute name="invisible">1</attribute> |
||||
|
</button> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
|
||||
|
<!-- Wizard view modification --> |
||||
|
<record model="ir.ui.view" id="subscribe_coop_wizard_view_form_inherit"> |
||||
|
<field name="name">Subscribe Cooperator</field> |
||||
|
<field name="model">beesdoo.shift.subscribe</field> |
||||
|
<field name="inherit_id" ref="beesdoo_shift.subscribe_coop_wizard_view_form" /> |
||||
|
<field name="arch" type="xml"> |
||||
|
<field name="shift_id" position="attributes"> |
||||
|
<attribute name="attrs"></attribute> |
||||
|
</field> |
||||
|
<field name="info_session" position="attributes"> |
||||
|
<attribute name="invisible">1</attribute> |
||||
|
</field> |
||||
|
<field name="info_session_date" position="attributes"> |
||||
|
<attribute name="invisible">1</attribute> |
||||
|
</field> |
||||
|
<field name="reset_compensation_counter" position="attributes"> |
||||
|
<attribute name="invisible">1</attribute> |
||||
|
</field> |
||||
|
</field> |
||||
|
</record> |
||||
|
</odoo> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue