From 9309d441c037bc5f51219d5ef7878eb7372e0af2 Mon Sep 17 00:00:00 2001 From: ardo-odoo Date: Tue, 29 Apr 2025 16:19:29 +0530 Subject: [PATCH] [ADD] product_kits: new module for creating and selling product kits - Add the ability to designate products as "kits" with sub-products - Implement a wizard for configuring kit components with custom quantities and prices - Automatically calculate kit price based on sub-product prices and quantities - Support display control for kit components in sales orders, invoices, and portal view --- product_kits/__init__.py | 2 + product_kits/__manifest__.py | 19 +++ product_kits/models/__init__.py | 3 + product_kits/models/product_template.py | 8 ++ product_kits/models/sale_order.py | 7 ++ product_kits/models/sale_order_line.py | 30 +++++ product_kits/report/report_invoice.xml | 11 ++ .../report/sale_order_portal_view.xml | 10 ++ product_kits/report/sale_order_report.xml | 10 ++ product_kits/security/ir.model.access.csv | 3 + product_kits/views/product_template_views.xml | 15 +++ product_kits/views/sale_order_views.xml | 33 +++++ product_kits/wizard/__init__.py | 2 + product_kits/wizard/product_kit_wizard.py | 115 ++++++++++++++++++ .../wizard/product_kit_wizard_line.py | 15 +++ .../wizard/product_kit_wizard_views.xml | 36 ++++++ 16 files changed, 319 insertions(+) create mode 100644 product_kits/__init__.py create mode 100644 product_kits/__manifest__.py create mode 100644 product_kits/models/__init__.py create mode 100644 product_kits/models/product_template.py create mode 100644 product_kits/models/sale_order.py create mode 100644 product_kits/models/sale_order_line.py create mode 100644 product_kits/report/report_invoice.xml create mode 100644 product_kits/report/sale_order_portal_view.xml create mode 100644 product_kits/report/sale_order_report.xml create mode 100644 product_kits/security/ir.model.access.csv create mode 100644 product_kits/views/product_template_views.xml create mode 100644 product_kits/views/sale_order_views.xml create mode 100644 product_kits/wizard/__init__.py create mode 100644 product_kits/wizard/product_kit_wizard.py create mode 100644 product_kits/wizard/product_kit_wizard_line.py create mode 100644 product_kits/wizard/product_kit_wizard_views.xml diff --git a/product_kits/__init__.py b/product_kits/__init__.py new file mode 100644 index 00000000000..9b4296142f4 --- /dev/null +++ b/product_kits/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/product_kits/__manifest__.py b/product_kits/__manifest__.py new file mode 100644 index 00000000000..66db49de797 --- /dev/null +++ b/product_kits/__manifest__.py @@ -0,0 +1,19 @@ +{ + 'name': 'Product Kits', + 'version': '1.0', + 'depends': ['base', 'sale_management'], + 'author': 'Aryan Donga (ardo)', + 'description': 'Simple module to create and sell product kits', + 'application': False, + 'installable': True, + 'license': 'LGPL-3', + 'data': [ + 'security/ir.model.access.csv', + 'report/sale_order_report.xml', + 'report/report_invoice.xml', + 'report/sale_order_portal_view.xml', + 'views/product_template_views.xml', + 'wizard/product_kit_wizard_views.xml', + 'views/sale_order_views.xml' + ], +} diff --git a/product_kits/models/__init__.py b/product_kits/models/__init__.py new file mode 100644 index 00000000000..8f2f8c0cbc1 --- /dev/null +++ b/product_kits/models/__init__.py @@ -0,0 +1,3 @@ +from . import product_template +from . import sale_order_line +from . import sale_order diff --git a/product_kits/models/product_template.py b/product_kits/models/product_template.py new file mode 100644 index 00000000000..faea924ab0a --- /dev/null +++ b/product_kits/models/product_template.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + is_kit = fields.Boolean(string='Is Kit', default=False) + sub_product_ids = fields.Many2many('product.product', string='Sub Products') diff --git a/product_kits/models/sale_order.py b/product_kits/models/sale_order.py new file mode 100644 index 00000000000..393067814c5 --- /dev/null +++ b/product_kits/models/sale_order.py @@ -0,0 +1,7 @@ +from odoo import fields, models + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + print_in_report = fields.Boolean(string='Print in report') diff --git a/product_kits/models/sale_order_line.py b/product_kits/models/sale_order_line.py new file mode 100644 index 00000000000..03323caed74 --- /dev/null +++ b/product_kits/models/sale_order_line.py @@ -0,0 +1,30 @@ +from odoo import api, fields, models + + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + is_kit = fields.Boolean(compute='_compute_is_kit', store=True) + parent_kit_line_id = fields.Many2one( + comodel_name='sale.order.line', + string='Parent Kit Line', + ondelete='cascade', + index=True, + ) + + # Optional fields for sub-products + sub_product_line_ids = fields.One2many( + comodel_name='sale.order.line', + inverse_name='parent_kit_line_id', + string='Sub Product Lines', + copy=True, + ) + custom_sub_product_price = fields.Float( + string='Custom Sub Product Price', + help='Overridden price of the sub product line.', + ) + + @api.depends('product_id') + def _compute_is_kit(self): + for line in self: + line.is_kit = line.product_id.is_kit if line.product_id else False diff --git a/product_kits/report/report_invoice.xml b/product_kits/report/report_invoice.xml new file mode 100644 index 00000000000..a17973fd97b --- /dev/null +++ b/product_kits/report/report_invoice.xml @@ -0,0 +1,11 @@ + + + + diff --git a/product_kits/report/sale_order_portal_view.xml b/product_kits/report/sale_order_portal_view.xml new file mode 100644 index 00000000000..5adb8b77e04 --- /dev/null +++ b/product_kits/report/sale_order_portal_view.xml @@ -0,0 +1,10 @@ + + + + diff --git a/product_kits/report/sale_order_report.xml b/product_kits/report/sale_order_report.xml new file mode 100644 index 00000000000..1268f13bf81 --- /dev/null +++ b/product_kits/report/sale_order_report.xml @@ -0,0 +1,10 @@ + + + + diff --git a/product_kits/security/ir.model.access.csv b/product_kits/security/ir.model.access.csv new file mode 100644 index 00000000000..df4195f38ec --- /dev/null +++ b/product_kits/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 +product_kits.access_product_kit_wizard,access_product_kit_wizard,product_kits.model_product_kit_wizard,base.group_user,1,1,1,0 +product_kits.access_product_kit_wizard_line,access_product_kit_wizard_line,product_kits.model_product_kit_wizard_line,base.group_user,1,1,1,0 diff --git a/product_kits/views/product_template_views.xml b/product_kits/views/product_template_views.xml new file mode 100644 index 00000000000..75e3b2fdbe9 --- /dev/null +++ b/product_kits/views/product_template_views.xml @@ -0,0 +1,15 @@ + + + + product.template.form.view.kits + product.template + + + + + + + + + diff --git a/product_kits/views/sale_order_views.xml b/product_kits/views/sale_order_views.xml new file mode 100644 index 00000000000..0698ed1f5d1 --- /dev/null +++ b/product_kits/views/sale_order_views.xml @@ -0,0 +1,33 @@ + + + + sale.order.form.view.kits + sale.order + + + +