forked from Mapan/odoo17e
99 lines
5.0 KiB
Python
99 lines
5.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo.addons.mrp_subcontracting.tests.common import TestMrpSubcontractingCommon
|
|
from odoo.fields import Command
|
|
from odoo.tests import Form
|
|
|
|
|
|
class TestReportsMrpAccountSubcontracting(TestMrpSubcontractingCommon):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
in_picking_type = cls.env.ref('stock.picking_type_in')
|
|
supplier_location = cls.env.ref('stock.stock_location_suppliers')
|
|
stock_location = cls.env.ref('stock.stock_location_stock')
|
|
cls.picking = cls.env['stock.picking'].create({
|
|
'location_id': supplier_location.id,
|
|
'location_dest_id': stock_location.id,
|
|
'picking_type_id': in_picking_type.id,
|
|
'partner_id': cls.subcontractor_partner1.id,
|
|
'move_ids_without_package': [Command.create({
|
|
'name': 'test_mrp_cost_structure_subcontracting',
|
|
'product_id': cls.finished.id,
|
|
'product_uom_qty': 2,
|
|
'location_id': supplier_location.id,
|
|
'location_dest_id': stock_location.id,
|
|
'product_uom': cls.finished.uom_id.id,
|
|
'price_unit': 25,
|
|
})]
|
|
})
|
|
|
|
def test_mrp_cost_structure_and_mrp_report_subcontracting(self):
|
|
""" Check that values of mrp_cost_structure are correctly calculated for subcontracting """
|
|
|
|
self.picking.action_confirm()
|
|
self.assertEqual(self.picking.move_ids_without_package.is_subcontract, True)
|
|
|
|
self.picking.move_ids_without_package.quantity = 2
|
|
self.picking.button_validate()
|
|
|
|
self.env.flush_all() # Need to flush for mrp report
|
|
|
|
mo_subcontracted = self.env['mrp.production'].search([('product_id', '=', self.finished.id)], limit=1)
|
|
self.assertTrue(mo_subcontracted)
|
|
self.assertEqual(mo_subcontracted.state, 'done')
|
|
|
|
# Test MRP Cost structure
|
|
report = self.env['report.mrp_account_enterprise.mrp_cost_structure']
|
|
report_values = report._get_report_values(docids=mo_subcontracted.id)['lines'][0]
|
|
self.assertEqual(report_values['subcontracting_total_cost'], 50)
|
|
self.assertEqual(report_values['subcontracting_total_qty'], 2)
|
|
self.assertEqual(report_values['subcontracting'][0]['unit_cost'], 25)
|
|
self.assertEqual(report_values['subcontracting'][0]['partner_name'], self.subcontractor_partner1.display_name)
|
|
|
|
# Test Production Analyses Report
|
|
record_report = self.env['mrp.report'].search([('product_id', '=', self.finished.id)])
|
|
self.assertEqual(len(record_report), 1)
|
|
self.assertEqual(record_report.subcontracting_cost, 25 * 2)
|
|
self.assertEqual(record_report.unit_subcontracting_cost, 25)
|
|
|
|
def test_mrp_cost_structure_backorder(self):
|
|
""" Check that values of mrp_cost_structure are correctly calculated for subcontracting """
|
|
# update the price of the component
|
|
self.picking.product_id.bom_ids.bom_line_ids.product_id.standard_price = 10
|
|
self.picking.move_ids.price_unit = 15
|
|
self.picking.move_ids.product_uom_qty = 10
|
|
self.picking.action_confirm()
|
|
# valide only 4 units and create a backorder
|
|
self.picking.move_ids_without_package.quantity = 4
|
|
res = self.picking.button_validate()
|
|
wizard = Form(self.env[res.get('res_model')].with_context(res['context'])).save()
|
|
wizard.process()
|
|
backorder_id = self.picking.search([('backorder_id', '=', self.picking.id)])
|
|
backorder_id.move_ids_without_package.quantity = 6
|
|
backorder_id.button_validate()
|
|
|
|
self.env.flush_all() # Need to flush for mrp report
|
|
|
|
mo_subcontracted = self.env['mrp.production'].search([('product_id', '=', self.finished.id)])
|
|
self.assertEqual(len(mo_subcontracted), 2)
|
|
self.assertEqual(mo_subcontracted.mapped('state'), ['done', 'done'])
|
|
|
|
report = self.env['report.mrp_account_enterprise.mrp_cost_structure']
|
|
|
|
# Test MRP Cost structure
|
|
for mo in mo_subcontracted:
|
|
report_values = report._get_report_values(docids=mo.id)['lines'][0]
|
|
self.assertEqual(report_values['subcontracting_total_cost'], 15 * mo.qty_producing)
|
|
self.assertEqual(report_values['subcontracting_total_qty'], mo.qty_producing)
|
|
self.assertEqual(report_values['subcontracting'][0]['unit_cost'], 15)
|
|
# ((component 1 = $ 10) + (component 1 = $ 10)) * mo.qty_propducing = $ 80 for 4 units
|
|
# $ 120 for 6 units
|
|
self.assertEqual(report_values['total_cost_components'], 20 * mo.qty_producing)
|
|
self.assertEqual(report_values['subcontracting'][0]['partner_name'], self.subcontractor_partner1.display_name)
|
|
|
|
mrp_report = self.env['mrp.report'].search([('product_id', '=', self.picking.product_id.id)])
|
|
self.assertEqual(sorted(mrp_report.mapped('subcontracting_cost')), [60, 90])
|
|
self.assertEqual(mrp_report.mapped('unit_subcontracting_cost'), [15, 15])
|