[MIG] scrap_reason_code from v11 to v13

This commit is contained in:
Khalid
2020-01-28 15:35:40 +05:30
committed by Chandresh Thakkar
parent c233777853
commit 0cc4e786c5
14 changed files with 124 additions and 127 deletions

View File

@@ -14,13 +14,13 @@ Scrap Reason Code
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3 :alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--warehouse-lightgray.png?logo=github .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstock--logistics--warehouse-lightgray.png?logo=github
:target: https://github.com/OCA/stock-logistics-warehouse/tree/11.0/scrap_reason_code :target: https://github.com/OCA/stock-logistics-warehouse/tree/13.0/scrap_reason_code
:alt: OCA/stock-logistics-warehouse :alt: OCA/stock-logistics-warehouse
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-11-0/stock-logistics-warehouse-11-0-scrap_reason_code :target: https://translation.odoo-community.org/projects/stock-logistics-warehouse-13-0/stock-logistics-warehouse-13-0-scrap_reason_code
:alt: Translate me on Weblate :alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/153/11.0 :target: https://runbot.odoo-community.org/runbot/153/13.0
:alt: Try me on Runbot :alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5| |badge1| |badge2| |badge3| |badge4| |badge5|
@@ -65,6 +65,7 @@ Contributors
* Michael Allen <mallen@opensourceintegrators.com> * Michael Allen <mallen@opensourceintegrators.com>
* Bhavesh Odedra <bodedra@opensourceintegrators.com> * Bhavesh Odedra <bodedra@opensourceintegrators.com>
* Balaji Kannan <bkannan@opensourceintegrators.com> * Balaji Kannan <bkannan@opensourceintegrators.com>
* Serpent Consulting Services Pvt. Ltd. <support@serpentcs.com>
Other credits Other credits
~~~~~~~~~~~~~ ~~~~~~~~~~~~~
@@ -94,6 +95,6 @@ Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-bodedra| |maintainer-bodedra|
This module is part of the `OCA/stock-logistics-warehouse <https://github.com/OCA/stock-logistics-warehouse/tree/11.0/scrap_reason_code>`_ project on GitHub. This module is part of the `OCA/stock-logistics-warehouse <https://github.com/OCA/stock-logistics-warehouse/tree/13.0/scrap_reason_code>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -1,5 +1,3 @@
# Copyright (C) 2019 IBM Corp.
# Copyright (C) 2019 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import models from . import models

View File

@@ -1,26 +1,20 @@
# Copyright (C) 2019 IBM Corp.
# Copyright (C) 2019 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{ {
'name': 'Scrap Reason Code', "name": "Scrap Reason Code",
'version': '11.0.1.0.0', "version": "13.0.1.0.0",
'license': 'AGPL-3', "license": "AGPL-3",
'summary': 'Reason code for scrapping', "summary": "Reason code for scrapping",
'author': 'Open Source Integrators, Odoo Community Association (OCA)', "author": "Open Source Integrators, Odoo Community Association (OCA)",
'website': 'https://github.com/OCA/stock-logistics-warehouse', "website": "https://github.com/OCA/stock-logistics-warehouse",
'category': 'Warehouse Management', "category": "Warehouse Management",
'depends': [ "depends": ["stock"],
'stock', "data": [
"security/ir.model.access.csv",
"views/reason_code_view.xml",
"views/stock_scrap_views.xml",
"views/stock_move_views.xml",
], ],
'data': [ "maintainers": ["bodedra"],
'security/ir.model.access.csv', "installable": True,
'views/reason_code_view.xml',
'views/stock_scrap_views.xml',
'views/stock_move_views.xml',
],
'auto_install': False,
'application': False,
'maintainers': ['bodedra'],
'installable': True,
} }

View File

@@ -1,5 +1,3 @@
# Copyright (C) 2019 IBM Corp.
# Copyright (C) 2019 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import reason_code from . import reason_code

View File

@@ -6,11 +6,13 @@ from odoo import fields, models
class ReasonCode(models.Model): class ReasonCode(models.Model):
_name = 'reason.code' _name = "reason.code"
_description = 'Reason Code' _description = "Reason Code"
name = fields.Char("Code", required=True) name = fields.Char("Code", required=True)
description = fields.Text("Description") description = fields.Text("Description")
location_id = fields.Many2one( location_id = fields.Many2one(
'stock.location', string="Scrap Location", "stock.location",
domain="[('scrap_location', '=', True)]") string="Scrap Location",
domain="[('scrap_location', '=', True)]",
)

View File

@@ -6,6 +6,6 @@ from odoo import fields, models
class StockMove(models.Model): class StockMove(models.Model):
_inherit = 'stock.move' _inherit = "stock.move"
reason_code_id = fields.Many2one('reason.code', string='Reason code') reason_code_id = fields.Many2one("reason.code", string="Reason code")

View File

@@ -6,35 +6,38 @@ from odoo import api, fields, models
class StockScrap(models.Model): class StockScrap(models.Model):
_inherit = 'stock.scrap' _inherit = "stock.scrap"
reason_code_id = fields.Many2one( reason_code_id = fields.Many2one(
'reason.code', string='Reason Code', "reason.code", string="Reason Code", states={"done": [("readonly", True)]}
states={'done': [('readonly', True)]}) )
scrap_location_id = fields.Many2one( scrap_location_id = fields.Many2one(
'stock.location', 'Scrap Location', "stock.location", "Scrap Location", required=True, readonly=True
required=True, readonly=True) )
def _prepare_move_values(self): def _prepare_move_values(self):
res = super(StockScrap, self)._prepare_move_values() res = super(StockScrap, self)._prepare_move_values()
res['reason_code_id'] = self.reason_code_id.id res["reason_code_id"] = self.reason_code_id.id
return res return res
@api.onchange('reason_code_id') @api.onchange("reason_code_id")
def _onchange_reason_code_id(self): def _onchange_reason_code_id(self):
if self.reason_code_id.location_id: if self.reason_code_id.location_id:
self.scrap_location_id = self.reason_code_id.location_id self.scrap_location_id = self.reason_code_id.location_id
@api.multi
def write(self, vals): def write(self, vals):
if 'reason_code_id' in vals: if "reason_code_id" in vals:
self.scrap_location_id = self.env['reason.code'].browse( self.scrap_location_id = (
vals.get('reason_code_id')).location_id self.env["reason.code"].browse(vals.get("reason_code_id")).location_id
)
return super(StockScrap, self).write(vals) return super(StockScrap, self).write(vals)
@api.model @api.model
def create(self, vals): def create(self, vals):
if 'reason_code_id' in vals: if "reason_code_id" in vals:
vals['scrap_location_id'] = self.env['reason.code'].browse( vals["scrap_location_id"] = (
vals.get('reason_code_id')).location_id.id self.env["reason.code"]
.browse(vals.get("reason_code_id"))
.location_id.id
)
return super(StockScrap, self).create(vals) return super(StockScrap, self).create(vals)

View File

@@ -1,3 +1,4 @@
* Michael Allen <mallen@opensourceintegrators.com> * Michael Allen <mallen@opensourceintegrators.com>
* Bhavesh Odedra <bodedra@opensourceintegrators.com> * Bhavesh Odedra <bodedra@opensourceintegrators.com>
* Balaji Kannan <bkannan@opensourceintegrators.com> * Balaji Kannan <bkannan@opensourceintegrators.com>
* Serpent Consulting Services Pvt. Ltd. <support@serpentcs.com>

View File

@@ -1,5 +1,3 @@
# Copyright (C) 2019 IBM Corp.
# Copyright (C) 2019 Open Source Integrators
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from . import test_scrap_reason_code from . import test_scrap_reason_code

View File

@@ -9,72 +9,94 @@ class StockScrap(TransactionCase):
def setUp(self): def setUp(self):
super(StockScrap, self).setUp() super(StockScrap, self).setUp()
self.stock_location = self.env.ref('stock.stock_location_stock') self.stock_location = self.env.ref("stock.stock_location_stock")
self.customer_location = self.env.ref('stock.stock_location_customers') self.customer_location = self.env.ref("stock.stock_location_customers")
self.scrapped_location = self.env.ref('stock.stock_location_scrapped') stock_location_locations_virtual = self.env["stock.location"].create(
{"name": "Virtual Locations", "usage": "view", "posz": 1}
)
self.scrapped_location = self.env["stock.location"].create(
{
"name": "Scrapped",
"location_id": stock_location_locations_virtual.id,
"scrap_location": True,
"usage": "inventory",
}
)
self.scrap_product = self.env['product.product'].create({ self.scrap_product = self.env["product.product"].create(
'name': 'Scrap Product A', {
'type': 'product', "name": "Scrap Product A",
'categ_id': self.env.ref('product.product_category_all').id, "type": "product",
}) "categ_id": self.env.ref("product.product_category_all").id,
}
)
self.reason_code = self.env['reason.code'].create({ self.reason_code = self.env["reason.code"].create(
'name': 'DM300', {
'description': 'Product is damage', "name": "DM300",
'location_id': self.scrapped_location.id "description": "Product is damage",
}) "location_id": self.scrapped_location.id,
}
)
self.uom_unit = self.env.ref('product.product_uom_unit') self.uom_unit = self.env.ref("uom.product_uom_unit")
def test_scrap_reason_code(self): def test_scrap_reason_code(self):
""" Scrap the product of a picking. Then modify the """Scrap the product of a picking. Then modify the
done linked stock move and ensure the scrap quantity is also done linked stock move and ensure the scrap quantity is also
updated and verify scrap reason code updated and verify scrap reason code
""" """
self.env['stock.quant']._update_available_quantity(self.scrap_product, self.env["stock.quant"]._update_available_quantity(
self.stock_location, self.scrap_product, self.stock_location, 10
10) )
partner = self.env['res.partner'].create({'name': 'BOdedra'}) partner = self.env["res.partner"].create({"name": "BOdedra"})
picking = self.env['stock.picking'].create({ picking = self.env["stock.picking"].create(
'name': 'A single picking with one move to scrap', {
'location_id': self.stock_location.id, "name": "A single picking with one move to scrap",
'location_dest_id': self.customer_location.id, "location_id": self.stock_location.id,
'partner_id': partner.id, "location_dest_id": self.customer_location.id,
'picking_type_id': self.env.ref('stock.picking_type_out').id, "partner_id": partner.id,
}) "picking_type_id": self.env.ref("stock.picking_type_out").id,
move1 = self.env['stock.move'].create({ }
'name': 'A move to confirm and scrap its product', )
'location_id': self.stock_location.id, move1 = self.env["stock.move"].create(
'location_dest_id': self.customer_location.id, {
'product_id': self.scrap_product.id, "name": "A move to confirm and scrap its product",
'product_uom': self.uom_unit.id, "location_id": self.stock_location.id,
'product_uom_qty': 1.0, "location_dest_id": self.customer_location.id,
'picking_id': picking.id, "product_id": self.scrap_product.id,
}) "product_uom": self.uom_unit.id,
"product_uom_qty": 1.0,
"picking_id": picking.id,
}
)
move1._action_confirm() move1._action_confirm()
self.assertEqual(move1.state, 'confirmed') self.assertEqual(move1.state, "confirmed")
scrap = self.env['stock.scrap'].create({ scrap = self.env["stock.scrap"].create(
'product_id': self.scrap_product.id, {
'product_uom_id': self.scrap_product.uom_id.id, "product_id": self.scrap_product.id,
'scrap_qty': 5, "product_uom_id": self.scrap_product.uom_id.id,
'picking_id': picking.id, "scrap_qty": 5,
'reason_code_id': self.reason_code.id "picking_id": picking.id,
}) "reason_code_id": self.reason_code.id,
}
)
scrap._onchange_reason_code_id() scrap._onchange_reason_code_id()
scrap.do_scrap() scrap.do_scrap()
self.assertEqual(len(picking.move_lines), 2) self.assertEqual(len(picking.move_lines), 2)
scrapped_move = picking.move_lines.filtered( scrapped_move = picking.move_lines.filtered(lambda m: m.state == "done")
lambda m: m.state == 'done') self.assertTrue(scrapped_move, "No scrapped move created.")
self.assertTrue(scrapped_move, 'No scrapped move created.') self.assertEqual(
self.assertEqual(scrapped_move.scrap_ids.ids, [scrap.id], scrapped_move.scrap_ids.ids, [scrap.id], "Wrong scrap linked to the move."
'Wrong scrap linked to the move.') )
self.assertEqual(scrap.scrap_qty, 5, self.assertEqual(
'Scrap quantity has been modified and is not ' scrap.scrap_qty,
'correct anymore.') 5,
"Scrap quantity has been modified and is not " "correct anymore.",
)
move = scrap.move_id move = scrap.move_id
self.assertEqual(move.reason_code_id.id, self.reason_code.id) self.assertEqual(move.reason_code_id.id, self.reason_code.id)
scrapped_move.quantity_done = 8 scrapped_move.quantity_done = 8
self.assertEqual(scrap.scrap_qty, 8, 'Scrap quantity is not updated.') self.assertEqual(scrap.scrap_qty, 8, "Scrap quantity is not updated.")

View File

@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2019 Open Source Integrators <!-- Copyright 2019 Open Source Integrators
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
@@ -38,7 +37,6 @@
<record id="open_view_reason_code_form" model="ir.actions.act_window"> <record id="open_view_reason_code_form" model="ir.actions.act_window">
<field name="name">Scrap Reason Codes</field> <field name="name">Scrap Reason Codes</field>
<field name="res_model">reason.code</field> <field name="res_model">reason.code</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form</field>
</record> </record>

View File

@@ -1,24 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2019 Open Source Integrators <!-- Copyright 2019 Open Source Integrators
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<odoo> <odoo>
<!-- Stock move Form view -->
<record id="stock_move_reason_code_form" model="ir.ui.view">
<field name="name">stock.move.reason.code.form</field>
<field name="model">stock.move</field>
<field name="inherit_id" ref="stock.view_move_picking_form"/>
<field name="arch" type="xml">
<xpath expr="//group[1]" position='after'>
<field name="scrapped" invisible="1"/>
<group string="Reason Code" attrs="{'invisible': [('scrapped', '!=', True)]}">
<field name="reason_code_id"/>
</group>
</xpath>
</field>
</record>
<record id="stock_reason_code_form" model="ir.ui.view"> <record id="stock_reason_code_form" model="ir.ui.view">
<field name="name">stock.reason.code.form</field> <field name="name">stock.reason.code.form</field>
<field name="model">stock.move</field> <field name="model">stock.move</field>

View File

@@ -1,4 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2019 Open Source Integrators <!-- Copyright 2019 Open Source Integrators
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). --> License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->