Hi,
I created a custom field to get the availability of a room. The availability is determined if the room has folios in a specific date with a folio state in check_in, reserved or pending. The field works well but not the searcher.
Any help will be helpful. Thanks in advance.
@classmethod
def get_availability(cls, rooms, name):
pool = Pool()
Folio = pool.get('hotel.folio')
result = {}
ctx = Transaction().context
arrival_date = ctx.get('arrival_date')
departure_date = ctx.get('departure_date')
for room in rooms:
result[room.id] = 'available'
if arrival_date and departure_date:
for room in rooms:
clause = [
('arrival_date','<',departure_date),
('departure_date','>',arrival_date),
('room','=', room.id),
]
folios = Folio.search(clause,
limit=1,
order=[('id','DESC')]
)
if folios:
for folio in folios:
if folio.registration_state == 'reserved':
result[room.id] = 'reserved'
elif folio.registration_state in ['check_in', 'pending'] :
result[room.id] = 'occupied'
return result
@classmethod
def search_availability(cls, name, domain):
pool = Pool()
Folio = pool.get('hotel.folio')
table = cls.__table__()
folio = Folio.__table__()
_, operator_, state = domain
Operator = fields.SQL_OPERATORS[operator_]
ctx = Transaction().context
arrival_date = ctx.get('arrival_date')
departure_date = ctx.get('departure_date')
if arrival_date and departure_date:
state_case = Case(
( ((folio.arrival_date < departure_date) &
(folio.departure_date > arrival_date) &
(folio.registration_state == 'pending')), 'reserved'),
( ((folio.arrival_date < departure_date) &
(folio.departure_date > arrival_date) &
(folio.registration_state == 'reserved')), 'reserved'),
( ((folio.arrival_date < departure_date) &
(folio.departure_date > arrival_date) &
(folio.registration_state == 'check_in')), 'occupied'),
else_='available')
state_query = (table.join(
folio, 'LEFT', condition=table.id == folio.room,
)
.select(
table.id,
where=(
Operator(state_case, state)),
order_by=[folio.id.desc],
),
)
return [('id', 'in', state_query)]
return []