[WIP] Basic multihotel modeling

This commit is contained in:
Dario Lodeiros
2019-07-31 14:17:58 +02:00
parent 5f8d663ffa
commit 5a68d76bb0
43 changed files with 106 additions and 65 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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):

View File

@@ -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):

View File

@@ -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):

View File

@@ -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(

View File

@@ -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

View File

@@ -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):

View File

@@ -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')

View File

@@ -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',)

View File

@@ -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)

View File

@@ -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):

View File

@@ -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')

View File

@@ -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')

View File

@@ -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!')]

View File

@@ -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')

View File

@@ -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)',

View File

@@ -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'),

View File

@@ -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:

View File

@@ -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',)

View File

@@ -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')

View File

@@ -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):

View File

@@ -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')

View File

@@ -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')

View File

@@ -10,6 +10,8 @@
<form string="Board Service Line">
<group>
<field name="name" />
<field name="hotel_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
<field name="amount"/>
<field name="board_service_line_ids">
<tree editable="bottom">

View File

@@ -11,6 +11,8 @@
<sheet>
<h3>
<field name="name" />
<field name="hotel_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
<separator />
<label for="name" string="Max. days InTime before Checkin" />
<field name="days_intime" />

View File

@@ -24,6 +24,7 @@
<group name="group_left">
<field name="partner_id" required="True"
domain="[('is_company','=', False)]"/>
<field name="hotel_id" invisible="1"/>
<field name="enter_date"/>
<field name="exit_date"/>
<field name="arrival_hour"/>

View File

@@ -12,6 +12,8 @@
<group>
<field name="name" colspan="1" />
<field name="sequence" select="1" />
<field name="hotel_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
</group>
</sheet>
</form>

View File

@@ -80,7 +80,7 @@
</group>
<group>
<field name="pricelist_id" />
<field name="company_id" />
<field name="hotel_id" invisible="1"/>
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
<field name="reservation_type" attrs="{'readonly':[('state','not in',('draft'))]}"/>
<field name="channel_type" attrs="{'required':[('reservation_type','=','normal')]}"/>

View File

@@ -236,6 +236,7 @@
</group>
<group invisible="1">
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
<field name="hotel_id" invisible="1"/>
<!-- <field name="check_rooms" invisible="1"/> -->
<field name="checkin_partner_pending_count" invisible="1"/>
<!-- <field name="product_uom" string="Rent(UOM)" invisible="1" /> -->
@@ -254,6 +255,8 @@
<tree string="Services" editable="bottom"
decoration-success="is_board_service == True">
<field name="is_board_service" invisible="1" />
<field name="company_id" invisible="0"/>
<field name="hotel_id" invisible="0"/>
<button type="object" class="oe_stat_button"
icon="fa fa-1x fa-bed"
name="open_service_lines"

View File

@@ -11,6 +11,8 @@
<sheet>
<group>
<field name="name" string="Amenity Type" />
<field name="hotel_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
<!-- <field name="parent_id" domain="[('isamenitytype','=',True)]" /> -->
<!-- <field name="isamenitytype" invisible="1" /> -->
</group>

View File

@@ -18,7 +18,9 @@
</group>
<notebook>
<page string="Information">
<group colspan="4" col="4">
<group colspan="4" col="4">
<field name="hotel_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
<field name="room_amenity_type_id" select="2" string="Amenity Type" />
<!-- <field name="categ_id" select="1"
domain="[('isamenitytype','=',True)]" /> -->

View File

@@ -10,6 +10,8 @@
<sheet>
<field name="name" />
<field name="description" />
<field name="hotel_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
</sheet>
</form>
</field>

View File

@@ -17,6 +17,8 @@
</div>
<group colspan="4">
<group>
<field name="hotel_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
<field name="name" />
<field name="code_class" />
</group>

View File

@@ -15,12 +15,15 @@
options='{"terminology": "archive"}'/>
</button>
</div>
<div class="oe_title">
<label for="name" string="Name" />
<h1>
<field name="name" />
</h1>
</div>
<div class="oe_title">
<label for="name" string="Name" />
<h1>
<field name="name" />
</h1>
</div>
<group>
<field name="hotel_id" invisible="1"/>
</group>
<div>
<separator string="Pricelist Items"/>
<field name="item_ids" nolabel="1">

View File

@@ -22,6 +22,7 @@
<field name="class_id" />
</group>
<group>
<field name="hotel_id" invisible="1"/>
<field name="list_price" widget='monetary' options="{'currency_field': 'currency_id', 'field_digits': True}"/>
</group>
</group>

View File

@@ -32,6 +32,7 @@
<notebook>
<page name="information_hotel_room" string="Information">
<group colspan="4" col="4">
<field name="hotel_id" invisible="1"/>
<field name="floor_id" string="Ubication"
attrs="{'readonly':[('shared_room_id','!=', False)]}" />
<!-- <field name="categ_id" select="1" domain="[('isroomtype','=',True)]" string="Room Type" /> -->

View File

@@ -14,6 +14,7 @@
<field name="day_qty"/>
<field name="date" />
<field name="price_unit" />
<field name="hotel_id" invisible="1"/>
</group>
</form>
</field>
@@ -28,6 +29,7 @@
<field name="product_id" />
<field name="day_qty"/>
<field name="date" />
<field name="hotel_id" invisible="1"/>
</tree>
</field>
</record>

View File

@@ -1,48 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--======================= Hotel Service Type =========================== -->
<!-- Form view of hotel service type -->
<record model="ir.ui.view" id="hotel_service_type_view_form">
<field name="name">hotel.service_type.form</field>
<field name="model">hotel.service.type</field>
<field name="arch" type="xml">
<form string="Service Type">
<sheet>
<group>
<field name="name" select="1" string="Service Name" />
<!-- <field name="parent_id" domain="[('isservicetype','=',True)]"
select="1" /> -->
<!-- <field name="isservicetype" invisible="1" /> -->
</group>
</sheet>
</form>
</field>
</record>
<!-- Tree view of hotel service type -->
<record model="ir.ui.view" id="hotel_service_type_view_tree">
<field name="name">hotel.service_type.tree</field>
<field name="model">hotel.service.type</field>
<field name="arch" type="xml">
<tree string="Service Type">
<field name="name" />
</tree>
</field>
</record>
<!-- Action for hotel service type -->
<record model="ir.actions.act_window" id="open_hotel_service_type_form_tree">
<field name="name">Service Type</field>
<field name="res_model">hotel.service.type</field>
<!-- <field name="context">{'default_isservicetype':1}</field> -->
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_hotel_service" name="Services"
parent="hotel.hotel_configuration_menu" sequence="2" />
<menuitem name="Service Types" id="menu_open_hotel_service_type_form_tree"
action="open_hotel_service_type_form_tree" sequence="9"
parent="hotel.menu_hotel_service" />
</odoo>

View File

@@ -14,6 +14,8 @@
<field name="per_day" invisible="1"/>
<field name="is_board_service" invisible="1" />
<field name="folio_id" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="hotel_id" invisible="1"/>
<field name="product_id"
domain="[('sale_ok', '=', True)]"
options="{'create': False, 'create_edit': False}"
@@ -58,6 +60,8 @@
attrs="{'invisible':[('is_board_service','=', False)]}" />
<field name="per_day" invisible="1" readonly="1"/>
<field name="folio_id" invisible="1"/>
<field name="company_id" invisible="1"/>
<field name="hotel_id" invisible="1"/>
<field name="ser_room_line"
attrs = "{'required': [('per_day','=',True)]}" />
<field name="product_id"

View File

@@ -8,6 +8,7 @@
<xpath expr="//field[@name='date_invoice']" position="after">
<field name="folio_ids" widget="many2many_tags"/>
<field name="from_folio" invisible="1" />
<field name="hotel_id" invisible="1"/>
</xpath>
<xpath expr="//button[@name='%(account.action_account_invoice_payment)d']" position="attributes">
<attribute name="attrs">{'invisible': ['|',('from_folio','=',True)]}</attribute>

View File

@@ -7,6 +7,8 @@
<field name="arch" type="xml">
<xpath expr="//field[@name='country_group_ids']" position="before">
<field name="hotel_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
<field name="pricelist_type" />
<field name="cancelation_rule_id" />
</xpath>

View File

@@ -10,6 +10,8 @@
<page string="Hotel Service">
<group colspan="4">
<group>
<field name="hotel_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
<field name="is_extra_bed" />
<field name="daily_limit" />
<field name="show_in_calendar" />