diff --git a/event_service_base/__init__.py b/event_service_base/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/event_service_base/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/event_service_base/__manifest__.py b/event_service_base/__manifest__.py new file mode 100644 index 0000000..e94cf80 --- /dev/null +++ b/event_service_base/__manifest__.py @@ -0,0 +1,12 @@ +{ + 'name': 'Event Service Base', + 'summary': 'Foundational business logic for service event management', + 'description': """ +Provides the foundational models and business logic for +service events and bookings, intended to be extended +by other modules. +""", + 'version': '1.0', + 'author': 'Dhruv', + 'license': 'LGPL-3', +} diff --git a/event_service_base/models/__init__.py b/event_service_base/models/__init__.py new file mode 100644 index 0000000..8102ebb --- /dev/null +++ b/event_service_base/models/__init__.py @@ -0,0 +1,2 @@ +from . import event_service +from . import event_service_registration \ No newline at end of file diff --git a/event_service_base/models/event_service.py b/event_service_base/models/event_service.py new file mode 100644 index 0000000..4ca1276 --- /dev/null +++ b/event_service_base/models/event_service.py @@ -0,0 +1,29 @@ +from community.odoo import fields, models + + +class EventService(models.Model): + _name = "event.service" + _description = "Event Service" + + name = fields.Char(string="Name", required=True, index=True) + description = fields.HTML(string="Description") + price = fields.Float(string="Price", default=0.0) + active = fields.Boolean(string="Active", default=True) + category_id = fields.Many2one("event.service.category", string="Category", ondelete="restrict") + tag_ids = fields.Many2many("event.service.tag", string="Tags") + company_id = fields.Many2one("res.company", default=lambda self: self.env.company) + booking_ids = fields.One2many("event.service.registration", "service_id", string="Bookings") + +class EventServiceCategory(models.Model): + _name = "event.service.category" + _description = "Event Service Category" + + name = fields.Char(required=True) + active = fields.Boolean(default=True) + +class EventServiceTag(models.Model): + _name = "event.service.tag" + _description = "Event Service Tag" + + name = fields.Char(required=True) + color = fields.Integer() diff --git a/event_service_base/models/event_service_registration.py b/event_service_base/models/event_service_registration.py new file mode 100644 index 0000000..caad343 --- /dev/null +++ b/event_service_base/models/event_service_registration.py @@ -0,0 +1,69 @@ +from odoo import api, fields, models +from odoo.exceptions import ValidationError + + +class EventServiceRegistration(models.Model): + _name = "event.service.registration" + _description = "Event Service Registration" + + name = fields.Char(string="Event Name", readonly=True, copy=False) + quantity = fields.Integer(string="Number of Attendees", default=1) + currency_id = fields.Many2one("res.currency", related="company_id.currency_id", readonly=True) + amount = fields.Monetary(string="Total Amount", compute="_compute_amount", store=True, currency_field="currency_id") + booking_date = fields.Datetime(string="Booking Date", default=fields.Datetime.now, required=True) + state = fields.Selection([ + ('draft', 'Draft'), + ('confirmed', 'Confirmed'), + ('cancelled', 'Cancelled') + ], default = 'draft', readonly=True) + partner_id = fields.Many2one("res.partner", string="Partner", required=True, ondelete="restrict") + service_id = fields.Many2one("event.service", string="Service", required=True, ondelete="restrict") + company_id = fields.Many2one("res.company", default=lambda self: self.env.company, ondelete="restrict") + + _unique_booking = models.Constraint( + "unique(partner_id, service_id)", + "You cannot register the same service twice.", + ) + + @api.constrains("quantity") + def _check_quantity(self): + for record in self: + if record.quantity <= 0: + raise ValidationError( + "Number of attendees must be greater than zero." + ) + + @api.depends('service_id.price', 'quantity') + def _compute_amount(self): + for record in self: + record.amount = record.quantity * record.service_id.price + + @api.constrains("company_id", "service_id") + def _check_company_consistency(self): + for record in self: + if ( + record.service_id + and record.service_id.company_id != record.company_id + ): + raise ValidationError( + "The service and the booking must belong to the same company." + ) + + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if not vals.get("name"): + vals["name"] = self.env["ir.sequence"].next_by_code( + "event.service.registration" + ) + return super().create(vals_list) + + @api.constrains("booking_date") + def _check_booking_date(self): + now = fields.Datetime.now() + for record in self: + if record.booking_date and record.booking_date < now: + raise ValidationError( + "The booking date cannot be in the past." + ) diff --git a/event_service_base/security/ir.model.access.csv b/event_service_base/security/ir.model.access.csv new file mode 100644 index 0000000..409501e --- /dev/null +++ b/event_service_base/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_event_service_registration_user,event.service.registration user,model_event_service_registration,base.group_user,1,1,1,1 +access_event_service_user,event.service user,model_event_service,base.group_user,1,1,1,1 +access_event_service_category_user,event.service.category user,model_event_service_category,base.group_user,1,1,1,0 +access_event_service_tag_user,event.service.tag user,model_event_service_tag,base.group_user,1,1,1,0 diff --git a/event_service_website/__init__.py b/event_service_website/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/event_service_website/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/event_service_website/__manifest__.py b/event_service_website/__manifest__.py new file mode 100644 index 0000000..c7e830c --- /dev/null +++ b/event_service_website/__manifest__.py @@ -0,0 +1,17 @@ +{ + 'name': 'Event Service Website', + 'summary': 'Manage event services and customer bookings', + 'description': """ +- Definition of event services with pricing +- Service categories and tags +- Customer registrations for services +- Core business rules and validations for bookings + +""", + 'version': '1.0', + 'depends': ['event_service_base', 'website', 'portal'], + 'author': 'Dhruv', + 'installable': True, + 'application': True, + 'license': 'LGPL-3', +}