diff --git a/meeting_room_booking/__init__.py b/meeting_room_booking/__init__.py
new file mode 100644
index 0000000000..bd269b77eb
--- /dev/null
+++ b/meeting_room_booking/__init__.py
@@ -0,0 +1,3 @@
+from . import models
+from . import views
+from . import security
diff --git a/meeting_room_booking/__manifest__.py b/meeting_room_booking/__manifest__.py
new file mode 100644
index 0000000000..109394736d
--- /dev/null
+++ b/meeting_room_booking/__manifest__.py
@@ -0,0 +1,20 @@
+{
+ 'name': 'Meeting Room Booking',
+ 'version': '18.0.1.0.0',
+ 'summary': 'App to manage and book meeting rooms',
+ 'description': 'Manage meeting room booking',
+ 'author': 'imheart',
+ 'website': 'www.example-test-test.com',
+ 'category': 'Productivity',
+ 'license': 'LGPL-3',
+ 'depends': ['base',],
+ 'data': [
+ 'security/ir.model.access.csv',
+ 'views/room_views.xml',
+ 'views/booking_views.xml',
+ 'views/actions.xml',
+ 'views/menus.xml',
+ ],
+ 'installable': True,
+ 'application': True,
+}
\ No newline at end of file
diff --git a/meeting_room_booking/models/__init__.py b/meeting_room_booking/models/__init__.py
new file mode 100644
index 0000000000..9cb9680561
--- /dev/null
+++ b/meeting_room_booking/models/__init__.py
@@ -0,0 +1,2 @@
+from . import room
+from . import booking
\ No newline at end of file
diff --git a/meeting_room_booking/models/booking.py b/meeting_room_booking/models/booking.py
new file mode 100644
index 0000000000..00e3f212be
--- /dev/null
+++ b/meeting_room_booking/models/booking.py
@@ -0,0 +1,31 @@
+from odoo import api, fields, models
+from odoo.exceptions import ValidationError
+
+"""
+This module handles meeting room booking functionalities.
+"""
+
+class MeetingRoomBooking(models.Model):
+ _name = 'meeting.booking'
+ _description = 'Meeting Room Booking'
+
+ name = fields.Char(string='Booking Reference', required=True, default='New')
+ room_id = fields.Many2one(comodel_name='meeting.room', string='Room', required=True)
+ start_time = fields.Datetime(string='Start Time',required=True)
+ end_time = fields.Datetime(string='End Time', required=True)
+ booked_by = fields.Many2one(comodel_name='res.users', string='Booked by', default=lambda self: self.env.user)
+
+ @api.constrains('start_time', 'end_time', 'room_id')
+ def _check_double_booking(self):
+ for booking in self:
+ if booking.start_time >= booking.end_time:
+ raise ValidationError('Start Time must be less than End Time.')
+
+ overlapping_bookings = self.search([
+ ('room_id', '=', booking.room_id.id),
+ ('id', '!=', booking.id),
+ ('start_time', '<', booking.end_time),
+ ('end_time', '>', booking.start_time)
+ ])
+ if overlapping_bookings:
+ raise ValidationError('The selected room is already booked for the specified time.')
\ No newline at end of file
diff --git a/meeting_room_booking/models/room.py b/meeting_room_booking/models/room.py
new file mode 100644
index 0000000000..3c6399df29
--- /dev/null
+++ b/meeting_room_booking/models/room.py
@@ -0,0 +1,12 @@
+from odoo import models, fields
+
+class MeetingRoom(models.Model):
+ _name = 'meeting.room'
+ _description = 'Meeting Room'
+
+
+ name = fields.Char(string='Room Name', required=True)
+ capacity = fields.Integer(string='Capacity', required=True)
+ location = fields.Char(string='Location', required=True)
+ availability = fields.Boolean(string='Available', default=True)
+
diff --git a/meeting_room_booking/security/ir.model.access.csv b/meeting_room_booking/security/ir.model.access.csv
new file mode 100644
index 0000000000..b856471fd9
--- /dev/null
+++ b/meeting_room_booking/security/ir.model.access.csv
@@ -0,0 +1,3 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_meeting_room,access_meeting_room,model_meeting_room,base.group_user,1,1,1,1
+access_meeting_booking,access_meeting_booking,model_meeting_booking,base.group_user,1,1,1,1
\ No newline at end of file
diff --git a/meeting_room_booking/static/description/icon.png b/meeting_room_booking/static/description/icon.png
new file mode 100644
index 0000000000..213e8d62fd
Binary files /dev/null and b/meeting_room_booking/static/description/icon.png differ
diff --git a/meeting_room_booking/views/actions.xml b/meeting_room_booking/views/actions.xml
new file mode 100644
index 0000000000..b03108bd2e
--- /dev/null
+++ b/meeting_room_booking/views/actions.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Rooms
+ meeting.room
+ list,form
+
+
+
+ Bookings
+ meeting.booking
+ list,form
+
+
+
diff --git a/meeting_room_booking/views/booking_views.xml b/meeting_room_booking/views/booking_views.xml
new file mode 100644
index 0000000000..9f42afb9aa
--- /dev/null
+++ b/meeting_room_booking/views/booking_views.xml
@@ -0,0 +1,36 @@
+
+
+
+
+ meeting.booking.tree
+ meeting.booking
+
+
+
+
+
+
+
+
+
+
+
+
+ meeting.booking.form
+ meeting.booking
+
+
+
+
+
+
diff --git a/meeting_room_booking/views/menus.xml b/meeting_room_booking/views/menus.xml
new file mode 100644
index 0000000000..6f62d6ea02
--- /dev/null
+++ b/meeting_room_booking/views/menus.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/meeting_room_booking/views/room_views.xml b/meeting_room_booking/views/room_views.xml
new file mode 100644
index 0000000000..9a2485cba7
--- /dev/null
+++ b/meeting_room_booking/views/room_views.xml
@@ -0,0 +1,35 @@
+
+
+
+
+ meeting.room.tree
+ meeting.room
+
+
+
+
+
+
+
+
+
+
+
+ meeting.room.form
+ meeting.room
+
+
+
+
+
+
+