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.

151 lines
7.9 KiB

5 years ago
  1. # © 2019 Le Filament (<http://www.le-filament.com>)
  2. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
  3. from odoo import models, fields, api
  4. # import dateutil.rrule as rrule
  5. # from datetime import date
  6. from dateutil.relativedelta import *
  7. from dateutil.easter import *
  8. from dateutil.rrule import *
  9. from dateutil.parser import *
  10. from datetime import *
  11. class VracoopPointRetrait(models.Model):
  12. _name = "vracoop.point.retrait"
  13. _description = "Point de retrait"
  14. _inherit = ['website.published.multi.mixin']
  15. @api.model
  16. def default_get(self, fields):
  17. res = super(VracoopPointRetrait, self).default_get(fields)
  18. vracoop_time_ids = self.env['vracoop.time'].search([])
  19. vracoop_retrait_time_ids = []
  20. for vracoop_time_id in vracoop_time_ids:
  21. if vracoop_time_id.name == 'samedi' or vracoop_time_id.name == 'dimanche':
  22. active_day = False
  23. else:
  24. active_day = True
  25. vals = {
  26. 'vracoop_time_id': vracoop_time_id.id,
  27. 'name': vracoop_time_id.name,
  28. 'first_morning_heure': vracoop_time_id.first_morning_heure,
  29. 'last_morning_heure': vracoop_time_id.last_morning_heure,
  30. 'first_noon_heure': vracoop_time_id.first_noon_heure,
  31. 'last_noon_heure': vracoop_time_id.last_noon_heure,
  32. 'preparation_time': vracoop_time_id.preparation_time,
  33. 'availability_time': vracoop_time_id.availability_time,
  34. 'active_day': active_day
  35. }
  36. vracoop_retrait_time_ids.append((0, 0, vals))
  37. res.update({'vracoop_retrait_time_ids': vracoop_retrait_time_ids})
  38. return res
  39. name = fields.Char("Nom du point relais")
  40. active = fields.Boolean(default=True)
  41. street = fields.Char()
  42. street2 = fields.Char()
  43. zip = fields.Char(change_default=True)
  44. city = fields.Char()
  45. state_id = fields.Many2one(
  46. "res.country.state",
  47. string='State',
  48. ondelete='restrict',
  49. domain="[('country_id', '=?', country_id)]")
  50. country_id = fields.Many2one(
  51. 'res.country', string='Country', ondelete='restrict')
  52. image = fields.Binary("Image", attachment=True,)
  53. image_medium = fields.Binary("Medium-sized image", attachment=True)
  54. image_small = fields.Binary("Small-sized image", attachment=True)
  55. vracoop_retrait_time_ids = fields.One2many(
  56. comodel_name='vracoop.retrait.time',
  57. inverse_name='vracoop_point_retrait_id',
  58. string="Configuration des horaires")
  59. nb_max_retrait = fields.Integer(
  60. "Nombre de retrait max par tranche horaire")
  61. nb_day_available = fields.Integer("Nombre de jours pour commande")
  62. @api.multi
  63. def slot_calculate(self):
  64. self.ensure_one()
  65. LIST_WEEK_DAY = [
  66. ('lundi',0),
  67. ('mardi',1),
  68. ('mercredi',2),
  69. ('jeudi',3),
  70. ('vendredi',4),
  71. ('samedi',5),
  72. ('dimanche',6),
  73. ]
  74. for rec in self:
  75. my_datetime = datetime.today()
  76. return_slot_list = []
  77. vals = []
  78. list_week = list(rrule(DAILY, count=rec.nb_day_available, dtstart=datetime.today()))
  79. for week in list_week:
  80. corresponding_line = rec.vracoop_retrait_time_ids.search([
  81. ('vracoop_point_retrait_id', '=', rec.id), ('name', '=', week.strftime("%A"))])
  82. for week_day in LIST_WEEK_DAY:
  83. if week_day[0] == week.strftime("%A"):
  84. byweekday = week_day[1]
  85. time_available_week = datetime(week.year, week.month, week.day) + timedelta(hours=corresponding_line.availability_time)
  86. hour = time_available_week.strftime("%H")
  87. minute = time_available_week.strftime("%M")
  88. interval = int(hour)*60 + int(minute)
  89. if week.day == my_datetime.day:
  90. first_morning_hour_week = datetime(week.year, week.month, week.day) + timedelta(hours=corresponding_line.first_morning_heure)
  91. last_morning_hour_week = datetime(week.year, week.month, week.day) + timedelta(hours=corresponding_line.last_morning_heure)
  92. first_noon_hour_week = datetime(week.year, week.month, week.day) + timedelta(hours=corresponding_line.first_noon_heure)
  93. last_noon_hour_week = datetime(week.year, week.month, week.day) + timedelta(hours=corresponding_line.last_noon_heure)
  94. today_hour_available = my_datetime + timedelta(hours=corresponding_line.preparation_time)
  95. if (today_hour_available > first_morning_hour_week) and (today_hour_available < last_morning_hour_week):
  96. dtstart_morning = today_hour_available
  97. dtstart_noon = first_noon_hour_week
  98. elif (today_hour_available > first_noon_hour_week) and (today_hour_available < last_noon_hour_week):
  99. dtstart_morning = today_hour_available
  100. dtstart_noon = today_hour_available
  101. elif (today_hour_available > last_morning_hour_week) and (today_hour_available < first_noon_hour_week):
  102. dtstart_morning = today_hour_available
  103. dtstart_noon = first_noon_hour_week
  104. else:
  105. dtstart_morning = today_hour_available
  106. dtstart_noon = today_hour_available
  107. list_slot_per_day_morning = list(rrule(MINUTELY, interval=interval,
  108. byweekday=byweekday,
  109. dtstart=dtstart_morning,
  110. until=last_morning_hour_week))
  111. list_slot_per_day_noon = list(rrule(MINUTELY, interval=interval,
  112. byweekday=byweekday,
  113. dtstart=dtstart_noon,
  114. until=last_noon_hour_week))
  115. else:
  116. first_morning_hour_week = datetime(week.year, week.month, week.day) + timedelta(hours=corresponding_line.first_morning_heure)
  117. last_morning_hour_week = datetime(week.year, week.month, week.day) + timedelta(hours=corresponding_line.last_morning_heure)
  118. first_noon_hour_week = datetime(week.year, week.month, week.day) + timedelta(hours=corresponding_line.first_noon_heure)
  119. last_noon_hour_week = datetime(week.year, week.month, week.day) + timedelta(hours=corresponding_line.last_noon_heure)
  120. list_slot_per_day_morning = list(rrule(MINUTELY, interval=interval,
  121. byweekday=byweekday,
  122. dtstart=first_morning_hour_week,
  123. until=last_morning_hour_week))
  124. list_slot_per_day_noon = list(rrule(MINUTELY, interval=interval,
  125. byweekday=byweekday,
  126. dtstart=first_noon_hour_week,
  127. until=last_noon_hour_week))
  128. slots = []
  129. for slot_per_day_morning in list_slot_per_day_morning:
  130. first_slot = slot_per_day_morning.strftime("%H:%M")
  131. slot_per_day_morning = slot_per_day_morning + timedelta(hours=corresponding_line.availability_time)
  132. last_slot = slot_per_day_morning.strftime("%H:%M")
  133. slots.append((first_slot,last_slot))
  134. for slot_per_day_noon in list_slot_per_day_noon:
  135. first_slot = slot_per_day_noon.strftime("%H:%M")
  136. slot_per_day_noon = slot_per_day_noon + timedelta(hours=corresponding_line.availability_time)
  137. last_slot = slot_per_day_noon.strftime("%H:%M")
  138. slots.append((first_slot,last_slot))
  139. return_slot_list = slots
  140. vals.append((week.strftime("%a"), week, week.strftime("%b"), return_slot_list))
  141. return vals