diff --git a/__init__.py b/__init__.py
index 9d1cd29..9bcb14a 100644
--- a/__init__.py
+++ b/__init__.py
@@ -38,22 +38,22 @@ def register():
company.Company,
folio.Folio,
folio.FolioCharge,
- # folio.folioMaintenance,
- # folio.folioGuest,
- # folio.TransferfolioStart,
- # folio.TransferChargeStart,
+ folio.FolioStockMove,
+ folio.OpenMigrationStart,
party.Party,
channel.ChannelTax,
- booking.Guest,
booking.SelectRoomsAsk,
booking.BookingVoucher,
booking.RoomsOccupancyStart,
booking.BookingForecastStart,
- # folio.OpenMigrationStart,
+ folio.FolioGuest,
+ folio.GuestsListStart,
+ # folio.TransferfolioStart,
+ # folio.TransferChargeStart,
# folio.CheckOutfolioFailed,
# folio.ChangeRoomStart,
# folio.folioVoucher,
- # folio.StatisticsByMonthStart,
+ folio.StatisticsByMonthStart,
sale.InvoiceIncomeDailyStart,
service.Service,
service.ServiceLine,
@@ -64,39 +64,38 @@ def register():
housekeeping.HotelTask,
housekeeping.HousekeepingServiceStart,
room.CleanningDays,
- booking.GuestsListStart,
module='hotel', type_='model')
Pool.register(
booking.BookingReport,
booking.BookingForecastReport,
booking.RoomsOccupancyReport,
booking.BookingDailyReport,
- # folio.Migration,
+ folio.Migration,
+ folio.GuestsListReport,
+ folio.RegistrationCardReport,
# folio.folioReport,
# folio.folioByConsumerReport,
- # folio.StatisticsByMonthReport,
+ folio.StatisticsByMonthReport,
sale.InvoiceIncomeDailyReport,
sale.InvoiceSimplifiedReport,
service.ServiceReport,
- booking.RegistrationCardReport,
housekeeping.HousekeepingServiceReport,
- booking.GuestsListReport,
module='hotel', type_='report')
Pool.register(
booking.SelectRooms,
booking.BookingForecast,
booking.RoomsOccupancy,
booking.BookingDaily,
- # folio.OpenMigration,
+ folio.OpenMigration,
+ folio.GuestsList,
# folio.CheckOutfolio,
# folio.folioBill,
# folio.ChangeRoom,
# folio.Transferfolio,
# folio.TransferCharge,
- # folio.StatisticsByMonth,
+ folio.StatisticsByMonth,
service.CreateDailyServices,
housekeeping.HousekeepingService,
- booking.GuestsList,
sale.InvoiceIncomeDaily,
party.CreateGuest,
module='hotel', type_='wizard')
diff --git a/booking.py b/booking.py
index 696a76b..39f2bd5 100644
--- a/booking.py
+++ b/booking.py
@@ -563,146 +563,6 @@ class BookingVoucher(ModelSQL):
}])
-class Guest(ModelSQL, ModelView):
- 'Guest'
- __name__ = 'hotel.booking.guest'
- _rec_name = 'party'
- booking_line = fields.Many2One('hotel.folio', 'Booking Line',
- required=True, ondelete='CASCADE')
- party = fields.Many2One('party.party', 'Party', required=False)
- type_guest = fields.Selection([
- ('adult', 'Adult'),
- ('child', 'Child'),
- ], 'Type Guest')
- type_guest_string = type_guest.translated('type_guest')
- nationality = fields.Many2One('party.nationality', 'Nationality')
- origin_country = fields.Many2One('party.nationality', 'Origin Country',
- select=True)
- target_country = fields.Many2One('party.nationality', 'Target Country',
- select=True)
-
- # New fields for speed reason
- type_document = fields.Selection([
- ('12', 'Tarjeta de Identidad'),
- ('13', 'Cedula de Ciudadania'),
- ('21', 'Tarjeta de Extranjeria'),
- ('22', 'Cedula de Extranjeria'),
- ('41', 'Pasaporte'),
- ], 'Document Type')
- doc_number = fields.Char('Doc. Id', select=True)
- name = fields.Char('Name', select=True)
- mobile = fields.Char('Mobile', select=True)
- email = fields.Char('Email', select=True)
- birthday = fields.Date('Birthday', select=True)
- sex = fields.Selection([
- ('female', 'Female'),
- ('male', 'Male'),
- ('', ''),
- ], 'Sex')
- first_name = fields.Char('First Name')
- second_name = fields.Char('Second Name')
- first_family_name = fields.Char('First Family Name')
- second_family_name = fields.Char('Second Family Name')
- type_person = fields.Selection([
- ('persona_natural', 'Persona Natural'),
- ('persona_juridica', 'Persona Juridica'),
- ], 'Type Person')
-
- @fields.depends('name', 'first_name', 'second_name',
- 'first_family_name', 'second_family_name', 'type_person')
- def on_change_name(self):
- second_family_name = None
- first_family_name = None
- second_name = None
- first_name = None
- if self.name and self.type_person == 'persona_natural':
- names = self.name.split(' ')
- first_name = names[0]
- second_family_name = names[-1]
- if len(names) > 1:
- first_family_name = names[-2]
- if len(names) == 2:
- second_family_name = None
- first_family_name = names[1]
- elif len(names) == 5:
- second_name = names[1] + ' ' + names[2]
- elif len(names) == 4:
- second_name = names[1]
-
- self.second_family_name = second_family_name
- self.first_family_name = first_family_name
- self.second_name = second_name
- self.first_name = first_name
-
- def get_rec_name(self, name):
- if self.party:
- return self.party.name
-
- @staticmethod
- def default_type_guest():
- return 'adult'
-
- @staticmethod
- def default_sex():
- return 'male'
-
- @staticmethod
- def default_type_person():
- return 'persona_natural'
-
- @staticmethod
- def default_type_document():
- return '13'
-
- @staticmethod
- def default_principal_guest():
- return False
-
- @fields.depends('nationality', 'origin_country', 'target_country')
- def on_change_nationality(self):
- if self.nationality:
- self.target_country = self.nationality.id
- self.origin_country = self.nationality.id
-
- @classmethod
- def create(cls, vlist):
- Party = Pool().get('party.party')
- new_values = []
- for v in vlist:
- # if not v.get('doc_number'):
- # continue
- party = v.get('party')
- if not party:
- parties = Party.search([
- ('id_number', '=', v['doc_number']),
- ])
- if parties:
- party = parties[0]
- else:
- party, = Party.create([{
- 'name': v['name'],
- 'id_number': v['doc_number'],
- 'type_document': v['type_document'],
- 'birthday': v['birthday'],
- 'sex': v['sex'],
- 'first_name': v['first_name'],
- 'second_name': v['second_name'],
- 'first_family_name': v['first_family_name'],
- 'second_family_name': v['second_family_name'],
- 'type_person': v['type_person'],
- 'contact_mechanisms': [
- ('create', [
- {'type': 'email', 'value': v['email']},
- {'type': 'mobile', 'value': v['mobile']},
- ])
- ]
- }])
- v['party'] = party.id
- new_values.append(v)
-
- super(Guest, cls).create(new_values)
-
-
class BookingForecastStart(ModelView):
'Booking Forecast Start'
__name__ = 'hotel.print_booking_forecast.start'
@@ -769,8 +629,7 @@ class BookingForecastReport(Report):
date_init = data['date']
date_limit = data['date'] + timedelta(MAX_DAYS)
- dom = [['OR',
- [
+ dom = [['OR', [
('arrival_date', '<=', date_init),
('departure_date', '>=', date_init),
], [
@@ -807,113 +666,6 @@ class BookingForecastReport(Report):
return report_context
-class RegistrationCardReport(Report):
- __name__ = 'hotel.occupancy.registration_card'
-
- @classmethod
- def get_context(cls, records, header, data):
- report_context = super().get_context(records, header, data)
- user = Pool().get('res.user')(Transaction().user)
- report_context['company'] = user.company
- return report_context
-
-
-class GuestsListStart(ModelView):
- 'Guests List Start'
- __name__ = 'hotel.print_guests_list.start'
- date = fields.Date('Date', required=True)
- 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 GuestsList(Wizard):
- 'Guests List'
- __name__ = 'hotel.print_guests_list'
- start = StateView('hotel.print_guests_list.start',
- 'hotel.print_guests_list_start_view_form', [
- Button('Cancel', 'end', 'tryton-cancel'),
- Button('Open', 'print_', 'tryton-print', default=True),
- ])
- print_ = StateReport('hotel.guests_list.report')
-
- def do_print_(self, action):
- company = self.start.company
- data = {
- 'date': self.start.date,
- 'company': company.id,
- }
- return action, data
-
- def transition_print_(self):
- return 'end'
-
-
-class GuestsListReport(Report):
- __name__ = 'hotel.guests_list.report'
-
- @classmethod
- def get_context(cls, records, header, data):
- report_context = super().get_context(records, header, data)
- pool = Pool()
- Company = pool.get('company.company')
- # Operation = pool.get('hotel.operation')
- Room = pool.get('hotel.room')
- User = pool.get('res.user')
- user_id = Transaction().user
-
- user = User(user_id)
- start_date = data['date']
- # operations = Operation.search([
- # ('start_date', '<=', start_date),
- # ('kind', '=', 'occupancy'),
- # ('state', '=', 'open'),
- # ], order=[('room.code', 'ASC')])
- #
- # total_guests = []
- # rooms_occupied = []
- # for op in operations:
- # total_guests.append(len(op.guests))
- # rooms_occupied.append(op.room.id)
- #
- # rooms = Room.search_read([])
- #
- # _rooms_occupied = len(set(rooms_occupied))
- # num_rooms = len(rooms)
- # if num_rooms:
- # occupancy_rate = round(_rooms_occupied / num_rooms, 2)
- # else:
- # occupancy_rate = 0
- #
- # operations_ = []
- # for op in operations:
- # for guest in op.guests:
- # operations_.append({
- # 'room': op.room.code,
- # 'guest': guest.party.name,
- # 'party': op.party.code,
- # 'start_date': op.start_date,
- # 'end_date': op.end_date,
- # 'nights_quantity': op.nights_quantity,
- # })
- # report_context['records'] = operations_
- # report_context['total_rooms'] = _rooms_occupied
- # report_context['total_guests'] = sum(total_guests)
- # report_context['occupancy_rate'] = occupancy_rate
- # report_context['company'] = Company(data['company']).party.name
- # report_context['date'] = data['date']
- # report_context['print_date'] = datetime.now()
- # report_context['user'] = user.name
- return report_context
-
-
class RoomsOccupancyStart(ModelView):
'Rooms Occupancy Start'
__name__ = 'hotel.print_rooms_occupancy.start'
diff --git a/folio (copy).fodt b/folio (copy).fodt
deleted file mode 100644
index 8754439..0000000
Binary files a/folio (copy).fodt and /dev/null differ
diff --git a/folio.py b/folio.py
index 45327ad..6deb1b3 100644
--- a/folio.py
+++ b/folio.py
@@ -7,7 +7,8 @@ from trytond.model import ModelView, Workflow, ModelSQL, fields
from trytond.pyson import Eval, Bool
from trytond.pool import Pool
from trytond.report import Report
-from trytond.wizard import Wizard, StateView, StateAction, Button, StateTransition
+from trytond.wizard import (Wizard, StateView, StateAction,
+ Button, StateTransition, StateReport)
from trytond.transaction import Transaction
from trytond.model.exceptions import AccessError
from trytond.exceptions import UserError
@@ -91,7 +92,7 @@ class Folio(ModelSQL, ModelView):
digits=(16, 2)), 'get_total_amount')
total_commission = fields.Function(fields.Numeric('Channel Commission',
digits=(16, 2)), 'get_channel_commission')
- guests = fields.One2Many('hotel.booking.guest', 'booking_line', 'Guests',
+ guests = fields.One2Many('hotel.folio.guest', 'folio', 'Guests',
states={'readonly': ~Eval('registration_state').in_(['check_in'])})
nationality = fields.Many2One('party.nationality', 'Nationality',
states=STATES_CHECKIN)
@@ -118,9 +119,10 @@ class Folio(ModelSQL, ModelView):
'invisible': ~Bool(Eval('complementary')),
'required': Bool(Eval('complementary')),
})
+ breakfast_included = fields.Boolean('Breakfast Included')
room_amount = fields.Function(fields.Numeric('Room Amount',
digits=(16, 2)), 'get_room_amount')
- stock_moves = fields.Many2Many('hotel.operation-stock.move', 'operation',
+ stock_moves = fields.Many2Many('hotel.folio-stock.move', 'folio',
'move', 'Stock Moves', states={'readonly': True})
@classmethod
@@ -161,12 +163,6 @@ class Folio(ModelSQL, ModelView):
@classmethod
@ModelView.button
def check_in(cls, records):
- config_party = Pool().get('party.configuration')(1)
- validate_party = config_party.validate_party
- if not validate_party:
- config_party.validate_party = True
- config_party.save()
-
for rec in records:
# rec.booking.party.pre_validate()
if rec.booking.state == 'offer':
@@ -177,18 +173,7 @@ class Folio(ModelSQL, ModelView):
raise UserError(gettext('hotel.msg_missing_select_room'))
rec.set_registration_number()
rec.booking.check_rooms()
-
cls.write(records, {'registration_state': 'check_in'})
- # change_state = all(
- # [rl.registration_state == 'check_in' for rl in booking.lines]
- # )
- # print('change_state..', change_state)
- # if change_state:
- # booking.registration_state = 'check_in'
- # booking.save()
- if config_party.validate_party != validate_party:
- config_party.validate_party = validate_party
- config_party.save()
@classmethod
@ModelView.button
@@ -375,10 +360,13 @@ class Folio(ModelSQL, ModelView):
def default_accommodation():
Configuration = Pool().get('hotel.configuration')
configuration = Configuration.get_configuration()
-
if configuration.default_accommodation:
return configuration.default_accommodation.id
+ @staticmethod
+ def default_breakfast_included():
+ return True
+
@classmethod
def validate(cls, lines):
super(Folio, cls).validate(lines)
@@ -694,6 +682,145 @@ class Folio(ModelSQL, ModelView):
)
+class FolioGuest(ModelSQL, ModelView):
+ 'Folio Guest'
+ __name__ = 'hotel.folio.guest'
+ _rec_name = 'party'
+ folio = fields.Many2One('hotel.folio', 'Booking Line', required=True,
+ ondelete='CASCADE')
+ party = fields.Many2One('party.party', 'Party', required=False)
+ type_guest = fields.Selection([
+ ('adult', 'Adult'),
+ ('child', 'Child'),
+ ], 'Type Guest')
+ type_guest_string = type_guest.translated('type_guest')
+ nationality = fields.Many2One('party.nationality', 'Nationality')
+ origin_country = fields.Many2One('party.nationality', 'Origin Country',
+ select=True)
+ target_country = fields.Many2One('party.nationality', 'Target Country',
+ select=True)
+ # New fields for speed reason
+ type_document = fields.Selection([
+ ('12', 'Tarjeta de Identidad'),
+ ('13', 'Cedula de Ciudadania'),
+ ('21', 'Tarjeta de Extranjeria'),
+ ('22', 'Cedula de Extranjeria'),
+ ('41', 'Pasaporte'),
+ ], 'Document Type')
+ doc_number = fields.Char('Doc. Id', select=True)
+ name = fields.Char('Name', select=True)
+ mobile = fields.Char('Mobile', select=True)
+ email = fields.Char('Email', select=True)
+ birthday = fields.Date('Birthday', select=True)
+ sex = fields.Selection([
+ ('female', 'Female'),
+ ('male', 'Male'),
+ ('', ''),
+ ], 'Sex')
+ first_name = fields.Char('First Name')
+ second_name = fields.Char('Second Name')
+ first_family_name = fields.Char('First Family Name')
+ second_family_name = fields.Char('Second Family Name')
+ type_person = fields.Selection([
+ ('persona_natural', 'Persona Natural'),
+ ('persona_juridica', 'Persona Juridica'),
+ ], 'Type Person')
+
+ @fields.depends('name', 'first_name', 'second_name',
+ 'first_family_name', 'second_family_name', 'type_person')
+ def on_change_name(self):
+ second_family_name = None
+ first_family_name = None
+ second_name = None
+ first_name = None
+ if self.name and self.type_person == 'persona_natural':
+ names = self.name.split(' ')
+ first_name = names[0]
+ second_family_name = names[-1]
+ if len(names) > 1:
+ first_family_name = names[-2]
+ if len(names) == 2:
+ second_family_name = None
+ first_family_name = names[1]
+ elif len(names) == 5:
+ second_name = names[1] + ' ' + names[2]
+ elif len(names) == 4:
+ second_name = names[1]
+
+ self.second_family_name = second_family_name
+ self.first_family_name = first_family_name
+ self.second_name = second_name
+ self.first_name = first_name
+
+ def get_rec_name(self, name):
+ if self.party:
+ return self.party.name
+
+ @staticmethod
+ def default_type_guest():
+ return 'adult'
+
+ @staticmethod
+ def default_sex():
+ return 'male'
+
+ @staticmethod
+ def default_type_person():
+ return 'persona_natural'
+
+ @staticmethod
+ def default_type_document():
+ return '13'
+
+ @staticmethod
+ def default_principal_guest():
+ return False
+
+ @fields.depends('nationality', 'origin_country', 'target_country')
+ def on_change_nationality(self):
+ if self.nationality:
+ self.target_country = self.nationality.id
+ self.origin_country = self.nationality.id
+
+ @classmethod
+ def create(cls, vlist):
+ Party = Pool().get('party.party')
+ new_values = []
+ for v in vlist:
+ # if not v.get('doc_number'):
+ # continue
+ party = v.get('party')
+ if not party:
+ parties = Party.search([
+ ('id_number', '=', v['doc_number']),
+ ])
+ if parties:
+ party = parties[0]
+ else:
+ party, = Party.create([{
+ 'name': v['name'],
+ 'id_number': v['doc_number'],
+ 'type_document': v['type_document'],
+ 'birthday': v['birthday'],
+ 'sex': v['sex'],
+ 'first_name': v['first_name'],
+ 'second_name': v['second_name'],
+ 'first_family_name': v['first_family_name'],
+ 'second_family_name': v['second_family_name'],
+ 'type_person': v['type_person'],
+ 'contact_mechanisms': [
+ ('create', [
+ {'type': 'email', 'value': v['email']},
+ {'type': 'mobile', 'value': v['mobile']},
+ ])
+ ]
+ }])
+ v['party'] = party.id
+ new_values.append(v)
+
+ super(FolioGuest, cls).create(new_values)
+
+
class HotelCharge(Workflow, ModelSQL, ModelView):
'Hotel Charge'
__name__ = 'hotel.charge'
@@ -1629,6 +1756,16 @@ class OperationVoucher(ModelSQL):
}])
+class FolioStockMove(ModelSQL):
+ 'Folio - Stock Move'
+ __name__ = 'hotel.folio-stock.move'
+ _table = 'hotel_folio_stock_move_rel'
+ folio = fields.Many2One('hotel.folio', 'Folio',
+ ondelete='CASCADE', select=True, required=True)
+ move = fields.Many2One('stock.move', 'Move', select=True,
+ ondelete='RESTRICT', required=True)
+
+
class StatisticsByMonthStart(ModelView):
'Statistics By Month Start'
__name__ = 'hotel.statistics_by_month.start'
@@ -1857,3 +1994,110 @@ class StatisticsByMonthReport(Report):
report_context['reason_other'] = sum(reason_other)
return report_context
+
+
+class GuestsListStart(ModelView):
+ 'Guests List Start'
+ __name__ = 'hotel.print_guests_list.start'
+ date = fields.Date('Date', required=True)
+ 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 GuestsList(Wizard):
+ 'Guests List'
+ __name__ = 'hotel.print_guests_list'
+ start = StateView('hotel.print_guests_list.start',
+ 'hotel.print_guests_list_start_view_form', [
+ Button('Cancel', 'end', 'tryton-cancel'),
+ Button('Open', 'print_', 'tryton-print', default=True),
+ ])
+ print_ = StateReport('hotel.guests_list.report')
+
+ def do_print_(self, action):
+ company = self.start.company
+ data = {
+ 'date': self.start.date,
+ 'company': company.id,
+ }
+ return action, data
+
+ def transition_print_(self):
+ return 'end'
+
+
+class GuestsListReport(Report):
+ __name__ = 'hotel.guests_list.report'
+
+ @classmethod
+ def get_context(cls, records, header, data):
+ report_context = super().get_context(records, header, data)
+ pool = Pool()
+ Company = pool.get('company.company')
+ # Operation = pool.get('hotel.operation')
+ Room = pool.get('hotel.room')
+ User = pool.get('res.user')
+ user_id = Transaction().user
+
+ user = User(user_id)
+ start_date = data['date']
+ # operations = Operation.search([
+ # ('start_date', '<=', start_date),
+ # ('kind', '=', 'occupancy'),
+ # ('state', '=', 'open'),
+ # ], order=[('room.code', 'ASC')])
+ #
+ # total_guests = []
+ # rooms_occupied = []
+ # for op in operations:
+ # total_guests.append(len(op.guests))
+ # rooms_occupied.append(op.room.id)
+ #
+ # rooms = Room.search_read([])
+ #
+ # _rooms_occupied = len(set(rooms_occupied))
+ # num_rooms = len(rooms)
+ # if num_rooms:
+ # occupancy_rate = round(_rooms_occupied / num_rooms, 2)
+ # else:
+ # occupancy_rate = 0
+ #
+ # operations_ = []
+ # for op in operations:
+ # for guest in op.guests:
+ # operations_.append({
+ # 'room': op.room.code,
+ # 'guest': guest.party.name,
+ # 'party': op.party.code,
+ # 'start_date': op.start_date,
+ # 'end_date': op.end_date,
+ # 'nights_quantity': op.nights_quantity,
+ # })
+ # report_context['records'] = operations_
+ # report_context['total_rooms'] = _rooms_occupied
+ # report_context['total_guests'] = sum(total_guests)
+ # report_context['occupancy_rate'] = occupancy_rate
+ # report_context['company'] = Company(data['company']).party.name
+ # report_context['date'] = data['date']
+ # report_context['print_date'] = datetime.now()
+ # report_context['user'] = user.name
+ return report_context
+
+
+class RegistrationCardReport(Report):
+ __name__ = 'hotel.folio.registration_card'
+
+ @classmethod
+ def get_context(cls, records, header, data):
+ report_context = super().get_context(records, header, data)
+ user = Pool().get('res.user')(Transaction().user)
+ report_context['company'] = user.company
+ return report_context
diff --git a/invoice_simplified.fodt b/invoice_simplified.fodt
deleted file mode 100644
index 424da22..0000000
Binary files a/invoice_simplified.fodt and /dev/null differ
diff --git a/sale.xml b/sale.xml
index 9dbc645..94ebe1a 100644
--- a/sale.xml
+++ b/sale.xml
@@ -22,17 +22,5 @@ The COPYRIGHT file at the top level of this repository contains the full copyrig
-
-
diff --git a/service.py b/service.py
index 2198219..7f403e0 100644
--- a/service.py
+++ b/service.py
@@ -7,7 +7,7 @@ from trytond.pyson import Eval, In, If, Get
from trytond.modules.company import CompanyReport
from trytond.wizard import Wizard, StateView, Button, StateTransition
from trytond.transaction import Transaction
-from trytond.model.exceptions import AccessError
+from trytond.exceptions import UserError
from trytond.i18n import gettext
STATES = {
@@ -141,33 +141,32 @@ class ServiceLine(Workflow, ModelSQL, ModelView):
'Service Line'
__name__ = 'hotel.service.line'
service = fields.Many2One('hotel.service', 'Service', required=True)
- room = fields.Many2One('hotel.room', 'Room', select=True, required=True, states=STATES_LINE)
+ room = fields.Many2One('hotel.room', 'Room', select=True, required=True,
+ states=STATES_LINE)
time_service = fields.Time('Time Service', select=True, states=STATES_LINE)
product = fields.Many2One('product.product', 'Product',
domain=[
('salable', '=', True),
('active', '=', True),
], required=True)
- # ('template.kind', '!=', 'accommodation'),
quantity = fields.Integer('Quantity', required=True, states=STATES_LINE)
description = fields.Char('Description', states=STATES_LINE)
order = fields.Char('Order', select=True, states=STATES_LINE)
- sale_line = fields.Many2One('sale.line', 'Sale Line', states={
- 'readonly': True,
- })
- # guest = fields.Many2One('hotel.folio.guest', 'Guest', states=STATES_LINE,
- # domain=[
- # # ('operation.room', '=', Eval('room')),
- # # # ('operation.start_date', '<=', Eval('')),
- # # ('id', 'in', Eval('current_guests')),
- # ], depends=['current_guests'])
- operation_line = fields.Many2One('hotel.folio.charge', 'Operation Line',
+ invoice_line = fields.Many2One('account.invoice.line', 'Invoice Line',
+ states={'readonly': True})
+ guest = fields.Many2One('hotel.folio.guest', 'Guest', states=STATES_LINE,
+ domain=[
+ ('folio.room', '=', Eval('room')),
+ # ('operation.start_date', '<=', Eval('')),
+ ('id', 'in', Eval('current_guests')),
+ ], depends=['current_guests'])
+ charge = fields.Many2One('hotel.folio.charge', 'Operation Line',
states={'readonly': True})
current_guests = fields.Function(fields.Many2Many(
- 'hotel.operation.guest', None, None, 'Current Guests'),
+ 'hotel.folio.guest', None, None, 'Current Guests'),
'on_change_with_current_guests')
- operation = fields.Function(fields.Many2One('hotel.operation',
- 'Operation'), 'get_operation')
+ folio = fields.Function(fields.Many2One('hotel.folio',
+ 'Folio'), 'get_folio')
state = fields.Selection([
('draft', 'Draft'),
('loaded', 'Loaded'),
@@ -237,9 +236,9 @@ class ServiceLine(Workflow, ModelSQL, ModelView):
@fields.depends('room')
def on_change_with_current_guests(self, name=None):
- Operation = Pool().get('hotel.operation')
+ Folio = Pool().get('hotel.folio')
if self.room:
- operations = Operation.search([
+ operations = Folio.search([
('room', '=', self.room.id),
('state', '=', 'check_in'),
])
@@ -249,15 +248,15 @@ class ServiceLine(Workflow, ModelSQL, ModelView):
return guests
- def get_operation(self, name=None):
- if self.operation_line:
- return self.operation_line.operation.id
+ def get_folio(self, name=None):
+ if self.folio_line:
+ return self.folio_line.folio.id
def add_product_to_room(self):
pool = Pool()
- Operation = pool.get('hotel.operation')
+ Folio = pool.get('hotel.folio')
FolioCharge = pool.get('hotel.folio.charge')
- if self.sale_line:
+ if self.invoice_line:
return
dom = [
@@ -269,27 +268,31 @@ class ServiceLine(Workflow, ModelSQL, ModelView):
if self.guest:
dom.append(('guests', '=', self.guest.id))
- operations = Operation.search(dom)
- if not operations:
- raise AccessError(gettext('hotel.msg_room_not_occupied', s=self.room.name))
- elif len(operations) > 1:
- raise AccessError(gettext('hotel.msg_multiple_rooms_active', s=self.room.name))
+ folios = Folio.search(dom)
+ if not folios:
+ raise UserError(
+ gettext('hotel.msg_room_not_occupied', s=self.room.name)
+ )
+ elif len(folios) > 1:
+ raise UserError(
+ gettext('hotel.msg_multiple_rooms_active', s=self.room.name)
+ )
- operation = operations[0]
+ folio = folios[0]
new_line = {
- 'operation': operation.id,
+ 'operation': folio.id,
'date_service': self.service.service_date,
'order': self.order,
'description': self.description,
- # FIXME: not use int
'quantity': int(self.quantity),
- 'invoice_to': operation.main_guest.id,
+ 'invoice_to': folio.main_guest.id,
'unit_price': self.product.template.list_price,
'product': self.product.id,
}
+ # FIXME: not use int
line, = FolioCharge.create([new_line])
- self.write([self], {'operation_line': line.id})
+ self.write([self], {'charge': line.id})
class ServiceReport(CompanyReport):
@@ -331,15 +334,14 @@ class CreateDailyServices(Wizard):
def transition_accept_(self):
pool = Pool()
Service = pool.get('hotel.service')
- Operation = pool.get('hotel.operation')
+ Folio = pool.get('hotel.folio')
- operations = Operation.search([
- ('start_date', '<', self.start.date),
- ('state', 'in', ['open']),
+ folios = Folio.search([
+ ('arrival_date', '<', self.start.date),
+ ('registration_state', 'in', ['check_in', 'check_out']),
])
lines_to_create = []
-
service, = Service.create([{
'service_date': self.start.date,
'state': 'draft',
@@ -347,13 +349,13 @@ class CreateDailyServices(Wizard):
}])
Service.open([service])
product = self.start.kind.product
- for op in operations:
- if not op.breakfast_included:
+ for fol in folios:
+ if not fol.breakfast_included:
continue
- for guest in op.guests:
+ for guest in fol.guests:
lines_to_create.append({
'service': service.id,
- 'room': op.room.id,
+ 'room': fol.room.id,
'guest': guest.id,
'product': product.id,
'quantity': 1,
diff --git a/view/board_folio_form.xml b/view/board_folio_form.xml
index 3f38fa0..c210555 100644
--- a/view/board_folio_form.xml
+++ b/view/board_folio_form.xml
@@ -22,10 +22,10 @@ this repository contains the full copyright notices and license terms. -->
-
-
+
+
@@ -47,13 +47,15 @@ this repository contains the full copyright notices and license terms. -->
-
-
-
+
+
+
+
+
@@ -61,5 +63,6 @@ this repository contains the full copyright notices and license terms. -->
+
diff --git a/view/booking_folio_form.xml b/view/booking_folio_form.xml
index a252a11..3bf5fd3 100644
--- a/view/booking_folio_form.xml
+++ b/view/booking_folio_form.xml
@@ -20,8 +20,8 @@ this repository contains the full copyright notices and license terms. -->
-
-
+
+
@@ -44,8 +44,11 @@ this repository contains the full copyright notices and license terms. -->
+
+
+
+
+
-
diff --git a/view/service_line_form.xml b/view/service_line_form.xml
index 92929cb..a6962d4 100644
--- a/view/service_line_form.xml
+++ b/view/service_line_form.xml
@@ -12,8 +12,8 @@ this repository contains the full copyright notices and license terms. -->
-
-
+
+
diff --git a/view/service_line_tree.xml b/view/service_line_tree.xml
index 800e88e..2173132 100644
--- a/view/service_line_tree.xml
+++ b/view/service_line_tree.xml
@@ -3,7 +3,7 @@
this repository contains the full copyright notices and license terms. -->
-
+
@@ -11,6 +11,6 @@ this repository contains the full copyright notices and license terms. -->
-
-
+
+