diff --git a/event_generate_quotation_from_registration/__init__.py b/event_generate_quotation_from_registration/__init__.py new file mode 100644 index 0000000..9a7e03e --- /dev/null +++ b/event_generate_quotation_from_registration/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/event_generate_quotation_from_registration/__manifest__.py b/event_generate_quotation_from_registration/__manifest__.py new file mode 100644 index 0000000..6e24714 --- /dev/null +++ b/event_generate_quotation_from_registration/__manifest__.py @@ -0,0 +1,20 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + "name": "event_generate_quotation_from_registration", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "Elabore", + "website": "https://www.elabore.coop", + "category": "", + 'summary': 'Generate quotation from event registration', + 'description': """ + Generate quotation from event registration : + """, + "depends": ["event_sale"], + "data": [ + 'security/ir.model.access.csv', + 'views/event_registration_views.xml', + ], + "installable": True, +} diff --git a/event_generate_quotation_from_registration/models/__init__.py b/event_generate_quotation_from_registration/models/__init__.py new file mode 100644 index 0000000..998c634 --- /dev/null +++ b/event_generate_quotation_from_registration/models/__init__.py @@ -0,0 +1,3 @@ +from . import event_registration +from . import event_registration_financier +from . import sale_order \ No newline at end of file diff --git a/event_generate_quotation_from_registration/models/event_registration.py b/event_generate_quotation_from_registration/models/event_registration.py new file mode 100644 index 0000000..c5a749c --- /dev/null +++ b/event_generate_quotation_from_registration/models/event_registration.py @@ -0,0 +1,24 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models, api, Command +import logging +_logger = logging.getLogger(__name__) + +class EventRegistration(models.Model): + _inherit = "event.registration" + + financier_ids = fields.One2many('event.registration.financier', 'registration_id', string="Financements") + + + def generate_quotation(self): + for registration in self: + for financier in registration.financier_ids: + if not financier.quotation_id: + sale_order = self.env['sale.order'].create(financier.get_sale_order_values()) + financier.quotation_id = sale_order + else: + order_lines = self.env['sale.order.line'].search([ + ('order_id','=',financier.quotation_id.id), + ('product_id','=',financier.get_product_id()) + ]) + if order_lines: + order_lines[0].price_unit = financier.amount \ No newline at end of file diff --git a/event_generate_quotation_from_registration/models/event_registration_financier.py b/event_generate_quotation_from_registration/models/event_registration_financier.py new file mode 100644 index 0000000..bb3fc8e --- /dev/null +++ b/event_generate_quotation_from_registration/models/event_registration_financier.py @@ -0,0 +1,37 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models, api, Command +import logging + +from odoo.exceptions import UserError +_logger = logging.getLogger(__name__) + +class EventRegistrationFinancier(models.Model): + _name = "event.registration.financier" + + _rec_name = 'financier_id' + + company_id = fields.Many2one("res.company") + company_currency_id = fields.Many2one('res.currency', related="company_id.currency_id") + registration_id = fields.Many2one('event.registration') + quotation_id = fields.Many2one('sale.order', string="Devis") + financier_id = fields.Many2one('res.partner', string="Financeur", required=True) + amount = fields.Monetary('Montant', currency_field="company_currency_id") + + + def get_product_id(self): + if self.registration_id.event_ticket_id: + return self.registration_id.event_ticket_id.product_id.id + elif self.registration_id.event_id.event_ticket_ids: + return self.registration_id.event_id.event_ticket_ids[0].product_id.id + raise UserError('Un ticket doit être défini dans la session de formation afin de générer le devis') + + def get_sale_order_values(self): + return { + 'partner_id':self.financier_id.id, + 'order_line':[ + Command.create({ + "price_unit": self.amount, + "product_id": self.get_product_id() + }) + ] + } \ No newline at end of file diff --git a/event_generate_quotation_from_registration/models/sale_order.py b/event_generate_quotation_from_registration/models/sale_order.py new file mode 100644 index 0000000..535c21d --- /dev/null +++ b/event_generate_quotation_from_registration/models/sale_order.py @@ -0,0 +1,30 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models, api, Command +import logging +_logger = logging.getLogger(__name__) + +class SaleOrder(models.Model): + _inherit = "sale.order" + + def linked_to_registration(self): + return len(self.env['event.registration.financier'].search([('quotation_id','=',self.id)])) > 0 + + def action_confirm(self): + res = super(SaleOrder, self).action_confirm() + + #if sale order is linked to event.registration.financier, don't open wizard + if isinstance(res, dict) and res.get('xml_id') == 'event_sale.action_sale_order_event_registration' and self.linked_to_registration(): + return True + + return res + +class SaleOrderLine(models.Model): + _inherit = "sale.order.line" + + def _update_registrations(self, confirm=True, cancel_to_draft=False, registration_data=None, mark_as_paid=False): + # bypass _update_registrations if order generated by event registration + if self.order_id.linked_to_registration(): + return + return super(SaleOrderLine, self)._update_registrations(confirm, cancel_to_draft, registration_data, mark_as_paid) + + \ No newline at end of file diff --git a/event_generate_quotation_from_registration/security/ir.model.access.csv b/event_generate_quotation_from_registration/security/ir.model.access.csv new file mode 100644 index 0000000..93c0a20 --- /dev/null +++ b/event_generate_quotation_from_registration/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_event_registration_financier,access.event.registration.financier,model_event_registration_financier,sales_team.group_sale_salesman,1,1,1,1 \ No newline at end of file diff --git a/event_generate_quotation_from_registration/views/event_registration_views.xml b/event_generate_quotation_from_registration/views/event_registration_views.xml new file mode 100644 index 0000000..ed356b9 --- /dev/null +++ b/event_generate_quotation_from_registration/views/event_registration_views.xml @@ -0,0 +1,24 @@ + + + + + view.event.registration.form.event.generate.quotation.from.registration + event.registration + + + + + + + + + + + +