Skip to content

Commit 49ac63b

Browse files
committed
[ADD] beesdoo_shift: next_shift_id on cooperative.status
1 parent cb09394 commit 49ac63b

File tree

6 files changed

+157
-5
lines changed

6 files changed

+157
-5
lines changed

beesdoo_shift/data/cron.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<odoo>
22
<data noupdate="1">
33
<record id="ir_cron_update_today" model="ir.cron">
4-
<field name="name">Update Cooperatoor status base on the date</field>
4+
<field name="name">Update Cooperator status base on the date</field>
55
<field name="model_id" ref="model_cooperative_status" />
66
<field name="state">code</field>
77
<field name="code">model._set_today()</field>

beesdoo_shift/models/cooperative_status.py

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import logging
2-
from datetime import timedelta
2+
from datetime import datetime, timedelta
33

44
from odoo import _, api, fields, models
55
from odoo.exceptions import UserError, ValidationError
66

77
_logger = logging.getLogger(__name__)
88

9+
# todo rename mentions to cooperatives
10+
911

1012
def add_days_delta(date_from, days_delta):
1113
if not date_from:
@@ -65,7 +67,7 @@ def _get_status(self):
6567
"are based on the current date",
6668
default=fields.Date.today,
6769
)
68-
cooperator_id = fields.Many2one("res.partner")
70+
cooperator_id = fields.Many2one("res.partner") # todo rename to worker_id
6971
active = fields.Boolean(
7072
related="cooperator_id.active", store=True, index=True
7173
)
@@ -119,6 +121,23 @@ def _get_status(self):
119121
) # TODO unsubscribe when reach -2
120122
future_alert_date = fields.Date(compute="_compute_future_alert_date")
121123
next_countdown_date = fields.Date(compute="_compute_next_countdown_date")
124+
next_shift_id = fields.Many2one(
125+
comodel_name="beesdoo.shift.shift",
126+
string="Next Shift",
127+
compute="_compute_next_shift",
128+
store=True,
129+
help="Next shift the worker is subscribed to.",
130+
)
131+
next_shift_date = fields.Datetime(
132+
related="next_shift_id.start_time",
133+
string="Next Shift Date",
134+
store=True,
135+
)
136+
is_subscribed_to_shift = fields.Boolean(
137+
string="Subscribed before Alert Date",
138+
compute="_compute_next_shift",
139+
store=True,
140+
)
122141

123142
temporary_exempt_reason_id = fields.Many2one(
124143
comodel_name="cooperative.exempt.reason",
@@ -410,6 +429,52 @@ def _compute_next_countdown_date(self):
410429
for rec in self:
411430
rec.next_countdown_date = False
412431

432+
@api.multi
433+
@api.depends(
434+
"cooperator_id.shift_shift_ids",
435+
"cooperator_id.shift_shift_ids.start_time",
436+
"future_alert_date",
437+
"today",
438+
)
439+
def _compute_next_shift(self):
440+
# try to use "today" field from status if possible
441+
todays = self.mapped("today")
442+
if len(todays) == 1:
443+
today = todays.pop()
444+
now = datetime(today.year, today.month, today.day, 0, 0, 0)
445+
else:
446+
now = datetime.now()
447+
448+
# avoid searching for shift in loop
449+
cooperator_ids = self.mapped("cooperator_id").ids
450+
next_shifts = self.env["beesdoo.shift.shift"].search(
451+
[("start_time", ">=", now), ("worker_id", "in", cooperator_ids)],
452+
order="worker_id, start_time",
453+
)
454+
455+
next_shift_by_worker = {}
456+
for shift in next_shifts:
457+
# take fist shift for each worker
458+
if shift.worker_id.id not in next_shift_by_worker:
459+
next_shift_by_worker[shift.worker_id.id] = shift
460+
461+
for rec in self:
462+
rec.next_shift_id = next_shift_by_worker.get(rec.cooperator_id.id)
463+
if rec.next_shift_id:
464+
if rec.future_alert_date:
465+
future_alert_date_time = datetime(
466+
rec.future_alert_date.year,
467+
rec.future_alert_date.month,
468+
rec.future_alert_date.day,
469+
)
470+
rec.is_subscribed_to_shift = (
471+
rec.next_shift_id.start_time < future_alert_date_time
472+
)
473+
else:
474+
rec.is_subscribed_to_shift = True
475+
else:
476+
rec.is_subscribed_to_shift = False
477+
413478
def _can_shop_status(self):
414479
"""
415480
return the list of status that give access

beesdoo_shift/models/res_partner.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ class ResPartner(models.Model):
2020
compute="_compute_can_shop",
2121
store=True,
2222
)
23+
# todo implement as delegated inheritance ?
24+
# resolve as part of migration to OCA
2325
cooperative_status_ids = fields.One2many(
2426
string="Cooperative Statuses",
2527
comodel_name="cooperative.status",
@@ -66,6 +68,24 @@ class ResPartner(models.Model):
6668
subscribed_shift_ids = fields.Many2many(
6769
comodel_name="beesdoo.shift.template", readonly=True
6870
)
71+
shift_shift_ids = fields.One2many(
72+
comodel_name="beesdoo.shift.shift",
73+
inverse_name="worker_id",
74+
string="Shifts",
75+
help="All the shifts the worker is subscribed to.",
76+
)
77+
next_shift_id = fields.Many2one(
78+
related="cooperative_status_ids.next_shift_id",
79+
store=True,
80+
)
81+
is_subscribed_to_shift = fields.Boolean(
82+
related="cooperative_status_ids.is_subscribed_to_shift",
83+
store=True,
84+
)
85+
next_shift_date = fields.Datetime(
86+
related="cooperative_status_ids.next_shift_date",
87+
store=True,
88+
)
6989

7090
@api.depends("cooperative_status_ids")
7191
def _compute_can_shop(self):

beesdoo_shift/models/task.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@
99

1010
class Task(models.Model):
1111
_name = "beesdoo.shift.shift"
12-
1312
_inherit = ["mail.thread"]
14-
1513
_order = "start_time asc"
1614

1715
##################################

beesdoo_shift/tests/test_beesdoo_shift.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ def setUp(self):
2222
self.worker_regular_1 = self.env.ref(
2323
"beesdoo_shift.res_partner_worker_1_demo"
2424
)
25+
self.worker_irregular_2 = self.env.ref(
26+
"beesdoo_shift.res_partner_worker_2_demo"
27+
)
2528
self.worker_regular_3 = self.env.ref(
2629
"beesdoo_shift.res_partner_worker_3_demo"
2730
)
@@ -473,3 +476,62 @@ def test_change_worker_temporary_exemption_2(self):
473476
)
474477
exemption_wiz.exempt()
475478
self.assertEqual(self._count_number_of_shift(self.worker_regular_1), 4)
479+
480+
def test_irregular_worker_subscribed_to_shift_before_alert(self):
481+
self._generate_shifts(days=1, nb=2)
482+
self.assertFalse(
483+
self.worker_irregular_2.cooperative_status_ids.next_shift_id
484+
)
485+
486+
some_empty_shift = self.shift_model.search(
487+
[("start_time", ">=", datetime.now()), ("worker_id", "=", False)],
488+
limit=1,
489+
)
490+
491+
some_empty_shift.worker_id = self.worker_irregular_2
492+
self.assertEqual(
493+
self.worker_irregular_2.cooperative_status_ids.next_shift_id,
494+
some_empty_shift,
495+
)
496+
497+
some_empty_shift.worker_id = False
498+
self.assertFalse(
499+
self.worker_irregular_2.cooperative_status_ids.next_shift_id
500+
)
501+
502+
def test_unsubscribe_worker_from_task_template_computes_next_shift(self):
503+
self._generate_shifts(days=1, nb=2)
504+
now = datetime.now()
505+
# Check that initialisation works well
506+
next_shift = self.shift_model.search(
507+
[
508+
("start_time", ">=", now),
509+
("worker_id", "=", self.worker_regular_1.id),
510+
("task_template_id", "=", self.task_template_1.id),
511+
]
512+
)
513+
self.assertEqual(
514+
self.worker_regular_1.cooperative_status_ids.next_shift_id,
515+
next_shift,
516+
)
517+
518+
# Unsubscribe a worker from the task template
519+
self.task_template_1.worker_ids -= self.worker_regular_1
520+
521+
self.assertFalse(
522+
self.worker_regular_1.cooperative_status_ids.next_shift_id
523+
)
524+
525+
# Subscribe a worker from the task template
526+
self.task_template_1.worker_ids += self.worker_regular_1
527+
next_shift = self.shift_model.search(
528+
[
529+
("start_time", ">=", now),
530+
("worker_id", "=", self.worker_regular_1.id),
531+
("task_template_id", "=", self.task_template_1.id),
532+
]
533+
)
534+
self.assertEqual(
535+
self.worker_regular_1.cooperative_status_ids.next_shift_id,
536+
next_shift,
537+
)

beesdoo_shift/views/cooperative_status.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@
149149
<field name="can_shop" />
150150
</group>
151151
<group string="Timing information">
152+
<field name="next_shift_id" />
153+
<field name="next_shift_date" />
152154
<field
153155
name="next_countdown_date"
154156
readonly="1"
@@ -159,6 +161,11 @@
159161
readonly="1"
160162
attrs="{'invisible':[('working_mode', '!=', 'irregular')]}"
161163
/>
164+
<field
165+
name="is_subscribed_to_shift"
166+
readonly="1"
167+
attrs="{'invisible':[('working_mode', '!=', 'irregular')]}"
168+
/>
162169
<field name="time_extension" />
163170
<field name="holiday_start_time" />
164171
<field name="holiday_end_time" />

0 commit comments

Comments
 (0)