[REF] Change Hotel by PMS and Property concept

This commit is contained in:
Darío Lodeiros
2020-07-07 18:05:22 +02:00
parent 8fce730435
commit 0fb48fade2
124 changed files with 1493 additions and 1549 deletions

View File

@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data noupdate="1">
<!-- Sequences for hotel folio -->
<record model="ir.sequence" id="seq_hotel_folio">
<field name="name">Hotel Folio</field>
<field name="code">hotel.folio</field>
<field name="prefix">F/</field>
<field name="padding">5</field>
</record>
</data>
</odoo>

View File

@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<menuitem id="hotel_management_menu" name="Hotel Management"
sequence="8" web_icon="hotel,static/description/icon.png"
groups="hotel.group_hotel_user,hotel.group_hotel_call"/>
<menuitem id="hotel_configuration_menu" name="Configuration"
sequence="20" parent="hotel_management_menu"
groups="hotel.group_hotel_user"/>
<menuitem id="hotel_reports_menu" name="Reports"
sequence="15" parent="hotel_management_menu"
groups="hotel.group_hotel_user"/>
<menuitem id="menu_account_finance_xls_reports" name="XLS Reports"
parent="hotel.hotel_reports_menu" sequence="50"/>
<menuitem id="configuration_others" name="Configuration"
parent="hotel.hotel_configuration_menu" sequence="10"
groups="hotel.group_hotel_manager" />
<menuitem id="hotel_massive_change" name="Massive Changes"
parent="hotel.configuration_others"
sequence="10" action="action_hotel_massive_change"/>
</odoo>

View File

@@ -1,37 +0,0 @@
# Copyright 2018 Alexandre Díaz
# Copyright 2018 Dario Lodeiros
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import inherited_ir_http
from . import inherited_payment_return
from . import hotel_board_service_room_type
from . import hotel_property
from . import inherited_res_users
from . import hotel_floor
from . import hotel_folio
from . import hotel_reservation
from . import hotel_room
from . import hotel_shared_room
from . import hotel_amenity
from . import hotel_amenity_type
from . import hotel_room_type
from . import hotel_service
from . import inherited_account_invoice
from . import inherited_product_template
from . import inherited_res_company
from . import inherited_account_payment
from . import hotel_room_type_restriction
from . import hotel_room_type_restriction_item
from . import hotel_reservation_line
from . import hotel_checkin_partner
from . import inherited_product_pricelist
from . import inherited_res_partner
from . import inherited_mail_compose_message
from . import hotel_room_type_class
from . import hotel_room_closure_reason
from . import hotel_service_line
from . import hotel_board_service
from . import hotel_board_service_room_type_line
from . import hotel_board_service_line
from . import inherited_account_invoice_line
from . import hotel_cancelation_rule

View File

@@ -1,35 +0,0 @@
# Copyright 2019 Pablo Quesada
# Copyright 2019 Dario Lodeiros
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, _
from odoo.http import request
from odoo.exceptions import MissingError
class IrHttp(models.AbstractModel):
_inherit = 'ir.http'
def session_info(self):
res = super().session_info()
user = request.env.user
display_switch_hotel_menu = len(user.hotel_ids) > 1
# TODO: limit hotels to the current company?
# or switch company automatically
res['hotel_id'] = request.env.user.hotel_id.id if \
request.session.uid else None
res['user_hotels'] = {
'current_hotel': (user.hotel_id.id, user.hotel_id.name),
'allowed_hotels': [
(hotel.id, hotel.name) for hotel in user.hotel_ids
]
} if display_switch_hotel_menu else False
if user.hotel_id.company_id in user.company_ids:
user.company_id = user.hotel_id.company_id
res['company_id'] = user.hotel_id.company_id.id
else:
raise MissingError(
_("Wrong hotel and company access settings for this user. "
"Please review hotel and company for user %s") % user.name)
return res

View File

@@ -1,27 +0,0 @@
# Copyright 2019 Pablo Quesada
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, api, fields
class ResUsers(models.Model):
_inherit = 'res.users'
# Default Methods ang Gets
@api.model
def _get_default_hotel(self):
return self.env.user.hotel_id
# Fields declaration
hotel_id = fields.Many2one(
'hotel.property',
string='Hotel',
default=_get_default_hotel,
help='The hotel this user is currently working for.',
context={'user_preference': True})
hotel_ids = fields.Many2many(
'hotel.property',
'hotel_property_users_rel',
'user_id',
'hotel_id',
string='Hotels',
default=_get_default_hotel)

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="0">
<!--Group for hotel user -->
<record id="group_hotel_user" model="res.groups">
<field name="name">Hotel Management / User</field>
</record>
<!--Group for hotel manager -->
<record id="group_hotel_manager" model="res.groups">
<field name="name">Hotel Management/ Manager</field>
<field name="implied_ids" eval="[(4, ref('hotel.group_hotel_user'))]"/>
</record>
<!--Group for hotel user -->
<record id="group_hotel_call" model="res.groups">
<field name="name">Hotel Management / CallCenter</field>
</record>
</data>
</odoo>

View File

@@ -1,66 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
user_access_hotel_floor,user_access_hotel_floor,model_hotel_floor,hotel.group_hotel_user,1,0,0,0
user_access_hotel_amenity,user_access_hotel_amenity,model_hotel_amenity,hotel.group_hotel_user,1,0,0,0
user_access_hotel_amenity_type,user_access_hotel_amenity_type,model_hotel_amenity_type,hotel.group_hotel_user,1,0,0,0
user_access_hotel_service,user_access_hotel_service,model_hotel_service,hotel.group_hotel_user,1,1,1,1
user_access_hotel_room_type_restriction,user_access_hotel_room_type_restriction,model_hotel_room_type_restriction,hotel.group_hotel_user,1,0,0,0
user_access_hotel_reservation_line,user_access_hotel_reservation_line,model_hotel_reservation_line,hotel.group_hotel_user,1,1,1,1
user_access_room_closure_reason,user_access_room_closure_reason,model_room_closure_reason,hotel.group_hotel_user,1,0,0,0
user_access_hotel_service_line,user_access_hotel_service_line,model_hotel_service_line,hotel.group_hotel_user,1,1,1,1
user_access_hotel_board_service,user_access_hotel_board_service,model_hotel_board_service,hotel.group_hotel_user,1,0,0,0
user_access_hotel_checkin_partner,user_access_hotel_checkin_partner,model_hotel_checkin_partner,hotel.group_hotel_user,1,1,1,1
user_access_hotel_room_type_class,user_access_hotel_room_type_class,model_hotel_room_type_class,hotel.group_hotel_user,1,0,0,0
user_access_hotel_room,user_access_hotel_room,model_hotel_room,hotel.group_hotel_user,1,0,0,0
user_access_shared_hotel_room,user_access_hotel_shared_room,model_hotel_shared_room,hotel.group_hotel_user,1,0,0,0
user_access_hotel_room_type_restriction_item,user_access_hotel_room_type_restriction_item,model_hotel_room_type_restriction_item,hotel.group_hotel_user,1,0,0,0
user_access_hotel_reservation,user_access_hotel_reservation,model_hotel_reservation,hotel.group_hotel_user,1,1,1,1
user_access_hotel_folio,user_access_hotel_folio,model_hotel_folio,hotel.group_hotel_user,1,1,1,1
user_access_hotel_room_type,user_access_hotel_room_type,model_hotel_room_type,hotel.group_hotel_user,1,0,0,0
user_access_hotel_board_service_room_type,user_access_hotel_board_service_room_type,model_hotel_board_service_room_type,hotel.group_hotel_user,1,0,0,0
user_access_hotel_board_service_room_type_line,user_access_hotel_board_service_room_type_line,model_hotel_board_service_room_type_line,hotel.group_hotel_user,1,0,0,0
user_access_hotel_board_service_line,user_access_hotel_board_service_line,model_hotel_board_service_line,hotel.group_hotel_user,1,0,0,0
user_access_account_partial_reconcile,user_access_account_partial_reconcile,account.model_account_partial_reconcile,hotel.group_hotel_user,1,1,1,1
user_access_hotel_cancelation_rule,user_access_hotel_cancelation_rule,model_hotel_cancelation_rule,hotel.group_hotel_user,1,0,0,0
user_access_account_full_reconcile,user_access_account_full_reconcile,account.model_account_full_reconcile,hotel.group_hotel_user,1,1,1,1
manager_access_hotel_floor,manager_access_hotel_floor,model_hotel_floor,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_amenity,manager_access_hotel_amenity,model_hotel_amenity,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_amenity_type,manager_access_hotel_amenity_type,model_hotel_amenity_type,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_service,manager_access_hotel_service,model_hotel_service,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_room_type_restriction,manager_access_hotel_room_type_restriction,model_hotel_room_type_restriction,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_reservation_line,manager_access_hotel_reservation_line,model_hotel_reservation_line,hotel.group_hotel_manager,1,1,1,1
manager_access_room_closure_reason,manager_access_room_closure_reason,model_room_closure_reason,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_service_line,manager_access_hotel_service_line,model_hotel_service_line,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_board_service,manager_access_hotel_board_service,model_hotel_board_service,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_checkin_partner,manager_access_hotel_checkin_partner,model_hotel_checkin_partner,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_room_type_class,manager_access_hotel_room_type_class,model_hotel_room_type_class,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_room,manager_access_hotel_room,model_hotel_room,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_shared_room,manager_access_hotel_shared_room,model_hotel_shared_room,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_room_type_restriction_item,manager_access_hotel_room_type_restriction_item,model_hotel_room_type_restriction_item,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_reservation,manager_access_hotel_reservation,model_hotel_reservation,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_folio,manager_access_hotel_folio,model_hotel_folio,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_room_type,manager_access_hotel_room_type,model_hotel_room_type,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_board_service_room_type,manager_access_hotel_board_service_room_type,model_hotel_board_service_room_type,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_board_service_room_type_line,manager_access_hotel_board_service_room_type_line,model_hotel_board_service_room_type_line,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_board_service_line,manager_access_hotel_board_service_line,model_hotel_board_service_line,hotel.group_hotel_manager,1,1,1,1
manager_access_hotel_cancelation_rule,manager_access_hotel_cancelation_rule,model_hotel_cancelation_rule,base.group_user,1,1,1,1
call_access_hotel_floor,call_access_hotel_floor,model_hotel_floor,hotel.group_hotel_call,1,0,0,0
call_access_hotel_amenity,call_access_hotel_amenity,model_hotel_amenity,hotel.group_hotel_call,1,0,0,0
call_access_hotel_amenity_type,call_access_hotel_amenity_type,model_hotel_amenity_type,hotel.group_hotel_call,1,0,0,0
call_access_hotel_service,call_access_hotel_service,model_hotel_service,hotel.group_hotel_call,1,1,1,1
call_access_hotel_room_type_restriction,call_access_hotel_room_type_restriction,model_hotel_room_type_restriction,hotel.group_hotel_call,1,0,0,0
call_access_hotel_reservation_line,call_access_hotel_reservation_line,model_hotel_reservation_line,hotel.group_hotel_call,1,1,1,1
call_access_room_closure_reason,call_access_room_closure_reason,model_room_closure_reason,hotel.group_hotel_call,1,0,0,0
call_access_hotel_service_line,call_access_hotel_service_line,model_hotel_service_line,hotel.group_hotel_call,1,1,1,1
call_access_hotel_board_service,call_access_hotel_board_service,model_hotel_board_service,hotel.group_hotel_call,1,0,0,0
call_access_hotel_checkin_partner,call_access_hotel_checkin_partner,model_hotel_checkin_partner,hotel.group_hotel_call,1,1,1,1
call_access_hotel_room_type_class,call_access_hotel_room_type_class,model_hotel_room_type_class,hotel.group_hotel_call,1,0,0,0
call_access_hotel_room,call_access_hotel_room,model_hotel_room,hotel.group_hotel_call,1,0,0,0
call_access_hotel_shared_room,call_access_hotel_shared_room,model_hotel_shared_room,hotel.group_hotel_call,1,0,0,0
call_access_hotel_room_type_restriction_item,call_access_hotel_room_type_restriction_item,model_hotel_room_type_restriction_item,hotel.group_hotel_call,1,0,0,0
call_access_hotel_reservation,call_access_hotel_reservation,model_hotel_reservation,hotel.group_hotel_call,1,1,1,1
call_access_hotel_folio,call_access_hotel_folio,model_hotel_folio,hotel.group_hotel_call,1,1,1,1
call_access_hotel_room_type,call_access_hotel_room_type,model_hotel_room_type,hotel.group_hotel_call,1,0,0,0
call_access_hotel_board_service_room_type,call_access_hotel_board_service_room_type,model_hotel_board_service_room_type,hotel.group_hotel_call,1,0,0,0
call_access_hotel_board_service_room_type_line,call_access_hotel_board_service_room_type_line,model_hotel_board_service_room_type_line,hotel.group_hotel_call,1,0,0,0
call_access_hotel_board_service_line,call_access_hotel_board_service_line,model_hotel_board_service_line,hotel.group_hotel_call,1,0,0,0
call_access_hotel_cancelation_rule,call_access_hotel_cancelation_rule,model_hotel_cancelation_rule,base.group_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 user_access_hotel_floor user_access_hotel_floor model_hotel_floor hotel.group_hotel_user 1 0 0 0
3 user_access_hotel_amenity user_access_hotel_amenity model_hotel_amenity hotel.group_hotel_user 1 0 0 0
4 user_access_hotel_amenity_type user_access_hotel_amenity_type model_hotel_amenity_type hotel.group_hotel_user 1 0 0 0
5 user_access_hotel_service user_access_hotel_service model_hotel_service hotel.group_hotel_user 1 1 1 1
6 user_access_hotel_room_type_restriction user_access_hotel_room_type_restriction model_hotel_room_type_restriction hotel.group_hotel_user 1 0 0 0
7 user_access_hotel_reservation_line user_access_hotel_reservation_line model_hotel_reservation_line hotel.group_hotel_user 1 1 1 1
8 user_access_room_closure_reason user_access_room_closure_reason model_room_closure_reason hotel.group_hotel_user 1 0 0 0
9 user_access_hotel_service_line user_access_hotel_service_line model_hotel_service_line hotel.group_hotel_user 1 1 1 1
10 user_access_hotel_board_service user_access_hotel_board_service model_hotel_board_service hotel.group_hotel_user 1 0 0 0
11 user_access_hotel_checkin_partner user_access_hotel_checkin_partner model_hotel_checkin_partner hotel.group_hotel_user 1 1 1 1
12 user_access_hotel_room_type_class user_access_hotel_room_type_class model_hotel_room_type_class hotel.group_hotel_user 1 0 0 0
13 user_access_hotel_room user_access_hotel_room model_hotel_room hotel.group_hotel_user 1 0 0 0
14 user_access_shared_hotel_room user_access_hotel_shared_room model_hotel_shared_room hotel.group_hotel_user 1 0 0 0
15 user_access_hotel_room_type_restriction_item user_access_hotel_room_type_restriction_item model_hotel_room_type_restriction_item hotel.group_hotel_user 1 0 0 0
16 user_access_hotel_reservation user_access_hotel_reservation model_hotel_reservation hotel.group_hotel_user 1 1 1 1
17 user_access_hotel_folio user_access_hotel_folio model_hotel_folio hotel.group_hotel_user 1 1 1 1
18 user_access_hotel_room_type user_access_hotel_room_type model_hotel_room_type hotel.group_hotel_user 1 0 0 0
19 user_access_hotel_board_service_room_type user_access_hotel_board_service_room_type model_hotel_board_service_room_type hotel.group_hotel_user 1 0 0 0
20 user_access_hotel_board_service_room_type_line user_access_hotel_board_service_room_type_line model_hotel_board_service_room_type_line hotel.group_hotel_user 1 0 0 0
21 user_access_hotel_board_service_line user_access_hotel_board_service_line model_hotel_board_service_line hotel.group_hotel_user 1 0 0 0
22 user_access_account_partial_reconcile user_access_account_partial_reconcile account.model_account_partial_reconcile hotel.group_hotel_user 1 1 1 1
23 user_access_hotel_cancelation_rule user_access_hotel_cancelation_rule model_hotel_cancelation_rule hotel.group_hotel_user 1 0 0 0
24 user_access_account_full_reconcile user_access_account_full_reconcile account.model_account_full_reconcile hotel.group_hotel_user 1 1 1 1
25 manager_access_hotel_floor manager_access_hotel_floor model_hotel_floor hotel.group_hotel_manager 1 1 1 1
26 manager_access_hotel_amenity manager_access_hotel_amenity model_hotel_amenity hotel.group_hotel_manager 1 1 1 1
27 manager_access_hotel_amenity_type manager_access_hotel_amenity_type model_hotel_amenity_type hotel.group_hotel_manager 1 1 1 1
28 manager_access_hotel_service manager_access_hotel_service model_hotel_service hotel.group_hotel_manager 1 1 1 1
29 manager_access_hotel_room_type_restriction manager_access_hotel_room_type_restriction model_hotel_room_type_restriction hotel.group_hotel_manager 1 1 1 1
30 manager_access_hotel_reservation_line manager_access_hotel_reservation_line model_hotel_reservation_line hotel.group_hotel_manager 1 1 1 1
31 manager_access_room_closure_reason manager_access_room_closure_reason model_room_closure_reason hotel.group_hotel_manager 1 1 1 1
32 manager_access_hotel_service_line manager_access_hotel_service_line model_hotel_service_line hotel.group_hotel_manager 1 1 1 1
33 manager_access_hotel_board_service manager_access_hotel_board_service model_hotel_board_service hotel.group_hotel_manager 1 1 1 1
34 manager_access_hotel_checkin_partner manager_access_hotel_checkin_partner model_hotel_checkin_partner hotel.group_hotel_manager 1 1 1 1
35 manager_access_hotel_room_type_class manager_access_hotel_room_type_class model_hotel_room_type_class hotel.group_hotel_manager 1 1 1 1
36 manager_access_hotel_room manager_access_hotel_room model_hotel_room hotel.group_hotel_manager 1 1 1 1
37 manager_access_hotel_shared_room manager_access_hotel_shared_room model_hotel_shared_room hotel.group_hotel_manager 1 1 1 1
38 manager_access_hotel_room_type_restriction_item manager_access_hotel_room_type_restriction_item model_hotel_room_type_restriction_item hotel.group_hotel_manager 1 1 1 1
39 manager_access_hotel_reservation manager_access_hotel_reservation model_hotel_reservation hotel.group_hotel_manager 1 1 1 1
40 manager_access_hotel_folio manager_access_hotel_folio model_hotel_folio hotel.group_hotel_manager 1 1 1 1
41 manager_access_hotel_room_type manager_access_hotel_room_type model_hotel_room_type hotel.group_hotel_manager 1 1 1 1
42 manager_access_hotel_board_service_room_type manager_access_hotel_board_service_room_type model_hotel_board_service_room_type hotel.group_hotel_manager 1 1 1 1
43 manager_access_hotel_board_service_room_type_line manager_access_hotel_board_service_room_type_line model_hotel_board_service_room_type_line hotel.group_hotel_manager 1 1 1 1
44 manager_access_hotel_board_service_line manager_access_hotel_board_service_line model_hotel_board_service_line hotel.group_hotel_manager 1 1 1 1
45 manager_access_hotel_cancelation_rule manager_access_hotel_cancelation_rule model_hotel_cancelation_rule base.group_user 1 1 1 1
46 call_access_hotel_floor call_access_hotel_floor model_hotel_floor hotel.group_hotel_call 1 0 0 0
47 call_access_hotel_amenity call_access_hotel_amenity model_hotel_amenity hotel.group_hotel_call 1 0 0 0
48 call_access_hotel_amenity_type call_access_hotel_amenity_type model_hotel_amenity_type hotel.group_hotel_call 1 0 0 0
49 call_access_hotel_service call_access_hotel_service model_hotel_service hotel.group_hotel_call 1 1 1 1
50 call_access_hotel_room_type_restriction call_access_hotel_room_type_restriction model_hotel_room_type_restriction hotel.group_hotel_call 1 0 0 0
51 call_access_hotel_reservation_line call_access_hotel_reservation_line model_hotel_reservation_line hotel.group_hotel_call 1 1 1 1
52 call_access_room_closure_reason call_access_room_closure_reason model_room_closure_reason hotel.group_hotel_call 1 0 0 0
53 call_access_hotel_service_line call_access_hotel_service_line model_hotel_service_line hotel.group_hotel_call 1 1 1 1
54 call_access_hotel_board_service call_access_hotel_board_service model_hotel_board_service hotel.group_hotel_call 1 0 0 0
55 call_access_hotel_checkin_partner call_access_hotel_checkin_partner model_hotel_checkin_partner hotel.group_hotel_call 1 1 1 1
56 call_access_hotel_room_type_class call_access_hotel_room_type_class model_hotel_room_type_class hotel.group_hotel_call 1 0 0 0
57 call_access_hotel_room call_access_hotel_room model_hotel_room hotel.group_hotel_call 1 0 0 0
58 call_access_hotel_shared_room call_access_hotel_shared_room model_hotel_shared_room hotel.group_hotel_call 1 0 0 0
59 call_access_hotel_room_type_restriction_item call_access_hotel_room_type_restriction_item model_hotel_room_type_restriction_item hotel.group_hotel_call 1 0 0 0
60 call_access_hotel_reservation call_access_hotel_reservation model_hotel_reservation hotel.group_hotel_call 1 1 1 1
61 call_access_hotel_folio call_access_hotel_folio model_hotel_folio hotel.group_hotel_call 1 1 1 1
62 call_access_hotel_room_type call_access_hotel_room_type model_hotel_room_type hotel.group_hotel_call 1 0 0 0
63 call_access_hotel_board_service_room_type call_access_hotel_board_service_room_type model_hotel_board_service_room_type hotel.group_hotel_call 1 0 0 0
64 call_access_hotel_board_service_room_type_line call_access_hotel_board_service_room_type_line model_hotel_board_service_room_type_line hotel.group_hotel_call 1 0 0 0
65 call_access_hotel_board_service_line call_access_hotel_board_service_line model_hotel_board_service_line hotel.group_hotel_call 1 0 0 0
66 call_access_hotel_cancelation_rule call_access_hotel_cancelation_rule model_hotel_cancelation_rule base.group_user 1 0 0 0

View File

@@ -1,47 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--==== Amenities Type ==== -->
<!-- Form view of hotel room amenities type -->
<record model="ir.ui.view" id="hotel_room_amenity_type_view_form">
<field name="name">hotel.room_amenity_type_form</field>
<field name="model">hotel.amenity.type</field>
<field name="arch" type="xml">
<form string="Hotel Room Amenities Type">
<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>
</sheet>
</form>
</field>
</record>
<!-- Tree view of hotel room amenities type -->
<record model="ir.ui.view" id="hotel_room_amenity_type_view_list">
<field name="name">hotel.room_amenity_type_list</field>
<field name="model">hotel.amenity.type</field>
<field name="arch" type="xml">
<tree string="Hotel Room Amenities Type">
<field name="name" />
</tree>
</field>
</record>
<!-- Action for hotel room amenities type -->
<record model="ir.actions.act_window" id="action_hotel_room_amenity_type_view_form">
<field name="name">Hotel Room amenity Type</field>
<field name="res_model">hotel.amenity.type</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="Amenity Types"
id="menu_action_hotel_room_amenity_type_view_form" action="action_hotel_room_amenity_type_view_form"
sequence="3" parent="hotel.menu_amenity" />
</odoo>

View File

@@ -1,51 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--==================================================== Board Services ==================================================== -->
<!-- Form view of hotel board service -->
<record model="ir.ui.view" id="hotel_board_service_form">
<field name="name">hotel.board.service.form</field>
<field name="model">hotel.board.service</field>
<field name="arch" type="xml">
<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">
<field name="product_id"/>
<field name="amount" />
</tree>
</field>
</group>
</form>
</field>
</record>
<!-- Tree view of hotel floor -->
<record model="ir.ui.view" id="hotel_board_service_view_tree">
<field name="name">hotel.board.service.tree</field>
<field name="model">hotel.board.service</field>
<field name="arch" type="xml">
<tree string="Hotel Board Services">
<field name="name" />
<field name="amount" />
</tree>
</field>
</record>
<!-- Action of hotel floor -->
<record model="ir.actions.act_window" id="open_hotel_board_service_form_tree">
<field name="name">Board Services</field>
<field name="res_model">hotel.board.service</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="Board Services" id="menu_open_hotel_board_service_form_tree"
action="open_hotel_board_service_form_tree" sequence="25"
parent="hotel.configuration_others" />
</odoo>

View File

@@ -1,47 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--==================================================== Floor ==================================================== -->
<!-- Form view of hotel floor -->
<record model="ir.ui.view" id="hotel_floor_view_form">
<field name="name">hotel.floor.form</field>
<field name="model">hotel.floor</field>
<field name="arch" type="xml">
<form string=" Hotel Ubication">
<sheet>
<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>
</field>
</record>
<!-- Tree view of hotel floor -->
<record model="ir.ui.view" id="hotel_floor_view_tree">
<field name="name">hotel.floor.tree</field>
<field name="model">hotel.floor</field>
<field name="arch" type="xml">
<tree string=" Hotel Ubications">
<field name="name" colspan="1" />
<field name="sequence" select="1" />
</tree>
</field>
</record>
<!-- Action of hotel floor -->
<record model="ir.actions.act_window" id="open_hotel_floor_form_tree">
<field name="name">Floor Structure</field>
<field name="res_model">hotel.floor</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="Ubitacions" id="menu_open_hotel_floor_form_tree"
action="open_hotel_floor_form_tree" sequence="21"
parent="hotel.configuration_others" />
</odoo>

View File

@@ -1,43 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Form view of hotel room type class-->
<record model="ir.ui.view" id="hotel_room_closure_reason_view_form">
<field name="name">hotel.room.closure.reason.form</field>
<field name="model">room.closure.reason</field>
<field name="arch" type="xml">
<form string="Hotel Room Closure Reason">
<sheet>
<field name="name" />
<field name="description" />
<field name="hotel_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
</sheet>
</form>
</field>
</record>
<!-- Tree view of hotel room type class -->
<record model="ir.ui.view" id="hotel_room_closure_reason_view_tree">
<field name="name">>hotel.room.closure.reason.tree</field>
<field name="model">room.closure.reason</field>
<field name="arch" type="xml">
<tree string="Hotel Room Closure Reason">
<field name="name"/>
<field name="description" />
</tree>
</field>
</record>
<!-- Action for hotel room type class -->
<record model="ir.actions.act_window" id="open_hotel_room_closure_reason_form_tree">
<field name="name">Room Closure Reason</field>
<field name="res_model">room.closure.reason</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="Closure Reasons" id="menu_hotel_room_closure_reason_form_tree"
action="open_hotel_room_closure_reason_form_tree" sequence="25"
parent="hotel.configuration_others" />
</odoo>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<template id="assets_backend" name="hotel assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/hotel/static/src/js/widgets/switch_hotel_menu.js"></script>
</xpath>
</template>
</data>
</odoo>

View File

@@ -2,11 +2,11 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'roomdoo',
'summary': "A property management system focused on medium-sized hotels",
'name': 'pms',
'summary': "A property management system",
'version': '11.0.2.0.0',
'development_status': 'Beta',
'category': 'Generic Modules/Hotel Management',
'category': 'Generic Modules/Property Management System',
'website': 'https://github.com/hootel/hootel',
'author': 'Darío Lodeiros, '
'Alexandre Díaz, '
@@ -17,24 +17,24 @@
'installable': True,
'depends': [
'base',
'sale_stock',
'mail',
'account_payment_return',
'partner_firstname',
'account_cancel',
'email_template_qweb'
],
'data': [
'security/hotel_security.xml',
'security/pms_security.xml',
'security/ir.model.access.csv',
'data/cron_jobs.xml',
'data/hotel_data.xml',
'data/hotel_sequence.xml',
'data/pms_data.xml',
'data/pms_sequence.xml',
'data/email_template_cancel.xml',
'data/email_template_reserv.xml',
'data/email_template_exit.xml',
'report/hotel_folio.xml',
'report/hotel_folio_templates.xml',
'templates/hotel_email_template.xml',
'report/pms_folio.xml',
'report/pms_folio_templates.xml',
'templates/pms_email_template.xml',
'wizard/massive_changes.xml',
'wizard/massive_price_reservation_days.xml',
'wizard/service_on_day.xml',
@@ -42,28 +42,28 @@
'wizard/wizard_reservation.xml',
'views/general.xml',
'data/menus.xml',
'views/hotel_amenity_views.xml',
'views/hotel_amenity_type_views.xml',
'views/hotel_board_service_views.xml',
'views/hotel_board_service_room_type_views.xml',
'views/hotel_cancelation_rule_views.xml',
'views/hotel_checkin_partner_views.xml',
'views/hotel_floor_views.xml',
'views/hotel_folio_views.xml',
'views/hotel_property_views.xml',
'views/hotel_reservation_views.xml',
'views/hotel_room_type_views.xml',
'views/hotel_room_views.xml',
'views/hotel_room_closure_reason_views.xml',
'views/pms_amenity_views.xml',
'views/pms_amenity_type_views.xml',
'views/pms_board_service_views.xml',
'views/pms_board_service_room_type_views.xml',
'views/pms_cancelation_rule_views.xml',
'views/pms_checkin_partner_views.xml',
'views/pms_floor_views.xml',
'views/pms_folio_views.xml',
'views/pms_property_views.xml',
'views/pms_reservation_views.xml',
'views/pms_room_type_views.xml',
'views/pms_room_views.xml',
'views/pms_room_closure_reason_views.xml',
'views/inherited_account_payment_views.xml',
'views/inherited_account_invoice_views.xml',
'views/inherited_res_users_views.xml',
'views/hotel_room_type_class_views.xml',
'views/hotel_room_type_restriction_views.xml',
'views/hotel_room_type_restriction_item_views.xml',
'views/hotel_service_views.xml',
'views/hotel_service_line_views.xml',
'views/hotel_shared_room_views.xml',
'views/pms_room_type_class_views.xml',
'views/pms_room_type_restriction_views.xml',
'views/pms_room_type_restriction_item_views.xml',
'views/pms_service_views.xml',
'views/pms_service_line_views.xml',
'views/pms_shared_room_views.xml',
'views/inherited_res_partner_views.xml',
'views/inherited_product_pricelist_views.xml',
'views/inherited_product_template_views.xml',
@@ -71,9 +71,9 @@
'wizard/folio_make_invoice_advance_views.xml',
],
'demo': [
'demo/hotel_demo.xml'
'demo/pms_demo.xml'
],
'qweb': [
'static/src/xml/hotel_base_templates.xml',
'static/src/xml/pms_base_templates.xml',
],
}

View File

@@ -10,7 +10,7 @@
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="doall" eval="False" />
<field name="model_id" ref="model_hotel_reservation" />
<field name="model_id" ref="model_pms_reservation" />
<field name="code">model.reservation_reminder_24hrs()</field>
</record>
@@ -23,7 +23,7 @@
<field name="numbercall">-1</field>
<field name="doall" eval="False" />
<field name="state">code</field>
<field name="model_id" ref="model_hotel_reservation" />
<field name="model_id" ref="model_pms_reservation" />
<field name="nextcall" eval="(DateTime.now() + timedelta(days=1)).strftime('%Y-%m-%d 05:00:00')"/>
<field name="code">model.autocheckout()</field>

View File

@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xml>
<odoo>
<data noupdate="1">
<!-- Email Template For Hotel Reservation -->
<record id="mail_template_hotel_cancel" model="mail.template">
<field name="name">Cancel Reservation-Send by Email</field>
<field name="subject">Cancelación de su reserva en ${object.company_id.property_name}</field>
<field name="partner_to">${(object.partner_id.id or '')}</field>
<field name="model_id" ref="hotel.model_hotel_folio"/>
<field name="auto_delete" eval="True" />
<field name="body_html">
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xml>
<odoo>
<data noupdate="1">
<!-- Email Template For PMS Reservation -->
<record id="mail_template_pms_cancel" model="mail.template">
<field name="name">Cancel Reservation-Send by Email</field>
<field name="subject">Cancelación de su reserva en ${object.company_id.property_name}</field>
<field name="partner_to">${(object.partner_id.id or '')}</field>
<field name="model_id" ref="pms.model_pms_folio"/>
<field name="auto_delete" eval="True" />
<field name="body_html">
<![CDATA[
<style type="text/css">
/*Global Styles*/
@@ -704,8 +704,8 @@
</tbody>
</table>
</div>
]]>
</field>
</record>
</data>
</odoo>
]]>
</field>
</record>
</data>
</odoo>

View File

@@ -2,12 +2,12 @@
<!DOCTYPE xml>
<odoo>
<data noupdate="1">
<!-- Email Template For Hotel Reservation -->
<record id="mail_template_hotel_exit" model="mail.template">
<!-- Email Template For PMS Reservation -->
<record id="mail_template_pms_exit" model="mail.template">
<field name="name">Exit Reservation-Send by Email</field>
<field name="subject">Gracias por alojarse con nosotros en ${object.company_id.property_name}</field>
<field name="partner_to">${(object.partner_id.id or '')}</field>
<field name="model_id" ref="hotel.model_hotel_folio"/>
<field name="model_id" ref="pms.model_pms_folio"/>
<field name="auto_delete" eval="True" />
<field name="body_html"><![CDATA[<style type="text/css">/*Global Styles*/
.marco {bgcolor:#f6f6f6; margin: 0; padding: 0; min-width: 100%!important;}

View File

@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xml>
<odoo>
<data noupdate="1">
<!-- Email Template For Hotel Reservation -->
<record id="mail_template_hotel_reservation" model="mail.template">
<field name="name">Confirm Reservation-Send by Email</field>
<field name="subject">Confirmación de los detalles de su reserva en ${object.company_id.property_name}</field>
<field name="partner_to">${(object.partner_id.id or '')}</field>
<field name="model_id" ref="hotel.model_hotel_folio"/>
<field name="auto_delete" eval="True" />
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xml>
<odoo>
<data noupdate="1">
<!-- Email Template For PMS Reservation -->
<record id="mail_template_pms_reservation" model="mail.template">
<field name="name">Confirm Reservation-Send by Email</field>
<field name="subject">Confirmación de los detalles de su reserva en ${object.company_id.property_name}</field>
<field name="partner_to">${(object.partner_id.id or '')}</field>
<field name="model_id" ref="pms.model_pms_folio"/>
<field name="auto_delete" eval="True" />
<field name="body_html"><![CDATA[
<style type="text/css">
/*Global Styles*/
@@ -1036,7 +1036,7 @@
</table>
</div>
]]>
</field>
</record>
</data>
</odoo>
</field>
</record>
</data>
</odoo>

27
pms/data/menus.xml Normal file
View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<menuitem id="pms_management_menu" name="pms Management"
sequence="8" web_icon="pms,static/description/icon.png"
groups="pms.group_pms_user,pms.group_pms_call"/>
<menuitem id="pms_configuration_menu" name="Configuration"
sequence="20" parent="pms_management_menu"
groups="pms.group_pms_user"/>
<menuitem id="pms_reports_menu" name="Reports"
sequence="15" parent="pms_management_menu"
groups="pms.group_pms_user"/>
<menuitem id="menu_account_finance_xls_reports" name="XLS Reports"
parent="pms.pms_reports_menu" sequence="50"/>
<menuitem id="configuration_others" name="Configuration"
parent="pms.pms_configuration_menu" sequence="10"
groups="pms.group_pms_manager" />
<menuitem id="pms_massive_change" name="Massive Changes"
parent="pms.configuration_others"
sequence="10" action="action_pms_massive_change"/>
</odoo>

View File

@@ -2,41 +2,41 @@
<odoo>
<data noupdate="1">
<!-- hotel.users -->
<!-- pms.users -->
<record id="base.user_root" model="res.users">
<field name="groups_id" eval="[(4,ref('hotel.group_hotel_manager'))]"/>
<field name="groups_id" eval="[(4,ref('pms.group_pms_manager'))]"/>
</record>
<record id="base.user_demo" model="res.users">
<field name="groups_id" eval="[(4,ref('hotel.group_hotel_user'))]"/>
<field name="groups_id" eval="[(4,ref('pms.group_pms_user'))]"/>
</record>
<!-- Basic hotel -->
<!-- Basic pms -->
<record id="main_hotel_room_type_restriction" model="hotel.room.type.restriction">
<record id="main_pms_room_type_restriction" model="pms.room.type.restriction">
<field name="name">Restriction Plan</field>
</record>
<record id="main_hotel_property" model="hotel.property">
<field name="name">My Hotel</field>
<record id="main_pms_property" model="pms.property">
<field name="name">My Property</field>
<field name="company_id" ref="base.main_company"/>
<field name="default_pricelist_id" ref="product.list0"/>
<field name="default_restriction_id" ref="main_hotel_room_type_restriction"/>
<field name="default_restriction_id" ref="main_pms_room_type_restriction"/>
<field name="street">Rua Street Demo, s/n</field>
<field name="city">Roomdoo city</field>
<field name="city">Commitsun city</field>
<field name="country_id" ref="base.es"/>
<field name="zip">15703</field>
<field name="phone">+34 123 456 879</field>
<field name="email">roomdoo@hoteldemo.roomdoo.com</field>
<field name="website">https://www.roomdoo.com</field>
<field name="email">commitsun@hootel.com</field>
<field name="website">https://www.commitsun.com</field>
</record>
<record model="res.users" id="base.user_root">
<field name="company_id" ref="base.main_company"/>
<field name="company_ids" eval="[(4, ref('base.main_company'))]"/>
<field name="hotel_id" ref="main_hotel_property"/>
<field name="hotel_ids" eval="[(4, ref('main_hotel_property'))]"/>
<field name="pms_property_id" ref="main_pms_property"/>
<field name="pms_property_ids" eval="[(4, ref('main_pms_property'))]"/>
</record>
</data>
</odoo>

14
pms/data/pms_sequence.xml Normal file
View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data noupdate="1">
<!-- Sequences for pms folio -->
<record model="ir.sequence" id="seq_pms_folio">
<field name="name">PMS Folio</field>
<field name="code">pms.folio</field>
<field name="prefix">F/</field>
<field name="padding">5</field>
</record>
</data>
</odoo>

View File

@@ -2,170 +2,170 @@
<odoo>
<data noupdate="1">
<!-- hotel.floor -->
<!-- pms.floor -->
<record id="hotel_floor_0" model="hotel.floor">
<record id="pms_floor_0" model="pms.floor">
<field name="name">Ground Floor</field>
</record>
<record id="hotel_floor_1" model="hotel.floor">
<record id="pms_floor_1" model="pms.floor">
<field name="name">First Floor</field>
</record>
<record id="hotel_floor_2" model="hotel.floor">
<record id="pms_floor_2" model="pms.floor">
<field name="name">Second Floor</field>
</record>
<!-- hotel.amenity.type -->
<!-- pms.amenity.type -->
<record id="hotel_amenity_type_0" model="hotel.amenity.type">
<record id="pms_amenity_type_0" model="pms.amenity.type">
<field name="name">Toiletries</field>
</record>
<record id="hotel_amenity_type_1" model="hotel.amenity.type">
<record id="pms_amenity_type_1" model="pms.amenity.type">
<field name="name">Connectivity</field>
</record>
<record id="hotel_amenity_type_2" model="hotel.amenity.type">
<record id="pms_amenity_type_2" model="pms.amenity.type">
<field name="name">Kitchen facilities</field>
</record>
<!-- hotel.amenity -->
<!-- pms.amenity -->
<record id="hotel_amenity_0" model="hotel.amenity">
<record id="pms_amenity_0" model="pms.amenity">
<field name="name">Shampoo and Soap</field>
<field name="room_amenity_type_id" ref="hotel_amenity_type_0"/>
<field name="room_amenity_type_id" ref="pms_amenity_type_0"/>
</record>
<record id="hotel_amenity_1" model="hotel.amenity">
<record id="pms_amenity_1" model="pms.amenity">
<field name="name">High-quality Shampoo and Soap Essential Herbs</field>
<field name="room_amenity_type_id" ref="hotel_amenity_type_0"/>
<field name="room_amenity_type_id" ref="pms_amenity_type_0"/>
</record>
<record id="hotel_amenity_2" model="hotel.amenity">
<record id="pms_amenity_2" model="pms.amenity">
<field name="name">Hair Dryer</field>
<field name="room_amenity_type_id" ref="hotel_amenity_type_0"/>
<field name="room_amenity_type_id" ref="pms_amenity_type_0"/>
</record>
<record id="hotel_amenity_3" model="hotel.amenity">
<record id="pms_amenity_3" model="pms.amenity">
<field name="name">High speed Wired Internet access</field>
<field name="room_amenity_type_id" ref="hotel_amenity_type_1"/>
<field name="room_amenity_type_id" ref="pms_amenity_type_1"/>
</record>
<record id="hotel_amenity_4" model="hotel.amenity">
<record id="pms_amenity_4" model="pms.amenity">
<field name="name">Wi-Fi</field>
<field name="room_amenity_type_id" ref="hotel_amenity_type_1"/>
<field name="room_amenity_type_id" ref="pms_amenity_type_1"/>
</record>
<record id="hotel_amenity_5" model="hotel.amenity">
<record id="pms_amenity_5" model="pms.amenity">
<field name="name">Microwave oven</field>
<field name="room_amenity_type_id" ref="hotel_amenity_type_2"/>
<field name="room_amenity_type_id" ref="pms_amenity_type_2"/>
</record>
<record id="hotel_amenity_6" model="hotel.amenity">
<record id="pms_amenity_6" model="pms.amenity">
<field name="name">Half-sized Refrigerator</field>
<field name="room_amenity_type_id" ref="hotel_amenity_type_2"/>
<field name="room_amenity_type_id" ref="pms_amenity_type_2"/>
</record>
<!-- hotel.room.type.class -->
<!-- pms.room.type.class -->
<record id="hotel_room_type_class_0" model="hotel.room.type.class">
<record id="pms_room_type_class_0" model="pms.room.type.class">
<field name="name">Room</field>
</record>
<record id="hotel_room_type_class_1" model="hotel.room.type.class">
<record id="pms_room_type_class_1" model="pms.room.type.class">
<field name="name">Conference</field>
</record>
<!-- hotel.room.type -->
<!-- pms.room.type -->
<record id="hotel_room_type_0" model="hotel.room.type">
<record id="pms_room_type_0" model="pms.room.type">
<field name="name">Economic</field>
<field name="code_type">ECO</field>
<field name="list_price">21.00</field>
<field name="class_id" ref="hotel_room_type_class_0"/>
<field name="class_id" ref="pms_room_type_class_0"/>
<field name="room_amenity_ids"
eval="[(4, ref('hotel_amenity_0'))]"/>
eval="[(4, ref('pms_amenity_0'))]"/>
</record>
<record id="hotel_room_type_1" model="hotel.room.type">
<record id="pms_room_type_1" model="pms.room.type">
<field name="name">Single</field>
<field name="code_type">SNG</field>
<field name="list_price">20.00</field>
<field name="class_id" ref="hotel_room_type_class_0"/>
<field name="class_id" ref="pms_room_type_class_0"/>
<field name="room_amenity_ids"
eval="[(4, ref('hotel_amenity_0')), (4, ref('hotel_amenity_4'))]"/>
eval="[(4, ref('pms_amenity_0')), (4, ref('pms_amenity_4'))]"/>
</record>
<record id="hotel_room_type_2" model="hotel.room.type">
<record id="pms_room_type_2" model="pms.room.type">
<field name="name">Double</field>
<field name="code_type">DBL</field>
<field name="list_price">25.00</field>
<field name="class_id" ref="hotel_room_type_class_0"/>
<field name="class_id" ref="pms_room_type_class_0"/>
<field name="room_amenity_ids"
eval="[(4, ref('hotel_amenity_0')), (4, ref('hotel_amenity_4'))]"/>
eval="[(4, ref('pms_amenity_0')), (4, ref('pms_amenity_4'))]"/>
</record>
<record id="hotel_room_type_3" model="hotel.room.type">
<record id="pms_room_type_3" model="pms.room.type">
<field name="name">Triple</field>
<field name="code_type">TRP</field>
<field name="list_price">35.00</field>
<field name="class_id" ref="hotel_room_type_class_0"/>
<field name="class_id" ref="pms_room_type_class_0"/>
<field name="room_amenity_ids"
eval="[(4, ref('hotel_amenity_0')), (4, ref('hotel_amenity_4'))]"/>
eval="[(4, ref('pms_amenity_0')), (4, ref('pms_amenity_4'))]"/>
</record>
<record id="hotel_room_type_4" model="hotel.room.type">
<record id="pms_room_type_4" model="pms.room.type">
<field name="name">Conference Room</field>
<field name="code_type">CFR</field>
<field name="list_price">80.00</field>
<field name="class_id" ref="hotel_room_type_class_1"/>
<field name="class_id" ref="pms_room_type_class_1"/>
<field name="room_amenity_ids"
eval="[(4, ref('hotel_amenity_3')), (4, ref('hotel_amenity_4'))]"/>
eval="[(4, ref('pms_amenity_3')), (4, ref('pms_amenity_4'))]"/>
</record>
<!-- hotel.room -->
<!-- pms.room -->
<record id="hotel_room_0" model="hotel.room">
<record id="pms_room_0" model="pms.room">
<field name="name">Economic-101</field>
<field name="room_type_id" ref="hotel_room_type_0"/>
<field name="floor_id" ref="hotel_floor_1"/>
<field name="room_type_id" ref="pms_room_type_0"/>
<field name="floor_id" ref="pms_floor_1"/>
<field name="capacity">2</field>
</record>
<record id="hotel_room_1" model="hotel.room">
<record id="pms_room_1" model="pms.room">
<field name="name">Single-101</field>
<field name="room_type_id" ref="hotel_room_type_1"/>
<field name="floor_id" ref="hotel_floor_1"/>
<field name="room_type_id" ref="pms_room_type_1"/>
<field name="floor_id" ref="pms_floor_1"/>
<field name="capacity">1</field>
</record>
<record id="hotel_room_2" model="hotel.room">
<record id="pms_room_2" model="pms.room">
<field name="name">Single-102</field>
<field name="room_type_id" ref="hotel_room_type_1"/>
<field name="floor_id" ref="hotel_floor_1"/>
<field name="room_type_id" ref="pms_room_type_1"/>
<field name="floor_id" ref="pms_floor_1"/>
<field name="capacity">1</field>
</record>
<record id="hotel_room_3" model="hotel.room">
<record id="pms_room_3" model="pms.room">
<field name="name">Single-103</field>
<field name="room_type_id" ref="hotel_room_type_1"/>
<field name="floor_id" ref="hotel_floor_1"/>
<field name="room_type_id" ref="pms_room_type_1"/>
<field name="floor_id" ref="pms_floor_1"/>
<field name="capacity">1</field>
</record>
<record id="hotel_room_4" model="hotel.room">
<record id="pms_room_4" model="pms.room">
<field name="name">Double-201</field>
<field name="room_type_id" ref="hotel_room_type_2"/>
<field name="floor_id" ref="hotel_floor_2"/>
<field name="room_type_id" ref="pms_room_type_2"/>
<field name="floor_id" ref="pms_floor_2"/>
<field name="capacity">2</field>
<field name="extra_beds_allowed">1</field>
</record>
<record id="hotel_room_5" model="hotel.room">
<record id="pms_room_5" model="pms.room">
<field name="name">Double-202</field>
<field name="room_type_id" ref="hotel_room_type_2"/>
<field name="floor_id" ref="hotel_floor_2"/>
<field name="room_type_id" ref="pms_room_type_2"/>
<field name="floor_id" ref="pms_floor_2"/>
<field name="capacity">2</field>
</record>
<record id="hotel_room_6" model="hotel.room">
<record id="pms_room_6" model="pms.room">
<field name="name">Triple-203</field>
<field name="room_type_id" ref="hotel_room_type_3"/>
<field name="floor_id" ref="hotel_floor_2"/>
<field name="room_type_id" ref="pms_room_type_3"/>
<field name="floor_id" ref="pms_floor_2"/>
<field name="capacity">3</field>
</record>
<record id="hotel_room_7" model="hotel.room">
<record id="pms_room_7" model="pms.room">
<field name="name">Open Talk Away Room</field>
<field name="room_type_id" ref="hotel_room_type_4"/>
<field name="floor_id" ref="hotel_floor_0"/>
<field name="room_type_id" ref="pms_room_type_4"/>
<field name="floor_id" ref="pms_floor_0"/>
<field name="capacity">1</field>
</record>
<!-- product.product for hotel services -->
<!-- product.product for pms services -->
<record id="hotel_service_0" model="product.product">
<record id="pms_service_0" model="product.product">
<field name="name">Breakfast Buffet</field>
<field name="list_price">5.0</field>
<field name="type">service</field>
@@ -174,7 +174,7 @@
<field name="per_person">True</field>
</record>
<record id="hotel_service_1" model="product.product">
<record id="pms_service_1" model="product.product">
<field name="name">Extra Bed</field>
<field name="list_price">15.0</field>
<field name="type">service</field>
@@ -186,7 +186,7 @@
<field name="show_in_calendar">True</field>
</record>
<record id="hotel_service_3" model="product.product">
<record id="pms_service_3" model="product.product">
<field name="name">Late Check-out</field>
<field name="list_price">10.0</field>
<field name="type">service</field>
@@ -195,7 +195,7 @@
<field name="per_person">False</field>
</record>
<record id="hotel_service_4" model="product.product">
<record id="pms_service_4" model="product.product">
<field name="name">Lunch</field>
<field name="list_price">15.0</field>
<field name="type">service</field>
@@ -204,7 +204,7 @@
<field name="per_person">True</field>
</record>
<record id="hotel_service_5" model="product.product">
<record id="pms_service_5" model="product.product">
<field name="name">Dinner</field>
<field name="list_price">20.0</field>
<field name="type">service</field>
@@ -213,7 +213,7 @@
<field name="per_person">True</field>
</record>
<record id="hotel_service_6" model="product.product">
<record id="pms_service_6" model="product.product">
<field name="name">Free Bar</field>
<field name="list_price">40.0</field>
<field name="type">service</field>
@@ -222,71 +222,71 @@
<field name="per_person">True</field>
</record>
<!-- hotel.board.service -->
<!-- pms.board.service -->
<record id="hotel_board_service_0" model="hotel.board.service">
<record id="pms_board_service_0" model="pms.board.service">
<field name="name">BreakFast</field>
<field name="board_service_line_ids"
eval="[(5, 0), (0, 0, {
'product_id': ref('hotel_service_0'),
'product_id': ref('pms_service_0'),
'amount': 3})]"/>
<field name="price_type">fixed</field>
</record>
<record id="hotel_board_service_1" model="hotel.board.service">
<record id="pms_board_service_1" model="pms.board.service">
<field name="name">Half Board</field>
<field name="board_service_line_ids"
eval="[(5, 0), (0, 0, {
'product_id': ref('hotel_service_0'),
'product_id': ref('pms_service_0'),
'amount': 3}),
(0, 0, {'product_id': ref('hotel_service_5'),
(0, 0, {'product_id': ref('pms_service_5'),
'amount': 8})
]"/>
<field name="price_type">fixed</field>
</record>
<record id="hotel_board_service_2" model="hotel.board.service">
<record id="pms_board_service_2" model="pms.board.service">
<field name="name">FullBoard</field>
<field name="board_service_line_ids"
eval="[(5, 0), (0, 0, {
'product_id': ref('hotel_service_0'),
'product_id': ref('pms_service_0'),
'amount': 3}),
(0, 0, {'product_id': ref('hotel_service_4'),
(0, 0, {'product_id': ref('pms_service_4'),
'amount': 8}),
(0, 0, {'product_id': ref('hotel_service_5'),
(0, 0, {'product_id': ref('pms_service_5'),
'amount': 8})
]"/>
<field name="price_type">fixed</field>
</record>
<!-- hotel.board.service.room.type -->
<!-- pms.board.service.room.type -->
<!--Room 0 Economic-->
<record id="hotel_board_service_room_0"
model="hotel.board.service.room.type">
<field name="hotel_board_service_id"
ref="hotel_board_service_0"/>
<field name="hotel_room_type_id"
ref="hotel_room_type_0"/>
<record id="pms_board_service_room_0"
model="pms.board.service.room.type">
<field name="pms_board_service_id"
ref="pms_board_service_0"/>
<field name="pms_room_type_id"
ref="pms_room_type_0"/>
<field name="price_type">fixed</field>
</record>
<record id="hotel_board_service_room_1"
model="hotel.board.service.room.type">
<field name="hotel_board_service_id"
ref="hotel_board_service_1"/>
<field name="hotel_room_type_id"
ref="hotel_room_type_0"/>
<record id="pms_board_service_room_1"
model="pms.board.service.room.type">
<field name="pms_board_service_id"
ref="pms_board_service_1"/>
<field name="pms_room_type_id"
ref="pms_room_type_0"/>
<field name="price_type">fixed</field>
</record>
<record id="hotel_board_service_room_2"
model="hotel.board.service.room.type">
<field name="hotel_board_service_id"
ref="hotel_board_service_1"/>
<field name="hotel_room_type_id"
ref="hotel_room_type_0"/>
<record id="pms_board_service_room_2"
model="pms.board.service.room.type">
<field name="pms_board_service_id"
ref="pms_board_service_1"/>
<field name="pms_room_type_id"
ref="pms_room_type_0"/>
<field name="pricelist_id"
ref="product.list0"/>
<field name="price_type">fixed</field>
@@ -294,74 +294,74 @@
<!--Room 3 Triple-->
<record id="hotel_board_service_room_3"
model="hotel.board.service.room.type">
<field name="hotel_board_service_id"
ref="hotel_board_service_0"/>
<field name="hotel_room_type_id"
ref="hotel_room_type_3"/>
<record id="pms_board_service_room_3"
model="pms.board.service.room.type">
<field name="pms_board_service_id"
ref="pms_board_service_0"/>
<field name="pms_room_type_id"
ref="pms_room_type_3"/>
<field name="price_type">fixed</field>
</record>
<record id="hotel_board_service_room_4"
model="hotel.board.service.room.type">
<field name="hotel_board_service_id"
ref="hotel_board_service_2"/>
<field name="hotel_room_type_id"
ref="hotel_room_type_3"/>
<record id="pms_board_service_room_4"
model="pms.board.service.room.type">
<field name="pms_board_service_id"
ref="pms_board_service_2"/>
<field name="pms_room_type_id"
ref="pms_room_type_3"/>
<field name="price_type">fixed</field>
</record>
<!-- room.closure.reason -->
<record id="hotel_room_closure_reason_0" model="room.closure.reason">
<record id="pms_room_closure_reason_0" model="room.closure.reason">
<field name="name">Maintenance</field>
<field name="description">Used for closing of rooms which require a maintenance. You can specify the reason in the own reservation.</field>
</record>
<record id="hotel_room_closure_reason_1" model="room.closure.reason">
<record id="pms_room_closure_reason_1" model="room.closure.reason">
<field name="name">VIP Privacy</field>
<field name="description">Used for closing of rooms for extra privacy.</field>
</record>
<!-- hotel.folio -->
<!-- pms.folio -->
<!-- reservation of 1 economic room for 1 person -->
<record id="hotel_folio_0" model="hotel.folio">
<record id="pms_folio_0" model="pms.folio">
<field name="partner_id" ref="base.res_partner_address_27"/>
<field name="reservation_ids"
eval="[(5, 0), (0, 0, {
'pricelist_id': 1,
'room_type_id': ref('hotel_room_type_0'),
'room_type_id': ref('pms_room_type_0'),
'checkin': DateTime.today().strftime('%Y-%m-%d'),
'checkout': (DateTime.today() + timedelta(days=2)).strftime('%Y-%m-%d'),
'adults': 2,
'state': 'confirm',
'board_service_room_id': ref('hotel_board_service_room_1'),
'board_service_room_id': ref('pms_board_service_room_1'),
})]"/>
</record>
<!-- reservation of 1 triple room for 3 people on behalf on the company -->
<record id="hotel_folio_1" model="hotel.folio">
<record id="pms_folio_1" model="pms.folio">
<field name="partner_id" ref="base.res_partner_12"/>
<field name="reservation_ids"
eval="[(5, 0), (0, 0, {
'pricelist_id': 1,
'room_type_id': ref('hotel_room_type_3'),
'room_type_id': ref('pms_room_type_3'),
'checkin': (DateTime.today() + timedelta(days=2)).strftime('%Y-%m-%d'),
'checkout': (DateTime.today() + timedelta(days=4)).strftime('%Y-%m-%d'),
'adults': 3,
'board_service_room_id': ref('hotel_board_service_room_3'),
'board_service_room_id': ref('pms_board_service_room_3'),
})]"/>
</record>
<!-- reservation of 3 single rooms for 3 people with 1 cancelled -->
<!-- TODO: The third reservation is marked from State: Cancelled to Pending Entry at Folio creation -->
<record id="hotel_folio_2" model="hotel.folio">
<record id="pms_folio_2" model="pms.folio">
<field name="partner_id" ref="base.res_partner_address_10"/>
<field name="reservation_ids"
eval="[(5, 0),
(0, 0, {
'pricelist_id': 1,
'room_type_id': ref('hotel_room_type_1'),
'room_type_id': ref('pms_room_type_1'),
'checkin': (DateTime.today() + timedelta(days=2)).strftime('%Y-%m-%d'),
'checkout': (DateTime.today() + timedelta(days=4)).strftime('%Y-%m-%d'),
'adults': 1,
@@ -369,7 +369,7 @@
}),
(0, 0, {
'pricelist_id': 1,
'room_type_id': ref('hotel_room_type_1'),
'room_type_id': ref('pms_room_type_1'),
'checkin': (DateTime.today() + timedelta(days=2)).strftime('%Y-%m-%d'),
'checkout': (DateTime.today() + timedelta(days=4)).strftime('%Y-%m-%d'),
'adults': 1,
@@ -377,7 +377,7 @@
}),
(0, 0, {
'pricelist_id': 1,
'room_type_id': ref('hotel_room_type_1'),
'room_type_id': ref('pms_room_type_1'),
'checkin': (DateTime.today() + timedelta(days=2)).strftime('%Y-%m-%d'),
'checkout': (DateTime.today() + timedelta(days=4)).strftime('%Y-%m-%d'),
'adults': 1,
@@ -385,12 +385,12 @@
})]"/>
</record>
<!-- reservation of the conference room for 1 day on behalf of a company -->
<record id="hotel_folio_3" model="hotel.folio">
<record id="pms_folio_3" model="pms.folio">
<field name="partner_id" ref="base.res_partner_12"/>
<field name="reservation_ids"
eval="[(5, 0), (0, 0, {
'pricelist_id': 1,
'room_type_id': ref('hotel_room_type_4'),
'room_type_id': ref('pms_room_type_4'),
'checkin': (DateTime.today() + timedelta(days=3)).strftime('%Y-%m-%d'),
'checkout': (DateTime.today() + timedelta(days=4)).strftime('%Y-%m-%d'),
'adults': 1,
@@ -398,55 +398,55 @@
})]"/>
</record>
<!-- out of service room -->
<record id="hotel_folio_4" model="hotel.folio">
<field name="partner_id" ref="main_hotel_property"/>
<record id="pms_folio_4" model="pms.folio">
<field name="partner_id" ref="main_pms_property"/>
<field name="reservation_type">out</field>
<field name="reservation_ids"
eval="[(5, 0), (0, 0, {
'pricelist_id': 1,
'room_type_id': ref('hotel_room_type_1'),
'room_type_id': ref('pms_room_type_1'),
'checkin': DateTime.today().strftime('%Y-%m-%d'),
'checkout': (DateTime.today() + timedelta(days=2)).strftime('%Y-%m-%d'),
'adults': 1,
'state': 'confirm',
'reservation_type': 'out',
'closure_reason_id': ref('hotel_room_closure_reason_0'),
'closure_reason_id': ref('pms_room_closure_reason_0'),
'out_service_description': 'Change of lighting',
})]"/>
</record>
<!-- Multi Hotel Demo -->
<record id="demo_hotel_room_type_restriction" model="hotel.room.type.restriction">
<!-- Multi pms Demo -->
<record id="demo_pms_room_type_restriction" model="pms.room.type.restriction">
<field name="name">Restriction Plan Demo</field>
</record>
<record id="demo_hotel_property" model="hotel.property">
<field name="name">My Hotel Demo</field>
<record id="demo_pms_property" model="pms.property">
<field name="name">My pms Demo</field>
<field name="company_id" ref="base.main_company"/>
<field name="default_pricelist_id" ref="product.list0"/>
<field name="default_restriction_id" ref="demo_hotel_room_type_restriction"/>
<field name="default_restriction_id" ref="demo_pms_room_type_restriction"/>
</record>
<!-- hotel.room.type -->
<!-- pms.room.type -->
<record id="demo_hotel_room_type_0" model="hotel.room.type">
<field name="hotel_id" ref="hotel.demo_hotel_property"/>
<record id="demo_pms_room_type_0" model="pms.room.type">
<field name="pms_id" ref="pms.demo_pms_property"/>
<field name="name">Economic</field>
<field name="code_type">ECO</field>
<field name="list_price">21.00</field>
<field name="class_id" ref="hotel_room_type_class_0"/>
<field name="class_id" ref="pms_room_type_class_0"/>
<field name="room_amenity_ids"
eval="[(4, ref('hotel_amenity_0'))]"/>
eval="[(4, ref('pms_amenity_0'))]"/>
</record>
<record id="demo_hotel_room_type_1" model="hotel.room.type">
<field name="hotel_id" ref="hotel.demo_hotel_property"/>
<record id="demo_pms_room_type_1" model="pms.room.type">
<field name="pms_id" ref="pms.demo_pms_property"/>
<field name="name">Single</field>
<field name="code_type">SNG</field>
<field name="list_price">20.00</field>
<field name="class_id" ref="hotel_room_type_class_0"/>
<field name="class_id" ref="pms_room_type_class_0"/>
<field name="room_amenity_ids"
eval="[(4, ref('hotel_amenity_0')), (4, ref('hotel_amenity_4'))]"/>
eval="[(4, ref('pms_amenity_0')), (4, ref('pms_amenity_4'))]"/>
</record>
</data>

37
pms/models/__init__.py Normal file
View File

@@ -0,0 +1,37 @@
# Copyright 2018 Alexandre Díaz
# Copyright 2018 Dario Lodeiros
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import inherited_ir_http
from . import inherited_payment_return
from . import pms_board_service_room_type
from . import pms_property
from . import inherited_res_users
from . import pms_floor
from . import pms_folio
from . import pms_reservation
from . import pms_room
from . import pms_shared_room
from . import pms_amenity
from . import pms_amenity_type
from . import pms_room_type
from . import pms_service
from . import inherited_account_invoice
from . import inherited_product_template
from . import inherited_res_company
from . import inherited_account_payment
from . import pms_room_type_restriction
from . import pms_room_type_restriction_item
from . import pms_reservation_line
from . import pms_checkin_partner
from . import inherited_product_pricelist
from . import inherited_res_partner
from . import inherited_mail_compose_message
from . import pms_room_type_class
from . import pms_room_closure_reason
from . import pms_service_line
from . import pms_board_service
from . import pms_board_service_room_type_line
from . import pms_board_service_line
from . import inherited_account_invoice_line
from . import pms_cancelation_rule

View File

@@ -11,10 +11,10 @@ class AccountInvoice(models.Model):
# Field Declarations
folio_ids = fields.Many2many(
comodel_name='hotel.folio',
comodel_name='pms.folio',
compute='_computed_folio_origin')
hotel_id = fields.Many2one(
'hotel.property')
pms_property_id = fields.Many2one(
'pms.property')
from_folio = fields.Boolean(
compute='_computed_folio_origin')
outstanding_folios_debits_widget = fields.Text(
@@ -37,7 +37,7 @@ class AccountInvoice(models.Model):
def action_folio_payments(self):
self.ensure_one()
sales = self.mapped('invoice_line_ids.sale_line_ids.order_id')
folios = self.env['hotel.folio'].search([
folios = self.env['pms.folio'].search([
('order_id.id', 'in', sales.ids)
])
payments_obj = self.env['account.payment']

View File

@@ -9,17 +9,17 @@ class AccountInvoiceLine(models.Model):
# Fields declaration
reservation_ids = fields.Many2many(
'hotel.reservation',
'pms.reservation',
'reservation_invoice_rel',
'invoice_line_id', 'reservation_id',
string='Reservations', readonly=True, copy=False)
service_ids = fields.Many2many(
'hotel.service',
'pms.service',
'service_line_invoice_rel',
'invoice_line_id', 'service_id',
string='Services', readonly=True, copy=False)
reservation_line_ids = fields.Many2many(
'hotel.reservation.line',
'pms.reservation.line',
'reservation_line_invoice_rel',
'invoice_line_id', 'reservation_line_id',
string='Reservation Lines', readonly=True, copy=False)

View File

@@ -9,7 +9,7 @@ class AccountPayment(models.Model):
# Fields declaration
folio_id = fields.Many2one(
'hotel.folio',
'pms.folio',
string='Folio')
amount_total_folio = fields.Float(
compute="_compute_folio_amount", store=True,
@@ -28,7 +28,7 @@ class AccountPayment(models.Model):
fol = ()
for payment in self:
if payment.folio_id:
fol = payment.env['hotel.folio'].search([
fol = payment.env['pms.folio'].search([
('id', '=', payment.folio_id.id)
])
else:
@@ -136,7 +136,7 @@ class AccountPayment(models.Model):
@api.multi
def modify_payment(self):
self.ensure_one()
view_form_id = self.env.ref('hotel.account_payment_view_form_folio').id
view_form_id = self.env.ref('pms.account_payment_view_form_folio').id
# invoices = self.mapped('invoice_ids.id')
return{
'name': _('Payment'),

View File

@@ -0,0 +1,35 @@
# Copyright 2019 Pablo Quesada
# Copyright 2019 Dario Lodeiros
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, _
from odoo.http import request
from odoo.exceptions import MissingError
class IrHttp(models.AbstractModel):
_inherit = 'ir.http'
def session_info(self):
res = super().session_info()
user = request.env.user
display_switch_pms_menu = len(user.pms_property_ids) > 1
# TODO: limit properties to the current company?
# or switch company automatically
res['pms_property_id'] = request.env.user.pms_property_id.id if \
request.session.uid else None
res['user_properties'] = {
'current_property': (user.pms_property_id.id, user.pms_property_id.name),
'allowed_properties': [
(property.id, property.name) for property in user.pms_property_ids
]
} if display_switch_pms_menu else False
if user.pms_property_id.company_id in user.company_ids:
user.company_id = user.pms_property_id.company_id
res['company_id'] = user.pms_property_id.company_id.id
else:
raise MissingError(
_("Wrong property and company access settings for this user. "
"Please review property and company for user %s") % user.name)
return res

View File

@@ -9,10 +9,10 @@ class MailComposeMessage(models.TransientModel):
@api.multi
def send_mail(self, auto_commit=False):
if self._context.get('default_model') == 'hotel.folio' and \
if self._context.get('default_model') == 'pms.folio' and \
self._context.get('default_res_id') and \
self._context.get('mark_so_as_sent'):
folio = self.env['hotel.folio'].browse([
folio = self.env['pms.folio'].browse([
self._context['default_res_id']
])
if folio:

View File

@@ -8,13 +8,13 @@ class PaymentReturn(models.Model):
# Fields declaration
folio_id = fields.Many2one(
'hotel.folio',
'pms.folio',
string='Folio')
hotel_id = fields.Many2one(
'hotel.property',
pms_property_id = fields.Many2one(
'pms.property',
store=True,
readonly=True,
related='folio_id.hotel_id')
related='folio_id.pms_property_id')
# Business methods
@api.multi
@@ -22,12 +22,12 @@ class PaymentReturn(models.Model):
pay = super(PaymentReturn, self).action_confirm()
if pay:
folio_ids = []
folios = self.env['hotel.folio'].browse(folio_ids)
folios = self.env['pms.folio'].browse(folio_ids)
for line in self.line_ids:
payments = self.env['account.payment'].search([
('move_line_ids', 'in', line.move_line_ids.ids)
])
folios_line = self.env['hotel.folio'].browse(
folios_line = self.env['pms.folio'].browse(
payments.mapped('folio_id.id'))
for folio in folios_line:
if self.id not in folio.return_ids.ids:

View File

@@ -7,18 +7,18 @@ from odoo.exceptions import ValidationError
class ProductPricelist(models.Model):
""" Before creating a 'daily' pricelist, you need to consider the following:
A pricelist marked as daily is used as a daily rate plan for room types and
therefore is related only with one hotel.
therefore is related only with one property.
"""
_inherit = 'product.pricelist'
# Fields declaration
hotel_ids = fields.Many2many(
'hotel.property',
string='Hotels',
pms_property_ids = fields.Many2many(
'pms.property',
string='Properties',
required=False,
ondelete='restrict')
cancelation_rule_id = fields.Many2one(
'hotel.cancelation.rule',
'pms.cancelation.rule',
string="Cancelation Policy")
pricelist_type = fields.Selection([
('daily', 'Daily Plan')],
@@ -27,21 +27,21 @@ class ProductPricelist(models.Model):
is_staff = fields.Boolean('Is Staff')
# Constraints and onchanges
@api.constrains('pricelist_type', 'hotel_ids')
def _check_pricelist_type_hotel_ids(self):
@api.constrains('pricelist_type', 'pms_property_ids')
def _check_pricelist_type_property_ids(self):
for record in self:
if record.pricelist_type == 'daily' and len(record.hotel_ids) != 1:
if record.pricelist_type == 'daily' and len(record.pms_property_ids) != 1:
raise ValidationError(
_("A daily pricelist is used as a daily Rate Plan "
"for room types and therefore must be related with "
"one and only one hotel."))
"one and only one property."))
if record.pricelist_type == 'daily' and len(record.hotel_ids) == 1:
hotel_id = self.env['hotel.property'].search([
if record.pricelist_type == 'daily' and len(record.pms_property_ids) == 1:
pms_property_id = self.env['pms.property'].search([
('default_pricelist_id', '=', record.id)
]) or None
if hotel_id and hotel_id != record.hotel_ids:
if pms_property_id and pms_property_id != record.pms_property_ids:
raise ValidationError(
_("Relationship mismatch.") + " " +
_("This pricelist is used as default in a "
"different hotel."))
"different property."))

View File

@@ -7,9 +7,9 @@ from odoo import models, fields
class ProductTemplate(models.Model):
_inherit = "product.template"
hotel_ids = fields.Many2many(
'hotel.property',
string='Hotels',
pms_property_ids = fields.Many2many(
'pms.property',
string='Properties',
required=False,
ondelete='restrict')
per_day = fields.Boolean('Unit increment per day')

View File

@@ -8,7 +8,7 @@ class ResCompany(models.Model):
_inherit = 'res.company'
# Fields declaration
hotel_ids = fields.One2many('hotel.property', 'company_id', 'Hotels')
pms_property_ids = fields.One2many('pms.property', 'company_id', 'Properties')
# TODO: need extra explanation or remove otherwise
# additional_hours = fields.Integer('Additional Hours',
# help="Provide the min hours value for \

View File

@@ -22,16 +22,16 @@ class ResPartner(models.Model):
# Compute and Search methods
def _compute_reservations_count(self):
hotel_reservation_obj = self.env['hotel.reservation']
pms_reservation_obj = self.env['pms.reservation']
for record in self:
record.reservations_count = hotel_reservation_obj.search_count([
record.reservations_count = pms_reservation_obj.search_count([
('partner_id.id', '=', record.id)
])
def _compute_folios_count(self):
hotel_folio_obj = self.env['hotel.folio']
pms_folio_obj = self.env['pms.folio']
for record in self:
record.folios_count = hotel_folio_obj.search_count([
record.folios_count = pms_folio_obj.search_count([
('partner_id.id', '=', record.id)
])

View File

@@ -0,0 +1,27 @@
# Copyright 2019 Pablo Quesada
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, api, fields
class ResUsers(models.Model):
_inherit = 'res.users'
# Default Methods ang Gets
@api.model
def _get_default_pms_property(self):
return self.env.user.pms_property_id
# Fields declaration
pms_property_id = fields.Many2one(
'pms.property',
string='Property',
default=_get_default_pms_property,
help='The property this user is currently working for.',
context={'user_preference': True})
pms_property_ids = fields.Many2many(
'pms.property',
'pms_property_users_rel',
'user_id',
'property_id',
string='Properties',
default=_get_default_pms_property)

View File

@@ -4,21 +4,21 @@
from odoo import models, fields
class HotelRoomAmenity(models.Model):
_name = 'hotel.amenity'
class PmsRoomAmenity(models.Model):
_name = 'pms.amenity'
_description = 'Room amenities'
# Fields declaration
name = fields.Char('Amenity Name', translate=True, required=True)
hotel_ids = fields.Many2many(
'hotel.property',
string='Hotels',
pms_property_ids = fields.Many2many(
'pms.property',
string='Properties',
required=False,
ondelete='restrict')
room_amenity_type_id = fields.Many2one(
'hotel.amenity.type',
'pms.amenity.type',
'Amenity Category')
default_code = fields.Char('Internal Reference')
active = fields.Boolean('Active', default=True)
# TODO: Constrain coherence hotel_ids with amenity types hotel_ids
# TODO: Constrain coherence pms_property_ids with amenity types pms_property_ids

View File

@@ -4,17 +4,17 @@
from odoo import models, fields
class HotelRoomAmenityType(models.Model):
_name = 'hotel.amenity.type'
class PmsRoomAmenityType(models.Model):
_name = 'pms.amenity.type'
_description = 'Amenities Type'
# Fields declaration
name = fields.Char('Amenity Type Name', translate=True, required=True)
hotel_ids = fields.Many2many(
'hotel.property', string='Hotels', required=False, ondelete='restrict')
room_amenity_ids = fields.One2many('hotel.amenity',
pms_property_ids = fields.Many2many(
'pms.property', string='Properties', required=False, ondelete='restrict')
room_amenity_ids = fields.One2many('pms.amenity',
'room_amenity_type_id',
'Amenities in this category')
active = fields.Boolean('Active', default=True)
# TODO: Constrain coherence hotel_ids with amenities hotel_ids
# TODO: Constrain coherence pms_property_ids with amenities pms_property_ids

View File

@@ -4,8 +4,8 @@ from odoo import api, models, fields
from odoo.addons import decimal_precision as dp
class HotelBoardService(models.Model):
_name = "hotel.board.service"
class PmsBoardService(models.Model):
_name = "pms.board.service"
_description = "Board Services"
# Fields declaration
@@ -16,16 +16,16 @@ class HotelBoardService(models.Model):
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',
'pms.board.service.line',
'pms_board_service_id')
pms_property_ids = fields.Many2many(
'pms.property',
string='Properties',
required=False,
ondelete='restrict')
hotel_board_service_room_type_ids = fields.One2many(
'hotel.board.service.room.type',
'hotel_board_service_id')
pms_board_service_room_type_ids = fields.One2many(
'pms.board.service.room.type',
'pms_board_service_id')
price_type = fields.Selection([
('fixed', 'Fixed'),
('percent', 'Percent')],

View File

@@ -4,8 +4,8 @@ from odoo import api, fields, models
from odoo.addons import decimal_precision as dp
class HotelBoardServiceLine(models.Model):
_name = 'hotel.board.service.line'
class PmsBoardServiceLine(models.Model):
_name = 'pms.board.service.line'
_description = 'Services on Board Service included'
# Default methods
@@ -14,8 +14,8 @@ class HotelBoardServiceLine(models.Model):
return self.product_id.list_price
# Fields declaration
hotel_board_service_id = fields.Many2one(
'hotel.board.service',
pms_board_service_id = fields.Many2one(
'pms.board.service',
'Board Service',
ondelete='cascade',
required=True)
@@ -23,9 +23,9 @@ class HotelBoardServiceLine(models.Model):
'product.product',
string='Product',
required=True)
hotel_ids = fields.Many2many(
'hotel.property',
related='hotel_board_service_id.hotel_ids')
pms_property_ids = fields.Many2many(
'pms.property',
related='pms_board_service_id.pms_property_ids')
amount = fields.Float(
'Amount',
digits=dp.get_precision('Product Price'),

View File

@@ -5,10 +5,10 @@ from odoo.addons import decimal_precision as dp
from odoo.exceptions import UserError
class HotelBoardServiceRoomType(models.Model):
_name = 'hotel.board.service.room.type'
_table = 'hotel_board_service_room_type_rel'
_rec_name = 'hotel_board_service_id'
class PmsBoardServiceRoomType(models.Model):
_name = 'pms.board.service.room.type'
_table = 'pms_board_service_room_type_rel'
_rec_name = 'pms_board_service_id'
_log_access = False
_description = 'Board Service included in Room'
@@ -19,23 +19,23 @@ class HotelBoardServiceRoomType(models.Model):
for res in self:
if res.pricelist_id:
name = u'%s (%s)' % (
res.hotel_board_service_id.name,
res.pms_board_service_id.name,
res.pricelist_id.name)
else:
name = u'%s (%s)' % (res.hotel_board_service_id.name,
name = u'%s (%s)' % (res.pms_board_service_id.name,
_('Generic'))
result.append((res.id, name))
return result
# Fields declaration
hotel_board_service_id = fields.Many2one(
'hotel.board.service',
pms_board_service_id = fields.Many2one(
'pms.board.service',
string='Board Service',
index=True,
ondelete='cascade',
required=True)
hotel_room_type_id = fields.Many2one(
'hotel.room.type',
pms_room_type_id = fields.Many2one(
'pms.room.type',
string='Room Type',
index=True,
ondelete='cascade',
@@ -45,11 +45,11 @@ class HotelBoardServiceRoomType(models.Model):
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')
'pms.board.service.room.type.line',
'pms_board_service_room_type_id')
pms_property_id = fields.Many2one(
'pms.property',
related='pms_room_type_id.pms_property_id')
price_type = fields.Selection([
('fixed', 'Fixed'),
('percent', 'Percent')],
@@ -76,22 +76,22 @@ class HotelBoardServiceRoomType(models.Model):
def constrains_pricelist_id(self):
for record in self:
if self.pricelist_id:
board_pricelist = self.env['hotel.board.service.room.type'].search([
board_pricelist = self.env['pms.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),
('pms_room_type_id', '=', record.pms_room_type_id.id),
('pms_board_service_id', '=',
record.pms_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([
board_pricelist = self.env['pms.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),
('pms_room_type_id', '=', record.pms_room_type_id.id),
('pms_board_service_id', '=',
record.pms_board_service_id.id),
('id', '!=', record.id)
])
if board_pricelist:
@@ -103,9 +103,9 @@ class HotelBoardServiceRoomType(models.Model):
@api.multi
def open_board_lines_form(self):
action = self.env.ref(
'hotel.action_hotel_board_service_room_type_view').read()[0]
'pms.action_pms_board_service_room_type_view').read()[0]
action['views'] = [(self.env.ref(
'hotel.hotel_board_service_room_type_form').id, 'form')]
'pms.pms_board_service_room_type_form').id, 'form')]
action['res_id'] = self.id
action['target'] = 'new'
return action
@@ -115,30 +115,30 @@ class HotelBoardServiceRoomType(models.Model):
def init(self):
self._cr.execute(
'SELECT indexname FROM pg_indexes WHERE indexname = %s',
('hotel_board_service_id_hotel_room_type_id_pricelist_id',))
('pms_board_service_id_pms_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)')
'CREATE INDEX pms_board_service_id_pms_room_type_id_pricelist_id \
ON pms_board_service_room_type_rel \
(pms_board_service_id, pms_room_type_id, pricelist_id)')
@api.model
def create(self, vals):
if 'hotel_board_service_id' in vals:
if 'pms_board_service_id' in vals:
vals.update(
self.prepare_board_service_reservation_ids(
vals['hotel_board_service_id'])
vals['pms_board_service_id'])
)
return super(HotelBoardServiceRoomType, self).create(vals)
return super(PmsBoardServiceRoomType, self).create(vals)
@api.multi
def write(self, vals):
if 'hotel_board_service_id' in vals:
if 'pms_board_service_id' in vals:
vals.update(
self.prepare_board_service_reservation_ids(
vals['hotel_board_service_id'])
vals['pms_board_service_id'])
)
return super(HotelBoardServiceRoomType, self).write(vals)
return super(PmsBoardServiceRoomType, self).write(vals)
# Business methods
@api.model
@@ -147,7 +147,7 @@ class HotelBoardServiceRoomType(models.Model):
Prepare line to price products config
"""
cmds = [(5, 0, 0)]
board_service = self.env['hotel.board.service'].browse(
board_service = self.env['pms.board.service'].browse(
board_service_id)
for line in board_service.board_service_line_ids:
cmds.append((0, False, {

View File

@@ -4,13 +4,13 @@ from odoo import fields, models
from odoo.addons import decimal_precision as dp
class HotelBoardServiceRoomTypeLine(models.Model):
_name = 'hotel.board.service.room.type.line'
class PmsBoardServiceRoomTypeLine(models.Model):
_name = 'pms.board.service.room.type.line'
_description = 'Services on Board Service included in Room'
# Fields declaration
hotel_board_service_room_type_id = fields.Many2one(
'hotel.board.service.room.type',
pms_board_service_room_type_id = fields.Many2one(
'pms.board.service.room.type',
'Board Service Room',
ondelete='cascade',
required=True)

View File

@@ -5,8 +5,8 @@ from odoo import models, fields
# TODO: refactoring to cancellation.rule
class HotelCancelationRule(models.Model):
_name = 'hotel.cancelation.rule'
class PmsCancelationRule(models.Model):
_name = 'pms.cancelation.rule'
_description = 'Cancelation Rules'
# Fields declaration
@@ -15,9 +15,9 @@ class HotelCancelationRule(models.Model):
'product.pricelist',
'cancelation_rule_id',
'Pricelist that use this rule')
hotel_ids = fields.Many2many(
'hotel.property',
string='Hotels',
pms_property_ids = fields.Many2many(
'pms.property',
string='Properties',
required=False,
ondelete='restrict')
active = fields.Boolean('Active', default=True)
@@ -37,4 +37,4 @@ class HotelCancelationRule(models.Model):
('days', 'Specify days')], 'No Show apply on', default='all')
days_noshow = fields.Integer('NoShow first days', default="2")
# TODO: Constrain coherence hotel_ids pricelist and cancelation_rules
# TODO: Constrain coherence pms_property_ids pricelist and cancelation_rules

View File

@@ -9,13 +9,13 @@ from odoo.tools import (
DEFAULT_SERVER_DATE_FORMAT)
class HotelCheckinPartner(models.Model):
_name = 'hotel.checkin.partner'
class PmsCheckinPartner(models.Model):
_name = 'pms.checkin.partner'
# Default Methods ang Gets
def _default_reservation_id(self):
if 'reservation_id' in self.env.context:
reservation = self.env['hotel.reservation'].browse([
reservation = self.env['pms.reservation'].browse([
self.env.context['reservation_id']
])
return reservation
@@ -23,7 +23,7 @@ class HotelCheckinPartner(models.Model):
def _default_partner_id(self):
if 'reservation_id' in self.env.context:
reservation = self.env['hotel.reservation'].browse([
reservation = self.env['pms.reservation'].browse([
self.env.context['reservation_id']
])
partner_ids = []
@@ -43,12 +43,12 @@ class HotelCheckinPartner(models.Model):
def _default_folio_id(self):
if 'folio_id' in self.env.context:
folio = self.env['hotel.folio'].browse([
folio = self.env['pms.folio'].browse([
self.env.context['folio_id']
])
return folio
if 'reservation_id' in self.env.context:
folio = self.env['hotel.reservation'].browse([
folio = self.env['pms.reservation'].browse([
self.env.context['reservation_id']
]).folio_id
return folio
@@ -56,7 +56,7 @@ class HotelCheckinPartner(models.Model):
def _default_enter_date(self):
if 'reservation_id' in self.env.context:
reservation = self.env['hotel.reservation'].browse([
reservation = self.env['pms.reservation'].browse([
self.env.context['reservation_id']
])
return reservation.checkin
@@ -64,15 +64,15 @@ class HotelCheckinPartner(models.Model):
def _default_exit_date(self):
if 'reservation_id' in self.env.context:
reservation = self.env['hotel.reservation'].browse([
reservation = self.env['pms.reservation'].browse([
self.env.context['reservation_id']
])
return reservation.checkout
return False
@api.model
def _get_default_hotel(self):
return self.env.user.hotel_id
def _get_default_pms_property(self):
return self.env.user.pms_property_id
# Fields declaration
partner_id = fields.Many2one(
@@ -80,16 +80,16 @@ class HotelCheckinPartner(models.Model):
default=_default_partner_id,
required=True)
reservation_id = fields.Many2one(
'hotel.reservation',
'pms.reservation',
default=_default_reservation_id)
folio_id = fields.Many2one(
'hotel.folio',
'pms.folio',
default=_default_folio_id,
readonly=True,
required=True)
hotel_id = fields.Many2one(
'hotel.property',
default=_get_default_hotel,
pms_property_id = fields.Many2one(
'pms.property',
default=_get_default_pms_property,
required=True)
email = fields.Char('E-mail', related='partner_id.email')
mobile = fields.Char('Mobile', related='partner_id.mobile')
@@ -170,7 +170,7 @@ class HotelCheckinPartner(models.Model):
master_reservation = \
record.reservation_id.parent_reservation or \
record.reservation_id
splitted_reservs = self.env['hotel.reservation'].search([
splitted_reservs = self.env['pms.reservation'].search([
('splitted', '=', True),
'|',
('parent_reservation', '=', master_reservation.id),
@@ -200,7 +200,7 @@ class HotelCheckinPartner(models.Model):
# ORM Overrides
@api.model
def create(self, vals):
record = super(HotelCheckinPartner, self).create(vals)
record = super(PmsCheckinPartner, self).create(vals)
if vals.get('auto_booking', False):
record.action_on_board()
return record
@@ -208,17 +208,17 @@ class HotelCheckinPartner(models.Model):
# Business methods
def _get_arrival_hour(self):
self.ensure_one()
tz_hotel = self.env.user.hotel_id.tz
tz_property = self.env.user.pms_property_id.tz
today = fields.Datetime.context_timestamp(
self.with_context(tz=tz_hotel),
self.with_context(tz=tz_property),
datetime.datetime.strptime(fields.Date.today(),
DEFAULT_SERVER_DATE_FORMAT))
default_arrival_hour = self.env.user.hotel_id.default_arrival_hour
default_arrival_hour = self.env.user.pms_property_id.default_arrival_hour
if self.reservation_id.checkin < today.strftime(
DEFAULT_SERVER_DATE_FORMAT):
return default_arrival_hour
now = fields.Datetime.context_timestamp(
self.with_context(tz=tz_hotel),
self.with_context(tz=tz_property),
datetime.datetime.strptime(fields.Datetime.now(),
DEFAULT_SERVER_DATETIME_FORMAT))
arrival_hour = now.strftime("%H:%M")
@@ -226,17 +226,17 @@ class HotelCheckinPartner(models.Model):
def _get_departure_hour(self):
self.ensure_one()
tz_hotel = self.env.user.hotel_id.tz
tz_property = self.env.user.pms_property_id.tz
today = fields.Datetime.context_timestamp(
self.with_context(tz=tz_hotel),
self.with_context(tz=tz_property),
datetime.datetime.strptime(fields.Date.today(),
DEFAULT_SERVER_DATE_FORMAT))
default_departure_hour = self.env.user.hotel_id.default_departure_hour
default_departure_hour = self.env.user.pms_property_id.default_departure_hour
if self.reservation_id.checkout < today.strftime(
DEFAULT_SERVER_DATE_FORMAT):
return default_departure_hour
now = fields.Datetime.context_timestamp(
self.with_context(tz=tz_hotel),
self.with_context(tz=tz_property),
datetime.datetime.strptime(fields.Datetime.now(),
DEFAULT_SERVER_DATETIME_FORMAT))
departure_hour = now.strftime("%H:%M")

View File

@@ -3,8 +3,8 @@
from odoo import models, fields
class HotelFloor(models.Model):
_name = "hotel.floor"
class PmsFloor(models.Model):
_name = "pms.floor"
_description = "Ubication"
# Fields declaration
@@ -13,9 +13,9 @@ class HotelFloor(models.Model):
size=64,
required=True,
index=True)
hotel_ids = fields.Many2many(
'hotel.property',
string='Hotels',
pms_property_ids = fields.Many2many(
'pms.property',
string='Properties',
required=False,
ondelete='restrict')
sequence = fields.Integer('Sequence')

View File

@@ -5,9 +5,9 @@
from odoo import models, fields, api, _
class HotelFolio(models.Model):
_name = 'hotel.folio'
_description = 'Hotel Folio'
class PmsFolio(models.Model):
_name = 'pms.folio'
_description = 'PMS Folio'
_inherit = ['mail.thread', 'mail.activity.mixin', 'portal.mixin']
_order = 'id'
@@ -19,7 +19,7 @@ class HotelFolio(models.Model):
this method return diff_invoicing = True, else, return False
"""
if 'folio_id' in self.env.context:
folio = self.env['hotel.folio'].browse([
folio = self.env['pms.folio'].browse([
self.env.context['folio_id']
])
if folio.partner_id.id == folio.partner_invoice_id.id:
@@ -31,8 +31,8 @@ class HotelFolio(models.Model):
return self.env['crm.team']._get_default_team_id()
@api.model
def _get_default_hotel(self):
return self.env.user.hotel_id
def _get_default_pms_property(self):
return self.env.user.pms_property_id
# Fields declaration
name = fields.Char(
@@ -40,32 +40,32 @@ class HotelFolio(models.Model):
readonly=True,
index=True,
default=lambda self: _('New'))
hotel_id = fields.Many2one(
'hotel.property',
default=_get_default_hotel,
pms_property_id = fields.Many2one(
'pms.property',
default=_get_default_pms_property,
required=True)
partner_id = fields.Many2one(
'res.partner',
track_visibility='onchange',
ondelete='restrict')
reservation_ids = fields.One2many(
'hotel.reservation',
'pms.reservation',
'folio_id',
readonly=False,
states={'done': [('readonly', True)]},
help="Hotel room reservation detail.",)
help="Room reservation detail.",)
service_ids = fields.One2many(
'hotel.service',
'pms.service',
'folio_id',
readonly=False,
states={'done': [('readonly', True)]},
help="Hotel services detail provide to customer and it will "
help="Services detail provide to customer and it will "
"include in main Invoice.")
company_id = fields.Many2one(
'res.company',
'Company',
default=lambda self: self.env['res.company']._company_default_get(
'hotel.folio'))
'pms.folio'))
analytic_account_id = fields.Many2one(
'account.analytic.account',
'Analytic Account',
@@ -111,7 +111,7 @@ class HotelFolio(models.Model):
'account.payment.term',
string='Payment Terms')
checkin_partner_ids = fields.One2many(
'hotel.checkin.partner',
'pms.checkin.partner',
'folio_id')
invoice_ids = fields.Many2many(
'account.invoice',
@@ -401,7 +401,7 @@ class HotelFolio(models.Model):
for rline in self.reservation_ids:
if rline.splitted:
master_reservation = rline.parent_reservation or rline
has_to_send = self.env['hotel.reservation'].search_count([
has_to_send = self.env['pms.reservation'].search_count([
('splitted', '=', True),
('folio_id', '=', self.id),
('to_send', '=', True),
@@ -424,7 +424,7 @@ class HotelFolio(models.Model):
for rline in self.reservation_ids:
if rline.splitted:
master_reservation = rline.parent_reservation or rline
has_to_send = self.env['hotel.reservation'].search_count([
has_to_send = self.env['pms.reservation'].search_count([
('splitted', '=', True),
('folio_id', '=', self.id),
('to_send', '=', True),
@@ -447,7 +447,7 @@ class HotelFolio(models.Model):
for rline in self.reservation_ids:
if rline.splitted:
master_reservation = rline.parent_reservation or rline
nreservs = self.env['hotel.reservation'].search_count([
nreservs = self.env['pms.reservation'].search_count([
('splitted', '=', True),
('folio_id', '=', self.id),
('to_send', '=', True),
@@ -487,7 +487,7 @@ class HotelFolio(models.Model):
addr = self.partner_id.address_get(['invoice'])
pricelist = self.partner_id.property_product_pricelist and \
self.partner_id.property_product_pricelist.id or \
self.env.user.hotel_id.default_pricelist_id.id
self.env.user.pms_property_id.default_pricelist_id.id
values = {
'pricelist_id': pricelist,
'payment_term_id': self.partner_id.property_payment_term_id and
@@ -509,7 +509,7 @@ class HotelFolio(models.Model):
@api.multi
@api.onchange('pricelist_id')
def onchange_pricelist_id(self):
values = {'reservation_type': self.env['hotel.folio'].
values = {'reservation_type': self.env['pms.folio'].
calcule_reservation_type(
self.pricelist_id.is_staff,
self.reservation_type
@@ -522,7 +522,7 @@ class HotelFolio(models.Model):
self.ensure_one()
partner = self.partner_id.id
amount = self.pending_amount
view_id = self.env.ref('hotel.account_payment_view_form_folio').id
view_id = self.env.ref('pms.account_payment_view_form_folio').id
return{
'name': _('Register Payment'),
'view_type': 'form',
@@ -590,7 +590,7 @@ class HotelFolio(models.Model):
'name': _('Checkins'),
'view_type': 'form',
'view_mode': 'tree,form',
'res_model': 'hotel.checkin.partner',
'res_model': 'pms.checkin.partner',
'type': 'ir.actions.act_window',
'domain': [('reservation_id', 'in', rooms)],
'target': 'new',
@@ -610,7 +610,7 @@ class HotelFolio(models.Model):
ir_model_data = self.env['ir.model.data']
try:
template_id = ir_model_data.get_object_reference(
'hotel',
'pms',
'email_template_reservation')[1]
except ValueError:
template_id = False
@@ -622,7 +622,7 @@ class HotelFolio(models.Model):
compose_form_id = False
ctx = dict()
ctx.update({
'default_model': 'hotel.folio',
'default_model': 'pms.folio',
'default_res_id': self._ids[0],
'default_use_template': bool(template_id),
'default_template_id': template_id,
@@ -656,8 +656,8 @@ class HotelFolio(models.Model):
ir_model_data = self.env['ir.model.data']
try:
template_id = ir_model_data.get_object_reference(
'hotel',
'mail_template_hotel_exit')[1]
'pms',
'mail_template_pms_exit')[1]
except ValueError:
template_id = False
try:
@@ -668,7 +668,7 @@ class HotelFolio(models.Model):
compose_form_id = False
ctx = dict()
ctx.update({
'default_model': 'hotel.reservation',
'default_model': 'pms.reservation',
'default_res_id': self._ids[0],
'default_use_template': bool(template_id),
'default_template_id': template_id,
@@ -699,8 +699,8 @@ class HotelFolio(models.Model):
ir_model_data = self.env['ir.model.data']
try:
template_id = ir_model_data.get_object_reference(
'hotel',
'mail_template_hotel_cancel')[1]
'pms',
'mail_template_pms_cancel')[1]
except ValueError:
template_id = False
try:
@@ -711,7 +711,7 @@ class HotelFolio(models.Model):
compose_form_id = False
ctx = dict()
ctx.update({
'default_model': 'hotel.reservation',
'default_model': 'pms.reservation',
'default_res_id': self._ids[0],
'default_use_template': bool(template_id),
'default_template_id': template_id,
@@ -738,12 +738,12 @@ class HotelFolio(models.Model):
if 'company_id' in vals:
vals['name'] = self.env['ir.sequence'].with_context(
force_company=vals['company_id']
).next_by_code('hotel.folio') or _('New')
).next_by_code('pms.folio') or _('New')
else:
vals['name'] = self.env['ir.sequence'].next_by_code(
'hotel.folio') or _('New')
'pms.folio') or _('New')
vals.update(self._prepare_add_missing_fields(vals))
result = super(HotelFolio, self).create(vals)
result = super(PmsFolio, self).create(vals)
return result
# Business methods

View File

@@ -7,46 +7,46 @@ from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class HotelProperty(models.Model):
_name = 'hotel.property'
_description = 'Hotel'
class PmsProperty(models.Model):
_name = 'pms.property'
_description = 'Property'
_inherits = {'res.partner': 'partner_id'}
# Fields declaration
partner_id = fields.Many2one(
'res.partner',
'Hotel Property',
'Property',
required=True,
delegate=True,
ondelete='cascade')
company_id = fields.Many2one(
'res.company',
required=True,
help='The company that owns or operates this hotel.')
help='The company that owns or operates this property.')
user_ids = fields.Many2many(
'res.users',
'hotel_property_users_rel',
'hotel_id',
'pms_property_users_rel',
'pms_property_id',
'user_id',
string='Accepted Users')
room_type_ids = fields.One2many(
'hotel.room.type',
'hotel_id',
'pms.room.type',
'pms_property_id',
'Room Types')
room_ids = fields.One2many(
'hotel.room',
'hotel_id',
'pms.room',
'pms_property_id',
'Rooms')
default_pricelist_id = fields.Many2one(
'product.pricelist',
string='Product Pricelist',
required=True,
help='The default pricelist used in this hotel.')
help='The default pricelist used in this property.')
default_restriction_id = fields.Many2one(
'hotel.room.type.restriction',
'pms.room.type.restriction',
'Restriction Plan',
required=True,
help='The default restriction plan used in this hotel.')
help='The default restriction plan used in this property.')
default_arrival_hour = fields.Char('Arrival Hour (GMT)',
help="HH:mm Format", default="14:00")
default_departure_hour = fields.Char('Departure Hour (GMT)',

View File

@@ -16,9 +16,9 @@ import logging
_logger = logging.getLogger(__name__)
class HotelReservation(models.Model):
_name = 'hotel.reservation'
_description = 'Hotel Reservation'
class PmsReservation(models.Model):
_name = 'pms.reservation'
_description = 'Reservation'
_inherit = ['mail.thread', 'mail.activity.mixin', 'portal.mixin']
_order = "last_updated_res desc, name"
@@ -26,36 +26,36 @@ class HotelReservation(models.Model):
def _get_default_checkin(self):
folio = False
if 'folio_id' in self._context:
folio = self.env['hotel.folio'].search([
folio = self.env['pms.folio'].search([
('id', '=', self._context['folio_id'])
])
if folio and folio.reservation_ids:
return folio.reservation_ids[0].checkin
else:
tz_hotel = self.env.user.hotel_id.tz
today = fields.Date.context_today(self.with_context(tz=tz_hotel))
tz_property = self.env.user.pms_property_id.tz
today = fields.Date.context_today(self.with_context(tz=tz_property))
return fields.Date.from_string(today).strftime(
DEFAULT_SERVER_DATE_FORMAT)
def _get_default_checkout(self):
folio = False
if 'folio_id' in self._context:
folio = self.env['hotel.folio'].search([
folio = self.env['pms.folio'].search([
('id', '=', self._context['folio_id'])
])
if folio and folio.reservation_ids:
return folio.reservation_ids[0].checkout
else:
tz_hotel = self.env.user.hotel_id.tz
today = fields.Date.context_today(self.with_context(tz=tz_hotel))
tz_property = self.env.user.pms_property_id.tz
today = fields.Date.context_today(self.with_context(tz=tz_property))
return (fields.Date.from_string(today) + timedelta(days=1)).\
strftime(DEFAULT_SERVER_DATE_FORMAT)
def _get_default_arrival_hour(self):
folio = False
default_arrival_hour = self.env.user.hotel_id.default_arrival_hour
default_arrival_hour = self.env.user.pms_property_id.default_arrival_hour
if 'folio_id' in self._context:
folio = self.env['hotel.folio'].search([
folio = self.env['pms.folio'].search([
('id', '=', self._context['folio_id'])
])
if folio and folio.reservation_ids:
@@ -65,9 +65,9 @@ class HotelReservation(models.Model):
def _get_default_departure_hour(self):
folio = False
default_departure_hour = self.env.user.hotel_id.default_departure_hour
default_departure_hour = self.env.user.pms_property_id.default_departure_hour
if 'folio_id' in self._context:
folio = self.env['hotel.folio'].search([
folio = self.env['pms.folio'].search([
('id', '=', self._context['folio_id'])
])
if folio and folio.reservation_ids:
@@ -82,7 +82,7 @@ class HotelReservation(models.Model):
this method return diff_invoicing = True, else, return False
"""
if 'reservation_id' in self.env.context:
reservation = self.env['hotel.reservation'].browse([
reservation = self.env['pms.reservation'].browse([
self.env.context['reservation_id']
])
if reservation.partner_id.id == reservation.partner_invoice_id.id:
@@ -92,20 +92,20 @@ class HotelReservation(models.Model):
# Fields declaration
name = fields.Text('Reservation Description', required=True)
room_id = fields.Many2one(
'hotel.room',
'pms.room',
string='Room',
track_visibility='onchange',
ondelete='restrict')
folio_id = fields.Many2one(
'hotel.folio',
'pms.folio',
string='Folio',
track_visibility='onchange',
ondelete='cascade')
board_service_room_id = fields.Many2one(
'hotel.board.service.room.type',
'pms.board.service.room.type',
string='Board Service')
room_type_id = fields.Many2one(
'hotel.room.type',
'pms.room.type',
string='Room Type',
required=True,
track_visibility='onchange')
@@ -128,27 +128,27 @@ class HotelReservation(models.Model):
string='Company',
store=True,
readonly=True)
hotel_id = fields.Many2one(
'hotel.property',
pms_property_id = fields.Many2one(
'pms.property',
store=True,
readonly=True,
related='folio_id.hotel_id')
related='folio_id.pms_property_id')
reservation_line_ids = fields.One2many(
'hotel.reservation.line',
'pms.reservation.line',
'reservation_id',
required=True)
service_ids = fields.One2many(
'hotel.service',
'pms.service',
'reservation_id')
pricelist_id = fields.Many2one(
'product.pricelist',
related='folio_id.pricelist_id')
# TODO: Warning Mens to update pricelist
checkin_partner_ids = fields.One2many(
'hotel.checkin.partner',
'pms.checkin.partner',
'reservation_id')
parent_reservation = fields.Many2one(
'hotel.reservation',
'pms.reservation',
string='Parent Reservation')
segmentation_ids = fields.Many2many(
related='folio_id.segmentation_ids')
@@ -232,7 +232,7 @@ class HotelReservation(models.Model):
partner_invoice_lang = fields.Selection(related="partner_invoice_id.lang")
# TODO: As checkin_partner_count is a computed field, it can't not
# be used in a domain filer Non-stored field
# hotel.reservation.checkin_partner_count cannot be searched
# pms.reservation.checkin_partner_count cannot be searched
# searching on a computed field can also be enabled by setting the
# search parameter. The value is a method name returning a Domains
checkin_partner_count = fields.Integer(
@@ -498,7 +498,7 @@ class HotelReservation(models.Model):
if not self.overbooking \
and self.state not in ('cancelled') \
and not self._context.get("ignore_avail_restrictions", False):
occupied = self.env['hotel.reservation'].get_reservations(
occupied = self.env['pms.reservation'].get_reservations(
self.checkin,
(fields.Date.from_string(self.checkout) - timedelta(days=1)).
strftime(DEFAULT_SERVER_DATE_FORMAT))
@@ -547,7 +547,7 @@ class HotelReservation(models.Model):
addr = self.partner_id.address_get(['invoice'])
pricelist = self.partner_id.property_product_pricelist and \
self.partner_id.property_product_pricelist.id or \
self.env.user.hotel_id.default_pricelist_id.id
self.env.user.pms_property_id.default_pricelist_id.id
values = {
'pricelist_id': pricelist,
'partner_invoice_id': addr['invoice'],
@@ -557,7 +557,7 @@ class HotelReservation(models.Model):
@api.multi
@api.onchange('pricelist_id')
def onchange_pricelist_id(self):
values = {'reservation_type': self.env['hotel.folio'].
values = {'reservation_type': self.env['pms.folio'].
calcule_reservation_type(
self.pricelist_id.is_staff,
self.reservation_type)}
@@ -648,7 +648,7 @@ class HotelReservation(models.Model):
if self.overbooking or self.reselling or \
self.state in ('cancelled'):
return
occupied = self.env['hotel.reservation'].get_reservations(
occupied = self.env['pms.reservation'].get_reservations(
self.checkin,
(fields.Date.from_string(self.checkout) - timedelta(days=1)).
strftime(DEFAULT_SERVER_DATE_FORMAT))
@@ -682,11 +682,11 @@ class HotelReservation(models.Model):
'folio_id': self.folio_id.id,
'reservation_id': self.id,
}
line = self.env['hotel.service'].new(res)
line = self.env['pms.service'].new(res)
res.update(
self.env['hotel.service']._prepare_add_missing_fields(
self.env['pms.service']._prepare_add_missing_fields(
res))
res.update(self.env['hotel.service'].prepare_service_ids(
res.update(self.env['pms.service'].prepare_service_ids(
dfrom=self.checkin,
days=self.nights,
per_person=product.per_person,
@@ -716,7 +716,7 @@ class HotelReservation(models.Model):
action['res_id'] = invoices.ids[0]
else:
action = self.env.ref(
'hotel.action_view_folio_advance_payment_inv').read()[0]
'pms.action_view_folio_advance_payment_inv').read()[0]
action['context'] = {'default_reservation_id': self.id,
'default_folio_id': self.folio_id.id}
return action
@@ -724,7 +724,7 @@ class HotelReservation(models.Model):
@api.multi
def create_invoice(self):
action = self.env.ref(
'hotel.action_view_folio_advance_payment_inv').read()[0]
'pms.action_view_folio_advance_payment_inv').read()[0]
action['context'] = {'default_reservation_id': self.id,
'default_folio_id': self.folio_id.id}
return action
@@ -732,10 +732,10 @@ class HotelReservation(models.Model):
@api.multi
def open_folio(self):
action = self.env.ref(
'hotel.open_hotel_folio1_form_tree_all').read()[0]
'pms.open_pms_folio1_form_tree_all').read()[0]
if self.folio_id:
action['views'] = [
(self.env.ref('hotel.hotel_folio_view_form').id, 'form')]
(self.env.ref('pms.pms_folio_view_form').id, 'form')]
action['res_id'] = self.folio_id.id
else:
action = {'type': 'ir.actions.act_window_close'}
@@ -744,9 +744,9 @@ class HotelReservation(models.Model):
@api.multi
def open_reservation_form(self):
action = self.env.ref(
'hotel.open_hotel_reservation_form_tree_all').read()[0]
'pms.open_pms_reservation_form_tree_all').read()[0]
action['views'] = [
(self.env.ref('hotel.hotel_reservation_view_form').id, 'form')]
(self.env.ref('pms.pms_reservation_view_form').id, 'form')]
action['res_id'] = self.id
return action
@@ -761,7 +761,7 @@ class HotelReservation(models.Model):
partner = self.partner_id.id
amount = min(self.price_room_services_set, self.folio_pending_amount)
note = self.folio_id.name + ' (' + self.name + ')'
view_id = self.env.ref('hotel.account_payment_view_form_folio').id
view_id = self.env.ref('pms.account_payment_view_form_folio').id
return{
'name': _('Register Payment'),
'view_type': 'form',
@@ -792,7 +792,7 @@ class HotelReservation(models.Model):
('folio_id.name', operator, name),
('room_id.name', operator, name)
]
return super(HotelReservation, self).name_search(
return super(PmsReservation, self).name_search(
name='', args=args, operator='ilike', limit=limit)
@api.multi
@@ -809,14 +809,14 @@ class HotelReservation(models.Model):
vals.update(self._autoassign(vals))
vals.update(self._prepare_add_missing_fields(vals))
if 'folio_id' in vals and 'channel_type' not in vals:
folio = self.env["hotel.folio"].browse(vals['folio_id'])
folio = self.env["pms.folio"].browse(vals['folio_id'])
vals.update({'channel_type': folio.channel_type})
elif 'partner_id' in vals:
folio_vals = {'partner_id': int(vals.get('partner_id')),
'channel_type': vals.get('channel_type')}
# Create the folio in case of need
# (To allow to create reservations direct)
folio = self.env["hotel.folio"].create(folio_vals)
folio = self.env["pms.folio"].create(folio_vals)
vals.update({'folio_id': folio.id,
'reservation_type': vals.get('reservation_type'),
'channel_type': vals.get('channel_type')})
@@ -825,7 +825,7 @@ class HotelReservation(models.Model):
if service[2]:
service[2]['folio_id'] = folio.id
user = self.env['res.users'].browse(self.env.uid)
if user.has_group('hotel.group_hotel_call'):
if user.has_group('pms.group_pms_call'):
vals.update({
'to_assign': True,
'channel_type': 'call'
@@ -848,7 +848,7 @@ class HotelReservation(models.Model):
and 'real_checkin' not in vals and 'real_checkout' not in vals:
vals['real_checkin'] = vals['checkin']
vals['real_checkout'] = vals['checkout']
record = super(HotelReservation, self).create(vals)
record = super(PmsReservation, self).create(vals)
if record.preconfirm:
record.confirm()
return record
@@ -883,7 +883,7 @@ class HotelReservation(models.Model):
record.service_ids.filtered(
lambda r: r.is_board_service is True).unlink()
board_services = []
board = self.env['hotel.board.service.room.type'].browse(
board = self.env['pms.board.service.room.type'].browse(
vals['board_service_room_id'])
for line in board.board_service_line_ids:
res = {
@@ -893,7 +893,7 @@ class HotelReservation(models.Model):
'reservation_id': self.id,
}
res.update(
self.env['hotel.service']._prepare_add_missing_fields(
self.env['pms.service']._prepare_add_missing_fields(
res))
board_services.append((0, False, res))
# REVIEW: Why I need add manually the old IDs if
@@ -929,11 +929,11 @@ class HotelReservation(models.Model):
('state' in vals and record.state != vals['state']):
record.update({'to_send': True})
user = self.env['res.users'].browse(self.env.uid)
if user.has_group('hotel.group_hotel_call'):
if user.has_group('pms.group_pms_call'):
vals.update({
'to_assign': True,
})
record = super(HotelReservation, self).write(vals)
record = super(PmsReservation, self).write(vals)
return record
# Business methods
@@ -1014,7 +1014,7 @@ class HotelReservation(models.Model):
room_type_id = values.get('room_type_id')
if checkin and checkout and room_type_id:
if 'overbooking' not in values:
room_chosen = self.env['hotel.room.type'].\
room_chosen = self.env['pms.room.type'].\
check_availability_room_type(
checkin,
(fields.Date.from_string(checkout) -
@@ -1024,7 +1024,7 @@ class HotelReservation(models.Model):
room_type_id)[0]
# Check room_chosen exist
else:
room_chosen = self.env['hotel.room.type'].browse(
room_chosen = self.env['pms.room.type'].browse(
room_type_id).room_ids[0]
res.update({
'room_id': room_chosen.id
@@ -1033,7 +1033,7 @@ class HotelReservation(models.Model):
@api.model
def autocheckout(self):
reservations = self.env['hotel.reservation'].search([
reservations = self.env['pms.reservation'].search([
('state', 'not in', ('done', 'cancelled')),
('checkout', '<', fields.Date.today())
])
@@ -1097,11 +1097,11 @@ class HotelReservation(models.Model):
@param self: object pointer
'''
_logger.info('confirm')
hotel_reserv_obj = self.env['hotel.reservation']
pms_reserv_obj = self.env['pms.reservation']
user = self.env['res.users'].browse(self.env.uid)
for record in self:
vals = {}
if user.has_group('hotel.group_hotel_call'):
if user.has_group('pms.group_pms_call'):
vals.update({'channel_type': 'call'})
if record.checkin_partner_ids:
vals.update({'state': 'booking'})
@@ -1116,7 +1116,7 @@ class HotelReservation(models.Model):
if record.splitted:
master_reservation = record.parent_reservation or record
splitted_reservs = hotel_reserv_obj.search([
splitted_reservs = pms_reserv_obj.search([
('splitted', '=', True),
'|',
('parent_reservation', '=', master_reservation.id),
@@ -1154,7 +1154,7 @@ class HotelReservation(models.Model):
record._compute_cancelled_discount()
if record.splitted:
master_reservation = record.parent_reservation or record
splitted_reservs = self.env['hotel.reservation'].search([
splitted_reservs = self.env['pms.reservation'].search([
('splitted', '=', True),
'|',
('parent_reservation', '=', master_reservation.id),
@@ -1171,9 +1171,9 @@ class HotelReservation(models.Model):
self.ensure_one()
pricelist = self.pricelist_id
if pricelist and pricelist.cancelation_rule_id:
tz_hotel = self.env.user.hotel_id.tz
tz_property = self.env.user.pms_property_id.tz
today = fields.Date.context_today(self.with_context(
tz=tz_hotel))
tz=tz_property))
days_diff = (fields.Date.from_string(self.real_checkin) -
fields.Date.from_string(today)).days
if days_diff < 0:
@@ -1193,7 +1193,7 @@ class HotelReservation(models.Model):
})
if record.splitted:
master_reservation = record.parent_reservation or record
splitted_reservs = self.env['hotel.reservation'].search([
splitted_reservs = self.env['pms.reservation'].search([
('splitted', '=', True),
'|',
('parent_reservation', '=', master_reservation.id),
@@ -1285,7 +1285,7 @@ class HotelReservation(models.Model):
if not vals:
vals = {}
room_type_id = vals.get('room_type_id') or self.room_type_id.id
product = self.env['hotel.room.type'].browse(room_type_id).product_id
product = self.env['pms.room.type'].browse(room_type_id).product_id
partner = self.env['res.partner'].browse(
vals.get('partner_id') or self.partner_id.id)
if 'discount' in vals and vals.get('discount') > 0:
@@ -1336,13 +1336,10 @@ class HotelReservation(models.Model):
"""
domain = self._get_domain_reservations_occupation(dfrom, dto)
# _logger.info(domain)
return self.env['hotel.reservation'].search(domain)
return self.env['pms.reservation'].search(domain)
@api.model
def _get_domain_reservations_occupation(self, dfrom, dto):
# WARNING If add or remove domain items,
# update _hcalendar_get_count_reservations_json_data
# in calendar module hotel_calendar
domain = [('reservation_line_ids.date', '>=', dfrom),
('reservation_line_ids.date', '<=', dto),
('state', '!=', 'cancelled'),
@@ -1360,15 +1357,15 @@ class HotelReservation(models.Model):
@return: dictionary of lists with reservations (a hash of arrays!)
with the reservations dates between dfrom and dto
reservations_dates
{'2018-07-30': [hotel.reservation(29,), hotel.reservation(30,),
hotel.reservation(31,)],
'2018-07-31': [hotel.reservation(22,), hotel.reservation(35,),
hotel.reservation(36,)],
{'2018-07-30': [pms.reservation(29,), pms.reservation(30,),
pms.reservation(31,)],
'2018-07-31': [pms.reservation(22,), pms.reservation(35,),
pms.reservation(36,)],
}
"""
domain = [('date', '>=', dfrom),
('date', '<', dto)]
lines = self.env['hotel.reservation.line'].search(domain)
lines = self.env['pms.reservation.line'].search(domain)
reservations_dates = {}
for record in lines:
# kumari.net/index.php/programming/programmingcat/22-python-making-a-dictionary-of-lists-a-hash-of-arrays
@@ -1411,7 +1408,7 @@ class HotelReservation(models.Model):
lambda check: check.state == 'booking').action_done()
if record.splitted:
master_reservation = record.parent_reservation or record
splitted_reservs = self.env['hotel.reservation'].search([
splitted_reservs = self.env['pms.reservation'].search([
('splitted', '=', True),
'|',
('parent_reservation', '=', master_reservation.id),
@@ -1428,9 +1425,9 @@ class HotelReservation(models.Model):
def action_checks(self):
self.ensure_one()
action = self.env.ref(
'hotel.open_hotel_reservation_form_tree_all').read()[0]
'pms.open_pms_reservation_form_tree_all').read()[0]
action['views'] = [
(self.env.ref('hotel.hotel_reservation_checkin_view_form').id,
(self.env.ref('pms.pms_reservation_checkin_view_form').id,
'form')]
action['res_id'] = self.id
action['target'] = 'new'
@@ -1480,7 +1477,7 @@ class HotelReservation(models.Model):
'reservation_line_ids': reservation_lines[1],
'preconfirm': False,
})
reservation_copy = self.env['hotel.reservation'].with_context({
reservation_copy = self.env['pms.reservation'].with_context({
'ignore_avail_restrictions': True}).create(vals)
if not reservation_copy:
raise ValidationError(_("Unexpected error copying record. \
@@ -1501,7 +1498,7 @@ class HotelReservation(models.Model):
master_reservation = self.parent_reservation or self
splitted_reservs = self.env['hotel.reservation'].search([
splitted_reservs = self.env['pms.reservation'].search([
('splitted', '=', True),
('folio_id', '=', self.folio_id.id),
'|',
@@ -1579,9 +1576,9 @@ class HotelReservation(models.Model):
if not self.parent_reservation:
raise ValidationError(_("This is the parent reservation"))
action = self.env.ref(
'hotel.open_hotel_reservation_form_tree_all').read()[0]
'pms.open_pms_reservation_form_tree_all').read()[0]
action['views'] = [
(self.env.ref('hotel.hotel_reservation_view_form').id, 'form')]
(self.env.ref('pms.pms_reservation_view_form').id, 'form')]
action['res_id'] = self.parent_reservation.id
return action
@@ -1619,4 +1616,4 @@ class HotelReservation(models.Model):
@api.multi
def set_call_center_user(self):
user = self.env['res.users'].browse(self.env.uid)
return user.has_group('hotel.group_hotel_call')
return user.has_group('pms.group_pms_call')

View File

@@ -6,8 +6,8 @@ from odoo.addons import decimal_precision as dp
from odoo.exceptions import ValidationError
class HotelReservationLine(models.Model):
_name = "hotel.reservation.line"
class PmsReservationLine(models.Model):
_name = "pms.reservation.line"
_order = "date"
# Default Methods ang Gets
@@ -22,7 +22,7 @@ class HotelReservationLine(models.Model):
# Fields declaration
reservation_id = fields.Many2one(
'hotel.reservation',
'pms.reservation',
string='Reservation',
ondelete='cascade',
required=True,
@@ -35,11 +35,11 @@ class HotelReservationLine(models.Model):
string='Invoice Lines',
readonly=True,
copy=False)
hotel_id = fields.Many2one(
'hotel.property',
pms_property_id = fields.Many2one(
'pms.property',
store=True,
readonly=True,
related='reservation_id.hotel_id')
related='reservation_id.pms_property_id')
date = fields.Date('Date')
state = fields.Selection(related='reservation_id.state')
price = fields.Float(

View File

@@ -6,33 +6,33 @@ from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class HotelRoom(models.Model):
class PmsRoom(models.Model):
""" The rooms for lodging can be for sleeping, usually called rooms,
and also for speeches (conference rooms), parking,
relax with cafe con leche, spa...
"""
_name = 'hotel.room'
_description = 'Hotel Room'
_name = 'pms.room'
_description = 'Property Room'
_order = "sequence, room_type_id, name"
# Fields declaration
name = fields.Char('Room Name', required=True)
hotel_id = fields.Many2one(
'hotel.property',
pms_property_id = fields.Many2one(
'pms.property',
store=True,
readonly=True,
related='room_type_id.hotel_id')
related='room_type_id.pms_property_id')
room_type_id = fields.Many2one(
'hotel.room.type',
'Hotel Room Type',
'pms.room.type',
'Property Room Type',
required=True,
ondelete='restrict')
shared_room_id = fields.Many2one(
'hotel.shared.room',
'pms.shared.room',
'Shared Room',
default=False)
floor_id = fields.Many2one(
'hotel.floor',
'pms.floor',
'Ubication',
help='At which floor the room is located.')
capacity = fields.Integer('Capacity')
@@ -59,30 +59,30 @@ class HotelRoom(models.Model):
# CRUD methods
@api.model
def create(self, vals):
if vals.get('hotel_id', self.env.user.hotel_id.id) != \
self.env['hotel.room.type'].browse(
vals['room_type_id']).hotel_id.id:
if vals.get('pms_property_id', self.env.user.pms_property_id.id) != \
self.env['pms.room.type'].browse(
vals['room_type_id']).pms_property_id.id:
raise ValidationError(
_("A room cannot be created in a room type \
of another hotel."))
of another property."))
return super().create(vals)
@api.multi
def write(self, vals):
for record in self:
if vals.get('hotel_id', record.hotel_id.id) != record.hotel_id.id:
if vals.get('pms_property_id', record.pms_property_id.id) != record.pms_property_id.id:
raise ValidationError(
_("A room cannot be changed to another hotel.") + " " +
_("A room cannot be changed to another property.") + " " +
_("%s does not belong to %s.")
% (record, record.hotel_id))
room_type_ids = self.env['hotel.room.type'].search([
('hotel_id', '=', record.hotel_id.id)
% (record, record.pms_property_id))
room_type_ids = self.env['pms.room.type'].search([
('pms_property_id', '=', record.pms_property_id.id)
]).ids
if vals.get('room_type_id', record.room_type_id.id) \
not in room_type_ids:
raise ValidationError(
_("A room cannot be changed to a room type of \
another hotel or unlinked from a room type."))
another property or unlinked from a room type."))
return super().write(vals)
# Business methods

View File

@@ -9,9 +9,9 @@ class RoomClosureReason(models.Model):
# Fields declaration
name = fields.Char('Name', translate=True, required=True)
hotel_ids = fields.Many2many(
'hotel.property',
string='Hotels',
pms_property_ids = fields.Many2many(
'pms.property',
string='Properties',
required=False,
ondelete='restrict')
description = fields.Text('Description', translate=True)

View File

@@ -5,20 +5,20 @@ from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class HotelRoomType(models.Model):
class PmsRoomType(models.Model):
""" Before creating a 'room type', you need to consider the following:
With the term 'room type' is meant a sales type of residential accommodation: for
example, a Double Room, a Economic Room, an Apartment, a Tent, a Caravan...
"""
_name = "hotel.room.type"
_name = "pms.room.type"
_description = "Room Type"
_inherits = {'product.product': 'product_id'}
_order = "sequence, code_type, name"
# Default methods
@api.model
def _get_default_hotel(self):
return self.env.user.hotel_id
def _get_default_pms_property(self):
return self.env.user.pms_property_id
# Fields declaration
product_id = fields.Many2one(
@@ -27,26 +27,26 @@ class HotelRoomType(models.Model):
required=True,
delegate=True,
ondelete='cascade')
hotel_id = fields.Many2one(
'hotel.property',
'Hotel',
pms_property_id = fields.Many2one(
'pms.property',
'Property',
required=True,
ondelete='restrict',
default=_get_default_hotel,)
default=_get_default_pms_property,)
room_ids = fields.One2many(
'hotel.room',
'pms.room',
'room_type_id',
'Rooms')
class_id = fields.Many2one(
'hotel.room.type.class',
'Hotel Type Class')
'pms.room.type.class',
'Property Type Class')
board_service_room_type_ids = fields.One2many(
'hotel.board.service.room.type',
'hotel_room_type_id',
'pms.board.service.room.type',
'pms_room_type_id',
string='Board Services')
room_amenity_ids = fields.Many2many(
'hotel.amenity',
'hotel_room_type_aminity_rel',
'pms.amenity',
'pms_room_type_aminity_rel',
'room_type_ids',
'amenity_ids',
string='Room Type Amenities',
@@ -60,8 +60,8 @@ class HotelRoomType(models.Model):
sequence = fields.Integer('Sequence', default=0)
_sql_constraints = [
('code_type_hotel_unique', 'unique(code_type, hotel_id)',
'Room Type Code must be unique by Hotel!'),
('code_type_pms_unique', 'unique(code_type, pms_property_id)',
'Room Type Code must be unique by Property!'),
]
# Constraints and onchanges
@@ -100,15 +100,15 @@ class HotelRoomType(models.Model):
Check the max availability for an specific
type of room in a range of dates
"""
reservations = self.env['hotel.reservation'].get_reservations(dfrom,
reservations = self.env['pms.reservation'].get_reservations(dfrom,
dto)
reservations_rooms = reservations.mapped('room_id.id')
free_rooms = self.env['hotel.room'].search([
free_rooms = self.env['pms.room'].search([
('id', 'not in', reservations_rooms),
('id', 'not in', notthis)
])
if room_type_id:
rooms_linked = self.env['hotel.room.type'].search([
rooms_linked = self.env['pms.room.type'].search([
('id', '=', room_type_id)
]).room_ids
free_rooms = free_rooms & rooms_linked
@@ -127,8 +127,8 @@ class HotelRoomType(models.Model):
"""
vals = {}
room_type_ids = kwargs.get('room_type_ids', False)
room_types = self.env['hotel.room.type'].browse(room_type_ids) if \
room_type_ids else self.env['hotel.room.type'].search([])
room_types = self.env['pms.room.type'].browse(room_type_ids) if \
room_type_ids else self.env['pms.room.type'].search([])
date_from = kwargs.get('date_from', False)
days = kwargs.get('days', False)
discount = kwargs.get('discount', False)
@@ -140,7 +140,7 @@ class HotelRoomType(models.Model):
'pricelist_id',
partner.property_product_pricelist.id and
partner.property_product_pricelist.id or
self.env.user.hotel_id.default_pricelist_id.id)
self.env.user.pms_property_id.default_pricelist_id.id)
vals.update({
'partner_id': partner_id if partner_id else False,
'discount': discount,
@@ -148,7 +148,7 @@ class HotelRoomType(models.Model):
rate_vals = {}
for room_type in room_types:
vals.update({'room_type_id': room_type.id})
room_vals = self.env['hotel.reservation'].\
room_vals = self.env['pms.reservation'].\
prepare_reservation_lines(
date_from,
days,

View File

@@ -4,26 +4,26 @@
from odoo import models, fields
class HotelRoomTypeClass(models.Model):
class PmsRoomTypeClass(models.Model):
""" Before creating a 'room type_class', you need to consider the following:
With the term 'room type class' is meant a physical class of
residential accommodation: for example, a Room, a Bed, an Apartment,
a Tent, a Caravan...
"""
_name = "hotel.room.type.class"
_name = "pms.room.type.class"
_description = "Room Type Class"
_order = "sequence, name, code_class"
# Fields declaration
name = fields.Char('Class Name', required=True, translate=True)
# Relationship between models
hotel_ids = fields.Many2many(
'hotel.property',
string='Hotels',
pms_property_ids = fields.Many2many(
'pms.property',
string='Properties',
required=False,
ondelete='restrict')
room_type_ids = fields.One2many(
'hotel.room.type',
'pms.room.type',
'class_id',
'Types')
code_class = fields.Char('Code')

View File

@@ -3,25 +3,25 @@
from odoo import models, fields, api
class HotelRoomTypeRestriction(models.Model):
""" The hotel room type restriction is used as a daily restriction plan for room types
and therefore is related only with one hotel. """
_name = 'hotel.room.type.restriction'
class PmsRoomTypeRestriction(models.Model):
""" The room type restriction is used as a daily restriction plan for room types
and therefore is related only with one property. """
_name = 'pms.room.type.restriction'
# Default methods
@api.model
def _get_default_hotel(self):
return self.env.user.hotel_id or None
def _get_default_pms_property(self):
return self.env.user.pms_property_id or None
# Fields declaration
name = fields.Char('Restriction Plan Name', required=True)
hotel_id = fields.Many2one(
'hotel.property',
'Hotel',
pms_property_id = fields.Many2one(
'pms.property',
'Property',
ondelete='restrict',
default=_get_default_hotel)
default=_get_default_pms_property)
item_ids = fields.One2many(
'hotel.room.type.restriction.item',
'pms.room.type.restriction.item',
'restriction_id',
string='Restriction Items',
copy=True)

View File

@@ -4,14 +4,14 @@ from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class HotelRoomTypeRestrictionItem(models.Model):
_name = 'hotel.room.type.restriction.item'
class PmsRoomTypeRestrictionItem(models.Model):
_name = 'pms.room.type.restriction.item'
# Field Declarations
restriction_id = fields.Many2one('hotel.room.type.restriction',
restriction_id = fields.Many2one('pms.room.type.restriction',
'Restriction Plan', ondelete='cascade',
index=True)
room_type_id = fields.Many2one('hotel.room.type', 'Room Type',
room_type_id = fields.Many2one('pms.room.type', 'Room Type',
required=True, ondelete='cascade')
date = fields.Date('Date')

View File

@@ -12,9 +12,9 @@ import logging
_logger = logging.getLogger(__name__)
class HotelService(models.Model):
_name = 'hotel.service'
_description = 'Hotel Services and its charges'
class PmsService(models.Model):
_name = 'pms.service'
_description = 'Services and its charges'
# Default methods
@api.multi
@@ -32,7 +32,7 @@ class HotelService(models.Model):
def _default_reservation_id(self):
if self.env.context.get('reservation_ids'):
ids = [item[1] for item in self.env.context['reservation_ids']]
return self.env['hotel.reservation'].browse([
return self.env['pms.reservation'].browse([
(ids)], limit=1)
elif self.env.context.get('default_reservation_id'):
return self.env.context.get('default_reservation_id')
@@ -52,27 +52,27 @@ class HotelService(models.Model):
ondelete='restrict',
required=True)
folio_id = fields.Many2one(
'hotel.folio',
'pms.folio',
'Folio',
ondelete='cascade',
default=_default_folio_id)
reservation_id = fields.Many2one(
'hotel.reservation',
'pms.reservation',
'Room',
default=_default_reservation_id)
service_line_ids = fields.One2many(
'hotel.service.line',
'pms.service.line',
'service_id')
company_id = fields.Many2one(
related='folio_id.company_id',
string='Company',
store=True,
readonly=True)
hotel_id = fields.Many2one(
'hotel.property',
pms_property_id = fields.Many2one(
'pms.property',
store=True,
readonly=True,
related='folio_id.hotel_id')
related='folio_id.pms_property_id')
tax_ids = fields.Many2many(
'account.tax',
string='Taxes',
@@ -233,7 +233,7 @@ class HotelService(models.Model):
Compute the amounts of the service line.
"""
for record in self:
folio = record.folio_id or self.env['hotel.folio'].browse(
folio = record.folio_id or self.env['pms.folio'].browse(
self.env.context.get('default_folio_id'))
reservation = record.reservation_id or self.env.context.get(
'reservation_id')
@@ -280,7 +280,7 @@ class HotelService(models.Model):
if record.per_day and record.reservation_id:
product = record.product_id
if self.env.context.get('default_reservation_id'):
reservation = self.env['hotel.reservation'].browse(
reservation = self.env['pms.reservation'].browse(
self.env.context.get('default_reservation_id')
)
else:
@@ -339,9 +339,9 @@ class HotelService(models.Model):
# Action methods
@api.multi
def open_service_ids(self):
action = self.env.ref('hotel.action_hotel_services_form').read()[0]
action = self.env.ref('pms.action_pms_services_form').read()[0]
action['views'] = [
(self.env.ref('hotel.hotel_service_view_form').id, 'form')]
(self.env.ref('pms.pms_service_view_form').id, 'form')]
action['res_id'] = self.id
action['target'] = 'new'
return action
@@ -357,14 +357,14 @@ class HotelService(models.Model):
('reservation_id.name', operator, name),
('name', operator, name)
]
return super(HotelService, self).name_search(
return super(PmsService, self).name_search(
name='', args=args, operator='ilike', limit=limit)
@api.model
def create(self, vals):
vals.update(self._prepare_add_missing_fields(vals))
if self.compute_lines_out_vals(vals):
reservation = self.env['hotel.reservation'].browse(
reservation = self.env['pms.reservation'].browse(
vals['reservation_id'])
product = self.env['product.product'].browse(vals['product_id'])
if reservation.splitted:
@@ -384,7 +384,7 @@ class HotelService(models.Model):
old_day_lines=False,
consumed_on=product.consumed_on,
))
record = super(HotelService, self).create(vals)
record = super(PmsService, self).create(vals)
return record
@api.multi
@@ -400,7 +400,7 @@ class HotelService(models.Model):
})
else:
for record in self:
reservations = self.env['hotel.reservation']
reservations = self.env['pms.reservation']
reservation = reservations.browse(vals['reservation_id']) \
if 'reservation_id' in vals else record.reservation_id
if reservation.splitted:
@@ -420,7 +420,7 @@ class HotelService(models.Model):
old_line_days=self.service_line_ids,
consumed_on=product.consumed_on,
))
res = super(HotelService, self).write(vals)
res = super(PmsService, self).write(vals)
return res
# Business methods
@@ -457,7 +457,7 @@ class HotelService(models.Model):
def _compute_tax_ids(self):
for record in self:
# If company_id is set, always filter taxes by the company
folio = record.folio_id or self.env['hotel.folio'].browse(
folio = record.folio_id or self.env['pms.folio'].browse(
self.env.context.get('default_folio_id'))
reservation = record.reservation_id or self.env.context.get(
'reservation_id')
@@ -512,16 +512,16 @@ class HotelService(models.Model):
if reservation and self.is_board_service:
board_room_type = reservation.board_service_room_id
if board_room_type.price_type == 'fixed':
return self.env['hotel.board.service.room.type.line'].\
return self.env['pms.board.service.room.type.line'].\
search([
('hotel_board_service_room_type_id',
('pms_board_service_room_type_id',
'=', board_room_type.id),
('product_id', '=', self.product_id.id)]).amount
else:
return (reservation.price_total *
self.env['hotel.board.service.room.type.line'].
self.env['pms.board.service.room.type.line'].
search([
('hotel_board_service_room_type_id',
('pms_board_service_room_type_id',
'=', board_room_type.id),
('product_id', '=', self.product_id.id)])
.amount) / 100

View File

@@ -5,13 +5,13 @@ from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class HotelServiceLine(models.Model):
_name = "hotel.service.line"
class PmsServiceLine(models.Model):
_name = "pms.service.line"
_order = "date"
# Fields declaration
service_id = fields.Many2one(
'hotel.service',
'pms.service',
string='Service Room',
ondelete='cascade',
required=True,
@@ -24,11 +24,11 @@ class HotelServiceLine(models.Model):
string='Taxes',
related="service_id.tax_ids",
readonly="True")
hotel_id = fields.Many2one(
'hotel.property',
pms_property_id = fields.Many2one(
'pms.property',
store=True,
readonly=True,
related='service_id.hotel_id')
related='service_id.pms_property_id')
date = fields.Date('Date')
day_qty = fields.Integer('Units')
price_total = fields.Float(
@@ -73,7 +73,7 @@ class HotelServiceLine(models.Model):
for record in self:
limit = record.product_id.daily_limit
if limit > 0:
out_qty = sum(self.env['hotel.service.line'].search([
out_qty = sum(self.env['pms.service.line'].search([
('product_id', '=', record.product_id.id),
('date', '=', record.date),
('service_id', '!=', record.service_id.id)

View File

@@ -6,32 +6,32 @@ from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
class HotelSharedRoom(models.Model):
_name = 'hotel.shared.room'
_description = 'Hotel Shared Room'
class PmsSharedRoom(models.Model):
_name = 'pms.shared.room'
_description = 'Shared Room'
_order = "room_type_id, name"
# Fields declaration
name = fields.Char('Room Name', required=True)
room_type_id = fields.Many2one(
'hotel.room.type',
'Hotel Room Type',
'pms.room.type',
'Room Type',
required=True,
ondelete='restrict',
domain=[('shared_room', '=', True)]
)
hotel_id = fields.Many2one(
'hotel.property',
pms_property_id = fields.Many2one(
'pms.property',
store=True,
readonly=True,
related='room_type_id.hotel_id')
related='room_type_id.pms_property_id')
floor_id = fields.Many2one(
'hotel.floor',
'pms.floor',
'Ubication',
ondelete='restrict',
help='At which floor the room is located.')
bed_ids = fields.One2many(
'hotel.room',
'pms.room',
'shared_room_id',
readonly=True,
ondelete='restrict',)
@@ -56,7 +56,7 @@ class HotelSharedRoom(models.Model):
"If you want to eliminate beds in the \
room you must deactivate the beds from your form"))
beds = []
inactive_beds = self.env['hotel.room'].search([
inactive_beds = self.env['pms.room'].search([
('active', '=', False),
('shared_room_id', '=', self.id)
])

View File

@@ -4,10 +4,10 @@
<report
id="action_report_folio"
string="Folio"
model="hotel.folio"
model="pms.folio"
report_type="qweb-pdf"
file="hotel.report_folio"
name="hotel.report_folio"
file="pms.report_folio"
name="pms.report_folio"
print_report_name="(object.state in ('draft', 'sent') and 'Quotation - %s' % (object.name)) or 'Order - %s' % (object.name)"
/>
</data>

View File

@@ -224,7 +224,7 @@
<template id="report_folio">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t t-call="hotel.report_folio_document" t-lang="doc.partner_id.lang"/>
<t t-call="pms.report_folio_document" t-lang="doc.partner_id.lang"/>
</t>
</t>
</template>

View File

@@ -0,0 +1,66 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
user_access_pms_floor,user_access_pms_floor,model_pms_floor,pms.group_pms_user,1,0,0,0
user_access_pms_amenity,user_access_pms_amenity,model_pms_amenity,pms.group_pms_user,1,0,0,0
user_access_pms_amenity_type,user_access_pms_amenity_type,model_pms_amenity_type,pms.group_pms_user,1,0,0,0
user_access_pms_service,user_access_pms_service,model_pms_service,pms.group_pms_user,1,1,1,1
user_access_pms_room_type_restriction,user_access_pms_room_type_restriction,model_pms_room_type_restriction,pms.group_pms_user,1,0,0,0
user_access_pms_reservation_line,user_access_pms_reservation_line,model_pms_reservation_line,pms.group_pms_user,1,1,1,1
user_access_room_closure_reason,user_access_room_closure_reason,model_room_closure_reason,pms.group_pms_user,1,0,0,0
user_access_pms_service_line,user_access_pms_service_line,model_pms_service_line,pms.group_pms_user,1,1,1,1
user_access_pms_board_service,user_access_pms_board_service,model_pms_board_service,pms.group_pms_user,1,0,0,0
user_access_pms_checkin_partner,user_access_pms_checkin_partner,model_pms_checkin_partner,pms.group_pms_user,1,1,1,1
user_access_pms_room_type_class,user_access_pms_room_type_class,model_pms_room_type_class,pms.group_pms_user,1,0,0,0
user_access_pms_room,user_access_pms_room,model_pms_room,pms.group_pms_user,1,0,0,0
user_access_shared_pms_room,user_access_pms_shared_room,model_pms_shared_room,pms.group_pms_user,1,0,0,0
user_access_pms_room_type_restriction_item,user_access_pms_room_type_restriction_item,model_pms_room_type_restriction_item,pms.group_pms_user,1,0,0,0
user_access_pms_reservation,user_access_pms_reservation,model_pms_reservation,pms.group_pms_user,1,1,1,1
user_access_pms_folio,user_access_pms_folio,model_pms_folio,pms.group_pms_user,1,1,1,1
user_access_pms_room_type,user_access_pms_room_type,model_pms_room_type,pms.group_pms_user,1,0,0,0
user_access_pms_board_service_room_type,user_access_pms_board_service_room_type,model_pms_board_service_room_type,pms.group_pms_user,1,0,0,0
user_access_pms_board_service_room_type_line,user_access_pms_board_service_room_type_line,model_pms_board_service_room_type_line,pms.group_pms_user,1,0,0,0
user_access_pms_board_service_line,user_access_pms_board_service_line,model_pms_board_service_line,pms.group_pms_user,1,0,0,0
user_access_account_partial_reconcile,user_access_account_partial_reconcile,account.model_account_partial_reconcile,pms.group_pms_user,1,1,1,1
user_access_pms_cancelation_rule,user_access_pms_cancelation_rule,model_pms_cancelation_rule,pms.group_pms_user,1,0,0,0
user_access_account_full_reconcile,user_access_account_full_reconcile,account.model_account_full_reconcile,pms.group_pms_user,1,1,1,1
manager_access_pms_floor,manager_access_pms_floor,model_pms_floor,pms.group_pms_manager,1,1,1,1
manager_access_pms_amenity,manager_access_pms_amenity,model_pms_amenity,pms.group_pms_manager,1,1,1,1
manager_access_pms_amenity_type,manager_access_pms_amenity_type,model_pms_amenity_type,pms.group_pms_manager,1,1,1,1
manager_access_pms_service,manager_access_pms_service,model_pms_service,pms.group_pms_manager,1,1,1,1
manager_access_pms_room_type_restriction,manager_access_pms_room_type_restriction,model_pms_room_type_restriction,pms.group_pms_manager,1,1,1,1
manager_access_pms_reservation_line,manager_access_pms_reservation_line,model_pms_reservation_line,pms.group_pms_manager,1,1,1,1
manager_access_room_closure_reason,manager_access_room_closure_reason,model_room_closure_reason,pms.group_pms_manager,1,1,1,1
manager_access_pms_service_line,manager_access_pms_service_line,model_pms_service_line,pms.group_pms_manager,1,1,1,1
manager_access_pms_board_service,manager_access_pms_board_service,model_pms_board_service,pms.group_pms_manager,1,1,1,1
manager_access_pms_checkin_partner,manager_access_pms_checkin_partner,model_pms_checkin_partner,pms.group_pms_manager,1,1,1,1
manager_access_pms_room_type_class,manager_access_pms_room_type_class,model_pms_room_type_class,pms.group_pms_manager,1,1,1,1
manager_access_pms_room,manager_access_pms_room,model_pms_room,pms.group_pms_manager,1,1,1,1
manager_access_pms_shared_room,manager_access_pms_shared_room,model_pms_shared_room,pms.group_pms_manager,1,1,1,1
manager_access_pms_room_type_restriction_item,manager_access_pms_room_type_restriction_item,model_pms_room_type_restriction_item,pms.group_pms_manager,1,1,1,1
manager_access_pms_reservation,manager_access_pms_reservation,model_pms_reservation,pms.group_pms_manager,1,1,1,1
manager_access_pms_folio,manager_access_pms_folio,model_pms_folio,pms.group_pms_manager,1,1,1,1
manager_access_pms_room_type,manager_access_pms_room_type,model_pms_room_type,pms.group_pms_manager,1,1,1,1
manager_access_pms_board_service_room_type,manager_access_pms_board_service_room_type,model_pms_board_service_room_type,pms.group_pms_manager,1,1,1,1
manager_access_pms_board_service_room_type_line,manager_access_pms_board_service_room_type_line,model_pms_board_service_room_type_line,pms.group_pms_manager,1,1,1,1
manager_access_pms_board_service_line,manager_access_pms_board_service_line,model_pms_board_service_line,pms.group_pms_manager,1,1,1,1
manager_access_pms_cancelation_rule,manager_access_pms_cancelation_rule,model_pms_cancelation_rule,base.group_user,1,1,1,1
call_access_pms_floor,call_access_pms_floor,model_pms_floor,pms.group_pms_call,1,0,0,0
call_access_pms_amenity,call_access_pms_amenity,model_pms_amenity,pms.group_pms_call,1,0,0,0
call_access_pms_amenity_type,call_access_pms_amenity_type,model_pms_amenity_type,pms.group_pms_call,1,0,0,0
call_access_pms_service,call_access_pms_service,model_pms_service,pms.group_pms_call,1,1,1,1
call_access_pms_room_type_restriction,call_access_pms_room_type_restriction,model_pms_room_type_restriction,pms.group_pms_call,1,0,0,0
call_access_pms_reservation_line,call_access_pms_reservation_line,model_pms_reservation_line,pms.group_pms_call,1,1,1,1
call_access_room_closure_reason,call_access_room_closure_reason,model_room_closure_reason,pms.group_pms_call,1,0,0,0
call_access_pms_service_line,call_access_pms_service_line,model_pms_service_line,pms.group_pms_call,1,1,1,1
call_access_pms_board_service,call_access_pms_board_service,model_pms_board_service,pms.group_pms_call,1,0,0,0
call_access_pms_checkin_partner,call_access_pms_checkin_partner,model_pms_checkin_partner,pms.group_pms_call,1,1,1,1
call_access_pms_room_type_class,call_access_pms_room_type_class,model_pms_room_type_class,pms.group_pms_call,1,0,0,0
call_access_pms_room,call_access_pms_room,model_pms_room,pms.group_pms_call,1,0,0,0
call_access_pms_shared_room,call_access_pms_shared_room,model_pms_shared_room,pms.group_pms_call,1,0,0,0
call_access_pms_room_type_restriction_item,call_access_pms_room_type_restriction_item,model_pms_room_type_restriction_item,pms.group_pms_call,1,0,0,0
call_access_pms_reservation,call_access_pms_reservation,model_pms_reservation,pms.group_pms_call,1,1,1,1
call_access_pms_folio,call_access_pms_folio,model_pms_folio,pms.group_pms_call,1,1,1,1
call_access_pms_room_type,call_access_pms_room_type,model_pms_room_type,pms.group_pms_call,1,0,0,0
call_access_pms_board_service_room_type,call_access_pms_board_service_room_type,model_pms_board_service_room_type,pms.group_pms_call,1,0,0,0
call_access_pms_board_service_room_type_line,call_access_pms_board_service_room_type_line,model_pms_board_service_room_type_line,pms.group_pms_call,1,0,0,0
call_access_pms_board_service_line,call_access_pms_board_service_line,model_pms_board_service_line,pms.group_pms_call,1,0,0,0
call_access_pms_cancelation_rule,call_access_pms_cancelation_rule,model_pms_cancelation_rule,base.group_user,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 user_access_pms_floor user_access_pms_floor model_pms_floor pms.group_pms_user 1 0 0 0
3 user_access_pms_amenity user_access_pms_amenity model_pms_amenity pms.group_pms_user 1 0 0 0
4 user_access_pms_amenity_type user_access_pms_amenity_type model_pms_amenity_type pms.group_pms_user 1 0 0 0
5 user_access_pms_service user_access_pms_service model_pms_service pms.group_pms_user 1 1 1 1
6 user_access_pms_room_type_restriction user_access_pms_room_type_restriction model_pms_room_type_restriction pms.group_pms_user 1 0 0 0
7 user_access_pms_reservation_line user_access_pms_reservation_line model_pms_reservation_line pms.group_pms_user 1 1 1 1
8 user_access_room_closure_reason user_access_room_closure_reason model_room_closure_reason pms.group_pms_user 1 0 0 0
9 user_access_pms_service_line user_access_pms_service_line model_pms_service_line pms.group_pms_user 1 1 1 1
10 user_access_pms_board_service user_access_pms_board_service model_pms_board_service pms.group_pms_user 1 0 0 0
11 user_access_pms_checkin_partner user_access_pms_checkin_partner model_pms_checkin_partner pms.group_pms_user 1 1 1 1
12 user_access_pms_room_type_class user_access_pms_room_type_class model_pms_room_type_class pms.group_pms_user 1 0 0 0
13 user_access_pms_room user_access_pms_room model_pms_room pms.group_pms_user 1 0 0 0
14 user_access_shared_pms_room user_access_pms_shared_room model_pms_shared_room pms.group_pms_user 1 0 0 0
15 user_access_pms_room_type_restriction_item user_access_pms_room_type_restriction_item model_pms_room_type_restriction_item pms.group_pms_user 1 0 0 0
16 user_access_pms_reservation user_access_pms_reservation model_pms_reservation pms.group_pms_user 1 1 1 1
17 user_access_pms_folio user_access_pms_folio model_pms_folio pms.group_pms_user 1 1 1 1
18 user_access_pms_room_type user_access_pms_room_type model_pms_room_type pms.group_pms_user 1 0 0 0
19 user_access_pms_board_service_room_type user_access_pms_board_service_room_type model_pms_board_service_room_type pms.group_pms_user 1 0 0 0
20 user_access_pms_board_service_room_type_line user_access_pms_board_service_room_type_line model_pms_board_service_room_type_line pms.group_pms_user 1 0 0 0
21 user_access_pms_board_service_line user_access_pms_board_service_line model_pms_board_service_line pms.group_pms_user 1 0 0 0
22 user_access_account_partial_reconcile user_access_account_partial_reconcile account.model_account_partial_reconcile pms.group_pms_user 1 1 1 1
23 user_access_pms_cancelation_rule user_access_pms_cancelation_rule model_pms_cancelation_rule pms.group_pms_user 1 0 0 0
24 user_access_account_full_reconcile user_access_account_full_reconcile account.model_account_full_reconcile pms.group_pms_user 1 1 1 1
25 manager_access_pms_floor manager_access_pms_floor model_pms_floor pms.group_pms_manager 1 1 1 1
26 manager_access_pms_amenity manager_access_pms_amenity model_pms_amenity pms.group_pms_manager 1 1 1 1
27 manager_access_pms_amenity_type manager_access_pms_amenity_type model_pms_amenity_type pms.group_pms_manager 1 1 1 1
28 manager_access_pms_service manager_access_pms_service model_pms_service pms.group_pms_manager 1 1 1 1
29 manager_access_pms_room_type_restriction manager_access_pms_room_type_restriction model_pms_room_type_restriction pms.group_pms_manager 1 1 1 1
30 manager_access_pms_reservation_line manager_access_pms_reservation_line model_pms_reservation_line pms.group_pms_manager 1 1 1 1
31 manager_access_room_closure_reason manager_access_room_closure_reason model_room_closure_reason pms.group_pms_manager 1 1 1 1
32 manager_access_pms_service_line manager_access_pms_service_line model_pms_service_line pms.group_pms_manager 1 1 1 1
33 manager_access_pms_board_service manager_access_pms_board_service model_pms_board_service pms.group_pms_manager 1 1 1 1
34 manager_access_pms_checkin_partner manager_access_pms_checkin_partner model_pms_checkin_partner pms.group_pms_manager 1 1 1 1
35 manager_access_pms_room_type_class manager_access_pms_room_type_class model_pms_room_type_class pms.group_pms_manager 1 1 1 1
36 manager_access_pms_room manager_access_pms_room model_pms_room pms.group_pms_manager 1 1 1 1
37 manager_access_pms_shared_room manager_access_pms_shared_room model_pms_shared_room pms.group_pms_manager 1 1 1 1
38 manager_access_pms_room_type_restriction_item manager_access_pms_room_type_restriction_item model_pms_room_type_restriction_item pms.group_pms_manager 1 1 1 1
39 manager_access_pms_reservation manager_access_pms_reservation model_pms_reservation pms.group_pms_manager 1 1 1 1
40 manager_access_pms_folio manager_access_pms_folio model_pms_folio pms.group_pms_manager 1 1 1 1
41 manager_access_pms_room_type manager_access_pms_room_type model_pms_room_type pms.group_pms_manager 1 1 1 1
42 manager_access_pms_board_service_room_type manager_access_pms_board_service_room_type model_pms_board_service_room_type pms.group_pms_manager 1 1 1 1
43 manager_access_pms_board_service_room_type_line manager_access_pms_board_service_room_type_line model_pms_board_service_room_type_line pms.group_pms_manager 1 1 1 1
44 manager_access_pms_board_service_line manager_access_pms_board_service_line model_pms_board_service_line pms.group_pms_manager 1 1 1 1
45 manager_access_pms_cancelation_rule manager_access_pms_cancelation_rule model_pms_cancelation_rule base.group_user 1 1 1 1
46 call_access_pms_floor call_access_pms_floor model_pms_floor pms.group_pms_call 1 0 0 0
47 call_access_pms_amenity call_access_pms_amenity model_pms_amenity pms.group_pms_call 1 0 0 0
48 call_access_pms_amenity_type call_access_pms_amenity_type model_pms_amenity_type pms.group_pms_call 1 0 0 0
49 call_access_pms_service call_access_pms_service model_pms_service pms.group_pms_call 1 1 1 1
50 call_access_pms_room_type_restriction call_access_pms_room_type_restriction model_pms_room_type_restriction pms.group_pms_call 1 0 0 0
51 call_access_pms_reservation_line call_access_pms_reservation_line model_pms_reservation_line pms.group_pms_call 1 1 1 1
52 call_access_room_closure_reason call_access_room_closure_reason model_room_closure_reason pms.group_pms_call 1 0 0 0
53 call_access_pms_service_line call_access_pms_service_line model_pms_service_line pms.group_pms_call 1 1 1 1
54 call_access_pms_board_service call_access_pms_board_service model_pms_board_service pms.group_pms_call 1 0 0 0
55 call_access_pms_checkin_partner call_access_pms_checkin_partner model_pms_checkin_partner pms.group_pms_call 1 1 1 1
56 call_access_pms_room_type_class call_access_pms_room_type_class model_pms_room_type_class pms.group_pms_call 1 0 0 0
57 call_access_pms_room call_access_pms_room model_pms_room pms.group_pms_call 1 0 0 0
58 call_access_pms_shared_room call_access_pms_shared_room model_pms_shared_room pms.group_pms_call 1 0 0 0
59 call_access_pms_room_type_restriction_item call_access_pms_room_type_restriction_item model_pms_room_type_restriction_item pms.group_pms_call 1 0 0 0
60 call_access_pms_reservation call_access_pms_reservation model_pms_reservation pms.group_pms_call 1 1 1 1
61 call_access_pms_folio call_access_pms_folio model_pms_folio pms.group_pms_call 1 1 1 1
62 call_access_pms_room_type call_access_pms_room_type model_pms_room_type pms.group_pms_call 1 0 0 0
63 call_access_pms_board_service_room_type call_access_pms_board_service_room_type model_pms_board_service_room_type pms.group_pms_call 1 0 0 0
64 call_access_pms_board_service_room_type_line call_access_pms_board_service_room_type_line model_pms_board_service_room_type_line pms.group_pms_call 1 0 0 0
65 call_access_pms_board_service_line call_access_pms_board_service_line model_pms_board_service_line pms.group_pms_call 1 0 0 0
66 call_access_pms_cancelation_rule call_access_pms_cancelation_rule model_pms_cancelation_rule base.group_user 1 0 0 0

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="0">
<!--Group for pms user -->
<record id="group_pms_user" model="res.groups">
<field name="name">Property Management / User</field>
</record>
<!--Group for pms manager -->
<record id="group_pms_manager" model="res.groups">
<field name="name">Property Management/ Manager</field>
<field name="implied_ids" eval="[(4, ref('pms.group_pms_user'))]"/>
</record>
<!--Group for pms user -->
<record id="group_pms_call" model="res.groups">
<field name="name">Property Management / CallCenter</field>
</record>
</data>
</odoo>

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -1,7 +1,7 @@
odoo.define('hotel.ListController', function(require) {
odoo.define('pms.ListController', function(require) {
'use strict';
/*
* Hotel
* Pms
* GNU Public License
* Alexandre Díaz <dev@redneboa.es>
*/
@@ -16,10 +16,10 @@ ListController.include({
renderButtons: function () {
this._super.apply(this, arguments); // Sets this.$buttons
var self = this;
if (this.modelName === 'hotel.reservation') {
if (this.modelName === 'pms.reservation') {
this.$buttons.append("<button class='btn btn-sm oe_open_reservation_wizard oe_highlight' type='button'>"+_t('Open Wizard')+"</button>");
this.$buttons.find('.oe_open_reservation_wizard').on('click', function(){
self.do_action('hotel.open_wizard_reservations');
self.do_action('pms.open_wizard_reservations');
});
}
}

View File

@@ -1,4 +1,4 @@
odoo.define('hotel.SwitchHotelMenu', function(require) {
odoo.define('pms.SwitchPmsMenu', function(require) {
"use strict";
var config = require('web.config');
@@ -9,11 +9,11 @@ var Widget = require('web.Widget');
var _t = core._t;
var SwitchHotelMenu = Widget.extend({
template: 'hotel.SwitchHotelMenu',
var SwitchPmsMenu = Widget.extend({
template: 'pms.SwitchPmsMenu',
willStart: function() {
this.isMobile = config.device.isMobile;
if (!session.user_hotels) {
if (!session.user_pmss) {
return $.Deferred().reject();
}
return this._super();
@@ -22,40 +22,40 @@ var SwitchHotelMenu = Widget.extend({
var self = this;
this.$el.on('click', '.dropdown-menu li a[data-menu]', _.debounce(function(ev) {
ev.preventDefault();
var hotel_id = $(ev.currentTarget).data('hotel-id');
var pms_property_id = $(ev.currentTarget).data('property-id');
self._rpc({
model: 'res.users',
method: 'write',
args: [[session.uid], {'hotel_id': hotel_id}],
args: [[session.uid], {'pms_property_id': pms_property_id}],
})
.then(function() {
location.reload();
});
}, 1500, true));
var hotels_list = '';
var properties_list = '';
if (this.isMobile) {
hotels_list = '<li class="bg-info">' + _t('Tap on the list to change hotel') + '</li>';
propertiess_list = '<li class="bg-info">' + _t('Tap on the list to change property') + '</li>';
}
else {
self.$('.oe_topbar_name').text(session.user_hotels.current_hotel[1]);
self.$('.oe_topbar_name').text(session.user_properties.current_property[1]);
}
_.each(session.user_hotels.allowed_hotels, function(hotel) {
_.each(session.user_properties.allowed_propierties, function(property) {
var a = '';
if (hotel[0] === session.user_hotels.current_hotel[0]) {
if (property[0] === session.user_properties.current_property[0]) {
a = '<i class="fa fa-check mr8"></i>';
} else {
a = '<span class="mr24"/>';
}
hotels_list += '<li><a href="#" data-menu="hotel" data-hotel-id="' + hotel[0] + '">' + a + hotel[1] + '</a></li>';
properties_list += '<li><a href="#" data-menu="property" data-property-id="' + property[0] + '">' + a + property[1] + '</a></li>';
});
self.$('.dropdown-menu').html(hotels_list);
self.$('.dropdown-menu').html(properties_list);
return this._super();
},
});
SystrayMenu.Items.push(SwitchHotelMenu);
SystrayMenu.Items.push(SwitchPmsMenu);
return SwitchHotelMenu;
return SwitchPmsMenu;
});

View File

@@ -1,6 +1,6 @@
<template>
<t t-name="hotel.SwitchHotelMenu">
<t t-name="pms.SwitchPmsMenu">
<li class="o_switch_company_menu">
<a class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false" href="#">
<span t-attf-class="#{widget.isMobile ? 'fa fa-building-o' : 'oe_topbar_name'}"/> <span class="caret"/>

View File

@@ -3,21 +3,21 @@
<data noupdate="0">
<template id="template_header">
<h1 t-field="object.hotel_id.name" />
<h1 t-field="object.pms_property_id.name" />
<div class="row">
<div class="col-sm-4">
<t t-esc="object.hotel_id.street" />
<t t-if="object.hotel_id.street2" >- <t t-esc="object.hotel_id.street2" /></t> <br />
<t t-esc="object.hotel_id.zip" />
<t t-esc="object.hotel_id.city" />,
<t t-esc="object.hotel_id.state_id.name" /> <br />
<t t-esc="object.hotel_id.country_id.name" />
<t t-esc="object.pms_property_id.street" />
<t t-if="object.pms_property_id.street2" >- <t t-esc="object.pms_property_id.street2" /></t> <br />
<t t-esc="object.pms_property_id.zip" />
<t t-esc="object.pms_property_id.city" />,
<t t-esc="object.pms_property_id.state_id.name" /> <br />
<t t-esc="object.pms_property_id.country_id.name" />
</div>
<div class="col-sm-4">
<i class="glyphicon glyphicon-phone-alt" /> <t t-esc="object.hotel_id.phone" /> <br />
<i class="glyphicon glyphicon-envelope" /> <t t-esc="object.hotel_id.email" /> <br />
<i class="glyphicon glyphicon-home" /> <t t-esc="object.hotel_id.website" /> <br />
<i class="glyphicon glyphicon-phone-alt" /> <t t-esc="object.pms_property_id.phone" /> <br />
<i class="glyphicon glyphicon-envelope" /> <t t-esc="object.pms_property_id.email" /> <br />
<i class="glyphicon glyphicon-home" /> <t t-esc="object.pms_property_id.website" /> <br />
</div>
</div>
</template>
@@ -62,12 +62,12 @@
</div>
</div>
<t t-call="hotel.template_reservation_details"/>
<t t-call="pms.template_reservation_details"/>
<div class="row" style="padding-top: 20px;">
<div class="col-sm-12">
If you have any questions, please do not hesitate to contact with the hotel's staff. <br/>
Looking forward to seeing you at our hotel, <br />
If you have any questions, please do not hesitate to contact with the property's staff. <br/>
Looking forward to seeing you at our property, <br />
Best regards.
</div>
</div>
@@ -76,13 +76,13 @@
<template id="template_footer">
<div class="row" style="padding-top: 20px;">
<div class="col-sm-12">
Privacy Policy: We use your Personal Information only for managing your reservation. By using the hotel, you
Privacy Policy: We use your Personal Information only for managing your reservation. By using the property, you
agree to the collection and use of information in accordance with this policy.
</div>
</div>
</template>
<template id="template_reservation_confirmed" name="Hotel Reservation Confirmed">
<template id="template_reservation_confirmed" name="Property Reservation Confirmed">
<t t-call="web.layout">
<t t-set="head">
<!-- TODO: ensure bootstrap in shipped within the email -->
@@ -92,25 +92,25 @@
</t>
<t t-set="body_classname" t-value="'container'"/>
<div class="container">
<t t-call="hotel.template_header"/>
<t t-call="hotel.template_reservation"/>
<t t-call="hotel.template_footer"/>
<t t-call="pms.template_header"/>
<t t-call="pms.template_reservation"/>
<t t-call="pms.template_footer"/>
</div>
</t>
</template>
<!-- notify customer that reservation has been confirmed -->
<record id="email_template_reservation" model="mail.template">
<field name="name">Hotel: Reservation Confirmed</field>
<field name="model_id" ref="hotel.model_hotel_folio"/>
<field name="email_from">${('%s &lt;%s&gt;' % (object.hotel_id.partner_id.name, object.hotel_id.partner_id.email) or '')|safe}</field>
<field name="name">Property: Reservation Confirmed</field>
<field name="model_id" ref="pms.model_pms_folio"/>
<field name="email_from">${('%s &lt;%s&gt;' % (object.pms_property_id.partner_id.name, object.pms_property_id.partner_id.email) or '')|safe}</field>
<field name="email_to">${(object.email or '')|safe}</field>
<field name="partner_to">${(object.partner_id.id or '')}</field>
<field name="lang">${object.partner_id.lang}</field>
<field name="subject">Your reservation ${object.name} has been confirmed by the hotel staff</field>
<field name="subject">Your reservation ${object.name} has been confirmed by the property staff</field>
<field name="auto_delete" eval="True"/>
<field name="body_type">qweb</field>
<field name="body_view_id" ref="hotel.template_reservation_confirmed"/>
<field name="body_view_id" ref="pms.template_reservation_confirmed"/>
</record>
</data>

View File

@@ -4,7 +4,7 @@
<!-- Backend stuff -->
<template id="assets_backend" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/hotel/static/src/js/views/list/list_controller.js"></script>
<script type="text/javascript" src="/pms/static/src/js/views/list/list_controller.js"></script>
</xpath>
</template>

View File

@@ -8,7 +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"/>
<field name="pms_property_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,7 +7,7 @@
<field name="arch" type="xml">
<xpath expr="//field[@name='country_group_ids']" position="before">
<field name="hotel_ids" widget="many2many_tags"
<field name="pms_property_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
<field name="pricelist_type" />
<field name="cancelation_rule_id" />
@@ -18,6 +18,6 @@
<menuitem name="Pricelist" id="pricelist_menu"
action="product.product_pricelist_action2" sequence="22"
parent="hotel.configuration_others" />
parent="pms.configuration_others" />
</odoo>

View File

@@ -7,10 +7,10 @@
<field name="inherit_id" ref="product.product_template_form_view" />
<field name="arch" type="xml">
<xpath expr="//page[@name='sales']" position="before">
<page string="Hotel Service">
<page string="Service">
<group colspan="4">
<group>
<field name="hotel_ids" widget="many2many_tags"
<field name="pms_property_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
<field name="is_extra_bed" />
<field name="daily_limit" />

View File

@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="hotel_partner_reservations" model="ir.actions.act_window">
<record id="pms_partner_reservations" model="ir.actions.act_window">
<field name="name">Reservations</field>
<field name="res_model">hotel.reservation</field>
<field name="res_model">pms.reservation</field>
<field name="domain">[('partner_id', '=',active_id)]</field>
</record>
<record id="hotel_partner_folios" model="ir.actions.act_window">
<record id="pms_partner_folios" model="ir.actions.act_window">
<field name="name">Folios</field>
<field name="res_model">hotel.folio</field>
<field name="res_model">pms.folio</field>
<field name="domain">[('partner_id', '=',active_id)]</field>
</record>
@@ -21,12 +21,12 @@
<xpath expr='//div[@name="button_box"]' position='inside'>
<button class="oe_stat_button" type="action" icon="fa-bed"
name="%(hotel.hotel_partner_reservations)d"
name="%(pms.pms_partner_reservations)d"
help="Reservations related with this contact">
<field string="Reservations" name="reservations_count" widget="statinfo"/>
</button>
<button class="oe_stat_button" type="action" icon="fa-file"
name="%(hotel.hotel_partner_folios)d"
name="%(pms.pms_partner_folios)d"
help="Folios related with this contact">
<field string="Folios" name="folios_count" widget="statinfo"/>
</button>
@@ -39,7 +39,7 @@
</field>
</record>
<menuitem name="Customers" id="menu_hotel_customer"
<menuitem name="Customers" id="menu_pms_customer"
action="base.action_partner_form" sequence="500"
parent="menu_all_folio"/>

View File

@@ -6,9 +6,9 @@
<field name="inherit_id" ref="base.view_users_form" />
<field name="arch" type="xml">
<xpath expr="//page[@name='access_rights']/group" position="after">
<group string="Multi Hotels">
<field string="Allowed Hotels" name="hotel_ids" widget="many2many_tags"/>
<field string="Current Hotel" name="hotel_id" context="{'user_preference': 0}"/>
<group string="Multi Properties">
<field string="Allowed Properties" name="pms_property_ids" widget="many2many_tags"/>
<field string="Current Property" name="pms_property_id" context="{'user_preference': 0}"/>
</group>
</xpath>
</field>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<template id="assets_backend" name="pms assets" inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript" src="/pms/static/src/js/widgets/switch_pms_menu.js"></script>
</xpath>
</template>
</data>
</odoo>

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--==== Amenities Type ==== -->
<!-- Form view of pms room amenities type -->
<record model="ir.ui.view" id="pms_room_amenity_type_view_form">
<field name="name">pms.room_amenity_type_form</field>
<field name="model">pms.amenity.type</field>
<field name="arch" type="xml">
<form string="Room Amenities Type">
<sheet>
<group>
<field name="name" string="Amenity Type" />
<field name="pms_property_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
<!-- <field name="parent_id" domain="[('isamenitytype','=',True)]" /> -->
<!-- <field name="isamenitytype" invisible="1" /> -->
</group>
</sheet>
</form>
</field>
</record>
<!-- Tree view of pms room amenities type -->
<record model="ir.ui.view" id="pms_room_amenity_type_view_list">
<field name="name">pms.room_amenity_type_list</field>
<field name="model">pms.amenity.type</field>
<field name="arch" type="xml">
<tree string="Room Amenities Type">
<field name="name" />
</tree>
</field>
</record>
<!-- Action for pms room amenities type -->
<record model="ir.actions.act_window" id="action_pms_room_amenity_type_view_form">
<field name="name">Room amenity Type</field>
<field name="res_model">pms.amenity.type</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="Amenity Types"
id="menu_action_pms_room_amenity_type_view_form" action="action_pms_room_amenity_type_view_form"
sequence="3" parent="pms.menu_amenity" />
</odoo>

View File

@@ -2,12 +2,12 @@
<odoo>
<!--===== Room Amenities ===== -->
<!-- Form view of hotel room amenities -->
<record id="hotel_amenity_view_form" model="ir.ui.view">
<field name="name">hotel.amenity.form</field>
<field name="model">hotel.amenity</field>
<!-- Form view of pms room amenities -->
<record id="pms_amenity_view_form" model="ir.ui.view">
<field name="name">pms.amenity.form</field>
<field name="model">pms.amenity</field>
<field name="arch" type="xml">
<form string="Hotel Room Amenities">
<form string="Room Amenities">
<sheet>
<h1>
<label string="Amenity" />
@@ -19,7 +19,7 @@
<notebook>
<page string="Information">
<group colspan="4" col="4">
<field name="hotel_ids" widget="many2many_tags"
<field name="pms_property_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"
@@ -64,12 +64,12 @@
</field>
</record>
<!-- Search view of hotel room amenities -->
<record model="ir.ui.view" id="hotel_amenity_search">
<field name="name">hotel.room_amenity_search</field>
<field name="model">hotel.amenity</field>
<!-- Search view of pms room amenities -->
<record model="ir.ui.view" id="pms_amenity_search">
<field name="name">pms.room_amenity_search</field>
<field name="model">pms.amenity</field>
<field name="arch" type="xml">
<search string="Hotel Room Amenities">
<search string="Room Amenities">
<field name="name" />
<field name="room_amenity_type_id" select="1" />
<!-- <field name="list_price" string="ty rate" /> -->
@@ -83,12 +83,12 @@
</field>
</record>
<!-- Tree view of hotel room amenities -->
<record model="ir.ui.view" id="hotel_amenity_view_list">
<field name="name">hotel.room_amenity_list</field>
<field name="model">hotel.amenity</field>
<!-- Tree view of pms room amenities -->
<record model="ir.ui.view" id="pms_amenity_view_list">
<field name="name">pms.room_amenity_list</field>
<field name="model">pms.amenity</field>
<field name="arch" type="xml">
<tree string="Hotel Room Amenities">
<tree string="Room Amenities">
<field name="name" />
<field name="room_amenity_type_id" select="1" />
<!-- <field name="list_price" string="Ty rate" invisible="1" /> -->
@@ -96,25 +96,25 @@
</field>
</record>
<!-- Action for hotel room amenities -->
<record model="ir.actions.act_window" id="action_hotel_room_amenity_view_form">
<field name="name">Hotel Room Amenities</field>
<field name="res_model">hotel.amenity</field>
<!-- Action for pms room amenities -->
<record model="ir.actions.act_window" id="action_pms_room_amenity_view_form">
<field name="name">Room Amenities</field>
<field name="res_model">pms.amenity</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="hotel_amenity_view_list" />
<field name="view_id" ref="pms_amenity_view_list" />
</record>
<menuitem id="menu_amenity" name="Amenity"
parent="hotel.hotel_configuration_menu" sequence="2" />
parent="pms.pms_configuration_menu" sequence="2" />
<menuitem name="Amenities" id="menu_action_hotel_room_amenity_view_form"
action="action_hotel_room_amenity_view_form" sequence="2"
parent="hotel.menu_amenity" />
<menuitem name="Amenities" id="menu_action_pms_room_amenity_view_form"
action="action_pms_room_amenity_view_form" sequence="2"
parent="pms.menu_amenity" />
<!-- Amenities Categories -->
<!-- <record model="ir.actions.act_window" id="hotel_ty_category_action">
<!-- <record model="ir.actions.act_window" id="pms_ty_category_action">
<field name="name">Amenities by Category</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.category</field>
@@ -130,7 +130,7 @@
<field eval="'ir.actions.act_window,%d'%action_room_cate" name="value"/>
</record-->
<!-- <menuitem name="Amenities by Type" id="menu_hotel_ty_category_action"
action="hotel_ty_category_action" sequence="4" parent="hotel.menu_amenity" /> -->
<!-- <menuitem name="Amenities by Type" id="menu_pms_ty_category_action"
action="pms_ty_category_action" sequence="4" parent="pms.menu_amenity" /> -->
</odoo>

View File

@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="hotel_board_service_room_type_form">
<field name="name">hotel.board.service.room.type.form</field>
<field name="model">hotel.board.service.room.type</field>
<record model="ir.ui.view" id="pms_board_service_room_type_form">
<field name="name">pms.board.service.room.type.form</field>
<field name="model">pms.board.service.room.type</field>
<field name="arch" type="xml">
<form string="Board Service Line">
<group>
<field name="amount"/>
<field name="board_service_line_ids">
<tree editable="bottom">
<field name="hotel_board_service_room_type_id" invisible="1"/>
<field name="pms_board_service_room_type_id" invisible="1"/>
<field name="product_id"/>
<field name="amount" />
</tree>
@@ -20,9 +20,9 @@
</field>
</record>
<record model="ir.actions.act_window" id="action_hotel_board_service_room_type_view">
<field name="name">Hotel Board Service</field>
<field name="res_model">hotel.board.service.room.type</field>
<record model="ir.actions.act_window" id="action_pms_board_service_room_type_view">
<field name="name">Board Service</field>
<field name="res_model">board.service.room.type</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
</record>

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="pms_board_service_form">
<field name="name">pms.board.service.form</field>
<field name="model">pms.board.service</field>
<field name="arch" type="xml">
<form string="Board Service Line">
<group>
<field name="name" />
<field name="pms_property_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
<field name="amount"/>
<field name="board_service_line_ids">
<tree editable="bottom">
<field name="product_id"/>
<field name="amount" />
</tree>
</field>
</group>
</form>
</field>
</record>
<record model="ir.ui.view" id="pms_board_service_view_tree">
<field name="name">pms.board.service.tree</field>
<field name="model">pms.board.service</field>
<field name="arch" type="xml">
<tree string="Board Services">
<field name="name" />
<field name="amount" />
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="open_pms_board_service_form_tree">
<field name="name">Board Services</field>
<field name="res_model">pms.board.service</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="Board Services" id="menu_open_pms_board_service_form_tree"
action="open_pms_board_service_form_tree" sequence="25"
parent="pms.configuration_others" />
</odoo>

View File

@@ -3,15 +3,15 @@
<!--==================================================== Cancelation Rules ==================================================== -->
<!-- Form view of cancelation rules -->
<record model="ir.ui.view" id="hotel_cancelation_rule_form">
<field name="name">hotel.cancelation.rule.form</field>
<field name="model">hotel.cancelation.rule</field>
<record model="ir.ui.view" id="pms_cancelation_rule_form">
<field name="name">pms.cancelation.rule.form</field>
<field name="model">pms.cancelation.rule</field>
<field name="arch" type="xml">
<form string="Cancelation Rules">
<sheet>
<h3>
<field name="name" />
<field name="hotel_ids" widget="many2many_tags"
<field name="pms_property_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
<separator />
<label for="name" string="Max. days InTime before Checkin" />
@@ -35,9 +35,9 @@
</record>
<!-- Tree view of cancelation rules -->
<record model="ir.ui.view" id="hotel_cancelation_rule_view_tree">
<field name="name">hotel.cancelation.rule.tree</field>
<field name="model">hotel.cancelation.rule</field>
<record model="ir.ui.view" id="pms_cancelation_rule_view_tree">
<field name="name">pms.cancelation.rule.tree</field>
<field name="model">pms.cancelation.rule</field>
<field name="arch" type="xml">
<tree string="Cancelation Rules">
<field name="name" />
@@ -50,16 +50,16 @@
</field>
</record>
<!-- Action of hotel cancelation rules -->
<record model="ir.actions.act_window" id="action_hotel_cancelation_rule">
<!-- Action of pms cancelation rules -->
<record model="ir.actions.act_window" id="action_pms_cancelation_rule">
<field name="name">Cancelation Rules</field>
<field name="res_model">hotel.cancelation.rule</field>
<field name="res_model">pms.cancelation.rule</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="Cancelation Rules" id="menu_hotel_cancelation_rule"
action="action_hotel_cancelation_rule" sequence="25"
parent="hotel.configuration_others" />
<menuitem name="Cancelation Rules" id="menu_pms_cancelation_rule"
action="action_pms_cancelation_rule" sequence="25"
parent="pms.configuration_others" />
</odoo>

View File

@@ -4,19 +4,19 @@
<act_window
id="action_checkin_partner"
name="Action checkin"
res_model="hotel.checkin.partner"
res_model="pms.checkin.partner"
view_mode="tree,form" />
<menuitem
id="menu_hotel_checkin_partner"
id="menu_pms_checkin_partner"
name="Checkins"
parent="hotel.hotel_reports_menu"
parent="pms.pms_reports_menu"
sequence="25"
action="action_checkin_partner" />
<record id="hotel_checkin_partner_view_form" model="ir.ui.view">
<record id="pms_checkin_partner_view_form" model="ir.ui.view">
<field name="name">Checkin Form</field>
<field name="model">hotel.checkin.partner</field>
<field name="model">pms.checkin.partner</field>
<field name="arch" type="xml">
<form create="false">
<sheet>
@@ -24,7 +24,7 @@
<group name="group_left">
<field name="partner_id" required="True"
domain="[('is_company','=', False)]"/>
<field name="hotel_id" invisible="1"/>
<field name="pms_property_id" invisible="1"/>
<field name="enter_date"/>
<field name="exit_date"/>
<field name="arrival_hour"/>
@@ -39,9 +39,9 @@
</field>
</record>
<record id="hotel_checkin_partner_reservation_view_tree" model="ir.ui.view">
<field name="name">hotel.checkin.partner.reservation.view.tree</field>
<field name="model">hotel.checkin.partner</field>
<record id="pms_checkin_partner_reservation_view_tree" model="ir.ui.view">
<field name="name">pms.checkin.partner.reservation.view.tree</field>
<field name="model">pms.checkin.partner</field>
<field name="priority">20</field>
<field name="arch" type="xml">
<tree editable="bottom" create="1"
@@ -68,9 +68,9 @@
</field>
</record>
<record id="hotel_checkin_partner_view_tree" model="ir.ui.view">
<field name="name">hotel.checkin.partner.view.tree</field>
<field name="model">hotel.checkin.partner</field>
<record id="pms_checkin_partner_view_tree" model="ir.ui.view">
<field name="name">pms.checkin.partner.view.tree</field>
<field name="model">pms.checkin.partner</field>
<field name="priority">10</field>
<field name="arch" type="xml">
<tree create="false"
@@ -96,9 +96,9 @@
</field>
</record>
<record model="ir.ui.view" id="hotel_checkin_partner_view_search">
<field name="name">hotel.checkin.partner.search</field>
<field name="model">hotel.checkin.partner</field>
<record model="ir.ui.view" id="pms_checkin_partner_view_search">
<field name="name">pms.checkin.partner.search</field>
<field name="model">pms.checkin.partner</field>
<field name="arch" type="xml">
<search string="Checkin Detail">
<field name="partner_id" />

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record model="ir.ui.view" id="pms_floor_view_form">
<field name="name">pms.floor.form</field>
<field name="model">pms.floor</field>
<field name="arch" type="xml">
<form string="Property Ubication">
<sheet>
<group>
<field name="name" colspan="1" />
<field name="sequence" select="1" />
<field name="pms_property_ids" widget="many2many_tags"
options="{'no_create': True,'no_open': True}"/>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="pms_floor_view_tree">
<field name="name">pms.floor.tree</field>
<field name="model">pms.floor</field>
<field name="arch" type="xml">
<tree string=" Property Ubications">
<field name="name" colspan="1" />
<field name="sequence" select="1" />
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="open_pms_floor_form_tree">
<field name="name">Floor Structure</field>
<field name="res_model">pms.floor</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem name="Ubitacions" id="menu_open_pms_floor_form_tree"
action="open_pms_floor_form_tree" sequence="21"
parent="pms.configuration_others" />
</odoo>

View File

@@ -1,18 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--=== Hotel Folio ==== -->
<act_window id="action_view_folio_advance_payment_inv"
name="Invoice Folio"
src_model="hotel.folio"
src_model="pms.folio"
res_model="folio.advance.payment.inv"
key2="client_action_multi" target="new"
view_mode="form" multi="True"/>
<!-- Form view of hotel folio -->
<record model="ir.ui.view" id="hotel_folio_view_form">
<field name="name">hotel.folio.form</field>
<field name="model">hotel.folio</field>
<record model="ir.ui.view" id="pms_folio_view_form">
<field name="name">pms.folio.form</field>
<field name="model">pms.folio</field>
<field name="arch" type="xml">
<form string="Folio">
<header>
@@ -27,7 +25,7 @@
attrs="{'invisible': [('has_cancelled_reservations_to_send', '=', False)]}" class="oe_highlight"/> -->
<!-- <button name="send_exit_mail" type="object" string="Send Exit Email"
attrs="{'invisible': [('has_checkout_to_send', '=', False)]}" class="oe_highlight"/> -->
<button name="%(hotel.action_view_folio_advance_payment_inv)d"
<button name="%(pms.action_view_folio_advance_payment_inv)d"
string="Create Invoice" type="action" class="btn-primary"
attrs="{'invisible': [('state', '!=', 'confirm')]}"/>
<!-- <button name="action_cancel_draft" states="cancel,sale" string="Set to Draft"
@@ -36,7 +34,7 @@
attrs="{'invisible': [('state', 'not in', ('confirm','draft'))]}"
type="object" />
<button name="action_done" type="object" string="Set to Done"
help="If a Hotel Folio is done, you cannot modify it manually anymore. However, you will still be able to invoice. This is used to freeze the Hotel Folio." />
help="If a Folio is done, you cannot modify it manually anymore. However, you will still be able to invoice. This is used to freeze the Folio." />
<!-- <button name="print_quotation" string="Print" type="object" states="sent,sale"/> -->
<field name="state" select="2" widget="statusbar"
statusbar_visible="draft,sent,sale,done" />
@@ -86,7 +84,7 @@
<field name="cancelled_reason" attrs="{'invisible':[('state','not in',('cancel'))]}"/>
</group>
<group>
<field name="hotel_id" invisible="0"/>
<field name="pms_property_id" invisible="0"/>
<field name="pricelist_id" />
<field name="company_id" options="{'no_create': True}" groups="base.group_multi_company"/>
<field name="reservation_type" attrs="{'readonly':[('state','not in',('draft'))]}"/>
@@ -125,12 +123,12 @@
<notebook colspan="4" col="1">
<page string="Reservation Rooms">
<field name="reservation_ids" colspan="4" string="Room Line"
nolabel="1" context="{'from_folio':True,'reservation_ids':reservation_ids,'folio_id': id,'tree_view_ref':'hotel.hotel_reservation_view_bottom_tree', 'form_view_ref':'hotel.hotel_reservation_view_form'}"/>
nolabel="1" context="{'from_folio':True,'reservation_ids':reservation_ids,'folio_id': id,'tree_view_ref':'pms.pms_reservation_view_bottom_tree', 'form_view_ref':'pms.pms_reservation_view_form'}"/>
</page>
<page string="Services">
<separator string="Service Lines" colspan="4"/>
<field name="service_ids"
context="{'from_room':False,'folio_id': id,'tree_view_ref':'hotel.hotel_service_view_tree', 'form_view_ref':'hotel.hotel_service_view_form'}"
context="{'from_room':False,'folio_id': id,'tree_view_ref':'pms.pms_service_view_tree', 'form_view_ref':'pms.pms_service_view_form'}"
nolabel="1" />
</page>
<!--TODO: Add precheckin with indeterminate select room?? -->
@@ -139,7 +137,7 @@
context="{
'default_reservation_id': id,
'reservation_id': id,
'tree_view_ref':'hotel.hotel_checkin_partner_reservation_view_tree',
'tree_view_ref':'pms.pms_checkin_partner_reservation_view_tree',
}"
/>
</page>
@@ -190,7 +188,7 @@
</page>
<page name="payments" string="Payments" attrs="{'invisible': [('invoices_paid','&lt;=',0)]}">
<field name="payment_ids"
context="{'tree_view_ref':'hotel.account_payment_view_tree_folio', 'form_view_ref':'hotel.account_payment_view_form_folio'}"
context="{'tree_view_ref':'pms.account_payment_view_tree_folio', 'form_view_ref':'pms.account_payment_view_form_folio'}"
options="{'no_create': True}" />
</page>
<page name="returns" string="Retun Payments" attrs="{'invisible': [('refund_amount','&lt;=',0)]}">
@@ -228,12 +226,11 @@
</field>
</record>
<!-- Tree view of hotel folio -->
<record model="ir.ui.view" id="hotel_folio_view_tree">
<field name="name">hotel.folio.tree</field>
<field name="model">hotel.folio</field>
<record model="ir.ui.view" id="pms_folio_view_tree">
<field name="name">pms.folio.tree</field>
<field name="model">pms.folio</field>
<field name="arch" type="xml">
<tree string="Hotel Folio" decoration-info="state == 'draft'"
<tree string="Folio" decoration-info="state == 'draft'"
decoration-muted="state == 'cancel'"
default_order="create_date desc">
<field name="state"/>
@@ -244,15 +241,15 @@
<field name="amount_total" sum="Total amount"/>
<field name="pending_amount" sum="Total debt"/>
<field name="invoice_status" />
<field name="hotel_id" invisible="0"/>
<field name="pms_property_id" invisible="0"/>
</tree>
</field>
</record>
<!-- Folio Kanban View -->
<record model="ir.ui.view" id="hotel_folio_view_kanban">
<field name="name">hotel.folio.kanban</field>
<field name="model">hotel.folio</field>
<record model="ir.ui.view" id="pms_folio_view_kanban">
<field name="name">pms.folio.kanban</field>
<field name="model">pms.folio</field>
<field name="arch" type="xml">
<kanban class="o_res_partner_kanban" limit="80">
<field name="name"/>
@@ -289,10 +286,9 @@
</field>
</record>
<!-- Search view of hotel folio -->
<record model="ir.ui.view" id="hotel_folio_view_search">
<field name="name">hotel.folio.search</field>
<field name="model">hotel.folio</field>
<record model="ir.ui.view" id="pms_folio_view_search">
<field name="name">pms.folio.search</field>
<field name="model">pms.folio</field>
<field name="arch" type="xml">
<search string="Tables Detail">
<field name="partner_id" />
@@ -314,10 +310,9 @@
</field>
</record>
<!--graph view of hotel folio -->
<record id="hotel_folio_view_graph" model="ir.ui.view">
<field name="name">view.hotel.folio.graph</field>
<field name="model">hotel.folio</field>
<record id="pms_folio_view_graph" model="ir.ui.view">
<field name="name">view.pms.folio.graph</field>
<field name="model">pms.folio</field>
<field name="arch" type="xml">
<graph type="bar">
</graph>
@@ -328,7 +323,7 @@
<act_window name="Send Confirm Mail"
res_model="mail.compose.message"
src_model="hotel.folio"
src_model="pms.folio"
view_mode="form"
multi="False"
view_type="form"
@@ -336,26 +331,25 @@
key2="client_action_multi"
id="action_view_folio_send_confirm_mail"
context="{
'default_model': 'hotel.folio',
'default_model': 'pms.folio',
'default_res_id': active_id,
'default_use_template': True,
'default_template_id': ref('hotel.email_template_reservation'),
'default_template_id': ref('pms.email_template_reservation'),
'default_composition_mode': 'comment',
'force_send': True,
'mark_so_as_sent': True,
}" />
<!-- Action for hotel folio -->
<record model="ir.actions.act_window" id="open_hotel_folio1_form_tree_all">
<field name="name">Hotel Folio</field>
<field name="res_model">hotel.folio</field>
<record model="ir.actions.act_window" id="open_pms_folio1_form_tree_all">
<field name="name">Folio</field>
<field name="res_model">pms.folio</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form,graph</field>
</record>
<menuitem id="menu_all_folio" name="Reservations"
parent="hotel.hotel_management_menu" sequence="4"/>
<menuitem name="Folios" id="menu_open_hotel_folio1_form_tree_all"
action="open_hotel_folio1_form_tree_all" sequence="15" parent="menu_all_folio" />
parent="pms.pms_management_menu" sequence="4"/>
<menuitem name="Folios" id="menu_open_pms_folio1_form_tree_all"
action="open_pms_folio1_form_tree_all" sequence="15" parent="menu_all_folio" />
</odoo>

Some files were not shown because too many files have changed in this diff Show More