Browse Source

Merge branch '16.0' of https://github.com/CybroOdoo/CybroAddons into 16.0

pull/295/head
Shijin V 2 years ago
parent
commit
81d5283b29
  1. 46
      hotel_management_odoo/README.rst
  2. 24
      hotel_management_odoo/__init__.py
  3. 75
      hotel_management_odoo/__manifest__.py
  4. 22
      hotel_management_odoo/controllers/__init__.py
  5. 56
      hotel_management_odoo/controllers/hotel_management_odoo.py
  6. 26
      hotel_management_odoo/data/ir_data_sequence.xml
  7. 7
      hotel_management_odoo/doc/RELEASE_NOTES.md
  8. 38
      hotel_management_odoo/models/__init__.py
  9. 35
      hotel_management_odoo/models/account_move.py
  10. 37
      hotel_management_odoo/models/account_move_line.py
  11. 131
      hotel_management_odoo/models/cleaning_request.py
  12. 43
      hotel_management_odoo/models/cleaning_team.py
  13. 123
      hotel_management_odoo/models/event_booking_line.py
  14. 128
      hotel_management_odoo/models/fleet_booking_line.py
  15. 39
      hotel_management_odoo/models/fleet_vehicle_model.py
  16. 124
      hotel_management_odoo/models/food_booking_line.py
  17. 36
      hotel_management_odoo/models/hotel_amenity.py
  18. 34
      hotel_management_odoo/models/hotel_floor.py
  19. 106
      hotel_management_odoo/models/hotel_room.py
  20. 46
      hotel_management_odoo/models/hotel_service.py
  21. 151
      hotel_management_odoo/models/maintenance_request.py
  22. 45
      hotel_management_odoo/models/maintenance_team.py
  23. 743
      hotel_management_odoo/models/room_booking.py
  24. 149
      hotel_management_odoo/models/room_booking_line.py
  25. 121
      hotel_management_odoo/models/service_booking_line.py
  26. 60
      hotel_management_odoo/report/room_booking_reports.xml
  27. 61
      hotel_management_odoo/report/sale_order_reports.xml
  28. 53
      hotel_management_odoo/security/hotel_management_odoo_groups.xml
  29. 67
      hotel_management_odoo/security/hotel_management_odoo_security.xml
  30. 25
      hotel_management_odoo/security/ir.model.access.csv
  31. BIN
      hotel_management_odoo/static/description/assets/icons/check.png
  32. BIN
      hotel_management_odoo/static/description/assets/icons/chevron.png
  33. BIN
      hotel_management_odoo/static/description/assets/icons/cogs.png
  34. BIN
      hotel_management_odoo/static/description/assets/icons/consultation.png
  35. BIN
      hotel_management_odoo/static/description/assets/icons/ecom-black.png
  36. BIN
      hotel_management_odoo/static/description/assets/icons/education-black.png
  37. BIN
      hotel_management_odoo/static/description/assets/icons/hotel-black.png
  38. BIN
      hotel_management_odoo/static/description/assets/icons/license.png
  39. BIN
      hotel_management_odoo/static/description/assets/icons/lifebuoy.png
  40. BIN
      hotel_management_odoo/static/description/assets/icons/manufacturing-black.png
  41. BIN
      hotel_management_odoo/static/description/assets/icons/pos-black.png
  42. BIN
      hotel_management_odoo/static/description/assets/icons/puzzle.png
  43. BIN
      hotel_management_odoo/static/description/assets/icons/restaurant-black.png
  44. BIN
      hotel_management_odoo/static/description/assets/icons/service-black.png
  45. BIN
      hotel_management_odoo/static/description/assets/icons/trading-black.png
  46. BIN
      hotel_management_odoo/static/description/assets/icons/training.png
  47. BIN
      hotel_management_odoo/static/description/assets/icons/update.png
  48. BIN
      hotel_management_odoo/static/description/assets/icons/user.png
  49. BIN
      hotel_management_odoo/static/description/assets/icons/wrench.png
  50. BIN
      hotel_management_odoo/static/description/assets/misc/categories.png
  51. BIN
      hotel_management_odoo/static/description/assets/misc/check-box.png
  52. BIN
      hotel_management_odoo/static/description/assets/misc/compass.png
  53. BIN
      hotel_management_odoo/static/description/assets/misc/corporate.png
  54. BIN
      hotel_management_odoo/static/description/assets/misc/customer-support.png
  55. BIN
      hotel_management_odoo/static/description/assets/misc/cybrosys-logo.png
  56. BIN
      hotel_management_odoo/static/description/assets/misc/features.png
  57. BIN
      hotel_management_odoo/static/description/assets/misc/logo.png
  58. BIN
      hotel_management_odoo/static/description/assets/misc/pictures.png
  59. BIN
      hotel_management_odoo/static/description/assets/misc/pie-chart.png
  60. BIN
      hotel_management_odoo/static/description/assets/misc/right-arrow.png
  61. BIN
      hotel_management_odoo/static/description/assets/misc/star.png
  62. BIN
      hotel_management_odoo/static/description/assets/misc/support.png
  63. BIN
      hotel_management_odoo/static/description/assets/misc/whatsapp.png
  64. BIN
      hotel_management_odoo/static/description/assets/modules/l1.png
  65. BIN
      hotel_management_odoo/static/description/assets/modules/l2.png
  66. BIN
      hotel_management_odoo/static/description/assets/modules/l3.png
  67. BIN
      hotel_management_odoo/static/description/assets/modules/l4.png
  68. BIN
      hotel_management_odoo/static/description/assets/modules/l5.png
  69. BIN
      hotel_management_odoo/static/description/assets/modules/l6.png
  70. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot1.png
  71. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot13.png
  72. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot14.png
  73. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot15.png
  74. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot16.png
  75. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot2.png
  76. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot24.png
  77. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot27.png
  78. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot3.png
  79. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot4.png
  80. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot5.png
  81. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot8.png
  82. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshot_group.png
  83. BIN
      hotel_management_odoo/static/description/assets/screenshots/Screenshots.zip
  84. BIN
      hotel_management_odoo/static/description/assets/screenshots/accept.png
  85. BIN
      hotel_management_odoo/static/description/assets/screenshots/admin.png
  86. BIN
      hotel_management_odoo/static/description/assets/screenshots/adv_invoice.png
  87. BIN
      hotel_management_odoo/static/description/assets/screenshots/advance.png
  88. BIN
      hotel_management_odoo/static/description/assets/screenshots/assign_clean.png
  89. BIN
      hotel_management_odoo/static/description/assets/screenshots/assign_team.png
  90. BIN
      hotel_management_odoo/static/description/assets/screenshots/checkin.png
  91. BIN
      hotel_management_odoo/static/description/assets/screenshots/checkout.png
  92. BIN
      hotel_management_odoo/static/description/assets/screenshots/checkout_invoice.png
  93. BIN
      hotel_management_odoo/static/description/assets/screenshots/clean.png
  94. BIN
      hotel_management_odoo/static/description/assets/screenshots/clean_complete.png
  95. BIN
      hotel_management_odoo/static/description/assets/screenshots/clean_head.png
  96. BIN
      hotel_management_odoo/static/description/assets/screenshots/clean_req.png
  97. BIN
      hotel_management_odoo/static/description/assets/screenshots/complete.png
  98. BIN
      hotel_management_odoo/static/description/assets/screenshots/create_clean.png
  99. BIN
      hotel_management_odoo/static/description/assets/screenshots/create_req.png
  100. BIN
      hotel_management_odoo/static/description/assets/screenshots/done.png

46
hotel_management_odoo/README.rst

@ -0,0 +1,46 @@
.. image:: https://img.shields.io/badge/license-LGPL--3-green.svg
:target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
Hotel Management
================
A complete Hotel Management System that cover all areas of hotel services.
Configuration
=============
* No additional configurations needed
License
-------
General Public License, Version 3 (LGPL v3).
https://www.gnu.org/licenses/lgpl-3.0-standalone.html
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
Credits
-------
* Developer:(V16) Unnimaya C O, Contact: odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

24
hotel_management_odoo/__init__.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from . import controllers
from . import models
from . import wizard

75
hotel_management_odoo/__manifest__.py

@ -0,0 +1,75 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
{
'name': 'Hotel Management',
'version': '16.0.1.0.0',
'category': 'Industries',
'summary': """A complete Hotel Management System that cover all areas of
Hotel services""" ,
'description': """The module helps you to manage rooms, amenities,
services, food, events and vehicles. End Users can book rooms and reserve
foods from hotel.""",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'depends': ['account', 'event', 'fleet', 'lunch'],
'data': [
'security/hotel_management_odoo_groups.xml',
'security/hotel_management_odoo_security.xml',
'security/ir.model.access.csv',
'data/ir_data_sequence.xml',
'views/account_move_views.xml',
'views/hotel_menu_views.xml',
'views/hotel_amenity_views.xml',
'views/hotel_service_views.xml',
'views/hotel_floor_views.xml',
'views/hotel_room_views.xml',
'views/lunch_product_views.xml',
'views/fleet_vehicle_model_views.xml',
'views/room_booking_views.xml',
'views/maintenance_team_views.xml',
'views/maintenance_request_views.xml',
'views/cleaning_team_views.xml',
'views/cleaning_request_views.xml',
'views/food_booking_line_views.xml',
'views/dashboard_view.xml',
'wizard/room_booking_detail_views.xml',
'wizard/sale_order_detail_views.xml',
'views/reporting_views.xml',
'report/room_booking_reports.xml',
'report/sale_order_reports.xml',
],
'assets': {
'web.assets_backend': [
'hotel_management_odoo/static/src/js/action_manager.js',
'hotel_management_odoo/static/src/css/dashboard.css',
'hotel_management_odoo/static/src/js/dashboard_action.js',
'hotel_management_odoo/static/src/xml/dashboard_templates.xml',
],
},
'images': ['static/description/banner.jpg'],
'license': 'LGPL-3',
'installable': True,
'auto_install': False,
'application': True,
}

22
hotel_management_odoo/controllers/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from . import hotel_management_odoo

56
hotel_management_odoo/controllers/hotel_management_odoo.py

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
import json
from odoo import http
from odoo.http import content_disposition, request
from odoo.tools import html_escape
class XLSXReportController(http.Controller):
"""Controller for XlsX report"""
@http.route('/xlsx_reports', type='http', auth='user',
methods=['POST'], csrf=False)
def get_room_booking_report_xlsx(self, model, options, output_format,
report_name):
"""Function for generating xlsx report"""
report_obj = request.env[model].sudo()
options = json.loads(options)
try:
if output_format == 'xlsx':
response = request.make_response(
None,
headers=[('Content-Type', 'application/vnd.ms-excel'),
('Content-Disposition',
content_disposition(report_name + '.xlsx'))]
)
report_obj.get_xlsx_report(options, response)
response.set_cookie('fileToken', 'dummy token')
return response
except Exception as e:
s_error = http.serialize_exception(e)
error = {
'code': 200,
'message': 'Odoo Server Error',
'data': s_error
}
return request.make_response(html_escape(json.dumps(error)))

26
hotel_management_odoo/data/ir_data_sequence.xml

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data noupdate="1">
<!-- Room Booking Sequence-->
<record id="seq_hotel_folio" model="ir.sequence">
<field name="name">Hotel Folio</field>
<field name="code">room.booking</field>
<field name="prefix">BOOKING/</field>
<field name="padding">5</field>
</record>
<!-- Cleaning Request sequence-->
<record id="seq_cleaning" model="ir.sequence">
<field name="name">Cleaning Request</field>
<field name="code">cleaning.request</field>
<field name="prefix">CLEANING/</field>
<field name="padding">4</field>
</record>
<!-- Maintenance Request Sequence-->
<record id="seq_maintenance" model="ir.sequence">
<field name="name">Maintenance Request</field>
<field name="code">maintenance.request</field>
<field name="prefix">MNTC/</field>
<field name="padding">5</field>
</record>
</data>
</odoo>

7
hotel_management_odoo/doc/RELEASE_NOTES.md

@ -0,0 +1,7 @@
## Module <hotel_management_odoo>
#### 27.11.2023
#### Version 16.0.1.0.0
#### ADD
- Initial commit for Hotel Management

38
hotel_management_odoo/models/__init__.py

@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from . import account_move
from . import account_move_line
from . import cleaning_request
from . import cleaning_team
from . import event_booking_line
from . import fleet_booking_line
from . import fleet_vehicle_model
from . import food_booking_line
from . import hotel_amenity
from . import hotel_floor
from . import hotel_room
from . import hotel_service
from . import maintenance_request
from . import maintenance_team
from . import room_booking
from . import room_booking_line
from . import service_booking_line

35
hotel_management_odoo/models/account_move.py

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import fields, models
class AccountMove(models.Model):
"""
Inherited account. move for adding hotel booking reference field to
invoicing model.
"""
_inherit = "account.move"
hotel_booking_id = fields.Many2one('room.booking',
string="Booking Reference",
readonly=True, help="Choose the Booking "
"Reference")

37
hotel_management_odoo/models/account_move_line.py

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import fields, models
class AccountMoveLine(models.Model):
"""
Adding Product Type field to Account Move Line model.
"""
_inherit = "account.move.line"
product_type = fields.Selection([
('room', 'Room'),
('food', 'Food'),
('event', 'Event'),
('service', 'Service'),
('fleet', 'Fleet')
], string="Product Type", help="Choose the product type")

131
hotel_management_odoo/models/cleaning_request.py

@ -0,0 +1,131 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class CleaningRequest(models.Model):
"""Class for creating and assigning Cleaning Request"""
_name = "cleaning.request"
_inherit = ["mail.thread", "mail.activity.mixin"]
_rec_name = "sequence"
_description = "Cleaning Request"
sequence = fields.Char(string="Sequence", readonly=True, default='New',
copy=False, tracking=True,
help="Sequence for identifying the request")
state = fields.Selection([('draft', 'Draft'),
('assign', 'Assigned'),
('ongoing', 'Cleaning'),
('support', 'Waiting For Support'),
('done', 'Completed')],
string="State",
default='draft', help="State of cleaning request")
cleaning_type = fields.Selection(selection=[('room', 'Room'),
('hotel', 'Hotel'),
('vehicle', 'Vehicle')],
required=True, tracking=True,
string="Cleaning Type",
help="Choose what is to be cleaned")
room_id = fields.Many2one('hotel.room', string="Room",
help="Choose the room")
hotel = fields.Char(string="Hotel", help="cleaning request space in hotel")
vehicle_id = fields.Many2one('fleet.vehicle.model',
string="Vehicle",
help="Cleaning request from vehicle")
support_team_ids = fields.Many2many('res.users',
string="Support Team",
help="Support team members")
support_reason = fields.Char(string='Support', help="Support Reason")
description = fields.Char(string="Description",
help="Description about the cleaning")
team_id = fields.Many2one('cleaning.team', string="Team",
required=True,
tracking=True,
help="Choose the team")
head_id = fields.Many2one('res.users', string="Head",
related='team_id.team_head_id',
help="Head of cleaning team")
assigned_id = fields.Many2one('res.users', string="Assigned To",
help="The team member to whom the request is "
"Assigned To")
domain_partner_ids = fields.Many2many('res.partner',
string="Domain Partner",
help="Choose the Domain Partner")
@api.model
def create(self, vals_list):
"""Sequence Generation"""
if vals_list.get('sequence', 'New') == 'New':
vals_list['sequence'] = self.env['ir.sequence'].next_by_code(
'cleaning.request')
return super().create(vals_list)
@api.onchange('team_id')
def _onchange_team_id(self):
"""Function for updating the domain partner ids"""
self.update(
{'domain_partner_ids': self.team_id.member_ids.ids})
def action_assign_cleaning(self):
"""Button action for updating the state to assign"""
self.update({'state': 'assign'})
def action_start_cleaning(self):
"""Button action for updating the state to ongoing"""
self.write({'state': 'ongoing'})
def action_done_cleaning(self):
"""Button action for updating the state to done"""
self.write({'state': 'done'})
def action_assign_support(self):
"""Button action for updating the state to support"""
if self.support_reason:
self.write({'state': 'support'})
else:
raise ValidationError(_('Please enter the reason'))
def action_assign_assign_support(self):
"""Button action for updating the state to ongoing"""
if self.support_team_ids:
self.write({'state': 'ongoing'})
else:
raise ValidationError(_('Please choose a support'))
def action_maintain_request(self):
"""Button action for creating the maintenance request"""
self.env['maintenance.request'].sudo().create({
'date': fields.Date.today(),
'state': 'draft',
'type': self.cleaning_type,
'vehicle_maintenance_id': self.vehicle_id.id
})
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'type': 'success',
'message': "Maintenance Request Sent Successfully",
'next': {'type': 'ir.actions.act_window_close'},
}
}

43
hotel_management_odoo/models/cleaning_team.py

@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import fields, models
class CleaningTeam(models.Model):
""" Model for creating Cleaning team and assigns Cleaning requests to
each team"""
_name = "cleaning.team"
_description = "Cleaning Team"
name = fields.Char(string="Team Name", help="Name of the Team")
team_head_id = fields.Many2one('res.users', string="Team Head",
help="Choose the Team Head",
domain=lambda self: [
('groups_id', 'in', self.env.ref(
'hotel_management_odoo.'
'cleaning_team_group_head').id)])
member_ids = fields.Many2many('res.users', string="Member",
domain=lambda self: [
('groups_id', 'in', self.env.ref(
'hotel_management_odoo.'
'cleaning_team_group_user').id)],
help="Team Members")

123
hotel_management_odoo/models/event_booking_line.py

@ -0,0 +1,123 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import api, fields, models, tools
class EventBookingLine(models.Model):
"""Model that handles the event booking form"""
_name = "event.booking.line"
_description = "Hotel Event Line"
_rec_name = 'event_id'
booking_id = fields.Many2one("room.booking", string="Booking",
help="Choose room booking reference",
ondelete="cascade")
event_id = fields.Many2one('event.event', string="Event",
help="Choose the Event")
ticket_id = fields.Many2one('product.product', string="Ticket",
help="Choose the Ticket Type",
domain=[('detailed_type', '=', 'event')])
description = fields.Char(string='Description', help="Detailed "
"description of the "
"event",
related='event_id.display_name')
uom_qty = fields.Float(string="Quantity", default=1,
help="The quantity converted into the UoM used by "
"the product")
uom_id = fields.Many2one('uom.uom', readonly=True,
string="Unit of Measure",
related='ticket_id.uom_id', help="This will set "
"the unit of"
" measure used")
price_unit = fields.Float(related='ticket_id.lst_price', string='Price',
digits='Product Price',
help="The selling price of the selected ticket.")
tax_ids = fields.Many2many('account.tax',
'hotel_event_order_line_taxes_rel',
'event_id',
'tax_id', related='ticket_id.taxes_id',
string='Taxes',
help="Default taxes used when selling the event "
"tickets.",
domain=[('type_tax_use', '=', 'sale')])
currency_id = fields.Many2one(
related='booking_id.pricelist_id.currency_id', string='Currency',
help='The currency used',
store=True, precompute=True)
price_subtotal = fields.Float(
string="Subtotal",
compute='_compute_price_subtotal',
help="Total Price Excluding Tax",
store=True)
price_tax = fields.Float(
string="Total Tax",
compute='_compute_price_subtotal',
help="Tax Amount",
store=True)
price_total = fields.Float(
string="Total",
compute='_compute_price_subtotal',
help="Total Price Including Tax")
state = fields.Selection(
related='booking_id.state',
string="Order Status",
help="State of Room Booking",
copy=False)
@api.depends('uom_qty', 'price_unit', 'tax_ids')
def _compute_price_subtotal(self):
"""
Compute the amounts of the Event booking line.
"""
for line in self:
tax_results = self.env['account.tax']._compute_taxes(
[line._convert_to_tax_base_line_dict()])
totals = list(tax_results['totals'].values())[0]
amount_untaxed = totals['amount_untaxed']
amount_tax = totals['amount_tax']
line.update({
'price_subtotal': amount_untaxed,
'price_tax': amount_tax,
'price_total': amount_untaxed + amount_tax,
})
if self.env.context.get('import_file',
False) and not self.env.user. \
user_has_groups('account.group_account_manager'):
line.tax_id.invalidate_recordset(
['invoice_repartition_line_ids'])
def _convert_to_tax_base_line_dict(self):
""" Convert the current record to a dictionary in order to use the
generic taxes computation method
defined on account.tax.
:return: A python dictionary.
"""
self.ensure_one()
return self.env['account.tax']._convert_to_tax_base_line_dict(
self,
partner=self.booking_id.partner_id,
currency=self.currency_id,
taxes=self.tax_ids,
price_unit=self.price_unit,
quantity=self.uom_qty,
price_subtotal=self.price_subtotal,
)

128
hotel_management_odoo/models/fleet_booking_line.py

@ -0,0 +1,128 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import api, fields, models, tools
class FleetBookingLine(models.Model):
"""Model that handles the fleet booking"""
_name = "fleet.booking.line"
_description = "Hotel Fleet Line"
_rec_name = 'fleet_id'
@tools.ormcache()
def _get_default_uom_id(self):
"""Method for getting the default uom id"""
return self.env.ref('uom.product_uom_km')
booking_id = fields.Many2one("room.booking", string="Booking",
ondelete="cascade",
help="Shows the room Booking")
fleet_id = fields.Many2one('fleet.vehicle.model',
string="Vehicle",
help='Indicates the Vehicle')
description = fields.Char(string='Description',
related='fleet_id.display_name',
help="Description of Vehicle")
uom_qty = fields.Float(string="Total KM", default=1,
help="The quantity converted into the UoM used by "
"the product")
uom_id = fields.Many2one('uom.uom', readonly=True,
string="Unit of Measure",
default=_get_default_uom_id, help="This will set "
"the unit of"
" measure used")
price_unit = fields.Float(string='Rent/KM', related='fleet_id.price_per_km',
digits='Product Price',
help="The rent/km of the selected fleet.")
tax_ids = fields.Many2many('account.tax',
'hotel_fleet_order_line_taxes_rel',
'fleet_id',
'tax_id', string='Taxes',
help="Default taxes used when renting the fleet "
"models.",
domain=[('type_tax_use', '=', 'sale')])
currency_id = fields.Many2one(
related='booking_id.pricelist_id.currency_id',
string="Currency",
help='The currency used')
price_subtotal = fields.Float(
string="Subtotal",
compute='_compute_price_subtotal', help="Total price excluding tax",
store=True)
price_tax = fields.Float(
string="Total Tax",
compute='_compute_price_subtotal', help="Total tax amount",
store=True)
price_total = fields.Float(
string="Total",
compute='_compute_price_subtotal',
help="Total Price Including Tax",
store=True)
state = fields.Selection(
related='booking_id.state',
string="Order Status",
help=" Status of the Order",
copy=False)
@api.depends('uom_qty', 'price_unit', 'tax_ids')
def _compute_price_subtotal(self):
"""
Compute the amounts of the room booking line.
"""
for line in self:
tax_results = self.env['account.tax']._compute_taxes(
[line._convert_to_tax_base_line_dict()])
totals = list(tax_results['totals'].values())[0]
amount_untaxed = totals['amount_untaxed']
amount_tax = totals['amount_tax']
line.update({
'price_subtotal': amount_untaxed,
'price_tax': amount_tax,
'price_total': amount_untaxed + amount_tax,
})
if self.env.context.get('import_file',
False) and not self.env.user. \
user_has_groups('account.group_account_manager'):
line.tax_id.invalidate_recordset(
['invoice_repartition_line_ids'])
def _convert_to_tax_base_line_dict(self):
""" Convert the current record to a dictionary in order to use the
generic taxes computation method
defined on account.tax.
:return: A python dictionary.
"""
self.ensure_one()
return self.env['account.tax']._convert_to_tax_base_line_dict(
self,
partner=self.booking_id.partner_id,
currency=self.currency_id,
taxes=self.tax_ids,
price_unit=self.price_unit,
quantity=self.uom_qty,
price_subtotal=self.price_subtotal,
)
def search_available_vehicle(self):
"""Returns list of booked vehicles"""
return (self.env['fleet.vehicle.model'].search(
[('id', 'in', self.search([]).mapped('fleet_id').ids)]).ids)

39
hotel_management_odoo/models/fleet_vehicle_model.py

@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import fields, models, tools
class FleetVehicleModel(models.Model):
"""Inherits Fleet Model for Booking vehicles for hotel Customers"""
_inherit = 'fleet.vehicle.model'
@tools.ormcache()
def _set_default_uom_id(self):
"""Method for getting the default uom id"""
return self.env.ref('uom.product_uom_km')
price_per_km = fields.Float(string="Price/KM", default=1.0,
help="Rent for Vehicle")
uom_id = fields.Many2one('uom.uom',
string='Reference Uom',
help="UOM of the product",
default=_set_default_uom_id, required=True)

124
hotel_management_odoo/models/food_booking_line.py

@ -0,0 +1,124 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import api, fields, models, tools
class FoodBookingLine(models.Model):
"""Model that handles the food booking"""
_name = "food.booking.line"
_description = "Hotel Food Line"
_rec_name = 'food_id'
@tools.ormcache()
def _get_default_uom_id(self):
"""Method for getting the default uom id"""
return self.env.ref('uom.product_uom_unit')
booking_id = fields.Many2one("room.booking", string="Booking",
help="Shows the room Booking",
ondelete="cascade")
food_id = fields.Many2one('lunch.product', string="Product",
help="Indicates the Food Product")
description = fields.Char(string='Description',
help="Description of Food Product",
related='food_id.display_name')
uom_qty = fields.Float(string="Qty", default=1,
help="The quantity converted into the UoM used by "
"the product")
uom_id = fields.Many2one('uom.uom', readonly=True,
string="Unit of Measure",
default=_get_default_uom_id, help="This will set "
"the unit of"
" measure used")
price_unit = fields.Float(related='food_id.price', string='Price',
digits='Product Price',
help="The price of the selected food item.")
tax_ids = fields.Many2many('account.tax',
'hotel_food_order_line_taxes_rel',
'food_id', 'tax_id',
string='Taxes',
help="Default taxes used when selling the food"
" products.",
domain=[('type_tax_use', '=', 'sale')])
currency_id = fields.Many2one(
related='booking_id.pricelist_id.currency_id',
string="Currency", help='The currency used')
price_subtotal = fields.Float(
string="Subtotal",
compute='_compute_price_subtotal', help="Total Price Excluding Tax",
store=True)
price_tax = fields.Float(
string="Total Tax",
compute='_compute_price_subtotal', help="Tax Amount",
store=True)
price_total = fields.Float(
string="Total",
compute='_compute_price_subtotal', help="Total Price Including Tax",
store=True)
state = fields.Selection(
related='booking_id.state',
string="Order Status", help=" Status of the Order",
copy=False)
@api.depends('uom_qty', 'price_unit', 'tax_ids')
def _compute_price_subtotal(self):
"""
Compute the amounts of the room booking line.
"""
for line in self:
tax_results = self.env['account.tax']._compute_taxes(
[line._convert_to_tax_base_line_dict()])
totals = list(tax_results['totals'].values())[0]
amount_untaxed = totals['amount_untaxed']
amount_tax = totals['amount_tax']
line.update({
'price_subtotal': amount_untaxed,
'price_tax': amount_tax,
'price_total': amount_untaxed + amount_tax,
})
if self.env.context.get('import_file',
False) and not self.env.user. \
user_has_groups('account.group_account_manager'):
line.tax_id.invalidate_recordset(
['invoice_repartition_line_ids'])
def _convert_to_tax_base_line_dict(self):
""" Convert the current record to a dictionary in order to use the
generic taxes computation method
defined on account.tax.
:return: A python dictionary.
"""
self.ensure_one()
return self.env['account.tax']._convert_to_tax_base_line_dict(
self,
partner=self.booking_id.partner_id,
currency=self.currency_id,
taxes=self.tax_ids,
price_unit=self.price_unit,
quantity=self.uom_qty,
price_subtotal=self.price_subtotal,
)
def search_food_orders(self):
"""Returns list of food orders"""
return (self.search([]).filtered(lambda r: r.booking_id.state not in [
'check_out', 'cancel', 'done']).ids)

36
hotel_management_odoo/models/hotel_amenity.py

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import fields, models
class HotelAmenity(models.Model):
"""Model that handles all amenities of the hotel"""
_name = 'hotel.amenity'
_description = "Hotel Amenity"
_inherit = 'mail.thread'
_order = 'id desc'
name = fields.Char(string='Name', help="Name of the amenity")
icon = fields.Image(string="Icon", required=True,
help="Image of the amenity")
description = fields.Html(string="About",
help="Specify the amenity description")

34
hotel_management_odoo/models/hotel_floor.py

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import fields, models
class HotelFloor(models.Model):
"""Model that holds the Hotel Floors."""
_name = "hotel.floor"
_description = "Floor"
_order = 'id desc'
name = fields.Char(string="Name", help="Name of the floor", required=True)
user_id = fields.Many2one('res.users', string='Manager',
help="Manager of the Floor",
required=True)

106
hotel_management_odoo/models/hotel_room.py

@ -0,0 +1,106 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import api, fields, models, tools, _
from odoo.exceptions import ValidationError
class HotelRoom(models.Model):
"""Model that holds all details regarding hotel room"""
_name = 'hotel.room'
_description = 'Rooms'
_inherit = ['mail.thread', 'mail.activity.mixin']
@tools.ormcache()
def _get_default_uom_id(self):
"""Method for getting the default uom id"""
return self.env.ref('uom.product_uom_unit')
name = fields.Char(string='Name', help="Name of the Room", index='trigram',
required=True, translate=True)
status = fields.Selection([("available", "Available"),
("reserved", "Reserved"),
("occupied", "Occupied")],
default="available", string="Status",
help="Status of The Room",
tracking=True)
is_room_avail = fields.Boolean(default=True, string="Available",
help="Check if the room is available")
list_price = fields.Float(string='Rent', digits='Product Price',
help="The rent of the room.")
uom_id = fields.Many2one(
'uom.uom', string='Unit of Measure',
default=_get_default_uom_id, required=True,
help="Default unit of measure used for all stock operations.")
room_image = fields.Image(string="Room Image", max_width=1920,
max_height=1920, help='Image of the room')
taxes_ids = fields.Many2many('account.tax',
'hotel_room_taxes_rel',
'room_id', 'tax_id',
help="Default taxes used when selling the"
" room.", string='Customer Taxes',
domain=[('type_tax_use', '=', 'sale')],
default=lambda self: self.env.company.
account_sale_tax_id)
room_amenities_ids = fields.Many2many("hotel.amenity",
string="Room Amenities",
help="List of room amenities.")
floor_id = fields.Many2one('hotel.floor', string='Floor',
help="Automatically selects the Floor",
tracking=True)
user_id = fields.Many2one('res.users', string="User",
related='floor_id.user_id',
help="Automatically selects the manager",
tracking=True)
room_type = fields.Selection([('single', 'Single'),
('double', 'Double'),
('dormitory', 'Dormitory')],
required=True, string="Room Type",
help="Automatically selects the Room Type",
tracking=True,
default="single")
num_person = fields.Integer(string='Number Of Persons',
required=True,
help="Automatically chooses the No. of Persons",
tracking=True)
description = fields.Html(string='Description', help="Add description",
translate=True)
@api.constrains("num_person")
def _check_capacity(self):
"""Check capacity function"""
for room in self:
if room.num_person <= 0:
raise ValidationError(_("Room capacity must be more than 0"))
@api.onchange("room_type")
def _onchange_room_type(self):
"""
Based on selected room type, number of person will be updated.
----------------------------------------
@param self: object pointer
"""
if self.room_type == "single":
self.num_person = 1
elif self.room_type == "double":
self.num_person = 2
else:
self.num_person = 4

46
hotel_management_odoo/models/hotel_service.py

@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import fields, models
class HotelService(models.Model):
"""Model that holds the all hotel services"""
_name = 'hotel.service'
_description = "Hotel Service"
_inherit = 'mail.thread'
_order = 'id desc'
name = fields.Char(string="Service",
help="Name of the service",
required=True)
unit_price = fields.Float(string="Price",
help="Price of the service",
default=0.0)
taxes_ids = fields.Many2many('account.tax',
'hotel_service_taxes_rel',
'service_id', 'tax_id',
string='Customer Taxes',
help="Default taxes used when selling the"
" service product.",
domain=[('type_tax_use', '=', 'sale')],
default=lambda self:
self.env.company.account_sale_tax_id)

151
hotel_management_odoo/models/maintenance_request.py

@ -0,0 +1,151 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class MaintenanceRequest(models.Model):
"""Model that handles the maintenance requests"""
_name = 'maintenance.request'
_inherit = ['mail.thread', 'mail.activity.mixin']
_rec_name = 'sequence'
_description = "Maintenance Request"
sequence = fields.Char(readonly=True, string="Sequence", copy=False,
default='New', help='Sequence number for identifying'
' maintenance request')
date = fields.Date(string="Date", help="Date of maintenance request",
default=fields.Date.today)
state = fields.Selection(selection=[('draft', 'Draft'),
('team_leader_approve',
'Waiting For User Assign'),
('pending', 'Waiting For User To '
'Accept'),
('ongoing', 'Ongoing'),
('support', 'Waiting For Support'),
('done', 'Done'),
('verify', 'Pending For Verify'),
('cancel', 'Canceled')],
default='draft', string="State",
help="State of maintenance request",
tracking=True)
team_id = fields.Many2one('maintenance.team',
string='Maintenance Team',
help="Team for which this request is assigned",
tracking=True)
team_head_id = fields.Many2one('res.users',
related='team_id.user_id',
string='Team Leader',
help="Head of the maintenance team")
assigned_user_id = fields.Many2one('res.users',
string='Assigned User',
tracking=True,
help="User to whom the request is "
"assigned")
type = fields.Selection(selection=[('room', 'Room'),
('vehicle', 'Vehicle'),
('hotel', 'Hotel'),
('cleaning', 'Cleaning')], string="Type",
help="The type for which the request is creating",
tracking=True)
room_maintenance_ids = fields.Many2many('hotel.room',
string="Room Maintenance",
help="Choose Room Maintenance")
hotel_maintenance = fields.Char(string='Hotel Maintenance',
help="This is the Hotel Maintenance")
cleaning_maintenance = fields.Char(string='Cleaning Maintenance',
help="This is the Cleaning Maintenance")
vehicle_maintenance_id = fields.Many2one('fleet.vehicle.model',
string="Vehicle",
help="Choose Vehicle")
support_team_ids = fields.Many2many('res.users',
string="Support Team",
help="Choose Support Team")
support_reason = fields.Char(string='Support',
help="Reason for adding Support")
remarks = fields.Char(string='Remarks', help="Add Remarks")
domain_partner_ids = fields.Many2many('res.partner',
string="Partner",
help="For filtering Users")
@api.model
def create(self, vals_list):
"""Sequence Generation"""
if vals_list.get('sequence', 'New') == 'New':
vals_list['sequence'] = self.env['ir.sequence'].next_by_code(
'maintenance.request')
return super().create(vals_list)
@api.onchange('team_id')
def _onchange_team_id(self):
"""Function for filtering the maintenance team user"""
self.update({
'domain_partner_ids': self.team_id.member_ids.ids
})
def action_assign_team(self):
"""Button action for changing the state to team_leader_approve"""
if self.team_id:
self.state = 'team_leader_approve'
else:
raise ValidationError(
_("Please assign a Team"))
def action_assign_user(self):
"""Button action for changing the state to pending"""
if self.assigned_user_id:
self.state = 'pending'
else:
raise ValidationError(
_("Please assign a User"))
def action_start(self):
"""Button action for changing the state to ongoing"""
self.state = 'ongoing'
def action_support(self):
"""Button action for changing the state to support"""
if self.support_reason:
self.state = 'support'
else:
raise ValidationError(_('Please enter the reason'))
def action_complete(self):
"""Button action for changing the state to verify"""
if self.remarks:
self.state = 'verify'
else:
raise ValidationError(_('Please Add remark'))
def action_assign_support(self):
"""Button action for changing the state to ongoing"""
if self.support_team_ids:
self.state = 'ongoing'
else:
raise ValidationError(_('Please choose support'))
def action_verify(self):
"""Button action for changing the state to done"""
self.state = 'done'
if self.vehicle_maintenance_id:
self.vehicle_maintenance_id.status = 'available'

45
hotel_management_odoo/models/maintenance_team.py

@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import fields, models
class MaintenanceTeam(models.Model):
"""Model that handles the maintenance team """
_name = "maintenance.team"
_description = "Maintenance Team"
name = fields.Char(string='Maintenance Team',
help='Name of the maintenance team')
user_id = fields.Many2one('res.users', string='Team Leader',
help="Leader of Team",
domain=lambda self: [
('groups_id', 'in', self.env.ref(
'hotel_management_odoo.'
'maintenance_team_group_'
'leader').id)])
member_ids = fields.Many2many('res.users', string='Members',
help="Members of the Team",
domain=lambda self: [
('groups_id', 'in', self.env.ref(
'hotel_management_odoo.'
'maintenance_'
'team_group_user').id)])

743
hotel_management_odoo/models/room_booking.py

@ -0,0 +1,743 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from datetime import datetime, timedelta
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
from odoo.tools.safe_eval import pytz
class RoomBooking(models.Model):
"""Model that handles the hotel room booking and all operations related
to booking"""
_name = "room.booking"
_description = "Hotel Room Reservation"
_inherit = ['mail.thread', 'mail.activity.mixin']
name = fields.Char(string="Folio Number", readonly=True, index=True,
default="New", help="Name of Folio")
company_id = fields.Many2one('res.company', string="Company",
help="Choose the Company",
required=True, index=True,
default=lambda self: self.env.company)
partner_id = fields.Many2one('res.partner', string="Customer",
help="Customers of hotel",
required=True, index=True, tracking=1,
domain="[('type', '!=', 'private'),"
" ('company_id', 'in', "
"(False, company_id))]")
date_order = fields.Datetime(
string="Order Date",
required=True, copy=False,
help="Creation date of draft/sent orders,"
" Confirmation date of confirmed orders.",
default=fields.Datetime.now)
is_checkin = fields.Boolean(default=False, string="Is Checkin",
help="sets to True if the room is occupied")
maintenance_request_sent = fields.Boolean(default=False,
string="Maintenance Request sent "
"or Not",
help="sets to True if the "
"maintenance request send "
"once")
checkin_date = fields.Datetime(string="Check In",
help="Date of Checkin",
states={"draft": [("readonly", False)]},
default=fields.Datetime.now()
)
checkout_date = fields.Datetime(string="Check Out",
help="Date of Checkout",
states={"draft": [("readonly", False)]},
default=fields.Datetime.now() + timedelta(
hours=23, minutes=59, seconds=59))
hotel_policy = fields.Selection(
[("prepaid", "On Booking"),
("manual", "On Check In"),
("picking", "On Checkout"),
],
default="manual", string="Hotel Policy",
help="Hotel policy for payment that "
"either the guest has to pay at "
"booking time, check-in "
"or check-out time.", tracking=True
)
duration = fields.Integer(string="Duration in Days",
help="Number of days which will automatically "
"count from the check-in and check-out "
"date.", )
invoice_button_visible = fields.Boolean(string='Invoice Button Display',
help="Invoice button will be "
"visible if this button is "
"True")
invoice_status = fields.Selection(
selection=[('no_invoice', 'Nothing To Invoice'),
('to_invoice', 'To Invoice'),
('invoiced', 'Invoiced'),
], string="Invoice Status",
help="Status of the Invoice",
default='no_invoice', tracking=True)
hotel_invoice_id = fields.Many2one("account.move",
string="Invoice",
help="Indicates the invoice",
copy=False)
duration_visible = fields.Float(string="Duration",
help="A dummy field for Duration")
need_service = fields.Boolean(default=False, string="Need Service",
help="Check if a Service to be added with"
" the Booking")
need_fleet = fields.Boolean(default=False, string="Need Vehicle",
help="Check if a Fleet to be"
" added with the Booking")
need_food = fields.Boolean(default=False, string="Need Food",
help="Check if a Food to be added with"
" the Booking")
need_event = fields.Boolean(default=False, string="Need Event",
help="Check if a Event to be added with"
" the Booking")
service_line_ids = fields.One2many("service.booking.line",
"booking_id",
string="Service",
help="Hotel services details provided to"
"Customer and it will included in "
"the main Invoice.")
event_line_ids = fields.One2many("event.booking.line",
'booking_id',
string="Event",
help="Hotel event reservation detail.")
vehicle_line_ids = fields.One2many("fleet.booking.line",
"booking_id",
string="Vehicle",
help="Hotel fleet reservation detail.")
room_line_ids = fields.One2many("room.booking.line",
"booking_id", string="Room",
help="Hotel room reservation detail.")
food_order_line_ids = fields.One2many("food.booking.line",
"booking_id",
string='Food',
help="Food details provided"
" to Customer and"
" it will included in the "
"main invoice.", )
state = fields.Selection(selection=[('draft', 'Draft'),
('reserved', 'Reserved'),
('check_in', 'Check In'),
('check_out', 'Check Out'),
('cancel', 'Cancelled'),
('done', 'Done')], string='State',
help="State of the Booking",
default='draft', tracking=True)
user_id = fields.Many2one(
comodel_name='res.partner',
string="Invoice Address",
compute='_compute_user_id',
help="Sets the User automatically", required=True,
domain="['|', ('company_id', '=', False), ('company_id', '=',"
" company_id)]")
pricelist_id = fields.Many2one(
comodel_name='product.pricelist',
string="Pricelist",
compute='_compute_pricelist_id',
store=True, readonly=False,
required=True,
tracking=1,
help="If you change the pricelist, only newly added lines"
" will be affected.")
currency_id = fields.Many2one(
string="Currency", help="This is the Currency used",
related='pricelist_id.currency_id',
depends=['pricelist_id.currency_id'],
)
invoice_count = fields.Integer(compute='_compute_invoice_count',
string="Invoice "
"Count",
help="The number of invoices created")
account_move = fields.Integer(string='Invoice Id',
help="Id of the invoice created")
amount_untaxed = fields.Monetary(string="Total Untaxed Amount",
help="This indicates the total untaxed "
"amount", store=True,
compute='_compute_amount_untaxed',
tracking=5)
amount_tax = fields.Monetary(string="Taxes", help="Total Tax Amount",
store=True, compute='_compute_amount_untaxed')
amount_total = fields.Monetary(string="Total", store=True,
help="The total Amount including Tax",
compute='_compute_amount_untaxed',
tracking=4)
amount_untaxed_room = fields.Monetary(string="Room Untaxed",
help="Untaxed Amount for Room",
compute='_compute_amount_untaxed',
tracking=5)
amount_untaxed_food = fields.Monetary(string="Food Untaxed",
help="Untaxed Amount for Food",
compute='_compute_amount_untaxed',
tracking=5)
amount_untaxed_event = fields.Monetary(string="Event Untaxed",
help="Untaxed Amount for Event",
compute='_compute_amount_untaxed',
tracking=5)
amount_untaxed_service = fields.Monetary(
string="Service Untaxed", help="Untaxed Amount for Service",
compute='_compute_amount_untaxed', tracking=5)
amount_untaxed_fleet = fields.Monetary(string="Amount Untaxed",
help="Untaxed amount for Fleet",
compute='_compute_amount_untaxed',
tracking=5)
amount_taxed_room = fields.Monetary(string="Rom Tax", help="Tax for Room",
compute='_compute_amount_untaxed',
tracking=5)
amount_taxed_food = fields.Monetary(string="Food Tax", help="Tax for Food",
compute='_compute_amount_untaxed',
tracking=5)
amount_taxed_event = fields.Monetary(string="Event Tax",
help="Tax for Event",
compute='_compute_amount_untaxed',
tracking=5)
amount_taxed_service = fields.Monetary(string="Service Tax",
compute='_compute_amount_untaxed',
help="Tax for Service", tracking=5)
amount_taxed_fleet = fields.Monetary(string="Fleet Tax",
compute='_compute_amount_untaxed',
help="Tax for Fleet", tracking=5)
amount_total_room = fields.Monetary(string="Total Amount for Room",
compute='_compute_amount_untaxed',
help="This is the Total Amount for "
"Room", tracking=5)
amount_total_food = fields.Monetary(string="Total Amount for Food",
compute='_compute_amount_untaxed',
help="This is the Total Amount for "
"Food", tracking=5)
amount_total_event = fields.Monetary(string="Total Amount for Event",
compute='_compute_amount_untaxed',
help="This is the Total Amount for "
"Event", tracking=5)
amount_total_service = fields.Monetary(string="Total Amount for Service",
compute='_compute_amount_untaxed',
help="This is the Total Amount for "
"Service", tracking=5)
amount_total_fleet = fields.Monetary(string="Total Amount for Fleet",
compute='_compute_amount_untaxed',
help="This is the Total Amount for "
"Fleet", tracking=5)
@api.model
def create(self, vals_list):
"""Sequence Generation"""
if vals_list.get('name', 'New') == 'New':
vals_list['name'] = self.env['ir.sequence'].next_by_code(
'room.booking')
return super().create(vals_list)
@api.depends('partner_id')
def _compute_user_id(self):
"""Computes the User id"""
for order in self:
order.user_id = \
order.partner_id.address_get(['invoice'])[
'invoice'] if order.partner_id else False
def _compute_invoice_count(self):
"""Compute the invoice count"""
for record in self:
record.invoice_count = self.env['account.move'].search_count(
[('ref', '=', self.name)])
@api.depends('partner_id')
def _compute_pricelist_id(self):
"""Computes PriceList"""
for order in self:
if not order.partner_id:
order.pricelist_id = False
continue
order = order.with_company(order.company_id)
order.pricelist_id = order.partner_id.property_product_pricelist
@api.depends('room_line_ids.price_subtotal', 'room_line_ids.price_tax',
'room_line_ids.price_total',
'food_order_line_ids.price_subtotal',
'food_order_line_ids.price_tax',
'food_order_line_ids.price_total',
'service_line_ids.price_subtotal',
'service_line_ids.price_tax', 'service_line_ids.price_total',
'vehicle_line_ids.price_subtotal',
'vehicle_line_ids.price_tax', 'vehicle_line_ids.price_total',
'event_line_ids.price_subtotal', 'event_line_ids.price_tax',
'event_line_ids.price_total',
)
def _compute_amount_untaxed(self, flag=False):
"""Compute the total amounts of the Sale Order"""
amount_untaxed_room = 0.0
amount_untaxed_food = 0.0
amount_untaxed_fleet = 0.0
amount_untaxed_event = 0.0
amount_untaxed_service = 0.0
amount_taxed_room = 0.0
amount_taxed_food = 0.0
amount_taxed_fleet = 0.0
amount_taxed_event = 0.0
amount_taxed_service = 0.0
amount_total_room = 0.0
amount_total_food = 0.0
amount_total_fleet = 0.0
amount_total_event = 0.0
amount_total_service = 0.0
room_lines = self.room_line_ids
food_lines = self.food_order_line_ids
service_lines = self.service_line_ids
fleet_lines = self.vehicle_line_ids
event_lines = self.event_line_ids
booking_list = []
account_move_line = self.env['account.move.line'].search_read(
domain=[('ref', '=', self.name),
('display_type', '!=', 'payment_term')],
fields=['name', 'quantity', 'price_unit', 'product_type'], )
for rec in account_move_line:
del rec['id']
if room_lines:
amount_untaxed_room += sum(room_lines.mapped('price_subtotal'))
amount_taxed_room += sum(room_lines.mapped('price_tax'))
amount_total_room += sum(room_lines.mapped('price_total'))
for room in room_lines:
booking_dict = {'name': room.room_id.name,
'quantity': room.uom_qty,
'price_unit': room.price_unit,
'product_type': 'room'}
if booking_dict not in account_move_line:
if not account_move_line:
booking_list.append(booking_dict)
else:
for rec in account_move_line:
if rec['product_type'] == 'room':
if booking_dict['name'] == rec['name'] and \
booking_dict['price_unit'] == rec[
'price_unit'] and booking_dict['quantity'] \
!= rec['quantity']:
booking_list.append(
{'name': room.room_id.name,
"quantity": booking_dict[
'quantity'] - rec[
'quantity'],
"price_unit": room.price_unit,
"product_type": 'room'})
else:
booking_list.append(booking_dict)
if flag:
room.booking_line_visible = True
if food_lines:
for food in food_lines:
booking_list.append(self.create_list(food))
amount_untaxed_food += sum(food_lines.mapped('price_subtotal'))
amount_taxed_food += sum(food_lines.mapped('price_tax'))
amount_total_food += sum(food_lines.mapped('price_total'))
if service_lines:
for service in service_lines:
booking_list.append(self.create_list(service))
amount_untaxed_service += sum(
service_lines.mapped('price_subtotal'))
amount_taxed_service += sum(service_lines.mapped('price_tax'))
amount_total_service += sum(service_lines.mapped('price_total'))
if fleet_lines:
for fleet in fleet_lines:
booking_list.append(self.create_list(fleet))
amount_untaxed_fleet += sum(fleet_lines.mapped('price_subtotal'))
amount_taxed_fleet += sum(fleet_lines.mapped('price_tax'))
amount_total_fleet += sum(fleet_lines.mapped('price_total'))
if event_lines:
for event in event_lines:
booking_list.append(self.create_list(event))
amount_untaxed_event += sum(event_lines.mapped('price_subtotal'))
amount_taxed_event += sum(event_lines.mapped('price_tax'))
amount_total_event += sum(event_lines.mapped('price_total'))
for rec in self:
rec.amount_untaxed = amount_untaxed_food + amount_untaxed_room + \
amount_untaxed_fleet + \
amount_untaxed_event + amount_untaxed_service
rec.amount_untaxed_food = amount_untaxed_food
rec.amount_untaxed_room = amount_untaxed_room
rec.amount_untaxed_fleet = amount_untaxed_fleet
rec.amount_untaxed_event = amount_untaxed_event
rec.amount_untaxed_service = amount_untaxed_service
rec.amount_tax = (amount_taxed_food + amount_taxed_room
+ amount_taxed_fleet
+ amount_taxed_event + amount_taxed_service)
rec.amount_taxed_food = amount_taxed_food
rec.amount_taxed_room = amount_taxed_room
rec.amount_taxed_fleet = amount_taxed_fleet
rec.amount_taxed_event = amount_taxed_event
rec.amount_taxed_service = amount_taxed_service
rec.amount_total = (amount_total_food + amount_total_room
+ amount_total_fleet + amount_total_event
+ amount_total_service)
rec.amount_total_food = amount_total_food
rec.amount_total_room = amount_total_room
rec.amount_total_fleet = amount_total_fleet
rec.amount_total_event = amount_total_event
rec.amount_total_service = amount_total_service
return booking_list
@api.onchange('need_food')
def _onchange_need_food(self):
"""Unlink Food Booking Line if Need Food is false"""
if not self.need_food and self.food_order_line_ids:
for food in self.food_order_line_ids:
food.unlink()
@api.onchange('need_service')
def _onchange_need_service(self):
"""Unlink Service Booking Line if Need Service is False"""
if not self.need_service and self.service_line_ids:
for serv in self.service_line_ids:
serv.unlink()
@api.onchange('need_fleet')
def _onchange_need_fleet(self):
"""Unlink Fleet Booking Line if Need Fleet is False"""
if not self.need_fleet:
if self.vehicle_line_ids:
for fleet in self.vehicle_line_ids:
fleet.unlink()
@api.onchange('need_event')
def _onchange_need_event(self):
"""Unlink Event Booking Line if Need Event is False"""
if not self.need_event:
if self.event_line_ids:
for event in self.event_line_ids:
event.unlink()
@api.onchange('food_order_line_ids', 'room_line_ids',
'service_line_ids', 'vehicle_line_ids', 'event_line_ids')
def _onchange_room_line_ids(self):
"""Invokes the Compute amounts function"""
self._compute_amount_untaxed()
self.invoice_button_visible = False
@api.constrains("room_line_ids")
def _check_duplicate_folio_room_line(self):
"""
This method is used to validate the room_lines.
------------------------------------------------
@param self: object pointer
@return: raise warning depending on the validation
"""
for record in self:
# Create a set of unique ids
ids = set()
for line in record.room_line_ids:
if line.room_id.id in ids:
raise ValidationError(
_(
"""Room Entry Duplicates Found!, """
"""You Cannot Book "%s" Room More Than Once!"""
)
% line.room_id.name
)
ids.add(line.room_id.id)
def create_list(self, line_ids):
"""Returns a Dictionary containing the Booking line Values"""
account_move_line = self.env['account.move.line'].search_read(
domain=[('ref', '=', self.name),
('display_type', '!=', 'payment_term')],
fields=['name', 'quantity', 'price_unit', 'product_type'], )
for rec in account_move_line:
del rec['id']
booking_dict = {}
for line in line_ids:
name = ""
product_type = ""
if line_ids._name == 'food.booking.line':
name = line.food_id.name
product_type = 'food'
elif line_ids._name == 'fleet.booking.line':
name = line.fleet_id.name
product_type = 'fleet'
elif line_ids._name == 'service.booking.line':
name = line.service_id.name
product_type = 'service'
elif line_ids._name == 'event.booking.line':
name = line.event_id.name
product_type = 'event'
booking_dict = {'name': name,
'quantity': line.uom_qty,
'price_unit': line.price_unit,
'product_type': product_type}
return booking_dict
def action_reserve(self):
"""Button Reserve Function"""
if self.state == 'reserved':
message = _("Room Already Reserved.")
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'type': 'warning',
'message': message,
'next': {'type': 'ir.actions.act_window_close'},
}
}
if self.room_line_ids:
for room in self.room_line_ids:
room.room_id.write({
'status': 'reserved',
})
room.room_id.is_room_avail = False
self.write({"state": "reserved"})
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'type': 'success',
'message': "Rooms reserved Successfully!",
'next': {'type': 'ir.actions.act_window_close'},
}
}
raise ValidationError(_("Please Enter Room Details"))
def action_cancel(self):
"""
@param self: object pointer
"""
if self.room_line_ids:
for room in self.room_line_ids:
room.room_id.write({
'status': 'available',
})
room.room_id.is_room_avail = True
self.write({"state": "cancel"})
def action_maintenance_request(self):
"""
Function that handles the maintenance request
"""
room_list = []
for rec in self.room_line_ids.room_id.ids:
room_list.append(rec)
if room_list:
room_id = self.env['hotel.room'].search([
('id', 'in', room_list)])
self.env['maintenance.request'].sudo().create({
'date': fields.Date.today(),
'state': 'draft',
'type': 'room',
'room_maintenance_ids': room_id.ids,
})
self.maintenance_request_sent = True
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'type': 'success',
'message': "Maintenance Request Sent Successfully",
'next': {'type': 'ir.actions.act_window_close'},
}
}
raise ValidationError(_("Please Enter Room Details"))
def action_done(self):
"""Button action_confirm function"""
for rec in self.env['account.move'].search(
[('ref', '=', self.name)]):
if rec.payment_state != 'not_paid':
self.write({"state": "done"})
self.is_checkin = False
if self.room_line_ids:
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'type': 'success',
'message': "Booking Checked Out Successfully!",
'next': {'type': 'ir.actions.act_window_close'},
}
}
raise ValidationError(_('Your Invoice is Due for Payment.'))
self.write({"state": "done"})
def action_checkout(self):
"""Button action_heck_out function"""
self.write({"state": "check_out"})
for room in self.room_line_ids:
room.room_id.write({
'status': 'available',
'is_room_avail': True
})
room.write({'checkout_date': datetime.today()})
def action_invoice(self):
"""Method for creating invoice"""
if not self.room_line_ids:
raise ValidationError(_("Please Enter Room Details"))
booking_list = self._compute_amount_untaxed(True)
if booking_list:
account_move = self.env["account.move"].create([{
'move_type': 'out_invoice',
'invoice_date': fields.Date.today(),
'partner_id': self.partner_id.id,
'ref': self.name,
}])
for rec in booking_list:
account_move.invoice_line_ids.create([{
'name': rec['name'],
'quantity': rec['quantity'],
'price_unit': rec['price_unit'],
'move_id': account_move.id,
'price_subtotal': rec['quantity'] * rec['price_unit'],
'product_type': rec['product_type'],
}])
self.write({'invoice_status': "invoiced"})
self.invoice_button_visible = True
return {
'type': 'ir.actions.act_window',
'name': 'Invoices',
'view_mode': 'form',
'view_type': 'form',
'res_model': 'account.move',
'view_id': self.env.ref('account.view_move_form').id,
'res_id': account_move.id,
'context': "{'create': False}"
}
def action_view_invoices(self):
"""Method for Returning invoice View"""
return {
'type': 'ir.actions.act_window',
'name': 'Invoices',
'view_mode': 'tree,form',
'view_type': 'tree,form',
'res_model': 'account.move',
'domain': [('ref', '=', self.name)],
'context': "{'create': False}"
}
def action_checkin(self):
"""
@param self: object pointer
"""
if not self.room_line_ids:
raise ValidationError(_("Please Enter Room Details"))
else:
for room in self.room_line_ids:
room.room_id.write({
'status': 'occupied',
})
room.room_id.is_room_avail = False
self.write({"state": "check_in"})
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'type': 'success',
'message': "Booking Checked In Successfully!",
'next': {'type': 'ir.actions.act_window_close'},
}
}
def get_details(self):
""" Returns different counts for displaying in dashboard"""
today = datetime.today()
tz_name = self.env.user.tz
today_utc = pytz.timezone('UTC').localize(today,
is_dst=False)
context_today = today_utc.astimezone(pytz.timezone(tz_name))
total_room = self.env['hotel.room'].search_count([])
check_in = self.env['room.booking'].search_count(
[('state', '=', 'check_in')])
available_room = self.env['hotel.room'].search(
[('status', '=', 'available')])
reservation = self.env['room.booking'].search_count(
[('state', '=', 'reserved')])
check_outs = self.env['room.booking'].search([])
check_out = 0
staff = 0
for rec in check_outs:
for room in rec.room_line_ids:
if room.checkout_date.date() == context_today.date():
check_out += 1
"""staff"""
staff = self.env['res.users'].search_count(
[('groups_id', 'in',
[self.env.ref('hotel_management_odoo.hotel_group_admin').id,
self.env.ref(
'hotel_management_odoo.cleaning_team_group_head').id,
self.env.ref(
'hotel_management_odoo.cleaning_team_group_user').id,
self.env.ref(
'hotel_management_odoo.hotel_group_reception').id,
self.env.ref(
'hotel_management_odoo.maintenance_team_group_leader').id,
self.env.ref(
'hotel_management_odoo.maintenance_team_group_user').id
])])
total_vehicle = self.env['fleet.vehicle.model'].search_count([])
available_vehicle = total_vehicle - self.env[
'fleet.booking.line'].search_count(
[('state', '=', 'check_in')])
total_event = self.env['event.event'].search_count([])
pending_event = self.env['event.event'].search([])
pending_events = 0
today_events = 0
for pending in pending_event:
if pending.date_end >= fields.datetime.now():
pending_events += 1
if pending.date_end.date() == fields.date.today():
today_events += 1
food_items = self.env['lunch.product'].search_count([])
food_order = len(self.env['food.booking.line'].search([]).filtered(
lambda r: r.booking_id.state not in ['check_out', 'cancel',
'done']))
"""total Revenue"""
total_revenue = 0
today_revenue = 0
pending_payment = 0
for rec in self.env['account.move'].search(
[('payment_state', '=', 'paid')]):
if rec.ref:
if 'BOOKING' in rec.ref:
total_revenue += rec.amount_total
if rec.date == fields.date.today():
today_revenue += rec.amount_total
for rec in self.env['account.move'].search(
[('payment_state', '=', 'not_paid')]):
if rec.ref:
if 'BOOKING' in rec.ref:
pending_payment += rec.amount_total
return {
'total_room': total_room,
'available_room': len(available_room),
'staff': staff,
'check_in': check_in,
'reservation': reservation,
'check_out': check_out,
'total_vehicle': total_vehicle,
'available_vehicle': available_vehicle,
'total_event': total_event,
'today_events': today_events,
'pending_events': pending_events,
'food_items': food_items,
'food_order': food_order,
'total_revenue': round(total_revenue, 2),
'today_revenue': round(today_revenue, 2),
'pending_payment': round(pending_payment, 2),
'currency_symbol': self.env.user.company_id.currency_id.symbol,
'currency_position': self.env.user.company_id.currency_id.position
}

149
hotel_management_odoo/models/room_booking_line.py

@ -0,0 +1,149 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import api, fields, models, tools, _
from odoo.exceptions import ValidationError
class RoomBookingLine(models.Model):
"""Model that handles the room booking form"""
_name = "room.booking.line"
_description = "Hotel Folio Line"
_rec_name = 'room_id'
@tools.ormcache()
def _set_default_uom_id(self):
return self.env.ref('uom.product_uom_day')
booking_id = fields.Many2one("room.booking", string="Booking",
help="Indicates the Room",
ondelete="cascade")
checkin_date = fields.Datetime(string="Check In",
help="You can choose the date,"
" Otherwise sets to current Date",
required=True)
checkout_date = fields.Datetime(string="Check Out",
help="You can choose the date,"
" Otherwise sets to current Date",
required=True)
room_id = fields.Many2one('hotel.room', string="Room",
domain=[('status', '=', 'available')],
help="Indicates the Room",
required=True)
uom_qty = fields.Float(string="Duration",
help="The quantity converted into the UoM used by "
"the product", readonly=True)
uom_id = fields.Many2one('uom.uom',
default=_set_default_uom_id,
string="Unit of Measure",
help="This will set the unit of measure used",
readonly=True)
price_unit = fields.Float(related='room_id.list_price', string='Rent',
digits='Product Price',
help="The rent price of the selected room.")
tax_ids = fields.Many2many('account.tax',
'hotel_room_order_line_taxes_rel',
'room_id', 'tax_id',
related='room_id.taxes_ids',
string='Taxes',
help="Default taxes used when selling the room.",
domain=[('type_tax_use', '=', 'sale')])
currency_id = fields.Many2one(string='Currency',
related='booking_id.pricelist_id.currency_id',
help='The currency used')
price_subtotal = fields.Float(
string="Subtotal",
compute='_compute_price_subtotal', help="Total Price excluding Tax",
store=True)
price_tax = fields.Float(
string="Total Tax",
compute='_compute_price_subtotal', help="Tax Amount",
store=True)
price_total = fields.Float(
string="Total",
compute='_compute_price_subtotal', help="Total Price including Tax",
store=True)
state = fields.Selection(
related='booking_id.state',
string="Order Status", help=" Status of the Order",
copy=False, precompute=True)
booking_line_visible = fields.Boolean(default=False,
string="Booking Line Visible",
help="If True, then Booking Line will"
" be visible")
@api.onchange("checkin_date", "checkout_date")
def _onchange_checkin_date(self):
"""
When you change checkin_date or checkout_date it will check
and update the qty of hotel service line
-----------------------------------------------------------------
@param self: object pointer
"""
if self.checkout_date < self.checkin_date:
raise ValidationError(
_("Checkout must be greater or equal checkin date"))
if self.checkin_date and self.checkout_date:
diffdate = self.checkout_date - self.checkin_date
qty = diffdate.days
if diffdate.total_seconds() > 0:
qty = qty + 1
self.uom_qty = qty
@api.depends('uom_qty', 'price_unit', 'tax_ids')
def _compute_price_subtotal(self):
"""
Compute the amounts of the room booking line.
"""
for line in self:
tax_results = self.env['account.tax']._compute_taxes(
[line._convert_to_tax_base_line_dict()])
totals = list(tax_results['totals'].values())[0]
amount_untaxed = totals['amount_untaxed']
amount_tax = totals['amount_tax']
line.update({
'price_subtotal': amount_untaxed,
'price_tax': amount_tax,
'price_total': amount_untaxed + amount_tax,
})
if self.env.context.get('import_file',
False) and not self.env.user. \
user_has_groups('account.group_account_manager'):
line.tax_id.invalidate_recordset(
['invoice_repartition_line_ids'])
def _convert_to_tax_base_line_dict(self):
""" Convert the current record to a dictionary in order to use the
generic taxes computation method
defined on account.tax.
:return: A python dictionary.
"""
self.ensure_one()
return self.env['account.tax']._convert_to_tax_base_line_dict(
self,
partner=self.booking_id.partner_id,
currency=self.currency_id,
taxes=self.tax_ids,
price_unit=self.price_unit,
quantity=self.uom_qty,
price_subtotal=self.price_subtotal,
)

121
hotel_management_odoo/models/service_booking_line.py

@ -0,0 +1,121 @@
# -*- coding: utf-8 -*-
################################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Unnimaya C O (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU LESSER
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
#
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
from odoo import api, fields, models, tools
class ServiceBookingLine(models.Model):
"""Model that handles the service booking form"""
_name = "service.booking.line"
_description = "Hotel service Line"
@tools.ormcache()
def _get_default_uom_id(self):
"""Returns default product uom unit"""
return self.env.ref('uom.product_uom_unit')
booking_id = fields.Many2one("room.booking", string="Booking",
help="Indicates the Room Booking",
ondelete="cascade")
service_id = fields.Many2one('hotel.service', string="Service",
help="Indicates the Service")
description = fields.Char(string='Description', related='service_id.name',
help="Description of the Service")
uom_qty = fields.Float(string="Qty", default=1.0,
help="The quantity converted into the UoM used by "
"the product")
uom_id = fields.Many2one('uom.uom', readonly=True,
string="Unit of Measure",
help="This will set the unit of measure used",
default=_get_default_uom_id)
price_unit = fields.Float(string='Price', related='service_id.unit_price',
digits='Product Price',
help="The price of the selected service.")
tax_ids = fields.Many2many('account.tax',
'hotel_service_order_line_taxes_rel',
'service_id', 'tax_id',
related='service_id.taxes_ids', string='Taxes',
help="Default taxes used when selling the "
"services.",
domain=[('type_tax_use', '=', 'sale')])
currency_id = fields.Many2one(string='Currency',
related='booking_id.pricelist_id.currency_id',
help='The currency used')
price_subtotal = fields.Float(
string="Subtotal",
compute='_compute_price_subtotal', help="Total Price Excluding Tax",
store=True)
price_tax = fields.Float(
string="Total Tax",
compute='_compute_price_subtotal', help="Tax Amount",
store=True)
price_total = fields.Float(
string="Total",
compute='_compute_price_subtotal', help="Total Price Including Tax",
store=True)
state = fields.Selection(
related='booking_id.state',
string="Order Status", help=" Status of the Order",
copy=False)
booking_line_visible = fields.Boolean(default=False,
string="Booking Line Visible",
help="If true, Booking line will be"
" visible")
@api.depends('uom_qty', 'price_unit', 'tax_ids')
def _compute_price_subtotal(self):
"""
Compute the amounts of the room booking line.
"""
for line in self:
tax_results = self.env['account.tax']._compute_taxes(
[line._convert_to_tax_base_line_dict()])
totals = list(tax_results['totals'].values())[0]
amount_untaxed = totals['amount_untaxed']
amount_tax = totals['amount_tax']
line.update({
'price_subtotal': amount_untaxed,
'price_tax': amount_tax,
'price_total': amount_untaxed + amount_tax,
})
if self.env.context.get('import_file',
False) and not self.env.user. \
user_has_groups('account.group_account_manager'):
line.tax_id.invalidate_recordset(
['invoice_repartition_line_ids'])
def _convert_to_tax_base_line_dict(self):
""" Convert the current record to a dictionary in order to use the
generic taxes computation method
defined on account.tax.
:return: A python dictionary.
"""
self.ensure_one()
return self.env['account.tax']._convert_to_tax_base_line_dict(
self,
partner=self.booking_id.partner_id,
currency=self.currency_id,
taxes=self.tax_ids,
price_unit=self.price_unit,
quantity=self.uom_qty,
price_subtotal=self.price_subtotal,
)

60
hotel_management_odoo/report/room_booking_reports.xml

@ -0,0 +1,60 @@
<?xml version = "1.0" encoding = "UTF-8" ?>
<odoo>
<!-- Room booking report action-->
<record id="action_report_room_booking" model="ir.actions.report">
<field name="name">Room Booking Order</field>
<field name="model">room.booking</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">hotel_management_odoo.report_room_booking</field>
<field name="report_file">hotel_management_odoo.report_room_booking</field>
<field name="binding_model_id" ref="model_room_booking"/>
<field name="binding_type">report</field>
</record>
<!-- Room booking template-->
<template id="report_room_booking">
<t t-call="web.html_container">
<t t-call="web.external_layout">
<div class="page">
<h2>Room Booking</h2>
<br/>
<table class="table">
<thead>
<tr>
<th>Sl No.</th>
<th>Guest Name</th>
<th>Room No.</th>
<th>Check-In</th>
<th>Check-Out</th>
<th>Reference No.</th>
</tr>
</thead>
<t t-set="i" t-value="0"/>
<t t-foreach="booking" t-as="line">
<t t-set="i" t-value="i+1"/>
<tr>
<td>
<t t-esc="i"/>
</td>
<td>
<t t-esc="line['partner_id']"/>
</td>
<td>
<t t-esc="line['room']"/>
</td>
<td>
<t t-esc="line['checkin_date']"/>
</td>
<td>
<t t-esc="line['checkin_date']"/>
</td>
<td>
<t t-esc="line['name']"/>
</td>
</tr>
</t>
</table>
</div>
</t>
</t>
</template>
</odoo>

61
hotel_management_odoo/report/sale_order_reports.xml

@ -0,0 +1,61 @@
<?xml version = "1.0" encoding = "UTF-8" ?>
<odoo>
<!-- Sale order report action-->
<record id="action_report_sale_order" model="ir.actions.report">
<field name="name">Sale Order</field>
<field name="model">room.booking</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">hotel_management_odoo.report_sale_order</field>
<field name="report_file">hotel_management_odoo.report_sale_order</field>
<field name="binding_model_id" ref="model_room_booking"/>
<field name="binding_type">report</field>
</record>
<!-- Sale order report template-->
<template id="report_sale_order">
<t t-call="web.html_container">
<t t-call="web.external_layout">
<div class="page">
<div class="oe_structure"/>
<h2>Sale Order</h2>
<br/>
<table class="table">
<thead>
<tr>
<th>Sl No.</th>
<th>Guest Name</th>
<th>Check-In</th>
<th>Check-Out</th>
<th>Reference No.</th>
<th>Amount Total</th>
</tr>
</thead>
<t t-set="i" t-value="0"/>
<t t-foreach="booking" t-as="line">
<t t-set="i" t-value="i+1"/>
<tr>
<td>
<t t-esc="i"/>
</td>
<td>
<t t-esc="line['partner_id']"/>
</td>
<td>
<t t-esc="line['checkin_date']"/>
</td>
<td>
<t t-esc="line['checkin_date']"/>
</td>
<td>
<t t-esc="line['name']"/>
</td>
<td>
<t t-esc="line['amount_total']"/>
</td>
</tr>
</t>
</table>
</div>
</t>
</t>
</template>
</odoo>

53
hotel_management_odoo/security/hotel_management_odoo_groups.xml

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- Hotel Access Groups-->
<record id="module_category_hotel_management" model="ir.module.category">
<field name="name">Hotel Management</field>
<field name="description">Hotel Access Groups</field>
<field name="sequence">20</field>
</record>
<!-- Maintenance Team User groups-->
<record id="maintenance_team_group_user" model="res.groups">
<field name="name">Maintenance Team User</field>
<field name="category_id"
ref="hotel_management_odoo.module_category_hotel_management"/>
</record>
<!-- Maintenance Team Leader group-->
<record id="maintenance_team_group_leader" model="res.groups">
<field name="name">Maintenance Team Leader</field>
<field name="category_id"
ref="hotel_management_odoo.module_category_hotel_management"/>
<field name="implied_ids"
eval="[(4, ref('hotel_management_odoo.maintenance_team_group_user'))]"/>
</record>
<!-- Reception groups-->
<record id="hotel_group_reception" model="res.groups">
<field name="name">Receptionist</field>
<field name="category_id"
ref="hotel_management_odoo.module_category_hotel_management"/>
</record>
<!-- Cleaning Team User group-->
<record id="cleaning_team_group_user" model="res.groups">
<field name="name">Cleaning Team User</field>
<field name="category_id"
ref="hotel_management_odoo.module_category_hotel_management"/>
</record>
<!-- Cleaning Team Head group-->
<record id="cleaning_team_group_head" model="res.groups">
<field name="name">Cleaning Team Head</field>
<field name="category_id"
ref="hotel_management_odoo.module_category_hotel_management"/>
<field name="implied_ids"
eval="[(4, ref('hotel_management_odoo.cleaning_team_group_user'))]"/>
</record>
<!--Hotel Admin group-->
<record id="hotel_group_admin" model="res.groups">
<field name="name">Admin</field>
<field name="category_id"
ref="hotel_management_odoo.module_category_hotel_management"/>
<field name="implied_ids"
eval="[(4, ref('hotel_management_odoo.maintenance_team_group_leader')),
(4, ref('hotel_management_odoo.cleaning_team_group_head')),
(4, ref('hotel_group_reception')), ]"/>
</record>
</odoo>

67
hotel_management_odoo/security/hotel_management_odoo_security.xml

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<!-- MAINTENANCE RECORD RULE-->
<record id="maintenance_request_rule_leader"
model="ir.rule">
<field name="name">Record Rule for Maintenance team leader</field>
<field ref="model_maintenance_request" name="model_id"/>
<field name="groups"
eval="[(4, ref('hotel_management_odoo.maintenance_team_group_leader'))]"/>
<field name="domain_force">[('team_head_id', '=', user.id)]</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_unlink" eval="True"/>
</record>
<!-- Record Rule for Maintenance User-->
<record id="maintenance_request_rule_user"
model="ir.rule">
<field name="name">Record Rule for Maintenance User</field>
<field ref="model_maintenance_request" name="model_id"/>
<field name="groups"
eval="[(4, ref('hotel_management_odoo.maintenance_team_group_user'))]"/>
<field name="domain_force">[('assigned_user_id', '=', user.id)]</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_unlink" eval="True"/>
</record>
<!-- Record Rule for hotel Admin-->
<record id="maintenance_request_rule_admin"
model="ir.rule">
<field name="name">Record Rule for hotel Admin</field>
<field ref="model_maintenance_request" name="model_id"/>
<field name="groups"
eval="[(4, ref('hotel_management_odoo.hotel_group_admin'))]"/>
<field name="domain_force">[(1,'=',1)]</field>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_unlink" eval="True"/>
</record>
<!-- CLEANING HEAD RECORD RULE-->
<record id="cleaning_request_rule_head" model="ir.rule">
<field name="name">Cleaning Head Record Rule</field>
<field name="model_id" ref="model_cleaning_request"/>
<field name="groups"
eval="[(4, ref('hotel_management_odoo.cleaning_team_group_head'))]"/>
<field name="domain_force">[('team_id.team_head_id.id', '=', user.id)]
</field>
</record>
<!-- CLEANING USER RECORD RULE-->
<record id="cleaning_request_rule_user" model="ir.rule">
<field name="name">Cleaning User Record Rule</field>
<field name="model_id" ref="model_cleaning_request"/>
<field name="groups"
eval="[(4, ref('hotel_management_odoo.cleaning_team_group_user'))]"/>
<field name="domain_force">[('assigned_id.id', '=', user.id)]</field>
</record>
<!-- CLEANING ADMIN RECORD RULE-->
<record id="cleaning_request_rule_admin" model="ir.rule">
<field name="name">Cleaning Admin Record Rule</field>
<field name="model_id" ref="model_cleaning_request"/>
<field name="groups"
eval="[(4, ref('hotel_management_odoo.hotel_group_admin'))]"/>
<field name="domain_force">[(1, '=', 1)]</field>
</record>
</odoo>

25
hotel_management_odoo/security/ir.model.access.csv

@ -0,0 +1,25 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_hotel_amenity_user,access.hotel.amenity.user,model_hotel_amenity,base.group_user,1,1,1,1
access_hotel_service_user,access.hotel.service.user,model_hotel_service,base.group_user,1,1,1,1
access_hotel_floor_user,access.hotel.floor.user,model_hotel_floor,base.group_user,1,1,1,1
access_hotel_room_user,access.hotel.room.user,model_hotel_room,base.group_user,1,1,1,1
access_room_booking_user,access.room.booking.user,model_room_booking,base.group_user,1,1,1,1
access_room_booking_line_user,access.room.booking.line.user,model_room_booking_line,base.group_user,1,1,1,1
access_food_booking_line_user,access.food.booking.line.user,model_food_booking_line,base.group_user,1,1,1,1
access_service_booking_line_user,access.service.booking.line.user,model_service_booking_line,base.group_user,1,1,1,1
access_fleet_booking_line_user,access.fleet.booking.line.user,model_fleet_booking_line,base.group_user,1,1,1,1
access_event_booking_line_user,access.event.booking.line.user,model_event_booking_line,base.group_user,1,1,1,1
access_room_booking_detail_user,access.room.booking.detail.user,model_room_booking_detail,base.group_user,1,1,1,1
access_sale_order_detail_user,access.sale.order.detail.user,model_sale_order_detail,base.group_user,1,1,1,1
access_maintenance_team_maintenance_team_group_leader,access.maintenance.team.maintenance_team_group_leader,model_maintenance_team,hotel_management_odoo.maintenance_team_group_leader,1,1,1,1
access_maintenance_request_hotel_group_admin,access.maintenance.request.hotel_group_admin,model_maintenance_request,hotel_management_odoo.hotel_group_admin,1,1,1,1
access_maintenance_request_maintenance_team_group_leader,access.maintenance.request.maintenance_team_group_leader,model_maintenance_request,hotel_management_odoo.maintenance_team_group_leader,1,1,1,1
access_maintenance_request_maintenance_team_group_user,access.maintenance.request.maintenance_team_group_user,model_maintenance_request,hotel_management_odoo.maintenance_team_group_user,1,1,1,1
access_cleaning_team_cleaning_team_group_head,access.cleaning.team.cleaning_team_group_head,model_cleaning_team,hotel_management_odoo.cleaning_team_group_head,1,1,1,1
access_cleaning_request_hotel_group_admin,access.cleaning.request.hotel_group_admin,model_cleaning_request,hotel_management_odoo.hotel_group_admin,1,1,1,1
access_cleaning_request_cleaning_team_group_head,access.cleaning.request.cleaning_team_group_head,model_cleaning_request,hotel_management_odoo.cleaning_team_group_head,1,1,1,1
access_cleaning_request_cleaning_team_group_user,access.cleaning.request.cleaning_team_group_user,model_cleaning_request,hotel_management_odoo.cleaning_team_group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_hotel_amenity_user access.hotel.amenity.user model_hotel_amenity base.group_user 1 1 1 1
3 access_hotel_service_user access.hotel.service.user model_hotel_service base.group_user 1 1 1 1
4 access_hotel_floor_user access.hotel.floor.user model_hotel_floor base.group_user 1 1 1 1
5 access_hotel_room_user access.hotel.room.user model_hotel_room base.group_user 1 1 1 1
6 access_room_booking_user access.room.booking.user model_room_booking base.group_user 1 1 1 1
7 access_room_booking_line_user access.room.booking.line.user model_room_booking_line base.group_user 1 1 1 1
8 access_food_booking_line_user access.food.booking.line.user model_food_booking_line base.group_user 1 1 1 1
9 access_service_booking_line_user access.service.booking.line.user model_service_booking_line base.group_user 1 1 1 1
10 access_fleet_booking_line_user access.fleet.booking.line.user model_fleet_booking_line base.group_user 1 1 1 1
11 access_event_booking_line_user access.event.booking.line.user model_event_booking_line base.group_user 1 1 1 1
12 access_room_booking_detail_user access.room.booking.detail.user model_room_booking_detail base.group_user 1 1 1 1
13 access_sale_order_detail_user access.sale.order.detail.user model_sale_order_detail base.group_user 1 1 1 1
14 access_maintenance_team_maintenance_team_group_leader access.maintenance.team.maintenance_team_group_leader model_maintenance_team hotel_management_odoo.maintenance_team_group_leader 1 1 1 1
15 access_maintenance_request_hotel_group_admin access.maintenance.request.hotel_group_admin model_maintenance_request hotel_management_odoo.hotel_group_admin 1 1 1 1
16 access_maintenance_request_maintenance_team_group_leader access.maintenance.request.maintenance_team_group_leader model_maintenance_request hotel_management_odoo.maintenance_team_group_leader 1 1 1 1
17 access_maintenance_request_maintenance_team_group_user access.maintenance.request.maintenance_team_group_user model_maintenance_request hotel_management_odoo.maintenance_team_group_user 1 1 1 1
18 access_cleaning_team_cleaning_team_group_head access.cleaning.team.cleaning_team_group_head model_cleaning_team hotel_management_odoo.cleaning_team_group_head 1 1 1 1
19 access_cleaning_request_hotel_group_admin access.cleaning.request.hotel_group_admin model_cleaning_request hotel_management_odoo.hotel_group_admin 1 1 1 1
20 access_cleaning_request_cleaning_team_group_head access.cleaning.request.cleaning_team_group_head model_cleaning_request hotel_management_odoo.cleaning_team_group_head 1 1 1 1
21 access_cleaning_request_cleaning_team_group_user access.cleaning.request.cleaning_team_group_user model_cleaning_request hotel_management_odoo.cleaning_team_group_user 1 1 1 1

BIN
hotel_management_odoo/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
hotel_management_odoo/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
hotel_management_odoo/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
hotel_management_odoo/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
hotel_management_odoo/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
hotel_management_odoo/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
hotel_management_odoo/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
hotel_management_odoo/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
hotel_management_odoo/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
hotel_management_odoo/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
hotel_management_odoo/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
hotel_management_odoo/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
hotel_management_odoo/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
hotel_management_odoo/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
hotel_management_odoo/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
hotel_management_odoo/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
hotel_management_odoo/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
hotel_management_odoo/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
hotel_management_odoo/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
hotel_management_odoo/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
hotel_management_odoo/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
hotel_management_odoo/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
hotel_management_odoo/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
hotel_management_odoo/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
hotel_management_odoo/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
hotel_management_odoo/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
hotel_management_odoo/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
hotel_management_odoo/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
hotel_management_odoo/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
hotel_management_odoo/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
hotel_management_odoo/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
hotel_management_odoo/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
hotel_management_odoo/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
hotel_management_odoo/static/description/assets/modules/l1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
hotel_management_odoo/static/description/assets/modules/l2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
hotel_management_odoo/static/description/assets/modules/l3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
hotel_management_odoo/static/description/assets/modules/l4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
hotel_management_odoo/static/description/assets/modules/l5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
hotel_management_odoo/static/description/assets/modules/l6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot13.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot14.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot15.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot24.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot27.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshot_group.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/Screenshots.zip

Binary file not shown.

BIN
hotel_management_odoo/static/description/assets/screenshots/accept.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/admin.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/adv_invoice.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/advance.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/assign_clean.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/assign_team.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/checkin.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/checkout.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/checkout_invoice.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/clean.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/clean_complete.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/clean_head.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/clean_req.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/complete.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/create_clean.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/create_req.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
hotel_management_odoo/static/description/assets/screenshots/done.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

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

Loading…
Cancel
Save