From ab00f5a16225e6d64e437b08c00ac3962ba48968 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Tue, 12 Mar 2019 16:10:30 +0100 Subject: [PATCH 01/17] [MIG] repair_refurbish (mrp_repair_refurbish): Migration to 12.0 --- repair_refurbish/README.rst | 106 ++++ repair_refurbish/__init__.py | 1 + repair_refurbish/__manifest__.py | 22 + repair_refurbish/data/stock_data.xml | 27 ++ repair_refurbish/i18n/de.po | 90 ++++ .../i18n/mrp_repair_refurbish.pot | 85 ++++ repair_refurbish/models/__init__.py | 4 + repair_refurbish/models/product_product.py | 12 + repair_refurbish/models/product_template.py | 43 ++ repair_refurbish/models/repair.py | 85 ++++ repair_refurbish/models/stock_move.py | 15 + repair_refurbish/readme/CONFIGURE.rst | 4 + repair_refurbish/readme/CONTRIBUTORS.rst | 3 + repair_refurbish/readme/CREDITS.rst | 3 + repair_refurbish/readme/DESCRIPTION.rst | 2 + repair_refurbish/readme/USAGE.rst | 12 + repair_refurbish/static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 455 ++++++++++++++++++ repair_refurbish/tests/__init__.py | 1 + .../tests/test_repair_refurbish.py | 91 ++++ .../views/product_product_view.xml | 17 + .../views/product_template_view.xml | 31 ++ repair_refurbish/views/repair_view.xml | 57 +++ 23 files changed, 1166 insertions(+) create mode 100644 repair_refurbish/README.rst create mode 100644 repair_refurbish/__init__.py create mode 100644 repair_refurbish/__manifest__.py create mode 100644 repair_refurbish/data/stock_data.xml create mode 100644 repair_refurbish/i18n/de.po create mode 100644 repair_refurbish/i18n/mrp_repair_refurbish.pot create mode 100644 repair_refurbish/models/__init__.py create mode 100644 repair_refurbish/models/product_product.py create mode 100644 repair_refurbish/models/product_template.py create mode 100644 repair_refurbish/models/repair.py create mode 100644 repair_refurbish/models/stock_move.py create mode 100644 repair_refurbish/readme/CONFIGURE.rst create mode 100644 repair_refurbish/readme/CONTRIBUTORS.rst create mode 100644 repair_refurbish/readme/CREDITS.rst create mode 100644 repair_refurbish/readme/DESCRIPTION.rst create mode 100644 repair_refurbish/readme/USAGE.rst create mode 100644 repair_refurbish/static/description/icon.png create mode 100644 repair_refurbish/static/description/index.html create mode 100644 repair_refurbish/tests/__init__.py create mode 100644 repair_refurbish/tests/test_repair_refurbish.py create mode 100644 repair_refurbish/views/product_product_view.xml create mode 100644 repair_refurbish/views/product_template_view.xml create mode 100644 repair_refurbish/views/repair_view.xml diff --git a/repair_refurbish/README.rst b/repair_refurbish/README.rst new file mode 100644 index 000000000..906d14db2 --- /dev/null +++ b/repair_refurbish/README.rst @@ -0,0 +1,106 @@ +==================== +MRP Repair Refurbish +==================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmanufacture-lightgray.png?logo=github + :target: https://github.com/OCA/manufacture/tree/11.0/mrp_repair_refurbish + :alt: OCA/manufacture +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/manufacture-11-0/manufacture-11-0-mrp_repair_refurbish + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/129/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds the ability to obtain refurbished product as a consequence +of the repair of a product that was defective. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +#. For each product that can potentially be refurbished, define the + refurbished version in the product form. +#. A default 'Refurbished' virtual location is created during module install, + and proposed by default on each product. + +Usage +===== + +#. Create an MRP repair. +#. Indicate a product to repair, If the product has a proposed refurbished + version, it will be proposed to be used. The destination location +#. Add operations if needed. +#. Complete the repair. + +The initial product will be moved to the 'Scrap' location, and the +refurbished product will be moved from a 'Refurbish' location to the desired +destination location. + +The components that were added to the repair order will be moved to the +'Refurbish' location. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Eficent + +Contributors +~~~~~~~~~~~~ + +* Jordi Ballester Alomar +* Lois Rilo + +Other credits +~~~~~~~~~~~~~ + +The initial development of this module has been financially supported by: + +* Aleph Objects, Inc. + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/manufacture `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/repair_refurbish/__init__.py b/repair_refurbish/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/repair_refurbish/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/repair_refurbish/__manifest__.py b/repair_refurbish/__manifest__.py new file mode 100644 index 000000000..10b60bdbc --- /dev/null +++ b/repair_refurbish/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright 2016-18 Eficent Business and IT Consulting Services S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +{ + "name": "MRP Repair Refurbish", + "summary": "Create refurbished products during repair", + "version": "12.0.1.0.1", + "category": "Manufacturing", + "website": "https://github.com/OCA/manufacture", + "author": "Eficent, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": [ + 'repair', + ], + "data": [ + "views/repair_view.xml", + "data/stock_data.xml", + "views/product_template_view.xml", + "views/product_product_view.xml", + ], +} diff --git a/repair_refurbish/data/stock_data.xml b/repair_refurbish/data/stock_data.xml new file mode 100644 index 000000000..479c57699 --- /dev/null +++ b/repair_refurbish/data/stock_data.xml @@ -0,0 +1,27 @@ + + + + + + Refurbish + + production + + + + + + + + + property_stock_refurbish + + + + + + diff --git a/repair_refurbish/i18n/de.po b/repair_refurbish/i18n/de.po new file mode 100644 index 000000000..62ee32573 --- /dev/null +++ b/repair_refurbish/i18n/de.po @@ -0,0 +1,90 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_repair_refurbish +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2018-12-09 10:43+0000\n" +"Last-Translator: Maria Sparenberg \n" +"Language-Team: none\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.3\n" + +#. module: mrp_repair_refurbish +#: model:ir.model,name:mrp_repair_refurbish.model_product_product +msgid "Product" +msgstr "Produkt" + +#. module: mrp_repair_refurbish +#: model:ir.model,name:mrp_repair_refurbish.model_product_template +msgid "Product Template" +msgstr "Produktvorlage" + +#. module: mrp_repair_refurbish +#: model:ir.ui.view,arch_db:mrp_repair_refurbish.product_normal_form_view +#: model:ir.ui.view,arch_db:mrp_repair_refurbish.product_template_only_form_view +#: model:stock.location,name:mrp_repair_refurbish.stock_location_refurbish +msgid "Refurbish" +msgstr "Wiederaufbereiten" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_product_product_property_stock_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_product_template_property_stock_refurbish +msgid "Refurbish Location" +msgstr "Lagerort für Wiederaufbereitung" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_refurbish_location_dest_id +msgid "Refurbished Delivery Location" +msgstr "Auslieferungslagerort" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_refurbish_move_id +msgid "Refurbished Inventory Move" +msgstr "Lagerbewegung" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_refurbish_lot_id +msgid "Refurbished Lot" +msgstr "Wiederaufbereitetes Los" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_product_product_refurbish_product_id +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_product_template_refurbish_product_id +msgid "Refurbished Product" +msgstr "Wiederaufbereitetes Produkt" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_refurbish_product_id +msgid "Refurbished product" +msgstr "Wiederaufbereitetes Produkt" + +#. module: mrp_repair_refurbish +#: model:ir.model,name:mrp_repair_refurbish.model_mrp_repair_line +msgid "Repair Line" +msgstr "Instandsetzungslinie" + +#. module: mrp_repair_refurbish +#: model:ir.model,name:mrp_repair_refurbish.model_mrp_repair +msgid "Repair Order" +msgstr "Reparaturauftrag" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,help:mrp_repair_refurbish.field_product_product_property_stock_refurbish +#: model:ir.model.fields,help:mrp_repair_refurbish.field_product_template_property_stock_refurbish +msgid "This stock location will be used, instead of the default one, as the source location for stock moves generated by repair orders when refurbishing takes place." +msgstr "" +"Dieser Lagerort wird anstatt des Standardlagerortes als Quelllager für " +"Lagerbewegungen verwendet, die durch Reparaturaufträge bei der " +"Wiederaufbereitung erzeugt werden." + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_to_refurbish +msgid "To Refurbish" +msgstr "Wiederaufbereiten" diff --git a/repair_refurbish/i18n/mrp_repair_refurbish.pot b/repair_refurbish/i18n/mrp_repair_refurbish.pot new file mode 100644 index 000000000..7f331e052 --- /dev/null +++ b/repair_refurbish/i18n/mrp_repair_refurbish.pot @@ -0,0 +1,85 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_repair_refurbish +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: mrp_repair_refurbish +#: model:ir.model,name:mrp_repair_refurbish.model_product_product +msgid "Product" +msgstr "" + +#. module: mrp_repair_refurbish +#: model:ir.model,name:mrp_repair_refurbish.model_product_template +msgid "Product Template" +msgstr "" + +#. module: mrp_repair_refurbish +#: model:ir.ui.view,arch_db:mrp_repair_refurbish.product_normal_form_view +#: model:ir.ui.view,arch_db:mrp_repair_refurbish.product_template_only_form_view +#: model:stock.location,name:mrp_repair_refurbish.stock_location_refurbish +msgid "Refurbish" +msgstr "" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_product_product_property_stock_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_product_template_property_stock_refurbish +msgid "Refurbish Location" +msgstr "" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_refurbish_location_dest_id +msgid "Refurbished Delivery Location" +msgstr "" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_refurbish_move_id +msgid "Refurbished Inventory Move" +msgstr "" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_refurbish_lot_id +msgid "Refurbished Lot" +msgstr "" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_product_product_refurbish_product_id +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_product_template_refurbish_product_id +msgid "Refurbished Product" +msgstr "" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_refurbish_product_id +msgid "Refurbished product" +msgstr "" + +#. module: mrp_repair_refurbish +#: model:ir.model,name:mrp_repair_refurbish.model_mrp_repair_line +msgid "Repair Line" +msgstr "" + +#. module: mrp_repair_refurbish +#: model:ir.model,name:mrp_repair_refurbish.model_mrp_repair +msgid "Repair Order" +msgstr "" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,help:mrp_repair_refurbish.field_product_product_property_stock_refurbish +#: model:ir.model.fields,help:mrp_repair_refurbish.field_product_template_property_stock_refurbish +msgid "This stock location will be used, instead of the default one, as the source location for stock moves generated by repair orders when refurbishing takes place." +msgstr "" + +#. module: mrp_repair_refurbish +#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_to_refurbish +msgid "To Refurbish" +msgstr "" + diff --git a/repair_refurbish/models/__init__.py b/repair_refurbish/models/__init__.py new file mode 100644 index 000000000..9261e7fb8 --- /dev/null +++ b/repair_refurbish/models/__init__.py @@ -0,0 +1,4 @@ +from . import product_product +from . import product_template +from . import repair +from . import stock_move diff --git a/repair_refurbish/models/product_product.py b/repair_refurbish/models/product_product.py new file mode 100644 index 000000000..4ab246863 --- /dev/null +++ b/repair_refurbish/models/product_product.py @@ -0,0 +1,12 @@ +# Copyright 2017-18 Eficent Business and IT Consulting Services S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class ProductProduct(models.Model): + _inherit = 'product.product' + + refurbish_product_id = fields.Many2one( + comodel_name='product.product', string='Refurbished Product', + domain="[('type', '=', 'product')]") diff --git a/repair_refurbish/models/product_template.py b/repair_refurbish/models/product_template.py new file mode 100644 index 000000000..a41024d39 --- /dev/null +++ b/repair_refurbish/models/product_template.py @@ -0,0 +1,43 @@ +# Copyright 2017-18 Eficent Business and IT Consulting Services S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + refurbish_product_id = fields.Many2one( + comodel_name='product.product', string='Refurbished Product', + compute='_compute_refurbish_product', + inverse='_set_refurbish_product', search='_search_refurbish_product', + domain="[('type', '=', 'product')]") + + property_stock_refurbish = fields.Many2one( + comodel_name='stock.location', string="Refurbish Location", + company_dependent=True, domain=[('usage', 'like', 'production')], + help="This stock location will be used, instead of the " + "default one, as the source location for " + "stock moves generated by repair orders when refurbishing takes " + "place.") + + @api.depends('product_variant_ids', + 'product_variant_ids.refurbish_product_id') + def _compute_refurbish_product(self): + unique_variants = self.filtered(lambda template: + len(template.product_variant_ids) == 1) + for template in unique_variants: + template.refurbish_product_id = \ + template.product_variant_ids.refurbish_product_id + + @api.multi + def _set_refurbish_product(self): + for rec in self: + if len(rec.product_variant_ids) == 1: + rec.product_variant_ids.refurbish_product_id = \ + rec.refurbish_product_id + + def _search_refurbish_product(self, operator, value): + products = self.env['product.product'].search([ + ('refurbish_product_id', operator, value)], limit=None) + return [('id', 'in', products.mapped('product_tmpl_id').ids)] diff --git a/repair_refurbish/models/repair.py b/repair_refurbish/models/repair.py new file mode 100644 index 000000000..dc0033c11 --- /dev/null +++ b/repair_refurbish/models/repair.py @@ -0,0 +1,85 @@ +# Copyright 2017-18 Eficent Business and IT Consulting Services S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class RepairOrder(models.Model): + _inherit = 'repair.order' + + to_refurbish = fields.Boolean() + location_dest_id = fields.Many2one( + string='Delivery Location', comodel_name='stock.location') + refurbish_location_dest_id = fields.Many2one( + string='Refurbished Delivery Location', comodel_name='stock.location') + refurbish_product_id = fields.Many2one( + string='Refurbished product', comodel_name='product.product') + refurbish_lot_id = fields.Many2one( + string='Refurbished Lot', comodel_name='stock.production.lot') + refurbish_move_id = fields.Many2one( + string='Refurbished Inventory Move', comodel_name='stock.move') + + @api.onchange('product_id') + def onchange_product_id(self): + res = super().onchange_product_id() + self.to_refurbish = True if \ + self.product_id.refurbish_product_id else False + return res + + @api.onchange('to_refurbish', 'product_id') + def _onchange_to_refurbish(self): + if self.to_refurbish: + self.refurbish_product_id = self.product_id.refurbish_product_id + self.refurbish_location_dest_id = self.location_dest_id + self.location_dest_id = self.product_id.property_stock_refurbish + else: + self.location_dest_id = self.refurbish_location_dest_id + self.refurbish_product_id = False + self.refurbish_location_dest_id = False + + @api.multi + def _get_refurbish_stock_move_dict(self): + return { + 'name': self.name, + 'product_id': self.refurbish_product_id.id, + 'product_uom': self.product_uom.id or + self.refurbish_product_id.uom_id.id, + 'product_uom_qty': self.product_qty, + 'partner_id': self.address_id and + self.address_id.id or False, + 'location_id': self.location_dest_id.id, + 'location_dest_id': self.refurbish_location_dest_id.id, + 'restrict_lot_id': self.refurbish_lot_id.id, + } + + @api.multi + def action_repair_done(self): + res = super(RepairOrder, self.with_context( + force_refurbish_location_dest_id=self.location_dest_id.id + )).action_repair_done() + for repair in self: + if repair.to_refurbish: + move = self.env['stock.move'].create( + repair._get_refurbish_stock_move_dict()) + move.quantity_done = repair.product_qty + move._action_done() + repair.refurbish_move_id = move.id + return res + + +class RepairLine(models.Model): + _inherit = 'repair.line' + + @api.onchange('type', 'repair_id') + def onchange_operation_type(self): + res = super(RepairLine, self).onchange_operation_type() + context = self.env.context + if (self.type == 'add' and 'to_refurbish' in context and + context['to_refurbish']): + self.location_dest_id = context['refurbish_location_dest_id'] + elif (self.type == 'add' and 'to_refurbish' in context and not + context['to_refurbish']): + scrap_location_id = self.env['stock.location'].search([ + ('usage', '=', 'customer')], limit=1) + self.location_dest_id = scrap_location_id + return res diff --git a/repair_refurbish/models/stock_move.py b/repair_refurbish/models/stock_move.py new file mode 100644 index 000000000..fc25c6c0a --- /dev/null +++ b/repair_refurbish/models/stock_move.py @@ -0,0 +1,15 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +from odoo import models, api + + +class StockMove(models.Model): + + _inherit = 'stock.move' + + @api.model + def create(self, vals): + if 'force_refurbish_location_dest_id' in self.env.context: + vals['location_dest_id'] = self.env.context[ + 'force_refurbish_location_dest_id'] + return super().create(vals) diff --git a/repair_refurbish/readme/CONFIGURE.rst b/repair_refurbish/readme/CONFIGURE.rst new file mode 100644 index 000000000..1f81d11d0 --- /dev/null +++ b/repair_refurbish/readme/CONFIGURE.rst @@ -0,0 +1,4 @@ +#. For each product that can potentially be refurbished, define the + refurbished version in the product form. +#. A default 'Refurbished' virtual location is created during module install, + and proposed by default on each product. diff --git a/repair_refurbish/readme/CONTRIBUTORS.rst b/repair_refurbish/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..30781998a --- /dev/null +++ b/repair_refurbish/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* Jordi Ballester Alomar +* Lois Rilo +* Akim Juillerat diff --git a/repair_refurbish/readme/CREDITS.rst b/repair_refurbish/readme/CREDITS.rst new file mode 100644 index 000000000..259e3b85f --- /dev/null +++ b/repair_refurbish/readme/CREDITS.rst @@ -0,0 +1,3 @@ +The initial development of this module has been financially supported by: + +* Aleph Objects, Inc. diff --git a/repair_refurbish/readme/DESCRIPTION.rst b/repair_refurbish/readme/DESCRIPTION.rst new file mode 100644 index 000000000..3414dba2b --- /dev/null +++ b/repair_refurbish/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module adds the ability to obtain refurbished product as a consequence +of the repair of a product that was defective. diff --git a/repair_refurbish/readme/USAGE.rst b/repair_refurbish/readme/USAGE.rst new file mode 100644 index 000000000..6cffafe8e --- /dev/null +++ b/repair_refurbish/readme/USAGE.rst @@ -0,0 +1,12 @@ +#. Create an MRP repair. +#. Indicate a product to repair, If the product has a proposed refurbished + version, it will be proposed to be used. The destination location +#. Add operations if needed. +#. Complete the repair. + +The initial product will be moved to the 'Scrap' location, and the +refurbished product will be moved from a 'Refurbish' location to the desired +destination location. + +The components that were added to the repair order will be moved to the +'Refurbish' location. diff --git a/repair_refurbish/static/description/icon.png b/repair_refurbish/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/repair_refurbish/static/description/index.html b/repair_refurbish/static/description/index.html new file mode 100644 index 000000000..2f153b08c --- /dev/null +++ b/repair_refurbish/static/description/index.html @@ -0,0 +1,455 @@ + + + + + + +MRP Repair Refurbish + + + +
+

MRP Repair Refurbish

+ + +

Beta License: AGPL-3 OCA/manufacture Translate me on Weblate Try me on Runbot

+

This module adds the ability to obtain refurbished product as a consequence +of the repair of a product that was defective.

+

Table of contents

+ +
+

Configuration

+
    +
  1. For each product that can potentially be refurbished, define the +refurbished version in the product form.
  2. +
  3. A default ‘Refurbished’ virtual location is created during module install, +and proposed by default on each product.
  4. +
+
+
+

Usage

+
    +
  1. Create an MRP repair.
  2. +
  3. Indicate a product to repair, If the product has a proposed refurbished +version, it will be proposed to be used. The destination location
  4. +
  5. Add operations if needed.
  6. +
  7. Complete the repair.
  8. +
+

The initial product will be moved to the ‘Scrap’ location, and the +refurbished product will be moved from a ‘Refurbish’ location to the desired +destination location.

+

The components that were added to the repair order will be moved to the +‘Refurbish’ location.

+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Eficent
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The initial development of this module has been financially supported by:

+
    +
  • Aleph Objects, Inc.
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/manufacture project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/repair_refurbish/tests/__init__.py b/repair_refurbish/tests/__init__.py new file mode 100644 index 000000000..4e9f9ec0c --- /dev/null +++ b/repair_refurbish/tests/__init__.py @@ -0,0 +1 @@ +from . import test_repair_refurbish diff --git a/repair_refurbish/tests/test_repair_refurbish.py b/repair_refurbish/tests/test_repair_refurbish.py new file mode 100644 index 000000000..28bfba265 --- /dev/null +++ b/repair_refurbish/tests/test_repair_refurbish.py @@ -0,0 +1,91 @@ +# Copyright 2018 Eficent Business and IT Consulting Services S.L. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests.common import TransactionCase + + +class TestMrpMtoWithStock(TransactionCase): + + def setUp(self, *args, **kwargs): + super(TestMrpMtoWithStock, self).setUp(*args, **kwargs) + self.repair_obj = self.env['repair.order'] + self.repair_line_obj = self.env['repair.line'] + self.product_obj = self.env['product.product'] + self.move_obj = self.env['stock.move'] + + self.stock_location_stock = self.env.ref('stock.stock_location_stock') + self.customer_location = self.env.ref('stock.stock_location_customers') + self.refurbish_loc = self.env.ref( + 'repair_refurbish.stock_location_refurbish') + + self.refurbish_product = self.product_obj.create({ + 'name': 'Refurbished Awesome Screen', + 'type': 'product', + }) + self.product = self.product_obj.create({ + 'name': 'Awesome Screen', + 'type': 'product', + 'refurbish_product_id': self.refurbish_product.id, + }) + self.material = self.product_obj.create({ + 'name': 'Materials', + 'type': 'consu', + }) + self._update_product_qty(self.product, self.stock_location_stock, 10.0) + + def _update_product_qty(self, product, location, quantity): + product_qty = self.env['stock.change.product.qty'].create({ + 'location_id': location.id, + 'product_id': product.id, + 'new_quantity': quantity, + }) + product_qty.change_product_qty() + return product_qty + + def test_01_repair_refurbish(self): + """Tests that locations are properly set with a product to + refurbish, then complete repair.""" + repair = self.repair_obj.create({ + 'product_id': self.product.id, + 'product_qty': 3.0, + 'product_uom': self.product.uom_id.id, + 'location_dest_id': self.customer_location.id, + }) + repair.onchange_product_id() + self.assertTrue(repair.to_refurbish) + repair._onchange_to_refurbish() + self.assertEqual(repair.refurbish_location_dest_id, + self.customer_location) + self.assertEqual(repair.location_dest_id, + self.product.property_stock_refurbish) + line = self.repair_line_obj.with_context( + to_refurbish=repair.to_refurbish, + refurbish_location_dest_id=repair.refurbish_location_dest_id, + ).new({ + 'name': 'consume stuff to repair', + 'repair_id': repair.id, + 'type': 'add', + 'product_id': self.material.id, + 'product_uom': self.material.uom_id.id, + 'product_uom_qty': 1.0, + }) + line.onchange_product_id() + line.onchange_operation_type() + self.assertEqual(line.location_id, repair.location_id) + self.assertEqual(line.location_dest_id, self.customer_location) + # Complete repair: + repair.action_validate() + repair.action_repair_start() + repair.action_repair_end() + moves = self.move_obj.search([('reference', '=', repair.name)]) + self.assertEqual(len(moves), 2) + for m in moves: + self.assertEqual(m.state, 'done') + if m.product_id == self.product: + self.assertEqual(m.location_id, self.stock_location_stock) + self.assertEqual(m.location_dest_id, self.refurbish_loc) + elif m.product_id == self.refurbish_product: + self.assertEqual(m.location_id, self.refurbish_loc) + self.assertEqual(m.location_dest_id, self.customer_location) + else: + self.assertTrue(False, "Unexpected move.") diff --git a/repair_refurbish/views/product_product_view.xml b/repair_refurbish/views/product_product_view.xml new file mode 100644 index 000000000..f418118fe --- /dev/null +++ b/repair_refurbish/views/product_product_view.xml @@ -0,0 +1,17 @@ + + + + + product.product.form + product.product + + + + + + + + + + + diff --git a/repair_refurbish/views/product_template_view.xml b/repair_refurbish/views/product_template_view.xml new file mode 100644 index 000000000..cafa2730b --- /dev/null +++ b/repair_refurbish/views/product_template_view.xml @@ -0,0 +1,31 @@ + + + + + product.template.product.form + product.template + + + + + + + + + + + + product.template.stock.property.form.inherit + product.template + + + + + + + + + + diff --git a/repair_refurbish/views/repair_view.xml b/repair_refurbish/views/repair_view.xml new file mode 100644 index 000000000..f47ce2524 --- /dev/null +++ b/repair_refurbish/views/repair_view.xml @@ -0,0 +1,57 @@ + + + + + repair.order.tree + repair.order + + + + + + + + + + repair.order.form + repair.order + + + + + + + + + + + + + + + + + {'default_product_uom_qty': product_qty, 'to_refurbish': to_refurbish, 'refurbish_location_dest_id': location_dest_id} + + + + + + repair.order.select + repair.order + + + + + + + + + + From 065b331eafc60e50aff00f30ac5d381f508a0d02 Mon Sep 17 00:00:00 2001 From: Akim Juillerat Date: Tue, 12 Mar 2019 19:17:07 +0100 Subject: [PATCH 02/17] fixup! [MIG] repair_refurbish (mrp_repair_refurbish): Migration to 12.0 --- repair_refurbish/models/stock_move.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/repair_refurbish/models/stock_move.py b/repair_refurbish/models/stock_move.py index fc25c6c0a..024b76f8d 100644 --- a/repair_refurbish/models/stock_move.py +++ b/repair_refurbish/models/stock_move.py @@ -7,9 +7,10 @@ class StockMove(models.Model): _inherit = 'stock.move' - @api.model - def create(self, vals): + @api.model_create_multi + def create(self, vals_list): if 'force_refurbish_location_dest_id' in self.env.context: - vals['location_dest_id'] = self.env.context[ - 'force_refurbish_location_dest_id'] - return super().create(vals) + for vals in vals_list: + vals['location_dest_id'] = self.env.context[ + 'force_refurbish_location_dest_id'] + return super().create(vals_list) From 731d91c6e3123e45e2cea490b4901169499ba5ba Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 28 Mar 2019 13:07:44 +0000 Subject: [PATCH 03/17] [UPD] README.rst --- repair_refurbish/README.rst | 11 ++++++----- repair_refurbish/static/description/index.html | 7 ++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/repair_refurbish/README.rst b/repair_refurbish/README.rst index 906d14db2..261d0a6e9 100644 --- a/repair_refurbish/README.rst +++ b/repair_refurbish/README.rst @@ -14,13 +14,13 @@ MRP Repair Refurbish :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmanufacture-lightgray.png?logo=github - :target: https://github.com/OCA/manufacture/tree/11.0/mrp_repair_refurbish + :target: https://github.com/OCA/manufacture/tree/12.0/repair_refurbish :alt: OCA/manufacture .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/manufacture-11-0/manufacture-11-0-mrp_repair_refurbish + :target: https://translation.odoo-community.org/projects/manufacture-12-0/manufacture-12-0-repair_refurbish :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/129/11.0 + :target: https://runbot.odoo-community.org/runbot/129/12.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -63,7 +63,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -80,6 +80,7 @@ Contributors * Jordi Ballester Alomar * Lois Rilo +* Akim Juillerat Other credits ~~~~~~~~~~~~~ @@ -101,6 +102,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/manufacture `_ project on GitHub. +This module is part of the `OCA/manufacture `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/repair_refurbish/static/description/index.html b/repair_refurbish/static/description/index.html index 2f153b08c..0e18cabfe 100644 --- a/repair_refurbish/static/description/index.html +++ b/repair_refurbish/static/description/index.html @@ -367,7 +367,7 @@ ul.auto-toc { !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/manufacture Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/manufacture Translate me on Weblate Try me on Runbot

This module adds the ability to obtain refurbished product as a consequence of the repair of a product that was defective.

Table of contents

@@ -414,7 +414,7 @@ destination location.

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us smashing it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -430,6 +430,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
@@ -446,7 +447,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/manufacture project on GitHub.

+

This module is part of the OCA/manufacture project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

From a6fef2d92daeb270281a6ea344bd60d74960ddf5 Mon Sep 17 00:00:00 2001 From: oca-travis Date: Thu, 28 Mar 2019 21:34:46 +0000 Subject: [PATCH 04/17] [UPD] Update repair_refurbish.pot --- repair_refurbish/i18n/de.po | 82 +++++++++++-------- repair_refurbish/i18n/repair_refurbish.pot | 94 ++++++++++++++++++++++ 2 files changed, 142 insertions(+), 34 deletions(-) create mode 100644 repair_refurbish/i18n/repair_refurbish.pot diff --git a/repair_refurbish/i18n/de.po b/repair_refurbish/i18n/de.po index 62ee32573..7e129bbea 100644 --- a/repair_refurbish/i18n/de.po +++ b/repair_refurbish/i18n/de.po @@ -1,6 +1,6 @@ # Translation of Odoo Server. # This file contains the translation of the following modules: -# * mrp_repair_refurbish +# * mrp_repair_refurbish # msgid "" msgstr "" @@ -16,75 +16,89 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.3\n" -#. module: mrp_repair_refurbish -#: model:ir.model,name:mrp_repair_refurbish.model_product_product +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_repair_order__location_dest_id +#, fuzzy +msgid "Delivery Location" +msgstr "Auslieferungslagerort" + +#. module: repair_refurbish +#: model:ir.model,name:repair_refurbish.model_product_product msgid "Product" msgstr "Produkt" -#. module: mrp_repair_refurbish -#: model:ir.model,name:mrp_repair_refurbish.model_product_template +#. module: repair_refurbish +#: model:ir.model,name:repair_refurbish.model_product_template msgid "Product Template" msgstr "Produktvorlage" -#. module: mrp_repair_refurbish -#: model:ir.ui.view,arch_db:mrp_repair_refurbish.product_normal_form_view -#: model:ir.ui.view,arch_db:mrp_repair_refurbish.product_template_only_form_view -#: model:stock.location,name:mrp_repair_refurbish.stock_location_refurbish +#. module: repair_refurbish +#: model_terms:ir.ui.view,arch_db:repair_refurbish.product_normal_form_view +#: model_terms:ir.ui.view,arch_db:repair_refurbish.product_template_only_form_view msgid "Refurbish" msgstr "Wiederaufbereiten" -#. module: mrp_repair_refurbish -#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_product_product_property_stock_refurbish -#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_product_template_property_stock_refurbish +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_product_product__property_stock_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_product_template__property_stock_refurbish msgid "Refurbish Location" msgstr "Lagerort für Wiederaufbereitung" -#. module: mrp_repair_refurbish -#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_refurbish_location_dest_id +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_repair_order__refurbish_location_dest_id msgid "Refurbished Delivery Location" msgstr "Auslieferungslagerort" -#. module: mrp_repair_refurbish -#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_refurbish_move_id +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_repair_order__refurbish_move_id msgid "Refurbished Inventory Move" msgstr "Lagerbewegung" -#. module: mrp_repair_refurbish -#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_refurbish_lot_id +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_repair_order__refurbish_lot_id msgid "Refurbished Lot" msgstr "Wiederaufbereitetes Los" -#. module: mrp_repair_refurbish -#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_product_product_refurbish_product_id -#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_product_template_refurbish_product_id +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_product_product__refurbish_product_id +#: model:ir.model.fields,field_description:repair_refurbish.field_product_template__refurbish_product_id msgid "Refurbished Product" msgstr "Wiederaufbereitetes Produkt" -#. module: mrp_repair_refurbish -#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_refurbish_product_id +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_repair_order__refurbish_product_id msgid "Refurbished product" msgstr "Wiederaufbereitetes Produkt" -#. module: mrp_repair_refurbish -#: model:ir.model,name:mrp_repair_refurbish.model_mrp_repair_line -msgid "Repair Line" +#. module: repair_refurbish +#: model:ir.model,name:repair_refurbish.model_repair_line +#, fuzzy +msgid "Repair Line (parts)" msgstr "Instandsetzungslinie" -#. module: mrp_repair_refurbish -#: model:ir.model,name:mrp_repair_refurbish.model_mrp_repair +#. module: repair_refurbish +#: model:ir.model,name:repair_refurbish.model_repair_order msgid "Repair Order" msgstr "Reparaturauftrag" -#. module: mrp_repair_refurbish -#: model:ir.model.fields,help:mrp_repair_refurbish.field_product_product_property_stock_refurbish -#: model:ir.model.fields,help:mrp_repair_refurbish.field_product_template_property_stock_refurbish -msgid "This stock location will be used, instead of the default one, as the source location for stock moves generated by repair orders when refurbishing takes place." +#. module: repair_refurbish +#: model:ir.model,name:repair_refurbish.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model.fields,help:repair_refurbish.field_product_product__property_stock_refurbish +#: model:ir.model.fields,help:repair_refurbish.field_product_template__property_stock_refurbish +msgid "" +"This stock location will be used, instead of the default one, as the source " +"location for stock moves generated by repair orders when refurbishing takes " +"place." msgstr "" "Dieser Lagerort wird anstatt des Standardlagerortes als Quelllager für " "Lagerbewegungen verwendet, die durch Reparaturaufträge bei der " "Wiederaufbereitung erzeugt werden." -#. module: mrp_repair_refurbish -#: model:ir.model.fields,field_description:mrp_repair_refurbish.field_mrp_repair_to_refurbish +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_repair_order__to_refurbish msgid "To Refurbish" msgstr "Wiederaufbereiten" diff --git a/repair_refurbish/i18n/repair_refurbish.pot b/repair_refurbish/i18n/repair_refurbish.pot new file mode 100644 index 000000000..5cbe0602e --- /dev/null +++ b/repair_refurbish/i18n/repair_refurbish.pot @@ -0,0 +1,94 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * repair_refurbish +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_repair_order__location_dest_id +msgid "Delivery Location" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model,name:repair_refurbish.model_product_product +msgid "Product" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model,name:repair_refurbish.model_product_template +msgid "Product Template" +msgstr "" + +#. module: repair_refurbish +#: model_terms:ir.ui.view,arch_db:repair_refurbish.product_normal_form_view +#: model_terms:ir.ui.view,arch_db:repair_refurbish.product_template_only_form_view +msgid "Refurbish" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_product_product__property_stock_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_product_template__property_stock_refurbish +msgid "Refurbish Location" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_repair_order__refurbish_location_dest_id +msgid "Refurbished Delivery Location" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_repair_order__refurbish_move_id +msgid "Refurbished Inventory Move" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_repair_order__refurbish_lot_id +msgid "Refurbished Lot" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_product_product__refurbish_product_id +#: model:ir.model.fields,field_description:repair_refurbish.field_product_template__refurbish_product_id +msgid "Refurbished Product" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_repair_order__refurbish_product_id +msgid "Refurbished product" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model,name:repair_refurbish.model_repair_line +msgid "Repair Line (parts)" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model,name:repair_refurbish.model_repair_order +msgid "Repair Order" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model,name:repair_refurbish.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: repair_refurbish +#: model:ir.model.fields,help:repair_refurbish.field_product_product__property_stock_refurbish +#: model:ir.model.fields,help:repair_refurbish.field_product_template__property_stock_refurbish +msgid "This stock location will be used, instead of the default one, as the source location for stock moves generated by repair orders when refurbishing takes place." +msgstr "" + +#. module: repair_refurbish +#: model:ir.model.fields,field_description:repair_refurbish.field_repair_order__to_refurbish +msgid "To Refurbish" +msgstr "" + From 20fe31b178effda26731d932592220bf4281a74c Mon Sep 17 00:00:00 2001 From: Bhavesh Odedra Date: Fri, 12 Apr 2019 23:03:52 +0530 Subject: [PATCH 05/17] [FIX] repair_refurbish, product with tracking show error when end repair order --- repair_refurbish/__manifest__.py | 2 +- repair_refurbish/models/repair.py | 13 +++++++++++-- repair_refurbish/readme/CONTRIBUTORS.rst | 1 + 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/repair_refurbish/__manifest__.py b/repair_refurbish/__manifest__.py index 10b60bdbc..09ac4ed0f 100644 --- a/repair_refurbish/__manifest__.py +++ b/repair_refurbish/__manifest__.py @@ -3,7 +3,7 @@ { "name": "MRP Repair Refurbish", "summary": "Create refurbished products during repair", - "version": "12.0.1.0.1", + "version": "12.0.1.1.1", "category": "Manufacturing", "website": "https://github.com/OCA/manufacture", "author": "Eficent, Odoo Community Association (OCA)", diff --git a/repair_refurbish/models/repair.py b/repair_refurbish/models/repair.py index dc0033c11..01dcbe825 100644 --- a/repair_refurbish/models/repair.py +++ b/repair_refurbish/models/repair.py @@ -49,8 +49,17 @@ class RepairOrder(models.Model): self.address_id.id or False, 'location_id': self.location_dest_id.id, 'location_dest_id': self.refurbish_location_dest_id.id, - 'restrict_lot_id': self.refurbish_lot_id.id, - } + 'move_line_ids': [(0, 0, { + 'product_id': self.refurbish_product_id.id, + 'lot_id': self.refurbish_lot_id.id, + 'product_uom_qty': self.product_qty, + 'product_uom_id': self.product_uom.id or + self.refurbish_product_id.uom_id.id, + 'qty_done': self.product_qty, + 'package_id': False, + 'result_package_id': False, + 'location_id': self.location_dest_id.id, + 'location_dest_id': self.refurbish_location_dest_id.id})]} @api.multi def action_repair_done(self): diff --git a/repair_refurbish/readme/CONTRIBUTORS.rst b/repair_refurbish/readme/CONTRIBUTORS.rst index 30781998a..2c6fe617d 100644 --- a/repair_refurbish/readme/CONTRIBUTORS.rst +++ b/repair_refurbish/readme/CONTRIBUTORS.rst @@ -1,3 +1,4 @@ * Jordi Ballester Alomar * Lois Rilo * Akim Juillerat +* Bhavesh Odedra From 3b1f53ecdbe3b8e8dafd28f580aa045e33d31c25 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 22 Apr 2019 07:07:44 +0000 Subject: [PATCH 06/17] [UPD] README.rst --- repair_refurbish/README.rst | 1 + repair_refurbish/static/description/index.html | 1 + 2 files changed, 2 insertions(+) diff --git a/repair_refurbish/README.rst b/repair_refurbish/README.rst index 261d0a6e9..72524df28 100644 --- a/repair_refurbish/README.rst +++ b/repair_refurbish/README.rst @@ -81,6 +81,7 @@ Contributors * Jordi Ballester Alomar * Lois Rilo * Akim Juillerat +* Bhavesh Odedra Other credits ~~~~~~~~~~~~~ diff --git a/repair_refurbish/static/description/index.html b/repair_refurbish/static/description/index.html index 0e18cabfe..802a7d570 100644 --- a/repair_refurbish/static/description/index.html +++ b/repair_refurbish/static/description/index.html @@ -431,6 +431,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
  • Jordi Ballester Alomar <jordi.ballester@eficent.com>
  • Lois Rilo <lois.rilo@eficent.com>
  • Akim Juillerat <akim.juillerat@camptocamp.com>
  • +
  • Bhavesh Odedra <bodedra@opensourceintegrators.com>
  • From e50727eaf4c2d6141193f00cf719c285212b3a87 Mon Sep 17 00:00:00 2001 From: remi-filament <30716308+remi-filament@users.noreply.github.com> Date: Mon, 29 Apr 2019 10:18:19 +0200 Subject: [PATCH 07/17] Fix pyflakes issue --- repair_refurbish/models/product_template.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/repair_refurbish/models/product_template.py b/repair_refurbish/models/product_template.py index a41024d39..3b6935e72 100644 --- a/repair_refurbish/models/product_template.py +++ b/repair_refurbish/models/product_template.py @@ -10,7 +10,8 @@ class ProductTemplate(models.Model): refurbish_product_id = fields.Many2one( comodel_name='product.product', string='Refurbished Product', compute='_compute_refurbish_product', - inverse='_set_refurbish_product', search='_search_refurbish_product', + inverse='_inverse_refurbish_product', + search='_search_refurbish_product', domain="[('type', '=', 'product')]") property_stock_refurbish = fields.Many2one( @@ -31,7 +32,7 @@ class ProductTemplate(models.Model): template.product_variant_ids.refurbish_product_id @api.multi - def _set_refurbish_product(self): + def _inverse_refurbish_product(self): for rec in self: if len(rec.product_variant_ids) == 1: rec.product_variant_ids.refurbish_product_id = \ From 6581f8ca01262899962572657aa0e45a86efb86e Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 29 Jul 2019 03:10:43 +0000 Subject: [PATCH 08/17] [UPD] README.rst --- repair_refurbish/static/description/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repair_refurbish/static/description/index.html b/repair_refurbish/static/description/index.html index 802a7d570..6799e77ed 100644 --- a/repair_refurbish/static/description/index.html +++ b/repair_refurbish/static/description/index.html @@ -3,7 +3,7 @@ - + MRP Repair Refurbish