79 lines
3.2 KiB
Python
79 lines
3.2 KiB
Python
from odoo import models, fields, api, _
|
|
from odoo.exceptions import ValidationError
|
|
|
|
class ReservationSchedule(models.Model):
|
|
_name = 'reservation.schedule'
|
|
_description = 'Restaurant Reservation Schedule'
|
|
_order = 'day asc'
|
|
|
|
day = fields.Selection([
|
|
('0', 'Monday'),
|
|
('1', 'Tuesday'),
|
|
('2', 'Wednesday'),
|
|
('3', 'Thursday'),
|
|
('4', 'Friday'),
|
|
('5', 'Saturday'),
|
|
('6', 'Sunday')
|
|
], string='Day of Week', required=True)
|
|
|
|
opening_time = fields.Float(string='Opening Time', default=12.0, help="Format: 14.5 for 2:30 PM")
|
|
closing_time = fields.Float(string='Closing Time', default=22.0)
|
|
|
|
has_break = fields.Boolean(string='Has Break Time', default=False)
|
|
break_start_time = fields.Float(string='Break Start Time')
|
|
break_end_time = fields.Float(string='Break End Time')
|
|
|
|
is_closed = fields.Boolean(string='Closed for Reservations', default=False)
|
|
|
|
default_slot_duration = fields.Selection([
|
|
('0.5', '30 Minutes'),
|
|
('1.0', '1 Hour'),
|
|
('1.5', '1.5 Hours'),
|
|
('2.0', '2 Hours'),
|
|
('3.0', '3 Hours'),
|
|
], string='Default Slot Duration', default='1.0', required=True)
|
|
|
|
peak_hour_ids = fields.One2many('reservation.peak.hour', 'schedule_id', string='Peak Hour Slot Overrides')
|
|
|
|
display_opening = fields.Char(compute='_compute_display_times')
|
|
display_closing = fields.Char(compute='_compute_display_times')
|
|
display_break = fields.Char(compute='_compute_display_times')
|
|
|
|
def _compute_display_times(self):
|
|
for rec in self:
|
|
rec.display_opening = self._float_to_time_str(rec.opening_time)
|
|
rec.display_closing = self._float_to_time_str(rec.closing_time)
|
|
if rec.has_break:
|
|
rec.display_break = f"{self._float_to_time_str(rec.break_start_time)} - {self._float_to_time_str(rec.break_end_time)}"
|
|
else:
|
|
rec.display_break = ""
|
|
|
|
def _float_to_time_str(self, time_float):
|
|
hours = int(time_float)
|
|
minutes = int((time_float - hours) * 60)
|
|
ampm = "am" if hours < 12 else "pm"
|
|
display_hours = hours if hours <= 12 else hours - 12
|
|
if display_hours == 0: display_hours = 12
|
|
return f"{display_hours}:{minutes:02d}{ampm}"
|
|
|
|
_sql_constraints = [
|
|
('day_unique', 'unique(day)', 'Schedule for this day already exists!')
|
|
]
|
|
|
|
@api.constrains('opening_time', 'closing_time', 'break_start_time', 'break_end_time', 'has_break')
|
|
def _check_times(self):
|
|
for rec in self:
|
|
if not rec.is_closed:
|
|
if rec.opening_time >= rec.closing_time:
|
|
raise ValidationError(_("Opening time must be before closing time."))
|
|
if rec.has_break:
|
|
if not (rec.opening_time < rec.break_start_time < rec.break_end_time < rec.closing_time):
|
|
raise ValidationError(_("Break time must be within opening and closing hours, and start before it ends."))
|
|
|
|
def name_get(self):
|
|
result = []
|
|
for rec in self:
|
|
day_name = dict(self._fields['day'].selection).get(rec.day)
|
|
result.append((rec.id, day_name))
|
|
return result
|