mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
Merge branch 'multihotel' of https://github.com/hootel/hootel into multihotel
This commit is contained in:
@@ -10,10 +10,15 @@ class HotelRoomAmenity(models.Model):
|
||||
|
||||
# Fields declaration
|
||||
name = fields.Char('Amenity Name', translate=True, required=True)
|
||||
hotel_ids = fields.Many2many('hotel.property', string='Hotels', required=False, ondelete='restrict')
|
||||
hotel_ids = fields.Many2many(
|
||||
'hotel.property',
|
||||
string='Hotels',
|
||||
required=False,
|
||||
ondelete='restrict')
|
||||
room_amenity_type_id = fields.Many2one(
|
||||
'hotel.amenity.type',
|
||||
'Amenity Category')
|
||||
default_code = fields.Char('Internal Reference')
|
||||
room_amenity_type_id = fields.Many2one('hotel.amenity.type',
|
||||
'Amenity Category')
|
||||
active = fields.Boolean('Active', default=True)
|
||||
|
||||
# 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, api
|
||||
from odoo import models, fields
|
||||
|
||||
|
||||
class HotelRoomAmenityType(models.Model):
|
||||
|
||||
@@ -8,20 +8,37 @@ class HotelBoardService(models.Model):
|
||||
_name = "hotel.board.service"
|
||||
_description = "Board Services"
|
||||
|
||||
name = fields.Char('Board Name', translate=True, size=64, required=True, index=True)
|
||||
board_service_line_ids = fields.One2many('hotel.board.service.line',
|
||||
'hotel_board_service_id')
|
||||
price_type = fields.Selection([
|
||||
('fixed','Fixed'),
|
||||
('percent','Percent')], string='Type', default='fixed', required=True)
|
||||
# Fields declaration
|
||||
name = fields.Char(
|
||||
'Board Name',
|
||||
translate=True,
|
||||
size=64,
|
||||
required=True,
|
||||
index=True)
|
||||
board_service_line_ids = fields.One2many(
|
||||
'hotel.board.service.line',
|
||||
'hotel_board_service_id')
|
||||
hotel_ids = fields.Many2many(
|
||||
'hotel.property',
|
||||
string='Hotels',
|
||||
required=False,
|
||||
ondelete='restrict')
|
||||
hotel_board_service_room_type_ids = fields.One2many(
|
||||
'hotel.board.service.room.type', 'hotel_board_service_id')
|
||||
amount = fields.Float('Amount',
|
||||
digits=dp.get_precision('Product Price'),
|
||||
compute='_compute_board_amount',
|
||||
store=True)
|
||||
hotel_ids = fields.Many2many('hotel.property', string='Hotels', required=False, ondelete='restrict')
|
||||
'hotel.board.service.room.type',
|
||||
'hotel_board_service_id')
|
||||
price_type = fields.Selection([
|
||||
('fixed', 'Fixed'),
|
||||
('percent', 'Percent')],
|
||||
string='Type',
|
||||
default='fixed',
|
||||
required=True)
|
||||
amount = fields.Float(
|
||||
'Amount',
|
||||
digits=dp.get_precision('Product Price'),
|
||||
compute='_compute_board_amount',
|
||||
store=True)
|
||||
|
||||
# Compute and Search methods
|
||||
@api.depends('board_service_line_ids.amount')
|
||||
def _compute_board_amount(self):
|
||||
for record in self:
|
||||
|
||||
@@ -1,32 +1,37 @@
|
||||
# Copyright 2017 Dario Lodeiros
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
from odoo import api, fields, models, _
|
||||
from odoo import api, fields, models
|
||||
from odoo.addons import decimal_precision as dp
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
|
||||
class HotelBoardServiceLine(models.Model):
|
||||
_name = 'hotel.board.service.line'
|
||||
_description = 'Services on Board Service included'
|
||||
|
||||
# Default methods
|
||||
def _get_default_price(self):
|
||||
if self.product_id:
|
||||
return self.product_id.list_price
|
||||
|
||||
# Fields declaration
|
||||
hotel_board_service_id = fields.Many2one(
|
||||
'hotel.board.service',
|
||||
'Board Service',
|
||||
ondelete='cascade',
|
||||
required=True)
|
||||
product_id = fields.Many2one(
|
||||
'product.product', 'Product', required=True)
|
||||
'product.product',
|
||||
string='Product',
|
||||
required=True)
|
||||
hotel_ids = fields.Many2many(
|
||||
'hotel.property',
|
||||
related='hotel_board_service_id.hotel_ids')
|
||||
amount = fields.Float(
|
||||
'Amount',
|
||||
digits=dp.get_precision('Product Price'),
|
||||
default=_get_default_price)
|
||||
hotel_ids = fields.Many2many('hotel.property',
|
||||
related='hotel_board_service_id.hotel_ids')
|
||||
|
||||
# Constraints and onchanges
|
||||
@api.onchange('product_id')
|
||||
def onchange_product_id(self):
|
||||
if self.product_id:
|
||||
|
||||
@@ -12,64 +12,57 @@ class HotelBoardServiceRoomType(models.Model):
|
||||
_log_access = False
|
||||
_description = 'Board Service included in Room'
|
||||
|
||||
# Default Methods ang Gets
|
||||
@api.multi
|
||||
def name_get(self):
|
||||
result = []
|
||||
for res in self:
|
||||
if res.pricelist_id:
|
||||
name = u'%s (%s)' % (res.hotel_board_service_id.name, res.pricelist_id.name)
|
||||
name = u'%s (%s)' % (
|
||||
res.hotel_board_service_id.name,
|
||||
res.pricelist_id.name)
|
||||
else:
|
||||
name = u'%s (%s)' % (res.hotel_board_service_id.name, _('Generic'))
|
||||
name = u'%s (%s)' % (res.hotel_board_service_id.name,
|
||||
_('Generic'))
|
||||
result.append((res.id, name))
|
||||
return result
|
||||
|
||||
# Fields declaration
|
||||
hotel_board_service_id = fields.Many2one(
|
||||
'hotel.board.service', 'Board Service', index=True, ondelete='cascade', required=True)
|
||||
'hotel.board.service',
|
||||
string='Board Service',
|
||||
index=True,
|
||||
ondelete='cascade',
|
||||
required=True)
|
||||
hotel_room_type_id = fields.Many2one(
|
||||
'hotel.room.type', 'Room Type', index=True, ondelete='cascade', required=True)
|
||||
'hotel.room.type',
|
||||
string='Room Type',
|
||||
index=True,
|
||||
ondelete='cascade',
|
||||
required=True)
|
||||
pricelist_id = fields.Many2one(
|
||||
'product.pricelist', 'Pricelist', required=False)
|
||||
'product.pricelist',
|
||||
string='Pricelist',
|
||||
required=False)
|
||||
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')
|
||||
price_type = fields.Selection([
|
||||
('fixed', 'Fixed'),
|
||||
('percent', 'Percent')], string='Type', default='fixed', required=True)
|
||||
amount = fields.Float('Amount',
|
||||
digits=dp.get_precision('Product Price'),
|
||||
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):
|
||||
self._cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = %s', ('hotel_board_service_id_hotel_room_type_id_pricelist_id',))
|
||||
if not self._cr.fetchone():
|
||||
self._cr.execute('CREATE INDEX hotel_board_service_id_hotel_room_type_id_pricelist_id ON hotel_board_service_room_type_rel (hotel_board_service_id, hotel_room_type_id, pricelist_id)')
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
if 'hotel_board_service_id' in vals:
|
||||
vals.update(
|
||||
self.prepare_board_service_room_lines(vals['hotel_board_service_id'])
|
||||
)
|
||||
return super(HotelBoardServiceRoomType, self).create(vals)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
if 'hotel_board_service_id' in vals:
|
||||
vals.update(
|
||||
self.prepare_board_service_room_lines(vals['hotel_board_service_id'])
|
||||
)
|
||||
return super(HotelBoardServiceRoomType, self).write(vals)
|
||||
|
||||
@api.multi
|
||||
def open_board_lines_form(self):
|
||||
action = self.env.ref('hotel.action_hotel_board_service_room_type_view').read()[0]
|
||||
action['views'] = [(self.env.ref('hotel.hotel_board_service_room_type_form').id, 'form')]
|
||||
action['res_id'] = self.id
|
||||
action['target'] = 'new'
|
||||
return action
|
||||
('percent', 'Percent')],
|
||||
string='Type',
|
||||
default='fixed',
|
||||
required=True)
|
||||
amount = fields.Float(
|
||||
'Amount',
|
||||
digits=dp.get_precision('Product Price'),
|
||||
compute='_compute_board_amount',
|
||||
store=True)
|
||||
|
||||
# Compute and Search methods
|
||||
@api.depends('board_service_line_ids.amount')
|
||||
def _compute_board_amount(self):
|
||||
for record in self:
|
||||
@@ -78,40 +71,85 @@ class HotelBoardServiceRoomType(models.Model):
|
||||
total += service.amount
|
||||
record.update({'amount': total})
|
||||
|
||||
@api.model
|
||||
def prepare_board_service_room_lines(self, board_service_id):
|
||||
"""
|
||||
Prepare line to price products config
|
||||
"""
|
||||
cmds=[(5,0,0)]
|
||||
board_service = self.env['hotel.board.service'].browse(board_service_id)
|
||||
for line in board_service.board_service_line_ids:
|
||||
cmds.append((0, False, {
|
||||
'product_id': line.product_id.id,
|
||||
'amount': line.amount
|
||||
}))
|
||||
return {'board_service_line_ids': cmds}
|
||||
|
||||
# Constraints and onchanges
|
||||
@api.constrains('pricelist_id')
|
||||
def constrains_pricelist_id(self):
|
||||
for record in self:
|
||||
if self.pricelist_id:
|
||||
board_pricelist = self.env['hotel.board.service.room.type'].search([
|
||||
('pricelist_id','=', record.pricelist_id.id),
|
||||
('hotel_room_type_id','=', record.hotel_room_type_id.id),
|
||||
('hotel_board_service_id','=',record.hotel_board_service_id.id),
|
||||
('id','!=',record.id)
|
||||
('pricelist_id', '=', record.pricelist_id.id),
|
||||
('hotel_room_type_id', '=', record.hotel_room_type_id.id),
|
||||
('hotel_board_service_id', '=', record.hotel_board_service_id.id),
|
||||
('id', '!=', record.id)
|
||||
])
|
||||
if board_pricelist:
|
||||
raise UserError(
|
||||
_("This Board Service in this Room can't repeat pricelist"))
|
||||
else:
|
||||
board_pricelist = self.env['hotel.board.service.room.type'].search([
|
||||
('pricelist_id','=', False),
|
||||
('hotel_room_type_id','=', record.hotel_room_type_id.id),
|
||||
('hotel_board_service_id','=',record.hotel_board_service_id.id),
|
||||
('id','!=',record.id)
|
||||
('pricelist_id', '=', False),
|
||||
('hotel_room_type_id', '=', record.hotel_room_type_id.id),
|
||||
('hotel_board_service_id', '=', record.hotel_board_service_id.id),
|
||||
('id', '!=', record.id)
|
||||
])
|
||||
if board_pricelist:
|
||||
raise UserError(
|
||||
_("This Board Service in this Room can't repeat without pricelist"))
|
||||
_("This Board Service in this Room \
|
||||
can't repeat without pricelist"))
|
||||
|
||||
# Action methods
|
||||
@api.multi
|
||||
def open_board_lines_form(self):
|
||||
action = self.env.ref(
|
||||
'hotel.action_hotel_board_service_room_type_view').read()[0]
|
||||
action['views'] = [(self.env.ref(
|
||||
'hotel.hotel_board_service_room_type_form').id, 'form')]
|
||||
action['res_id'] = self.id
|
||||
action['target'] = 'new'
|
||||
return action
|
||||
|
||||
# ORM Overrides
|
||||
@api.model_cr
|
||||
def init(self):
|
||||
self._cr.execute(
|
||||
'SELECT indexname FROM pg_indexes WHERE indexname = %s',
|
||||
('hotel_board_service_id_hotel_room_type_id_pricelist_id',))
|
||||
if not self._cr.fetchone():
|
||||
self._cr.execute(
|
||||
'CREATE INDEX hotel_board_service_id_hotel_room_type_id_pricelist_id \
|
||||
ON hotel_board_service_room_type_rel \
|
||||
(hotel_board_service_id, hotel_room_type_id, pricelist_id)')
|
||||
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
if 'hotel_board_service_id' in vals:
|
||||
vals.update(
|
||||
self.prepare_board_service_room_lines(
|
||||
vals['hotel_board_service_id'])
|
||||
)
|
||||
return super(HotelBoardServiceRoomType, self).create(vals)
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
if 'hotel_board_service_id' in vals:
|
||||
vals.update(
|
||||
self.prepare_board_service_room_lines(
|
||||
vals['hotel_board_service_id'])
|
||||
)
|
||||
return super(HotelBoardServiceRoomType, self).write(vals)
|
||||
|
||||
# Business methods
|
||||
@api.model
|
||||
def prepare_board_service_room_lines(self, board_service_id):
|
||||
"""
|
||||
Prepare line to price products config
|
||||
"""
|
||||
cmds = [(5, 0, 0)]
|
||||
board_service = self.env['hotel.board.service'].browse(
|
||||
board_service_id)
|
||||
for line in board_service.board_service_line_ids:
|
||||
cmds.append((0, False, {
|
||||
'product_id': line.product_id.id,
|
||||
'amount': line.amount
|
||||
}))
|
||||
return {'board_service_line_ids': cmds}
|
||||
|
||||
@@ -1,20 +1,22 @@
|
||||
# Copyright 2017 Dario Lodeiros
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
from odoo import api, fields, models, _
|
||||
from odoo import fields, models
|
||||
from odoo.addons import decimal_precision as dp
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
|
||||
class HotelBoardServiceRoomTypeLine(models.Model):
|
||||
_name = 'hotel.board.service.room.type.line'
|
||||
_description = 'Services on Board Service included in Room'
|
||||
|
||||
#TODO def default_amount "amount of service"
|
||||
|
||||
|
||||
|
||||
# Fields declaration
|
||||
hotel_board_service_room_type_id = fields.Many2one(
|
||||
'hotel.board.service.room.type', 'Board Service Room', ondelete='cascade', required=True)
|
||||
'hotel.board.service.room.type',
|
||||
'Board Service Room',
|
||||
ondelete='cascade',
|
||||
required=True)
|
||||
product_id = fields.Many2one(
|
||||
'product.product', 'Product', required=True, readonly=True)
|
||||
'product.product',
|
||||
'Product',
|
||||
required=True,
|
||||
readonly=True)
|
||||
#TODO def default_amount "amount of service"
|
||||
amount = fields.Float('Amount', digits=dp.get_precision('Product Price'), default=0.0)
|
||||
|
||||
@@ -25,9 +25,6 @@ class HotelRoom(models.Model):
|
||||
default=False)
|
||||
floor_id = fields.Many2one('hotel.floor', 'Ubication',
|
||||
help='At which floor the room is located.')
|
||||
|
||||
max_adult = fields.Integer('Max Adult')
|
||||
max_child = fields.Integer('Max Child')
|
||||
capacity = fields.Integer('Capacity')
|
||||
to_be_cleaned = fields.Boolean('To be Cleaned', default=False)
|
||||
extra_beds_allowed = fields.Integer('Extra beds allowed',
|
||||
|
||||
@@ -53,7 +53,7 @@ class HotelRoomType(models.Model):
|
||||
for record in self:
|
||||
record.total_rooms_count = len(record.room_ids)
|
||||
|
||||
# CRUD methods
|
||||
# ORM Overrides
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
""" Add room types as not purchase services. """
|
||||
|
||||
@@ -58,8 +58,6 @@ class HotelSharedRoom(models.Model):
|
||||
name = u'%s (%s)' % (self.name, i + 1)
|
||||
bed_vals = {
|
||||
'name': name,
|
||||
'max_adult': 1,
|
||||
'max_child': 0,
|
||||
'capacity': 1,
|
||||
'room_type_id': self.room_type_id.id,
|
||||
'sequence': self.sequence,
|
||||
|
||||
Reference in New Issue
Block a user