diff --git a/product_catch_weight/__manifest__.py b/product_catch_weight/__manifest__.py
index 7c2ef68c..76d3cea2 100644
--- a/product_catch_weight/__manifest__.py
+++ b/product_catch_weight/__manifest__.py
@@ -12,6 +12,7 @@
'license': 'AGPL-3',
'website': 'https://hibou.io/',
'data': [
+ 'views/account_invoice_views.xml',
'views/stock_views.xml',
],
'installable': True,
diff --git a/product_catch_weight/models/__init__.py b/product_catch_weight/models/__init__.py
index 57a87093..5e099bc5 100644
--- a/product_catch_weight/models/__init__.py
+++ b/product_catch_weight/models/__init__.py
@@ -1,3 +1,4 @@
from . import account_invoice
+from . import product
from . import stock_patch
from . import stock
diff --git a/product_catch_weight/models/account_invoice.py b/product_catch_weight/models/account_invoice.py
index ab72943c..ee8c9f92 100644
--- a/product_catch_weight/models/account_invoice.py
+++ b/product_catch_weight/models/account_invoice.py
@@ -7,6 +7,9 @@ _logger = logging.getLogger(__name__)
class AccountInvoiceLine(models.Model):
_inherit = 'account.invoice.line'
+ catch_weight = fields.Float(string='Catch Weight', digits=(10, 4), compute='_compute_price', store=True)
+ catch_weight_uom_id = fields.Many2one('product.uom', related='product_id.catch_weight_uom_id')
+
@api.one
@api.depends('price_unit', 'discount', 'invoice_line_tax_ids', 'quantity',
'product_id', 'invoice_id.partner_id', 'invoice_id.currency_id', 'invoice_id.company_id',
@@ -17,6 +20,7 @@ class AccountInvoiceLine(models.Model):
ratio = 1.0
qty_done_total = 0.0
+ catch_weight = 0.0
if self.invoice_id.type in ('out_invoice', 'out_refund'):
move_lines = self.sale_line_ids.mapped('move_ids.move_line_ids')
else:
@@ -26,7 +30,9 @@ class AccountInvoiceLine(models.Model):
r = move_line.lot_id.catch_weight_ratio
ratio = ((ratio * qty_done_total) + (qty_done * r)) / (qty_done + qty_done_total)
qty_done_total += qty_done
+ catch_weight += move_line.lot_id.catch_weight
price = price * ratio
+ self.catch_weight = catch_weight
taxes = False
if self.invoice_line_tax_ids:
diff --git a/product_catch_weight/models/product.py b/product_catch_weight/models/product.py
new file mode 100644
index 00000000..16cb4b91
--- /dev/null
+++ b/product_catch_weight/models/product.py
@@ -0,0 +1,7 @@
+from odoo import api, fields, models
+
+
+class ProductProduct(models.Model):
+ _inherit = 'product.template'
+
+ catch_weight_uom_id = fields.Many2one('product.uom', string='Catch Weight UOM')
diff --git a/product_catch_weight/models/stock.py b/product_catch_weight/models/stock.py
index 6acec3a4..1ad5d3b6 100644
--- a/product_catch_weight/models/stock.py
+++ b/product_catch_weight/models/stock.py
@@ -4,17 +4,43 @@ from odoo import api, fields, models
class StockProductionLot(models.Model):
_inherit = 'stock.production.lot'
- catch_weight_ratio = fields.Float(string='Catch Weight Ratio', digits=(10, 6), default=1.0)
+ catch_weight_ratio = fields.Float(string='Catch Weight Ratio', digits=(10, 6), compute='_compute_catch_weight_ratio')
+ catch_weight = fields.Float(string='Catch Weight', digits=(10, 4))
+ catch_weight_uom_id = fields.Many2one('product.uom', related='product_id.catch_weight_uom_id')
+
+
+ @api.depends('catch_weight')
+ def _compute_catch_weight_ratio(self):
+ for lot in self:
+ if not lot.catch_weight_uom_id:
+ lot.catch_weight_ratio = 1.0
+ else:
+ lot.catch_weight_ratio = lot.catch_weight_uom_id._compute_quantity(lot.catch_weight,
+ lot.product_id.uom_id,
+ rounding_method='DOWN')
+
+
+class StockMove(models.Model):
+ _inherit = 'stock.move'
+
+ product_catch_weight_uom_id = fields.Many2one('product.uom', related="product_id.catch_weight_uom_id")
+
+ def _prepare_move_line_vals(self, quantity=None, reserved_quant=None):
+ vals = super(StockMove, self)._prepare_move_line_vals(quantity=quantity, reserved_quant=reserved_quant)
+ vals['catch_weight_uom_id'] = self.product_catch_weight_uom_id.id if self.product_catch_weight_uom_id else False
+ return vals
+
+ def action_show_details(self):
+ action = super(StockMove, self).action_show_details()
+ action['context']['show_catch_weight'] = bool(self.product_id.catch_weight_uom_id)
+ return action
class StockMoveLine(models.Model):
_inherit = 'stock.move.line'
- lot_catch_weight_ratio = fields.Float(string='Catch Weight Ratio', digits=(10, 6), default=1.0)
- lot_catch_weight_ratio_related = fields.Float(related='lot_id.catch_weight_ratio')
- #lot_catch_weight_ratio = fields.Float(related='lot_id.catch_weight_ratio')
-
- # def _action_done(self):
- # super(StockMoveLine, self)._action_done()
- # for ml in self.filtered(lambda l: l.product_id.tracking == 'serial' and l.lot_id):
- # ml.lot_id.catch_weight_ratio = ml.lot_catch_weight_ratio
+ catch_weight_ratio = fields.Float(string='Catch Weight Ratio', digits=(10, 6), default=1.0)
+ catch_weight = fields.Float(string='Catch Weight', digits=(10,4))
+ catch_weight_uom_id = fields.Many2one('product.uom', string='Catch Weight UOM')
+ lot_catch_weight = fields.Float(related='lot_id.catch_weight')
+ lot_catch_weight_uom_id = fields.Many2one('product.uom', related='product_id.catch_weight_uom_id')
diff --git a/product_catch_weight/models/stock_patch.py b/product_catch_weight/models/stock_patch.py
index 8787f4f6..fca04e4f 100644
--- a/product_catch_weight/models/stock_patch.py
+++ b/product_catch_weight/models/stock_patch.py
@@ -41,8 +41,9 @@ def _action_done(self):
# the fly before assigning it to the move line if the user checked both
# `use_create_lots` and `use_existing_lots`.
if ml.lot_name and not ml.lot_id:
+ lot_catch_weight = ml.catch_weight_uom_id._compute_quantity(ml.catch_weight, ml.product_id.catch_weight_uom_id, rounding_method='DOWN')
lot = self.env['stock.production.lot'].create(
- {'name': ml.lot_name, 'product_id': ml.product_id.id, 'catch_weight_ratio': ml.lot_catch_weight_ratio}
+ {'name': ml.lot_name, 'product_id': ml.product_id.id, 'catch_weight': lot_catch_weight}
)
ml.write({'lot_id': lot.id})
elif not picking_type_id.use_create_lots and not picking_type_id.use_existing_lots:
diff --git a/product_catch_weight/tests/test_catch_weight.py b/product_catch_weight/tests/test_catch_weight.py
index a167e530..1b13cb55 100644
--- a/product_catch_weight/tests/test_catch_weight.py
+++ b/product_catch_weight/tests/test_catch_weight.py
@@ -9,7 +9,16 @@ _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',
@@ -17,13 +26,10 @@ class TestPicking(TransactionCase):
'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,
})
- #self.product1 = self.env.ref('product.product_order_01')
- self.product1.write({
- 'type': 'product',
- 'tracking': 'serial',
- })
- self.stock_location = self.env.ref('stock.stock_location_stock')
# def test_creation(self):
@@ -50,12 +56,13 @@ class TestPicking(TransactionCase):
# self.env['stock.quant']._update_available_quantity(self.productA, stock_location, 1.0, lot_id=lot)
def test_so_invoice(self):
- ratio = 0.8
+ ref_weight = 45.0
lot = self.env['stock.production.lot'].create({
'product_id': self.product1.id,
'name': '123456789',
- 'catch_weight_ratio': ratio,
+ '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,
@@ -75,20 +82,20 @@ class TestPicking(TransactionCase):
inv_id = so.action_invoice_create()
inv = self.env['account.invoice'].browse(inv_id)
- self.assertEqual(inv.amount_total, ratio * self.product1.list_price)
+ self.assertAlmostEqual(inv.amount_total, lot.catch_weight_ratio * self.product1.list_price)
def test_so_invoice2(self):
- ratio1 = 0.8
- ratio2 = 1.1
+ 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_ratio': ratio1,
+ 'catch_weight': ref_weight1,
})
lot2 = self.env['stock.production.lot'].create({
'product_id': self.product1.id,
'name': '1-high',
- 'catch_weight_ratio': ratio2,
+ '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)
@@ -111,12 +118,12 @@ class TestPicking(TransactionCase):
inv_id = so.action_invoice_create()
inv = self.env['account.invoice'].browse(inv_id)
- self.assertEqual(inv.amount_total, (ratio1 * self.product1.list_price) + (ratio2 * self.product1.list_price))
+ self.assertAlmostEqual(inv.amount_total, self.product1.list_price * (lot1.catch_weight_ratio + lot2.catch_weight_ratio))
def test_po_invoice(self):
- ratio1 = 0.8
- ratio2 = 1.1
- ratios = (ratio1, ratio2)
+ 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,
@@ -135,7 +142,7 @@ class TestPicking(TransactionCase):
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, 'lot_catch_weight_ratio': ratios[i]})
+ line.write({'lot_name': str(i), 'qty_done': 1.0, 'catch_weight': weights[i]})
picking.button_validate()
self.assertEqual(picking.state, 'done')
@@ -147,6 +154,5 @@ class TestPicking(TransactionCase):
inv.purchase_order_change()
self.assertEqual(len(inv.invoice_line_ids), 1)
self.assertEqual(inv.invoice_line_ids.quantity, 2.0)
- self.assertEqual(inv.amount_total, (ratio1 * price) + (ratio2 * price))
-
+ self.assertAlmostEqual(inv.amount_total, price * sum(w / self.nominal_weight for w in weights))
diff --git a/product_catch_weight/views/account_invoice_views.xml b/product_catch_weight/views/account_invoice_views.xml
new file mode 100644
index 00000000..8eb57740
--- /dev/null
+++ b/product_catch_weight/views/account_invoice_views.xml
@@ -0,0 +1,69 @@
+
+
+
+ account.invoice.form.inherit
+ account.invoice
+
+
+
+
+
+
+
+
+
+ account.invoice.supplier.form.inherit
+ account.invoice
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | Catch Weight |
+ CW Unit Price |
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+ /
+
+ |
+
+
+ |
+ |
+
+
+
+
+
+
+ |
+ |
+
+
+
+
\ No newline at end of file
diff --git a/product_catch_weight/views/stock_views.xml b/product_catch_weight/views/stock_views.xml
index cee50753..40e2d9dd 100644
--- a/product_catch_weight/views/stock_views.xml
+++ b/product_catch_weight/views/stock_views.xml
@@ -7,17 +7,32 @@
+
+
-
- stock.move.line.form.inherit
- stock.move.line
-
+
+
+
+
+
+
+
+
+
+
+
+ stock.move.operations.form.inherit
+ stock.move
+
-
-
+
+
+
+
+ {'tree_view_ref': 'stock.view_stock_move_line_operation_tree', 'default_product_uom_id': product_uom, 'default_picking_id': picking_id, 'default_move_id': id, 'default_product_id': product_id, 'default_location_id': location_id, 'default_location_dest_id': location_dest_id, 'default_catch_weight_uom_id': product_catch_weight_uom_id}
@@ -27,8 +42,20 @@
-
-
+
+
+
+
+
+
+
+
+ product.template.common.form.inherit
+ product.template
+
+
+
+