[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,16 +14,16 @@ Scrap Reason Code
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |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
.. |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
.. |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
|badge1| |badge2| |badge3| |badge4| |badge5|
|badge1| |badge2| |badge3| |badge4| |badge5|
Adds a reason code for scrapping operations and an interface for the user
to create scrap codes
@@ -37,7 +37,7 @@ Usage
=====
In the Inventory module, open the Configuration menu and select Scrap Reason Codes.
Create the required scrap reason codes. Under Operations, select Scrap. Click the
Create the required scrap reason codes. Under Operations, select Scrap. Click the
create button to create a new scrap order. You will see a reason code field on the
scrap form which will allow you to select any of the scrap codes you created previously.
@@ -65,6 +65,7 @@ Contributors
* Michael Allen <mallen@opensourceintegrators.com>
* Bhavesh Odedra <bodedra@opensourceintegrators.com>
* Balaji Kannan <bkannan@opensourceintegrators.com>
* Serpent Consulting Services Pvt. Ltd. <support@serpentcs.com>
Other credits
~~~~~~~~~~~~~
@@ -92,8 +93,8 @@ promote its widespread use.
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.

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).
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).
{
'name': 'Scrap Reason Code',
'version': '11.0.1.0.0',
'license': 'AGPL-3',
'summary': 'Reason code for scrapping',
'author': 'Open Source Integrators, Odoo Community Association (OCA)',
'website': 'https://github.com/OCA/stock-logistics-warehouse',
'category': 'Warehouse Management',
'depends': [
'stock',
"name": "Scrap Reason Code",
"version": "13.0.1.0.0",
"license": "AGPL-3",
"summary": "Reason code for scrapping",
"author": "Open Source Integrators, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/stock-logistics-warehouse",
"category": "Warehouse Management",
"depends": ["stock"],
"data": [
"security/ir.model.access.csv",
"views/reason_code_view.xml",
"views/stock_scrap_views.xml",
"views/stock_move_views.xml",
],
'data': [
'security/ir.model.access.csv',
'views/reason_code_view.xml',
'views/stock_scrap_views.xml',
'views/stock_move_views.xml',
],
'auto_install': False,
'application': False,
'maintainers': ['bodedra'],
'installable': True,
"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).
from . import reason_code

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
In the Inventory module, open the Configuration menu and select Scrap Reason Codes.
Create the required scrap reason codes. Under Operations, select Scrap. Click the
Create the required scrap reason codes. Under Operations, select Scrap. Click the
create button to create a new scrap order. You will see a reason code field on the
scrap form which will allow you to select any of the scrap codes you created previously.

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).
from . import test_scrap_reason_code

View File

@@ -9,72 +9,94 @@ class StockScrap(TransactionCase):
def setUp(self):
super(StockScrap, self).setUp()
self.stock_location = self.env.ref('stock.stock_location_stock')
self.customer_location = self.env.ref('stock.stock_location_customers')
self.scrapped_location = self.env.ref('stock.stock_location_scrapped')
self.stock_location = self.env.ref("stock.stock_location_stock")
self.customer_location = self.env.ref("stock.stock_location_customers")
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({
'name': 'Scrap Product A',
'type': 'product',
'categ_id': self.env.ref('product.product_category_all').id,
})
self.scrap_product = self.env["product.product"].create(
{
"name": "Scrap Product A",
"type": "product",
"categ_id": self.env.ref("product.product_category_all").id,
}
)
self.reason_code = self.env['reason.code'].create({
'name': 'DM300',
'description': 'Product is damage',
'location_id': self.scrapped_location.id
})
self.reason_code = self.env["reason.code"].create(
{
"name": "DM300",
"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):
""" 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
updated and verify scrap reason code
"""
self.env['stock.quant']._update_available_quantity(self.scrap_product,
self.stock_location,
10)
partner = self.env['res.partner'].create({'name': 'BOdedra'})
picking = self.env['stock.picking'].create({
'name': 'A single picking with one move to scrap',
'location_id': self.stock_location.id,
'location_dest_id': self.customer_location.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,
'location_dest_id': self.customer_location.id,
'product_id': self.scrap_product.id,
'product_uom': self.uom_unit.id,
'product_uom_qty': 1.0,
'picking_id': picking.id,
})
self.env["stock.quant"]._update_available_quantity(
self.scrap_product, self.stock_location, 10
)
partner = self.env["res.partner"].create({"name": "BOdedra"})
picking = self.env["stock.picking"].create(
{
"name": "A single picking with one move to scrap",
"location_id": self.stock_location.id,
"location_dest_id": self.customer_location.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,
"location_dest_id": self.customer_location.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()
self.assertEqual(move1.state, 'confirmed')
scrap = self.env['stock.scrap'].create({
'product_id': self.scrap_product.id,
'product_uom_id': self.scrap_product.uom_id.id,
'scrap_qty': 5,
'picking_id': picking.id,
'reason_code_id': self.reason_code.id
})
self.assertEqual(move1.state, "confirmed")
scrap = self.env["stock.scrap"].create(
{
"product_id": self.scrap_product.id,
"product_uom_id": self.scrap_product.uom_id.id,
"scrap_qty": 5,
"picking_id": picking.id,
"reason_code_id": self.reason_code.id,
}
)
scrap._onchange_reason_code_id()
scrap.do_scrap()
self.assertEqual(len(picking.move_lines), 2)
scrapped_move = picking.move_lines.filtered(
lambda m: m.state == 'done')
self.assertTrue(scrapped_move, 'No scrapped move created.')
self.assertEqual(scrapped_move.scrap_ids.ids, [scrap.id],
'Wrong scrap linked to the move.')
self.assertEqual(scrap.scrap_qty, 5,
'Scrap quantity has been modified and is not '
'correct anymore.')
scrapped_move = picking.move_lines.filtered(lambda m: m.state == "done")
self.assertTrue(scrapped_move, "No scrapped move created.")
self.assertEqual(
scrapped_move.scrap_ids.ids, [scrap.id], "Wrong scrap linked to the move."
)
self.assertEqual(
scrap.scrap_qty,
5,
"Scrap quantity has been modified and is not " "correct anymore.",
)
move = scrap.move_id
self.assertEqual(move.reason_code_id.id, self.reason_code.id)
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
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">
<field name="name">Scrap Reason Codes</field>
<field name="res_model">reason.code</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>

View File

@@ -1,24 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright 2019 Open Source Integrators
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->
<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">
<field name="name">stock.reason.code.form</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
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -->