mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[IMP] board services py guideline
This commit is contained in:
@@ -10,13 +10,15 @@ class HotelRoomAmenity(models.Model):
|
|||||||
|
|
||||||
# Fields declaration
|
# Fields declaration
|
||||||
name = fields.Char('Amenity Name', translate=True, required=True)
|
name = fields.Char('Amenity Name', translate=True, required=True)
|
||||||
hotel_ids = fields.Many2many('hotel.property',
|
hotel_ids = fields.Many2many(
|
||||||
string='Hotels',
|
'hotel.property',
|
||||||
required=False,
|
string='Hotels',
|
||||||
ondelete='restrict')
|
required=False,
|
||||||
|
ondelete='restrict')
|
||||||
|
room_amenity_type_id = fields.Many2one(
|
||||||
|
'hotel.amenity.type',
|
||||||
|
'Amenity Category')
|
||||||
default_code = fields.Char('Internal Reference')
|
default_code = fields.Char('Internal Reference')
|
||||||
room_amenity_type_id = fields.Many2one('hotel.amenity.type',
|
|
||||||
'Amenity Category')
|
|
||||||
active = fields.Boolean('Active', default=True)
|
active = fields.Boolean('Active', default=True)
|
||||||
|
|
||||||
# TODO: Constrain coherence hotel_ids with amenity types hotel_ids
|
# TODO: Constrain coherence hotel_ids with amenity types hotel_ids
|
||||||
|
|||||||
@@ -8,20 +8,37 @@ class HotelBoardService(models.Model):
|
|||||||
_name = "hotel.board.service"
|
_name = "hotel.board.service"
|
||||||
_description = "Board Services"
|
_description = "Board Services"
|
||||||
|
|
||||||
name = fields.Char('Board Name', translate=True, size=64, required=True, index=True)
|
# Fields declaration
|
||||||
board_service_line_ids = fields.One2many('hotel.board.service.line',
|
name = fields.Char(
|
||||||
'hotel_board_service_id')
|
'Board Name',
|
||||||
price_type = fields.Selection([
|
translate=True,
|
||||||
('fixed','Fixed'),
|
size=64,
|
||||||
('percent','Percent')], string='Type', default='fixed', required=True)
|
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_ids = fields.One2many(
|
||||||
'hotel.board.service.room.type', 'hotel_board_service_id')
|
'hotel.board.service.room.type',
|
||||||
amount = fields.Float('Amount',
|
'hotel_board_service_id')
|
||||||
digits=dp.get_precision('Product Price'),
|
price_type = fields.Selection([
|
||||||
compute='_compute_board_amount',
|
('fixed', 'Fixed'),
|
||||||
store=True)
|
('percent', 'Percent')],
|
||||||
hotel_ids = fields.Many2many('hotel.property', string='Hotels', required=False, ondelete='restrict')
|
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')
|
@api.depends('board_service_line_ids.amount')
|
||||||
def _compute_board_amount(self):
|
def _compute_board_amount(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
|
|||||||
@@ -1,32 +1,37 @@
|
|||||||
# Copyright 2017 Dario Lodeiros
|
# Copyright 2017 Dario Lodeiros
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# 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.addons import decimal_precision as dp
|
||||||
from odoo.exceptions import UserError
|
|
||||||
|
|
||||||
|
|
||||||
class HotelBoardServiceLine(models.Model):
|
class HotelBoardServiceLine(models.Model):
|
||||||
_name = 'hotel.board.service.line'
|
_name = 'hotel.board.service.line'
|
||||||
_description = 'Services on Board Service included'
|
_description = 'Services on Board Service included'
|
||||||
|
|
||||||
|
# Default methods
|
||||||
def _get_default_price(self):
|
def _get_default_price(self):
|
||||||
if self.product_id:
|
if self.product_id:
|
||||||
return self.product_id.list_price
|
return self.product_id.list_price
|
||||||
|
|
||||||
|
# Fields declaration
|
||||||
hotel_board_service_id = fields.Many2one(
|
hotel_board_service_id = fields.Many2one(
|
||||||
'hotel.board.service',
|
'hotel.board.service',
|
||||||
'Board Service',
|
'Board Service',
|
||||||
ondelete='cascade',
|
ondelete='cascade',
|
||||||
required=True)
|
required=True)
|
||||||
product_id = fields.Many2one(
|
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 = fields.Float(
|
||||||
'Amount',
|
'Amount',
|
||||||
digits=dp.get_precision('Product Price'),
|
digits=dp.get_precision('Product Price'),
|
||||||
default=_get_default_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')
|
@api.onchange('product_id')
|
||||||
def onchange_product_id(self):
|
def onchange_product_id(self):
|
||||||
if self.product_id:
|
if self.product_id:
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ class HotelBoardServiceRoomType(models.Model):
|
|||||||
_log_access = False
|
_log_access = False
|
||||||
_description = 'Board Service included in Room'
|
_description = 'Board Service included in Room'
|
||||||
|
|
||||||
|
# Default Methods ang Gets
|
||||||
@api.multi
|
@api.multi
|
||||||
def name_get(self):
|
def name_get(self):
|
||||||
result = []
|
result = []
|
||||||
@@ -23,53 +24,42 @@ class HotelBoardServiceRoomType(models.Model):
|
|||||||
result.append((res.id, name))
|
result.append((res.id, name))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
# Fields declaration
|
||||||
hotel_board_service_id = fields.Many2one(
|
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_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(
|
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([
|
price_type = fields.Selection([
|
||||||
('fixed', 'Fixed'),
|
('fixed', 'Fixed'),
|
||||||
('percent', 'Percent')], string='Type', default='fixed', required=True)
|
('percent', 'Percent')],
|
||||||
amount = fields.Float('Amount',
|
string='Type',
|
||||||
digits=dp.get_precision('Product Price'),
|
default='fixed',
|
||||||
compute='_compute_board_amount',
|
required=True)
|
||||||
store=True)
|
amount = fields.Float(
|
||||||
board_service_line_ids = fields.One2many('hotel.board.service.room.type.line', 'hotel_board_service_room_type_id')
|
'Amount',
|
||||||
hotel_id = fields.Many2one('hotel.property',
|
digits=dp.get_precision('Product Price'),
|
||||||
related='hotel_room_type_id.hotel_id')
|
compute='_compute_board_amount',
|
||||||
|
store=True)
|
||||||
@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
|
|
||||||
|
|
||||||
|
# Compute and Search methods
|
||||||
@api.depends('board_service_line_ids.amount')
|
@api.depends('board_service_line_ids.amount')
|
||||||
def _compute_board_amount(self):
|
def _compute_board_amount(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
@@ -78,40 +68,85 @@ class HotelBoardServiceRoomType(models.Model):
|
|||||||
total += service.amount
|
total += service.amount
|
||||||
record.update({'amount': total})
|
record.update({'amount': total})
|
||||||
|
|
||||||
@api.model
|
# Constraints and onchanges
|
||||||
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}
|
|
||||||
|
|
||||||
@api.constrains('pricelist_id')
|
@api.constrains('pricelist_id')
|
||||||
def constrains_pricelist_id(self):
|
def constrains_pricelist_id(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
if self.pricelist_id:
|
if self.pricelist_id:
|
||||||
board_pricelist = self.env['hotel.board.service.room.type'].search([
|
board_pricelist = self.env['hotel.board.service.room.type'].search([
|
||||||
('pricelist_id','=', record.pricelist_id.id),
|
('pricelist_id', '=', record.pricelist_id.id),
|
||||||
('hotel_room_type_id','=', record.hotel_room_type_id.id),
|
('hotel_room_type_id', '=', record.hotel_room_type_id.id),
|
||||||
('hotel_board_service_id','=',record.hotel_board_service_id.id),
|
('hotel_board_service_id', '=', record.hotel_board_service_id.id),
|
||||||
('id','!=',record.id)
|
('id', '!=', record.id)
|
||||||
])
|
])
|
||||||
if board_pricelist:
|
if board_pricelist:
|
||||||
raise UserError(
|
raise UserError(
|
||||||
_("This Board Service in this Room can't repeat pricelist"))
|
_("This Board Service in this Room can't repeat pricelist"))
|
||||||
else:
|
else:
|
||||||
board_pricelist = self.env['hotel.board.service.room.type'].search([
|
board_pricelist = self.env['hotel.board.service.room.type'].search([
|
||||||
('pricelist_id','=', False),
|
('pricelist_id', '=', False),
|
||||||
('hotel_room_type_id','=', record.hotel_room_type_id.id),
|
('hotel_room_type_id', '=', record.hotel_room_type_id.id),
|
||||||
('hotel_board_service_id','=',record.hotel_board_service_id.id),
|
('hotel_board_service_id', '=', record.hotel_board_service_id.id),
|
||||||
('id','!=',record.id)
|
('id', '!=', record.id)
|
||||||
])
|
])
|
||||||
if board_pricelist:
|
if board_pricelist:
|
||||||
raise UserError(
|
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
|
# Copyright 2017 Dario Lodeiros
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# 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.addons import decimal_precision as dp
|
||||||
from odoo.exceptions import UserError
|
|
||||||
|
|
||||||
|
|
||||||
class HotelBoardServiceRoomTypeLine(models.Model):
|
class HotelBoardServiceRoomTypeLine(models.Model):
|
||||||
_name = 'hotel.board.service.room.type.line'
|
_name = 'hotel.board.service.room.type.line's
|
||||||
_description = 'Services on Board Service included in Room'
|
_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_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_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)
|
amount = fields.Float('Amount', digits=dp.get_precision('Product Price'), default=0.0)
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class HotelRoomType(models.Model):
|
|||||||
for record in self:
|
for record in self:
|
||||||
record.total_rooms_count = len(record.room_ids)
|
record.total_rooms_count = len(record.room_ids)
|
||||||
|
|
||||||
# CRUD methods
|
# ORM Overrides
|
||||||
@api.model
|
@api.model
|
||||||
def create(self, vals):
|
def create(self, vals):
|
||||||
""" Add room types as not purchase services. """
|
""" Add room types as not purchase services. """
|
||||||
|
|||||||
Reference in New Issue
Block a user