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.

231 lines
9.5 KiB

  1. # -*- coding: utf-8 -*-
  2. # Copyright 2019 - Today Coop IT Easy SCRLfs (<http://www.coopiteasy.be>)
  3. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
  4. from datetime import date, datetime, timedelta
  5. from openerp import fields
  6. from openerp.tests.common import TransactionCase
  7. class TestAttendanceSheet(TransactionCase):
  8. def setUp(self):
  9. super(TestAttendanceSheet, self).setUp()
  10. self.shift_model = self.env["beesdoo.shift.shift"]
  11. self.shift_template_model = self.env["beesdoo.shift.template"]
  12. self.attendance_sheet_model = self.env["beesdoo.shift.sheet"]
  13. self.attendance_sheet_shift_model = self.env[
  14. "beesdoo.shift.sheet.shift"
  15. ]
  16. self.shift_expected_model = self.env["beesdoo.shift.sheet.expected"]
  17. self.shift_added_model = self.env["beesdoo.shift.sheet.added"]
  18. self.default_task_type_id = self.env["ir.config_parameter"].get_param(
  19. "beesdoo_shift.default_task_type_id"
  20. )
  21. self.current_time = datetime.now()
  22. self.user_admin = self.env.ref("base.user_root")
  23. self.user_generic = self.env.ref(
  24. "beesdoo_shift.beesdoo_shift_user_1_demo"
  25. )
  26. self.user_permanent = self.env.ref(
  27. "beesdoo_shift.beesdoo_shift_user_2_demo"
  28. )
  29. self.worker_regular_1 = self.env.ref(
  30. "beesdoo_base.res_partner_cooperator_6_demo"
  31. )
  32. self.worker_regular_2 = self.env.ref(
  33. "beesdoo_base.res_partner_cooperator_5_demo"
  34. )
  35. self.worker_regular_3 = self.env.ref(
  36. "beesdoo_base.res_partner_cooperator_4_demo"
  37. )
  38. self.worker_regular_super_1 = self.env.ref(
  39. "beesdoo_base.res_partner_cooperator_1_demo"
  40. )
  41. self.worker_irregular_1 = self.env.ref(
  42. "beesdoo_base.res_partner_cooperator_2_demo"
  43. )
  44. self.worker_irregular_2 = self.env.ref(
  45. "beesdoo_base.res_partner_cooperator_4_demo"
  46. )
  47. self.task_type_1 = self.env.ref(
  48. "beesdoo_shift.beesdoo_shift_task_type_1_demo"
  49. )
  50. self.task_type_2 = self.env.ref(
  51. "beesdoo_shift.beesdoo_shift_task_type_2_demo"
  52. )
  53. self.task_type_3 = self.env.ref(
  54. "beesdoo_shift.beesdoo_shift_task_type_3_demo"
  55. )
  56. self.task_template_1 = self.env.ref(
  57. "beesdoo_shift.beesdoo_shift_task_template_1_demo"
  58. )
  59. self.task_template_2 = self.env.ref(
  60. "beesdoo_shift.beesdoo_shift_task_template_2_demo"
  61. )
  62. self.shift_regular_regular_1 = self.shift_model.create(
  63. {
  64. "task_template_id": self.task_template_1.id,
  65. "task_type_id": self.task_type_1.id,
  66. "worker_id": self.worker_regular_1.id,
  67. "start_time": self.current_time + timedelta(minutes=5),
  68. "end_time": self.current_time + timedelta(minutes=10),
  69. "is_regular": True,
  70. "is_compensation": False,
  71. }
  72. )
  73. self.shift_regular_regular_2 = self.shift_model.create(
  74. {
  75. "task_template_id": self.task_template_2.id,
  76. "task_type_id": self.task_type_2.id,
  77. "worker_id": self.worker_regular_2.id,
  78. "start_time": self.current_time - timedelta(minutes=50),
  79. "end_time": self.current_time - timedelta(minutes=20),
  80. "is_regular": True,
  81. "is_compensation": False,
  82. }
  83. )
  84. self.shift_regular_regular_replaced_1 = self.shift_model.create(
  85. {
  86. "task_template_id": self.task_template_1.id,
  87. "task_type_id": self.task_type_3.id,
  88. "worker_id": self.worker_regular_3.id,
  89. "start_time": self.current_time + timedelta(minutes=5),
  90. "end_time": self.current_time + timedelta(minutes=10),
  91. "is_regular": True,
  92. "is_compensation": False,
  93. "replaced_id": self.worker_regular_1.id,
  94. }
  95. )
  96. self.shift_regular_compensation_1 = self.shift_model.create(
  97. {
  98. "task_template_id": self.task_template_2.id,
  99. "task_type_id": self.task_type_1.id,
  100. "worker_id": self.worker_regular_super_1.id,
  101. "start_time": self.current_time + timedelta(minutes=9),
  102. "end_time": self.current_time + timedelta(minutes=21),
  103. "is_regular": False,
  104. "is_compensation": True,
  105. }
  106. )
  107. self.shift_irregular_1 = self.shift_model.create(
  108. {
  109. "task_template_id": self.task_template_2.id,
  110. "task_type_id": self.task_type_2.id,
  111. "worker_id": self.worker_irregular_1.id,
  112. "start_time": self.current_time + timedelta(minutes=5),
  113. "end_time": self.current_time + timedelta(minutes=10),
  114. }
  115. )
  116. self.shift_irregular_2 = self.shift_model.create(
  117. {
  118. "task_template_id": self.task_template_1.id,
  119. "task_type_id": self.task_type_3.id,
  120. "worker_id": self.worker_irregular_2.id,
  121. "start_time": self.current_time + timedelta(minutes=40),
  122. "end_time": self.current_time + timedelta(minutes=50),
  123. }
  124. )
  125. self.shift_empty_1 = self.shift_model.create(
  126. {
  127. "task_template_id": self.task_template_2.id,
  128. "task_type_id": self.task_type_1.id,
  129. "start_time": self.current_time + timedelta(minutes=5),
  130. "end_time": self.current_time + timedelta(minutes=10),
  131. }
  132. )
  133. def _search_sheets(self, start_time, end_time):
  134. return self.attendance_sheet_model.search(
  135. [("start_time", "=", start_time), ("end_time", "=", end_time)]
  136. )
  137. def test_default_task_type_setting(self):
  138. "Test default task type setting"
  139. setting_wizard = self.env["beesdoo.shift.config.settings"].sudo(
  140. self.user_admin
  141. )
  142. # do it for several task_type
  143. for task_type in (self.task_type_1, self.task_type_2):
  144. # setting default value
  145. setting_wizard_1 = setting_wizard.create(
  146. {"default_task_type_id": task_type.id}
  147. )
  148. setting_wizard_1.execute()
  149. param_id = self.env["ir.config_parameter"].get_param(
  150. "beesdoo_shift.default_task_type_id"
  151. )
  152. self.assertEquals(int(param_id), task_type.id)
  153. # check propagation on attendance sheet shifts
  154. self.assertEquals(
  155. self.attendance_sheet_shift_model.default_task_type_id(),
  156. task_type,
  157. )
  158. def test_attendance_sheet_creation(self):
  159. "Test the creation of an attendance sheet with all its expected shifts"
  160. start_in_1 = self.shift_regular_regular_1.start_time
  161. end_in_1 = self.shift_regular_regular_1.end_time
  162. start_in_2 = self.shift_regular_compensation_1.start_time
  163. end_in_2 = self.shift_regular_compensation_1.end_time
  164. start_out_1 = self.shift_regular_regular_2.start_time
  165. end_out_1 = self.shift_regular_regular_2.end_time
  166. start_out_2 = self.shift_irregular_2.start_time
  167. end_out_2 = self.shift_irregular_2.end_time
  168. # test attendance sheets creation
  169. self.attendance_sheet_model._generate_attendance_sheet()
  170. self.assertEquals(len(self._search_sheets(start_in_1, end_in_1)), 1)
  171. self.assertEquals(len(self._search_sheets(start_in_2, end_in_2)), 1)
  172. self.assertEquals(len(self._search_sheets(start_out_1, end_out_1)), 0)
  173. self.assertEquals(len(self._search_sheets(start_out_2, end_out_2)), 0)
  174. # test expected shifts creation
  175. sheet_1 = self._search_sheets(start_in_1, end_in_1)
  176. sheet_2 = self._search_sheets(start_in_2, end_in_2)
  177. self.assertTrue(sheet_1.start_time)
  178. self.assertTrue(sheet_1.end_time)
  179. # empty shift should not be added
  180. self.assertEquals(len(sheet_1.expected_shift_ids), 3)
  181. self.assertEquals(len(sheet_1.added_shift_ids), 0)
  182. self.assertEquals(len(sheet_2.expected_shift_ids), 1)
  183. # test consistency with actual shift
  184. for shift in sheet_1.expected_shift_ids:
  185. self.assertEquals(shift.worker_id, shift.task_id.worker_id)
  186. self.assertEquals(
  187. shift.replacement_worker_id, shift.task_id.replaced_id
  188. )
  189. self.assertEquals(shift.task_type_id, shift.task_id.task_type_id)
  190. self.assertEquals(shift.super_coop_id, shift.task_id.super_coop_id)
  191. self.assertEquals(shift.working_mode, shift.task_id.working_mode)
  192. if shift.working_mode == "regular":
  193. self.assertEquals(shift.stage, "absent_2")
  194. if shift.working_mode == "irregular":
  195. self.assertEquals(shift.stage, "absent_1")
  196. # test maximum number of workers calculation from task_templates
  197. self.assertEquals(sheet_1.max_worker_no, 21)
  198. # test default values creation
  199. self.assertTrue(sheet_1.time_slot)
  200. self.assertTrue(sheet_1.name)
  201. day = fields.Datetime.from_string(sheet_1.start_time)
  202. self.assertEquals(sheet_1.day, fields.Date.to_string(day))
  203. self.assertFalse(sheet_1.annotation)
  204. self.assertFalse(sheet_1.is_annotated)
  205. # test default super-cooperator setting
  206. self.assertTrue(self.shift_expected_model.default_task_type_id())