trytonpsk-hotel/housekeeping.py

252 lines
8.6 KiB
Python

# This file is part of Presik. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from trytond.pyson import Eval
from trytond.model import Workflow, ModelView, ModelSQL, fields, Unique
from trytond.wizard import Wizard, StateView, Button, StateReport
from trytond.report import Report
from trytond.transaction import Transaction
from datetime import datetime
from trytond.pool import Pool
STATES = {'invisible': (Eval('type') != 'service')}
class HousekeepingCleaningType(ModelSQL, ModelView):
"Housekeeping Cleaning Type"
__name__ = "hotel.housekeeping.cleaning_type"
name = fields.Char('Name', required=True, select=True)
description = fields.Text('Description')
class Housekeeping(Workflow, ModelSQL, ModelView):
'HouseKeeping'
__name__ = 'hotel.housekeeping'
employee = fields.Many2One('company.employee', 'Employee')
room = fields.Many2One('hotel.room', 'Room', required=True)
state = fields.Selection([
('inspected', 'Inspected'),
('dirty', 'Dirty'),
('clean', 'Clean'),
('maintenance', 'Maintenance'),
], 'Status', required=True, readonly=True)
state_string = state.translated('state')
availability = fields.Selection([
('blocked', 'Blocked'),
('available', 'Available'),
('occupied', 'Occupied'),
], 'Availability', required=True)
cleaning_type = fields.Many2One('hotel.housekeeping.cleaning_type',
'Cleaning Type', required=False)
availability_string = state.translated('availability')
check_list = fields.Text('Check List')
tasks = fields.One2Many('hotel.housekeeping.task', 'housekeeping',
'House Tasks')
start_date_assigned = fields.Date('Start Date Assigned')
end_date_assigned = fields.Date('End Date Assigned')
notes = fields.Text('Notes')
check_in_time = fields.Function(fields.Time('Check In Time'), 'get_check_in_time')
check_out_time = fields.Function(fields.Time('Check In Time'), 'get_check_out_time')
amenities = fields.Funtion(fields.Many2Many('hotel.room-hotel.amenities',
'room', 'amenities', 'Amenities'), 'get_amenities')
@classmethod
def __setup__(cls):
super(Housekeeping, cls).__setup__()
t = cls.__table__()
cls._sql_constraints += [
('room_uniq', Unique(t, t.room), 'The room must be unique.'),
]
cls._transitions |= set((
('clean', 'dirty'),
('clean', 'inspected'),
('clean', 'maintenance'),
('dirty', 'clean'),
('dirty', 'maintenance'),
('dirty', 'inspected'),
('maintenance', 'inspected'),
('maintenance', 'dirty'),
('inspected', 'dirty'),
('inspected', 'maintenance'),
('inspected', 'clean'),
))
cls._buttons.update({
'clean': {
'invisible': Eval('state').in_(['maintenance', 'clean']),
},
'dirty': {
'invisible': Eval('state').in_(['dirty']),
},
'inspected': {
'invisible': Eval('state').in_(['inspected']),
},
'maintenance': {
'invisible': Eval('state').in_(['maintenance']),
},
})
@staticmethod
def default_state():
return 'clean'
@staticmethod
def default_avaibility():
return 'available'
@classmethod
@ModelView.button
@Workflow.transition('clean')
def clean(cls, records):
for rec in records:
rec.cleaning_type = None
rec.save()
@classmethod
@ModelView.button
@Workflow.transition('dirty')
def dirty(cls, records):
Config = Pool().get('hotel.configuration')
config = Config.get_configuration()
for rec in records:
rec.cleaning_type = config.cleaning_occupied.id
@classmethod
@ModelView.button
@Workflow.transition('maintenance')
def maintenance(cls, records):
pass
@classmethod
@ModelView.button
@Workflow.transition('inspected')
def inspected(cls, records):
pass
def get_check_in_time(self, name):
pool = Pool()
Date = pool.get('ir.date')
Configuration = pool.get('hotel.configuration')
BookingFolio = pool.get('hotel.folio')
config = Configuration.get_configuration()
lines = BookingFolio.search_read([
('room', '=', self.room.id),
('arrival_date', '=', Date.today()),
], fields_names=['id'])
if lines:
return config.check_in_time.strftime('%H:%M %p')
def get_amenities(self, name=None):
res = []
for ame in room.amenities:
res.append(ame.id)
return res
def get_check_out_time(self, name):
# pool = Pool()
# Date = pool.get('ir.date')
# Configuration = pool.get('hotel.configuration')
# Operation = pool.get('hotel.operation')
# config = Configuration.get_configuration()
# operations = Operation.search_read([
# ('room', '=', self.room.id),
# ('end_date', '=', Date.today()),
# ], fields_names=['id'])
# if operations:
# return config.check_out_time.strftime('%H:%M %p')
pass
# def get_occupancies(self, name):
# pool = Pool()
# OccupancyLine = pool.get('hotel.occupancy.line')
# occupancies = set()
# lines = OccupancyLine.search([
# ('room.id', '=', self.room.id),
# ('occupancy.state', '=', 'confirmed'),
# ])
# for line in lines:
# occupancies.add(line.id)
# return list(occupancies)
class HotelTask(ModelSQL, ModelView):
"Hotel Task"
__name__ = "hotel.task"
name = fields.Char('Name Task', required=True, select=True)
frecuency = fields.Integer('Frecuency', select=True, help='In days')
quantity = fields.Integer('Quantity', select=True)
class HotelHousekeepingTask(ModelView, ModelSQL):
'Hotel Housekeeping Task'
__name__ = 'hotel.housekeeping.task'
housekeeping = fields.Many2One('hotel.housekeeping', 'Hotel Housekeeping',
ondelete='CASCADE', select=True, required=True)
task = fields.Many2One('hotel.task', 'Task', select=True, required=True)
frecuency = fields.Integer('Frecuency', select=True, help='In days')
quantity = fields.Integer('Quantity', select=True)
@fields.depends('task', 'frecuency')
def on_change_task(self, name=None):
if self.task:
self.frecuency = self.task.frecuency
class HousekeepingServiceStart(ModelView):
'Print Housekeeping service Start'
__name__ = 'hotel.print_housekeeping_service.start'
date = fields.Date('Date', required=True)
employee = fields.Many2One('company.employee', 'Employee')
company = fields.Many2One('company.company', 'Company', required=True)
@staticmethod
def default_date():
Date_ = Pool().get('ir.date')
return Date_.today()
@staticmethod
def default_company():
return Transaction().context.get('company')
class HousekeepingService(Wizard):
'Housekeeping Service'
__name__ = 'hotel.print_housekeeping_service'
start = StateView('hotel.print_housekeeping_service.start',
'hotel.print_housekeeping_service_start_view_form', [
Button('Cancel', 'end', 'tryton-cancel'),
Button('Open', 'print_', 'tryton-print', default=True),
])
print_ = StateReport('hotel.print_housekeeping_service.report')
def do_print_(self, action):
company = self.start.company
data = {
'date': self.start.date,
'employee': self.start.employee.id if self.start.employee else None,
'company': company.id,
}
return action, data
def transition_print_(self):
return 'end'
class HousekeepingServiceReport(Report):
__name__ = 'hotel.print_housekeeping_service.report'
@classmethod
def get_context(cls, records, header, data):
report_context = super().get_context(records, header, data)
pool = Pool()
Company = pool.get('company.company')
Housekeeping = pool.get('hotel.housekeeping')
dom = []
if data['employee']:
dom.append(('employee.id', '=', data['employee']))
housekeepings = Housekeeping.search(dom)
report_context['records'] = housekeepings
report_context['company'] = Company(data['company']).party.name
report_context['date'] = datetime.now()
return report_context