diff --git a/event_question_sale/controllers/__init__.py b/event_question_sale/controllers/__init__.py new file mode 100644 index 0000000..12a7e52 --- /dev/null +++ b/event_question_sale/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/event_question_sale/controllers/main.py b/event_question_sale/controllers/main.py new file mode 100644 index 0000000..7155607 --- /dev/null +++ b/event_question_sale/controllers/main.py @@ -0,0 +1,58 @@ +from collections import defaultdict +from odoo import _ +from odoo.http import request, route + +from odoo.addons.website_event_questions.controllers.main import WebsiteEventController + + +class WebsiteEventQep(WebsiteEventController): + # def _process_attendees_form(self, event, form_details): + # """Process data posted from the attendee details form. + # Extracts question answers: + # - For both questions asked 'once_per_order' and questions asked to every attendee + # - For questions of type 'simple_choice', extracting the suggested answer id + # - For questions of type 'text_box', extracting the text answer of the attendee. + # """ + # registrations = super(WebsiteEvent, self)._process_attendees_form( + # event, form_details + # ) + + def _create_attendees_from_registration_post(self, event, registration_data): + if not any(info.get("event_ticket_id") for info in registration_data): + return super()._create_attendees_from_registration_post( + event, registration_data + ) + + res = super()._create_attendees_from_registration_post(event, registration_data) + + order_sudo = request.website.sale_get_order(force_create=True) + + reg_answers = {} + for data in registration_data: + answers = data.get("registration_answer_ids") + + # tickets_data = defaultdict(int) + # for data in registration_data: + # event_ticket_id = data.get("event_ticket_id") + # if event_ticket_id: + # tickets_data[event_ticket_id] += 1 + + # cart_data = {} + # for ticket_id, count in tickets_data.items(): + # ticket_sudo = request.env["event.event.ticket"].sudo().browse(ticket_id) + # cart_values = order_sudo._cart_update( + # product_id=ticket_sudo.product_id.id, + # add_qty=count, + # event_ticket_id=ticket_id, + # ) + # cart_data[ticket_id] = cart_values["line_id"] + + # for data in registration_data: + # event_ticket_id = data.get("event_ticket_id") + # if event_ticket_id: + # data["sale_order_id"] = order_sudo.id + # data["sale_order_line_id"] = cart_data[event_ticket_id] + + request.session["website_sale_cart_quantity"] = order_sudo.cart_quantity + + return res diff --git a/event_question_sale_renting/__init__.py b/event_question_sale_renting/__init__.py new file mode 100644 index 0000000..0650744 --- /dev/null +++ b/event_question_sale_renting/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/event_question_sale_renting/__manifest__.py b/event_question_sale_renting/__manifest__.py new file mode 100644 index 0000000..32bb4a8 --- /dev/null +++ b/event_question_sale_renting/__manifest__.py @@ -0,0 +1,41 @@ +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). +{ + "name": "Event question sale renting", + "version": "1.0.0", + "summary": """ + Set booking order extra products on event question answers. + """, + "description": """ + This module extends the functionnalities of event questions and event tickets sale. + On the event questions you can check the box to be able to add on each answer, + zero, one or more extra products (giving price and qty) that will be added to the sale order. + For the questions asked once per registration, you can choose to add the extra products once or for each attendee. + """, + "author": "RemiFr82", + "contributors": "Hike2River", + "website": "https://remifr82.me", + "license": "LGPL-3", + "category": "Events", + # "price": 0, + # "currency": "EUR", + "application": False, + "installable": True, + "auto_install": False, + "pre_init_hook": "", + "post_init_hook": "", + "uninstall_hook": "", + "excludes": [], + "external_dependencies": [], + "depends": [ + "website_event_questions", + "website_event_sale", + ], + "data": [], + "assets": {}, + "css": [], + "images": [], + "js": [], + "test": [], + "demo": [], + "maintainer": "RemiFr82", +} diff --git a/event_question_sale_renting/controllers/__init__.py b/event_question_sale_renting/controllers/__init__.py new file mode 100644 index 0000000..12a7e52 --- /dev/null +++ b/event_question_sale_renting/controllers/__init__.py @@ -0,0 +1 @@ +from . import main diff --git a/event_question_sale_renting/controllers/main.py b/event_question_sale_renting/controllers/main.py new file mode 100644 index 0000000..7155607 --- /dev/null +++ b/event_question_sale_renting/controllers/main.py @@ -0,0 +1,58 @@ +from collections import defaultdict +from odoo import _ +from odoo.http import request, route + +from odoo.addons.website_event_questions.controllers.main import WebsiteEventController + + +class WebsiteEventQep(WebsiteEventController): + # def _process_attendees_form(self, event, form_details): + # """Process data posted from the attendee details form. + # Extracts question answers: + # - For both questions asked 'once_per_order' and questions asked to every attendee + # - For questions of type 'simple_choice', extracting the suggested answer id + # - For questions of type 'text_box', extracting the text answer of the attendee. + # """ + # registrations = super(WebsiteEvent, self)._process_attendees_form( + # event, form_details + # ) + + def _create_attendees_from_registration_post(self, event, registration_data): + if not any(info.get("event_ticket_id") for info in registration_data): + return super()._create_attendees_from_registration_post( + event, registration_data + ) + + res = super()._create_attendees_from_registration_post(event, registration_data) + + order_sudo = request.website.sale_get_order(force_create=True) + + reg_answers = {} + for data in registration_data: + answers = data.get("registration_answer_ids") + + # tickets_data = defaultdict(int) + # for data in registration_data: + # event_ticket_id = data.get("event_ticket_id") + # if event_ticket_id: + # tickets_data[event_ticket_id] += 1 + + # cart_data = {} + # for ticket_id, count in tickets_data.items(): + # ticket_sudo = request.env["event.event.ticket"].sudo().browse(ticket_id) + # cart_values = order_sudo._cart_update( + # product_id=ticket_sudo.product_id.id, + # add_qty=count, + # event_ticket_id=ticket_id, + # ) + # cart_data[ticket_id] = cart_values["line_id"] + + # for data in registration_data: + # event_ticket_id = data.get("event_ticket_id") + # if event_ticket_id: + # data["sale_order_id"] = order_sudo.id + # data["sale_order_line_id"] = cart_data[event_ticket_id] + + request.session["website_sale_cart_quantity"] = order_sudo.cart_quantity + + return res diff --git a/event_question_sale_renting/models/__init__.py b/event_question_sale_renting/models/__init__.py new file mode 100644 index 0000000..ceda3bf --- /dev/null +++ b/event_question_sale_renting/models/__init__.py @@ -0,0 +1,3 @@ +from . import event_question_answer_product +from . import event_question_answer +from . import event_question diff --git a/event_question_sale_renting/models/event_question.py b/event_question_sale_renting/models/event_question.py new file mode 100644 index 0000000..18b172e --- /dev/null +++ b/event_question_sale_renting/models/event_question.py @@ -0,0 +1,25 @@ +from odoo import api, fields, models, _ + + +class EventQuestion(models.Model): + _inherit = "event.question" + + add_renting = fields.Boolean( + string="Add extra renting on answers", + ) + qty_by_attendees = fields.Boolean( + string="Multiply quantity by attendees count", + help="For the questions asked only once per registration.\n" + "If checked, Odoo will add the extra product for each attendee.\n" + "Otherwise, Odoo will add the extra product only once.", + ) + + @api.onchange("question_type") + def onchange_qtype(self): + if self.question_type != "simple_choice" and self.add_product: + self.add_product = False + + @api.onchange("once_per_order") + def onchange_qtype(self): + if not self.once_per_order and self.qty_by_attendees: + self.qty_by_attendees = False diff --git a/event_question_sale_renting/models/event_question_answer.py b/event_question_sale_renting/models/event_question_answer.py new file mode 100644 index 0000000..8cd1d54 --- /dev/null +++ b/event_question_sale_renting/models/event_question_answer.py @@ -0,0 +1,12 @@ +from odoo import api, fields, models, _ + + +class EventQuestionAnswer(models.Model): + _inherit = "event.question.answer" + + extra_renting_ids = fields.One2many( + comodel_name="event.question.answer.renting", + inverse_name="answer_id", + string="Extra Renting", + help="These products rentings will be added to the sale order of the booking with the given quantity, prices and duration.", + ) diff --git a/event_question_sale_renting/models/event_question_answer_product.py b/event_question_sale_renting/models/event_question_answer_product.py new file mode 100644 index 0000000..df708ef --- /dev/null +++ b/event_question_sale_renting/models/event_question_answer_product.py @@ -0,0 +1,25 @@ +from odoo import api, fields, models, _ + + +class EventQuestionAnswerRenting(models.Model): + _inherit = "event.question.answer.renting" + + rentable = fields.Boolean( + string="Rentable", + compute="_get_rentable", + invisible=True, + ) + renting = fields.Boolean( + string="Renting", + ) + + @api.depends("product_id") + def _get_rentable(self): + for eqap in self: + eqap.rentable = eqap.product_id.rent_ok + + @api.onchange("rentable") + def onchange_rentable(self): + for eqap in self: + if not eqap.rentable: + eqap.renting = False diff --git a/event_question_sale_renting/models/event_registration_answer.py b/event_question_sale_renting/models/event_registration_answer.py new file mode 100644 index 0000000..58eac00 --- /dev/null +++ b/event_question_sale_renting/models/event_registration_answer.py @@ -0,0 +1,14 @@ +from odoo import api, fields, models, _ + + +class EventRegistrationAnswer(models.Model): + _inherit = "event.registration.answer" + + extra_product_ids = fields.One2many(related="value_answer_id.extra_product_ids") + sale_order_line_ids = fields.Many2many( + comodel_name="sale.order.line", + column1="event_answer_id", + column2="sale_order_line_id", + relation="event_answer_sale_order_line_rel", + string="Related sale order lines", + ) diff --git a/event_question_sale_renting/static/description/icon.png b/event_question_sale_renting/static/description/icon.png new file mode 100644 index 0000000..663109e Binary files /dev/null and b/event_question_sale_renting/static/description/icon.png differ diff --git a/event_question_sale_renting/static/description/icon.svg b/event_question_sale_renting/static/description/icon.svg new file mode 100644 index 0000000..fedafcd --- /dev/null +++ b/event_question_sale_renting/static/description/icon.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +