diff --git a/hotel/models/hotel_amenity.py b/hotel/models/hotel_amenity.py index 6243a2faa..43bc47f2b 100644 --- a/hotel/models/hotel_amenity.py +++ b/hotel/models/hotel_amenity.py @@ -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 diff --git a/hotel/models/hotel_amenity_type.py b/hotel/models/hotel_amenity_type.py index 47b75e760..7514d13b4 100644 --- a/hotel/models/hotel_amenity_type.py +++ b/hotel/models/hotel_amenity_type.py @@ -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): diff --git a/hotel/models/hotel_board_service.py b/hotel/models/hotel_board_service.py index 32f8313fe..275f284b5 100644 --- a/hotel/models/hotel_board_service.py +++ b/hotel/models/hotel_board_service.py @@ -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: diff --git a/hotel/models/hotel_board_service_line.py b/hotel/models/hotel_board_service_line.py index 8b9f4e8b9..8dfd69071 100644 --- a/hotel/models/hotel_board_service_line.py +++ b/hotel/models/hotel_board_service_line.py @@ -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: diff --git a/hotel/models/hotel_board_service_room_type.py b/hotel/models/hotel_board_service_room_type.py index 69e74e9dd..e0022baa9 100644 --- a/hotel/models/hotel_board_service_room_type.py +++ b/hotel/models/hotel_board_service_room_type.py @@ -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} diff --git a/hotel/models/hotel_board_service_room_type_line.py b/hotel/models/hotel_board_service_room_type_line.py index ba7757094..3c567d5ec 100644 --- a/hotel/models/hotel_board_service_room_type_line.py +++ b/hotel/models/hotel_board_service_room_type_line.py @@ -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) diff --git a/hotel/models/hotel_room.py b/hotel/models/hotel_room.py index b564eeed3..79bca659e 100644 --- a/hotel/models/hotel_room.py +++ b/hotel/models/hotel_room.py @@ -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', diff --git a/hotel/models/hotel_room_type.py b/hotel/models/hotel_room_type.py index ae4dcc293..55bd58ea0 100644 --- a/hotel/models/hotel_room_type.py +++ b/hotel/models/hotel_room_type.py @@ -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. """ diff --git a/hotel/models/hotel_shared_room.py b/hotel/models/hotel_shared_room.py index ee58a4ee6..d529f7271 100644 --- a/hotel/models/hotel_shared_room.py +++ b/hotel/models/hotel_shared_room.py @@ -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,