Skip to content

Commit

Permalink
mrp_subcontracting_purchase: new module copied from 15.0
Browse files Browse the repository at this point in the history
Add a new module to add smart buttons between a subcontracting purchase
order and the ressuply component delivery.

task-2486811

Part-of: odoo/odoo#75041
  • Loading branch information
Odoo SA authored and geomer198 committed Oct 13, 2023
1 parent 851840d commit d59b6b6
Show file tree
Hide file tree
Showing 9 changed files with 171 additions and 0 deletions.
4 changes: 4 additions & 0 deletions mrp_subcontracting_purchase/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from . import models
19 changes: 19 additions & 0 deletions mrp_subcontracting_purchase/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

{
'name': 'Purchase and Subcontracting Management',
'version': '0.1',
'category': 'Manufacturing/Purchase',
'description': """
This bridge module adds some smart buttons between Purchase and Subcontracting
""",
'depends': ['mrp_subcontracting', 'purchase'],
'data': [
'views/purchase_order_views.xml',
'views/stock_picking_views.xml',
],
'installable': True,
'auto_install': True,
'license': 'LGPL-3',
}
5 changes: 5 additions & 0 deletions mrp_subcontracting_purchase/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from . import stock_picking
from . import purchase_order
25 changes: 25 additions & 0 deletions mrp_subcontracting_purchase/models/purchase_order.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from odoo import models, fields, api


class PurchaseOrder(models.Model):
_inherit = 'purchase.order'

subcontracting_resupply_picking_count = fields.Integer(
"Count of Subcontracting Resupply", compute='_compute_subcontracting_resupply_picking_count',
help="Count of Subcontracting Resupply for component")

@api.depends('order_line.move_ids')
def _compute_subcontracting_resupply_picking_count(self):
for purchase in self:
purchase.subcontracting_resupply_picking_count = len(purchase._get_subcontracting_resupplies())

def action_view_subcontracting_resupply(self):
return self._get_action_view_picking(self._get_subcontracting_resupplies())

def _get_subcontracting_resupplies(self):
moves_subcontracted = self.order_line.move_ids.filtered(lambda m: m.is_subcontract)
subcontracted_productions = moves_subcontracted.move_orig_ids.production_id
return subcontracted_productions.picking_ids
40 changes: 40 additions & 0 deletions mrp_subcontracting_purchase/models/stock_picking.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from odoo import models, fields, api, _


class StockPicking(models.Model):
_inherit = 'stock.picking'

subcontracting_source_purchase_count = fields.Integer(
"Number of subcontracting PO Source", compute='_compute_subcontracting_source_purchase_count',
help="Number of subcontracting Purchase Order Source")

@api.depends('move_lines.move_dest_ids.raw_material_production_id')
def _compute_subcontracting_source_purchase_count(self):
for picking in self:
picking.subcontracting_source_purchase_count = len(picking._get_subcontracting_source_purchase())

def action_view_subcontracting_source_purchase(self):
purchase_order_ids = self._get_subcontracting_source_purchase().ids
action = {
'res_model': 'purchase.order',
'type': 'ir.actions.act_window',
}
if len(purchase_order_ids) == 1:
action.update({
'view_mode': 'form',
'res_id': purchase_order_ids[0],
})
else:
action.update({
'name': _("Source PO of %s", self.name),
'domain': [('id', 'in', purchase_order_ids)],
'view_mode': 'tree,form',
})
return action

def _get_subcontracting_source_purchase(self):
moves_subcontracted = self.move_lines.move_dest_ids.raw_material_production_id.move_finished_ids.move_dest_ids.filtered(lambda m: m.is_subcontract)
return moves_subcontracted.purchase_line_id.order_id
3 changes: 3 additions & 0 deletions mrp_subcontracting_purchase/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-

from . import test_mrp_subcontracting_purchase
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from odoo import Command

from odoo.addons.mrp_subcontracting.tests.common import TestMrpSubcontractingCommon


class MrpSubcontractingPurchaseTest(TestMrpSubcontractingCommon):

def test_count_smart_buttons(self):
resupply_sub_on_order_route = self.env['stock.location.route'].search([('name', '=', 'Resupply Subcontractor on Order')])
(self.comp1 + self.comp2).write({'route_ids': [Command.link(resupply_sub_on_order_route.id)]})

# I create a draft Purchase Order for first in move for 10 kg at 50 euro
po = self.env['purchase.order'].create({
'partner_id': self.subcontractor_partner1.id,
'order_line': [Command.create({
'name': 'finished',
'product_id': self.finished.id,
'product_qty': 1.0,
'product_uom': self.finished.uom_id.id,
'price_unit': 50.0}
)],
})

po.button_confirm()

self.assertEqual(po.subcontracting_resupply_picking_count, 1)
action1 = po.action_view_subcontracting_resupply()
picking = self.env[action1['res_model']].browse(action1['res_id'])
self.assertEqual(picking.subcontracting_source_purchase_count, 1)
action2 = picking.action_view_subcontracting_source_purchase()
po_action2 = self.env[action2['res_model']].browse(action2['res_id'])
self.assertEqual(po_action2, po)
20 changes: 20 additions & 0 deletions mrp_subcontracting_purchase/views/purchase_order_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="purchase_order_form_mrp_subcontracting_purchase" model="ir.ui.view">
<field name="name">purchase.order.inherited.form.mrp.subcontracting.purchase</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('oe_button_box')]/button[@name='action_view_picking']" position="before">
<button
class="oe_stat_button" name="action_view_subcontracting_resupply"
type="object" icon="fa-truck" attrs="{'invisible': [('subcontracting_resupply_picking_count', '=', 0)]}" groups="stock.group_stock_user">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value"><field name="subcontracting_resupply_picking_count"/></span>
<span class="o_stat_text">Resupply</span>
</div>
</button>
</xpath>
</field>
</record>
</odoo>
20 changes: 20 additions & 0 deletions mrp_subcontracting_purchase/views/stock_picking_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="stock_picking_form_mrp_subcontracting" model="ir.ui.view">
<field name="name">stock.picking.inherited.form.mrp.subcontracting</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('oe_button_box')]" position="inside">
<button
class="oe_stat_button" name="action_view_subcontracting_source_purchase"
type="object" icon="fa-shopping-cart" attrs="{'invisible': [('subcontracting_source_purchase_count', '=', 0)]}" groups="stock.group_stock_user">
<div class="o_field_widget o_stat_info">
<span class="o_stat_value"><field name="subcontracting_source_purchase_count"/></span>
<span class="o_stat_text">Source PO</span>
</div>
</button>
</xpath>
</field>
</record>
</odoo>

0 comments on commit d59b6b6

Please sign in to comment.