mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[WIP] Basic multihotel modeling
This commit is contained in:
@@ -12,3 +12,6 @@ class HotelRoomAmenitie(models.Model):
|
||||
default_code = fields.Char('Internal Reference')
|
||||
room_amenity_type_id = fields.Many2one('hotel.amenity.type',
|
||||
'Amenity Catagory')
|
||||
hotel_ids = fields.Many2many('hotel.property', 'Hotels', required=False, ondelete='restrict')
|
||||
|
||||
#TODO: Constrain coherence hotel_ids with amenity types hotel_ids
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Copyright 2017 Alexandre Díaz
|
||||
# Copyright 2017 Dario Lodeiros
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
from odoo import models, fields
|
||||
from odoo import models, fields, api
|
||||
|
||||
|
||||
class HotelRoomAmenitieType(models.Model):
|
||||
@@ -11,5 +11,8 @@ class HotelRoomAmenitieType(models.Model):
|
||||
name = fields.Char('Amenity Name', translate=True, required=True)
|
||||
active = fields.Boolean('Active', default=True)
|
||||
room_amenity_ids = fields.One2many('hotel.amenity',
|
||||
'room_amenity_type_id',
|
||||
'Amenities in this category')
|
||||
'room_amenity_type_id',
|
||||
'Amenities in this category')
|
||||
hotel_ids = fields.Many2many('hotel.property', 'Hotels', required=False, ondelete='restrict')
|
||||
|
||||
#TODO: Constrain coherence hotel_ids with amenities hotel_ids
|
||||
|
||||
@@ -20,6 +20,7 @@ class HotelBoardService(models.Model):
|
||||
digits=dp.get_precision('Product Price'),
|
||||
compute='_compute_board_amount',
|
||||
store=True)
|
||||
hotel_ids = fields.Many2many('hotel.property', string='Hotels', required=False, ondelete='restrict')
|
||||
|
||||
@api.depends('board_service_line_ids.amount')
|
||||
def _compute_board_amount(self):
|
||||
|
||||
@@ -24,6 +24,8 @@ class HotelBoardServiceLine(models.Model):
|
||||
'Amount',
|
||||
digits=dp.get_precision('Product Price'),
|
||||
default=_get_default_price)
|
||||
hotel_ids = fields.Many2many('hotel.property',
|
||||
related='hotel_board_service_id.hotel_ids')
|
||||
|
||||
@api.onchange('product_id')
|
||||
def onchange_product_id(self):
|
||||
|
||||
@@ -37,6 +37,8 @@ class HotelBoardServiceRoomType(models.Model):
|
||||
compute='_compute_board_amount',
|
||||
store=True)
|
||||
board_service_line_ids = fields.One2many('hotel.board.service.room.type.line', 'hotel_board_service_room_type_id')
|
||||
hotel_id = fields.Many2one('hotel.property',
|
||||
related='hotel_room_type_id.hotel_id')
|
||||
|
||||
@api.model_cr
|
||||
def init(self):
|
||||
|
||||
@@ -11,6 +11,8 @@ class HotelBoardServiceRoomTypeLine(models.Model):
|
||||
|
||||
#TODO def default_amount "amount of service"
|
||||
|
||||
|
||||
|
||||
hotel_board_service_room_type_id = fields.Many2one(
|
||||
'hotel.board.service.room.type', 'Board Service Room', ondelete='cascade', required=True)
|
||||
product_id = fields.Many2one(
|
||||
|
||||
@@ -28,3 +28,7 @@ class HotelCancelationRule(models.Model):
|
||||
('all', 'All Days'),
|
||||
('days', 'Specify days')], 'No Show apply on', default='all')
|
||||
days_noshow = fields.Integer('NoShow first days', default="2")
|
||||
hotel_ids = fields.Many2many('hotel.property', string='Hotels', required=False,
|
||||
ondelete='restrict')
|
||||
|
||||
#TODO: Constrain coherence hotel_ids pricelist and cancelation_rules
|
||||
|
||||
@@ -68,6 +68,10 @@ class HotelCheckinPartner(models.Model):
|
||||
return reservation.checkout
|
||||
return False
|
||||
|
||||
@api.model
|
||||
def _get_default_hotel(self):
|
||||
return self.env.user.hotel_id
|
||||
|
||||
partner_id = fields.Many2one('res.partner', default=_default_partner_id,
|
||||
required=True)
|
||||
email = fields.Char('E-mail', related='partner_id.email')
|
||||
@@ -91,6 +95,8 @@ class HotelCheckinPartner(models.Model):
|
||||
'State', readonly=True,
|
||||
default=lambda *a: 'draft',
|
||||
track_visibility='onchange')
|
||||
hotel_id = fields.Many2one('hotel.property', default=_get_default_hotel,
|
||||
required=True)
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
|
||||
@@ -9,3 +9,4 @@ class HotelFloor(models.Model):
|
||||
|
||||
name = fields.Char('Ubication Name', translate=True, size=64, required=True, index=True)
|
||||
sequence = fields.Integer('Sequence')
|
||||
hotel_ids = fields.Many2many('hotel.property', string='Hotels', required=False, ondelete='restrict')
|
||||
|
||||
@@ -94,10 +94,16 @@ class HotelFolio(models.Model):
|
||||
def _get_default_team(self):
|
||||
return self.env['crm.team']._get_default_team_id()
|
||||
|
||||
@api.model
|
||||
def _get_default_hotel(self):
|
||||
return self.env.user.hotel_id
|
||||
|
||||
#Main Fields--------------------------------------------------------
|
||||
name = fields.Char('Folio Number', readonly=True, index=True,
|
||||
default=lambda self: _('New'))
|
||||
client_order_ref = fields.Char(string='Customer Reference', copy=False)
|
||||
hotel_id = fields.Many2one('hotel.property', default=_get_default_hotel,
|
||||
required=True)
|
||||
partner_id = fields.Many2one('res.partner',
|
||||
track_visibility='onchange',
|
||||
ondelete='restrict',)
|
||||
|
||||
@@ -240,6 +240,8 @@ class HotelReservation(models.Model):
|
||||
partner_parent_id = fields.Many2one(related="partner_id.parent_id")
|
||||
closure_reason_id = fields.Many2one(related='folio_id.closure_reason_id')
|
||||
company_id = fields.Many2one(related='folio_id.company_id', string='Company', store=True, readonly=True)
|
||||
hotel_id = fields.Many2one('hotel.property', store=True, readonly=True,
|
||||
related='folio_id.hotel_id')
|
||||
reservation_line_ids = fields.One2many('hotel.reservation.line',
|
||||
'reservation_id',
|
||||
required=True)
|
||||
|
||||
@@ -37,6 +37,8 @@ class HotelReservationLine(models.Model):
|
||||
'reservation_line_invoice_rel',
|
||||
'reservation_line_id', 'invoice_line_id',
|
||||
string='Invoice Lines', readonly=True, copy=False)
|
||||
hotel_id = fields.Many2one('hotel.property', store=True, readonly=True,
|
||||
related='reservation_id.hotel_id')
|
||||
|
||||
@api.constrains('date')
|
||||
def constrains_duplicated_date(self):
|
||||
|
||||
@@ -14,10 +14,6 @@ class HotelRoom(models.Model):
|
||||
_description = 'Hotel Room'
|
||||
_order = "sequence, room_type_id, name"
|
||||
|
||||
@api.model
|
||||
def _get_default_hotel(self):
|
||||
return self.env.user.hotel_id
|
||||
|
||||
name = fields.Char('Room Name', required=True)
|
||||
active = fields.Boolean('Active', default=True)
|
||||
sequence = fields.Integer('Sequence', default=0)
|
||||
@@ -26,8 +22,8 @@ class HotelRoom(models.Model):
|
||||
ondelete='restrict')
|
||||
floor_id = fields.Many2one('hotel.floor', 'Ubication',
|
||||
help='At which floor the room is located.')
|
||||
hotel_id = fields.Many2one('hotel.property', 'Hotel', required=True, ondelete='restrict',
|
||||
default=_get_default_hotel,)
|
||||
hotel_id = fields.Many2one('hotel.property', store=True, readonly=True,
|
||||
related='room_type_id.hotel_id')
|
||||
|
||||
max_adult = fields.Integer('Max Adult')
|
||||
max_child = fields.Integer('Max Child')
|
||||
|
||||
@@ -8,3 +8,5 @@ class RoomClosureReason(models.Model):
|
||||
|
||||
name = fields.Char('Name', translate=True, required=True)
|
||||
description = fields.Text('Description', translate=True)
|
||||
hotel_ids = fields.Many2many('hotel.property', string='Hotels', required=False,
|
||||
ondelete='restrict')
|
||||
|
||||
@@ -20,6 +20,8 @@ class HotelRoomTypeClass(models.Model):
|
||||
category without removing it.")
|
||||
sequence = fields.Integer('Sequence', default=0)
|
||||
code_class = fields.Char('Code')
|
||||
hotel_ids = fields.Many2many('hotel.property', string='Hotels', required=False,
|
||||
ondelete='restrict')
|
||||
|
||||
_sql_constraints = [('code_class_unique', 'unique(code_class)',
|
||||
'code must be unique!')]
|
||||
|
||||
@@ -6,6 +6,10 @@ from odoo import models, fields, api
|
||||
class HotelRoomTypeRestriction(models.Model):
|
||||
_name = 'hotel.room.type.restriction'
|
||||
|
||||
@api.model
|
||||
def _get_default_hotel(self):
|
||||
return self.env.user.hotel_id
|
||||
|
||||
name = fields.Char('Restriction Plan Name', required=True)
|
||||
item_ids = fields.One2many('hotel.room.type.restriction.item',
|
||||
'restriction_id', string='Restriction Items',
|
||||
@@ -14,6 +18,8 @@ class HotelRoomTypeRestriction(models.Model):
|
||||
help='If unchecked, it will allow you to hide the \
|
||||
restriction plan without removing it.',
|
||||
default=True)
|
||||
hotel_id = fields.Many2one('hotel.property', default=_get_default_hotel,
|
||||
required=True, ondelete='cascade')
|
||||
|
||||
@api.multi
|
||||
@api.depends('name')
|
||||
|
||||
@@ -21,6 +21,8 @@ class HotelRoomTypeRestrictionItem(models.Model):
|
||||
closed = fields.Boolean('Closed')
|
||||
closed_departure = fields.Boolean('Closed Departure')
|
||||
closed_arrival = fields.Boolean('Closed Arrival')
|
||||
hotel_id = fields.Many2one('hotel.property', store=True, readonly=True,
|
||||
related='restriction_id.hotel_id')
|
||||
|
||||
_sql_constraints = [('room_type_registry_unique',
|
||||
'unique(restriction_id, room_type_id, date)',
|
||||
|
||||
@@ -132,6 +132,8 @@ class HotelService(models.Model):
|
||||
# Non-stored related field to allow portal user to see the image of the product he has ordered
|
||||
product_image = fields.Binary('Product Image', related="product_id.image", store=False, related_sudo=True)
|
||||
company_id = fields.Many2one(related='folio_id.company_id', string='Company', store=True, readonly=True)
|
||||
hotel_id = fields.Many2one('hotel.property', store=True, readonly=True,
|
||||
related='folio_id.hotel_id')
|
||||
invoice_status = fields.Selection([
|
||||
('invoiced', 'Fully Invoiced'),
|
||||
('to invoice', 'To Invoice'),
|
||||
|
||||
@@ -35,6 +35,8 @@ class HotelServiceLine(models.Model):
|
||||
string='Taxes',
|
||||
related="service_id.tax_ids",
|
||||
readonly="True")
|
||||
hotel_id = fields.Many2one('hotel.property', store=True, readonly=True,
|
||||
related='service_id.hotel_id')
|
||||
|
||||
def _cancel_discount(self):
|
||||
for record in self:
|
||||
|
||||
@@ -18,6 +18,8 @@ class HotelSharedRoom(models.Model):
|
||||
required=True, ondelete='restrict',
|
||||
domain=[('shared_room', '=', True)]
|
||||
)
|
||||
hotel_id = fields.Many2one('hotel.property', store=True, readonly=True,
|
||||
related='room_type_id.hotel_id')
|
||||
floor_id = fields.Many2one('hotel.floor', 'Ubication',
|
||||
help='At which floor the room is located.',
|
||||
ondelete='restrict',)
|
||||
|
||||
@@ -38,6 +38,7 @@ class AccountInvoice(models.Model):
|
||||
from_folio = fields.Boolean(compute='_computed_folio_origin')
|
||||
folio_ids = fields.Many2many(
|
||||
comodel_name='hotel.folio', compute='_computed_folio_origin')
|
||||
hotel_id = fields.Many2one('hotel.property')
|
||||
outstanding_folios_debits_widget = fields.Text(compute='_get_outstanding_folios_JSON')
|
||||
has_folios_outstanding = fields.Boolean(compute='_get_outstanding_folios_JSON')
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@ class PaymentReturn(models.Model):
|
||||
_inherit = 'payment.return'
|
||||
|
||||
folio_id = fields.Many2one('hotel.folio', string='Folio')
|
||||
hotel_id = fields.Many2one('hotel.property', store=True, readonly=True,
|
||||
related='folio_id.hotel_id')
|
||||
|
||||
@api.multi
|
||||
def action_confirm(self):
|
||||
|
||||
@@ -14,6 +14,8 @@ class ProductPricelist(models.Model):
|
||||
cancelation_rule_id = fields.Many2one(
|
||||
'hotel.cancelation.rule',
|
||||
string="Cancelation Policy")
|
||||
hotel_ids = fields.Many2many('hotel.property', string='Hotels', required=False,
|
||||
ondelete='restrict')
|
||||
|
||||
@api.multi
|
||||
@api.depends('name')
|
||||
|
||||
@@ -16,3 +16,5 @@ class ProductTemplate(models.Model):
|
||||
is_extra_bed = fields.Boolean('Is extra bed', default=False)
|
||||
show_in_calendar = fields.Boolean('Show in Calendar', default=False,
|
||||
help='Specifies if the product is shown in the calendar information.')
|
||||
hotel_ids = fields.Many2many('hotel.property', string='Hotels', required=False,
|
||||
ondelete='restrict')
|
||||
|
||||
Reference in New Issue
Block a user