mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
This UOM should be convertable (in the same category) as the normal stock UOM for the product. Example: If you want to sell 'units' of 50lbs then you should make a "50lbs" UOM in the Weight category and use that as the sale and purchase UOM, then your "Catch Weight UOM" can be the stock "lb(s)" UOM.
159 lines
6.4 KiB
Python
159 lines
6.4 KiB
Python
import logging
|
|
# from odoo.addons.stock.tests.test_move2 import TestPickShip
|
|
from odoo import fields
|
|
from odoo.tests.common import TransactionCase
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class TestPicking(TransactionCase):
|
|
def setUp(self):
|
|
super(TestPicking, self).setUp()
|
|
self.nominal_weight = 50.0
|
|
self.partner1 = self.env.ref('base.res_partner_2')
|
|
self.stock_location = self.env.ref('stock.stock_location_stock')
|
|
self.ref_uom_id = self.env.ref('product.product_uom_kgm')
|
|
self.product_uom_id = self.env['product.uom'].create({
|
|
'name': '50 ref',
|
|
'category_id': self.ref_uom_id.category_id.id,
|
|
'uom_type': 'bigger',
|
|
'factor_inv': self.nominal_weight,
|
|
})
|
|
self.product1 = self.env['product.product'].create({
|
|
'name': 'Product 1',
|
|
'type': 'product',
|
|
'tracking': 'serial',
|
|
'list_price': 100.0,
|
|
'standard_price': 50.0,
|
|
'taxes_id': [(5, 0, 0)],
|
|
'uom_id': self.product_uom_id.id,
|
|
'uom_po_id': self.product_uom_id.id,
|
|
'catch_weight_uom_id': self.ref_uom_id.id,
|
|
})
|
|
|
|
|
|
# def test_creation(self):
|
|
# self.productA.tracking = 'serial'
|
|
# lot = self.env['stock.production.lot'].create({
|
|
# 'product_id': self.productA.id,
|
|
# 'name': '123456789',
|
|
# })
|
|
#
|
|
# lot.catch_weight_ratio = 0.8
|
|
# _logger.warn(lot.xxxcatch_weight_ratio)
|
|
|
|
|
|
|
|
# def test_delivery(self):
|
|
# self.productA.tracking = 'serial'
|
|
# picking_pick, picking_pack, picking_ship = self.create_pick_pack_ship()
|
|
# stock_location = self.env['stock.location'].browse(self.stock_location)
|
|
# lot = self.env['stock.production.lot'].create({
|
|
# 'product_id': self.productA.id,
|
|
# 'name': '123456789',
|
|
# 'catch_weight_ratio': 0.8,
|
|
# })
|
|
# self.env['stock.quant']._update_available_quantity(self.productA, stock_location, 1.0, lot_id=lot)
|
|
|
|
def test_so_invoice(self):
|
|
ref_weight = 45.0
|
|
lot = self.env['stock.production.lot'].create({
|
|
'product_id': self.product1.id,
|
|
'name': '123456789',
|
|
'catch_weight': ref_weight,
|
|
})
|
|
self.assertAlmostEqual(lot.catch_weight_ratio, ref_weight / self.nominal_weight)
|
|
self.env['stock.quant']._update_available_quantity(self.product1, self.stock_location, 1.0, lot_id=lot)
|
|
so = self.env['sale.order'].create({
|
|
'partner_id': self.partner1.id,
|
|
'partner_invoice_id': self.partner1.id,
|
|
'partner_shipping_id': self.partner1.id,
|
|
'order_line': [(0, 0, {'product_id': self.product1.id})],
|
|
})
|
|
so.action_confirm()
|
|
self.assertTrue(so.state in ('sale', 'done'))
|
|
self.assertEqual(len(so.picking_ids), 1)
|
|
picking = so.picking_ids
|
|
self.assertEqual(picking.state, 'assigned')
|
|
self.assertEqual(picking.move_lines.move_line_ids.lot_id, lot)
|
|
picking.move_lines.move_line_ids.qty_done = 1.0
|
|
picking.button_validate()
|
|
self.assertEqual(picking.state, 'done')
|
|
|
|
inv_id = so.action_invoice_create()
|
|
inv = self.env['account.invoice'].browse(inv_id)
|
|
self.assertAlmostEqual(inv.amount_total, lot.catch_weight_ratio * self.product1.list_price)
|
|
|
|
def test_so_invoice2(self):
|
|
ref_weight1 = 45.0
|
|
ref_weight2 = 51.0
|
|
lot1 = self.env['stock.production.lot'].create({
|
|
'product_id': self.product1.id,
|
|
'name': '1-low',
|
|
'catch_weight': ref_weight1,
|
|
})
|
|
lot2 = self.env['stock.production.lot'].create({
|
|
'product_id': self.product1.id,
|
|
'name': '1-high',
|
|
'catch_weight': ref_weight2,
|
|
})
|
|
self.env['stock.quant']._update_available_quantity(self.product1, self.stock_location, 1.0, lot_id=lot1)
|
|
self.env['stock.quant']._update_available_quantity(self.product1, self.stock_location, 1.0, lot_id=lot2)
|
|
so = self.env['sale.order'].create({
|
|
'partner_id': self.partner1.id,
|
|
'partner_invoice_id': self.partner1.id,
|
|
'partner_shipping_id': self.partner1.id,
|
|
'order_line': [(0, 0, {'product_id': self.product1.id, 'product_uom_qty': 2.0})],
|
|
})
|
|
so.action_confirm()
|
|
self.assertTrue(so.state in ('sale', 'done'))
|
|
self.assertEqual(len(so.picking_ids), 1)
|
|
picking = so.picking_ids
|
|
self.assertEqual(picking.state, 'assigned')
|
|
self.assertEqual(picking.move_lines.move_line_ids.mapped('lot_id'), lot1 + lot2)
|
|
for line in picking.move_lines.move_line_ids:
|
|
line.qty_done = 1.0
|
|
picking.button_validate()
|
|
self.assertEqual(picking.state, 'done')
|
|
|
|
inv_id = so.action_invoice_create()
|
|
inv = self.env['account.invoice'].browse(inv_id)
|
|
self.assertAlmostEqual(inv.amount_total, self.product1.list_price * (lot1.catch_weight_ratio + lot2.catch_weight_ratio))
|
|
|
|
def test_po_invoice(self):
|
|
ref_weight1 = 45.0
|
|
ref_weight2 = 51.0
|
|
weights = (ref_weight1, ref_weight2)
|
|
price = self.product1.standard_price
|
|
po = self.env['purchase.order'].create({
|
|
'partner_id': self.partner1.id,
|
|
'order_line': [(0, 0, {
|
|
'product_id': self.product1.id,
|
|
'product_qty': 2.0,
|
|
'name': 'Test',
|
|
'date_planned': fields.Datetime.now(),
|
|
'product_uom': self.product1.uom_po_id.id,
|
|
'price_unit': price,
|
|
})]
|
|
})
|
|
po.button_confirm()
|
|
self.assertEqual(po.state, 'purchase')
|
|
self.assertEqual(len(po.picking_ids), 1)
|
|
|
|
picking = po.picking_ids
|
|
for i, line in enumerate(picking.move_lines.move_line_ids):
|
|
line.write({'lot_name': str(i), 'qty_done': 1.0, 'catch_weight': weights[i]})
|
|
picking.button_validate()
|
|
self.assertEqual(picking.state, 'done')
|
|
|
|
inv = self.env['account.invoice'].create({
|
|
'type': 'in_invoice',
|
|
'partner_id': self.partner1.id,
|
|
'purchase_id': po.id,
|
|
})
|
|
inv.purchase_order_change()
|
|
self.assertEqual(len(inv.invoice_line_ids), 1)
|
|
self.assertEqual(inv.invoice_line_ids.quantity, 2.0)
|
|
self.assertAlmostEqual(inv.amount_total, price * sum(w / self.nominal_weight for w in weights))
|
|
|