From 8967bf289a90744a0709c3c44499dfd04e9c3740 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Tue, 11 Oct 2016 17:46:53 +0200 Subject: [PATCH] Add modules sale_from_private_stock and sale_order_add_bom Port base_company_extension to v10 Avoid blockage on l10n_fr_infogreffe_connector --- sale_order_add_bom/__init__.py | 4 ++ sale_order_add_bom/__manifest__.py | 25 +++++++ sale_order_add_bom/mrp_bom.py | 12 ++++ sale_order_add_bom/sale_view.xml | 23 +++++++ sale_order_add_bom/wizard/__init__.py | 3 + .../wizard/sale_add_phantom_bom.py | 69 +++++++++++++++++++ .../wizard/sale_add_phantom_bom_view.xml | 36 ++++++++++ 7 files changed, 172 insertions(+) create mode 100644 sale_order_add_bom/__init__.py create mode 100644 sale_order_add_bom/__manifest__.py create mode 100644 sale_order_add_bom/mrp_bom.py create mode 100644 sale_order_add_bom/sale_view.xml create mode 100644 sale_order_add_bom/wizard/__init__.py create mode 100644 sale_order_add_bom/wizard/sale_add_phantom_bom.py create mode 100644 sale_order_add_bom/wizard/sale_add_phantom_bom_view.xml diff --git a/sale_order_add_bom/__init__.py b/sale_order_add_bom/__init__.py new file mode 100644 index 0000000..545b9e4 --- /dev/null +++ b/sale_order_add_bom/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +from . import mrp_bom +from . import wizard diff --git a/sale_order_add_bom/__manifest__.py b/sale_order_add_bom/__manifest__.py new file mode 100644 index 0000000..d35d5f6 --- /dev/null +++ b/sale_order_add_bom/__manifest__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# © 2016 Akretion (Alexis de Lattre ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Sale Order Add Bom', + 'version': '9.0.1.0.0', + 'category': 'Sales Management', + 'license': 'AGPL-3', + 'summary': 'Wizard to select a bom from a sale order', + 'description': """ +This module adds a wizard *Add Kit* on the form view of a quotation that allows the user to select a 'kit' BOM: Odoo will automatically add the components of the kit as sale order lines. + +This module has been written by Alexis de Lattre from Akretion +. + """, + 'author': 'Akretion', + 'website': 'http://www.akretion.com', + 'depends': ['sale', 'mrp'], + 'data': [ + 'wizard/sale_add_phantom_bom_view.xml', + 'sale_view.xml', + ], + 'installable': True, +} diff --git a/sale_order_add_bom/mrp_bom.py b/sale_order_add_bom/mrp_bom.py new file mode 100644 index 0000000..b2799b8 --- /dev/null +++ b/sale_order_add_bom/mrp_bom.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# © 2016 Akretion (Alexis de Lattre ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import models, fields + + +class MrpBom(models.Model): + _inherit = 'mrp.bom' + _rec_name = 'product_id' + + sale_ok = fields.Boolean(related='product_id.sale_ok', store=True) diff --git a/sale_order_add_bom/sale_view.xml b/sale_order_add_bom/sale_view.xml new file mode 100644 index 0000000..d38a017 --- /dev/null +++ b/sale_order_add_bom/sale_view.xml @@ -0,0 +1,23 @@ + + + + + + + + add.bom.sale.order.form + sale.order + + + + + + + + diff --git a/sale_order_add_bom/wizard/__init__.py b/sale_order_add_bom/wizard/__init__.py new file mode 100644 index 0000000..f473f0c --- /dev/null +++ b/sale_order_add_bom/wizard/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + +from . import sale_add_phantom_bom diff --git a/sale_order_add_bom/wizard/sale_add_phantom_bom.py b/sale_order_add_bom/wizard/sale_add_phantom_bom.py new file mode 100644 index 0000000..b451441 --- /dev/null +++ b/sale_order_add_bom/wizard/sale_add_phantom_bom.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# © 2016 Akretion (Alexis de Lattre ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from openerp import models, fields, api, _ +from openerp.exceptions import UserError +from openerp.tools import float_is_zero + + +class SaleAddPhantomBom(models.TransientModel): + _name = 'sale.add.phantom.bom' + _description = 'Add Kit to Quotation' + + @api.model + def _default_sale_id(self): + assert self._context.get('active_model') == 'sale.order' + return self.env['sale.order'].browse(self._context['active_id']) + + bom_id = fields.Many2one( + 'mrp.bom', 'Kit', required=True, + domain=[('type', '=', 'phantom'), ('sale_ok', '=', True)]) + qty = fields.Integer( + string='Number of Kits to Add', default=1, required=True) + # I can 't put the sale_id fields required=True because + # it may block the deletion of a sale order + sale_id = fields.Many2one( + 'sale.order', string='Quotation', default=_default_sale_id) + + @api.model + def _prepare_sale_order_line(self, bom_line, sale_order, wizard_qty): + qty_in_product_uom = self.env['product.uom']._compute_qty_obj( + bom_line.product_uom, + bom_line.product_qty, + bom_line.product_id.uom_id) + vals = { + 'product_id': bom_line.product_id.id, + 'product_uom_qty': qty_in_product_uom * wizard_qty, + 'order_id': sale_order.id, + } + return vals + + @api.multi + def add(self): + self.ensure_one() + assert self.sale_id, 'No related sale_id' + if self.qty < 1: + raise UserError(_( + "The number of kits to add must be 1 or superior")) + assert self.bom_id.type == 'phantom', 'The BOM is not a kit' + if not self.bom_id.bom_line_ids: + raise UserError(_("The selected kit is empty !")) + prec = self.env['decimal.precision'].precision_get( + 'Product Unit of Measure') + today = fields.Date.context_today(self) + solo = self.env['sale.order.line'] + for line in self.bom_id.bom_line_ids: + if float_is_zero(line.product_qty, precision_digits=prec): + continue + if line.date_start and line.date_start > today: + continue + if line.date_stop and line.date_stop < today: + continue + # The onchange is played in the inherit of the create() + # of sale order line in the 'sale' module + # TODO: if needed, we could increment existing order lines + # with the same product instead of always creating new lines + vals = self._prepare_sale_order_line(line, self.sale_id, self.qty) + solo.create(vals) + return True diff --git a/sale_order_add_bom/wizard/sale_add_phantom_bom_view.xml b/sale_order_add_bom/wizard/sale_add_phantom_bom_view.xml new file mode 100644 index 0000000..dff5025 --- /dev/null +++ b/sale_order_add_bom/wizard/sale_add_phantom_bom_view.xml @@ -0,0 +1,36 @@ + + + + + + + + sale.add.phantom.bom.form + sale.add.phantom.bom + +
+ + + + +
+
+
+
+
+ + + Add Kit + sale.add.phantom.bom + form + new + + +
+