From 1b017daba71cc4e1145dc10374635d95d39f3696 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Thu, 13 Jul 2023 14:48:58 +0200 Subject: [PATCH] [IMP] stock_average_daily_sale: Improve module helps / change field name to recommended_qty --- .../models/stock_average_daily_sale.py | 38 ++++++++++--------- .../tests/test_average_daily_sale.py | 3 ++ .../views/stock_average_daily_sale.xml | 2 +- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/stock_average_daily_sale/models/stock_average_daily_sale.py b/stock_average_daily_sale/models/stock_average_daily_sale.py index 41ed3e0..ffe6d55 100644 --- a/stock_average_daily_sale/models/stock_average_daily_sale.py +++ b/stock_average_daily_sale/models/stock_average_daily_sale.py @@ -31,15 +31,23 @@ class StockAverageDailySale(models.Model): selection=ABC_SELECTION, required=True, readonly=True, index=True ) average_daily_sales_count = fields.Float( - required=True, digits="Product Unit of Measure" + required=True, + digits="Product Unit of Measure", + help="How much deliveries on average for this product on the period. " + "The spikes are excluded from the average computation.", ) average_qty_by_sale = fields.Float( - required=True, digits="Product Unit of Measure", help="Average Daily Sales Qty" + required=True, + digits="Product Unit of Measure", + help="The quantity " + "delivered on average for one delivery of this product on the period. " + "The spikes are excluded from the average computation.", ) average_daily_qty = fields.Float( digits="Product Unit of Measure", required=True, - help="The average daily qty sold", + help="The quantity delivered on average on one day for this product on " + "the period. The spikes are excluded from the average computation.", ) config_id = fields.Many2one( string="Stock Average Daily Sale Configuration", @@ -54,27 +62,23 @@ class StockAverageDailySale(models.Model): store=True, index=True, ) - nbr_sales = fields.Integer(string="Number of Sales", required=True) + nbr_sales = fields.Integer( + string="Number of Sales", + required=True, + help="The total amount of deliveries for this product over the complete period", + ) product_id = fields.Many2one( comodel_name="product.product", string="Product", required=True, index=True ) safety = fields.Float( required=True, - help="daily standard deviation * safety factor * sqrt(nbr days into period " - "without saturday and sunday", + help="Safety stock to cover the variability of the quantity delivered " + "each day. Formula: daily standard deviation * safety factor * sqrt(nbr days in the period)", ) - safety_bin_min_qty = fields.Float( + recommended_qty = fields.Float( required=True, digits="Product Unit of Measure", - help="Minimal safety qty into a bin location computed as: " - "average daily qty * number days in stock * safety", - ) - safety_bin_min_qty_old = fields.Float( - required=True, - digits="Product Unit of Measure", - help="Minimal value for the safety qty. Computed as: " - "number days in stock * GREATEST(average daily sales count, 1) * " - "(average qty by sale + (stddev * safety factor))", + help="Minimal recommended quantity in stock. Formula: average daily qty * number days in stock + safety", ) sale_ok = fields.Boolean( string="Can be Sold", @@ -292,7 +296,7 @@ class StockAverageDailySale(models.Model): GREATEST( (cfg.number_days_qty_in_stock * average_qty_by_sale * average_daily_sales_count) + (ds.daily_standard_deviation * cfg.safety_factor * sqrt(nrb_days_without_sat_sun)), (cfg.number_days_qty_in_stock * average_qty_by_sale) - ) as safety_bin_min_qty + ) as recommended_qty FROM averages t JOIN daily_standard_deviation ds on ds.id= t.id JOIN stock_average_daily_sale_config cfg on cfg.id = t.config_id diff --git a/stock_average_daily_sale/tests/test_average_daily_sale.py b/stock_average_daily_sale/tests/test_average_daily_sale.py index 36dbf17..97c0857 100644 --- a/stock_average_daily_sale/tests/test_average_daily_sale.py +++ b/stock_average_daily_sale/tests/test_average_daily_sale.py @@ -55,6 +55,7 @@ class TestAverageSale(CommonAverageSaleTest, TransactionCase): "nbr_sales": 1.0, "average_qty_by_sale": 10.0, "qty_in_stock": 40.0, + "recommended_qty": 20.0, "warehouse_id": self.warehouse_0.id, } ], @@ -69,6 +70,7 @@ class TestAverageSale(CommonAverageSaleTest, TransactionCase): "nbr_sales": 1.0, "average_qty_by_sale": 12.0, "qty_in_stock": 48.0, + "recommended_qty": 24.0, "warehouse_id": self.warehouse_0.id, } ], @@ -133,6 +135,7 @@ class TestAverageSale(CommonAverageSaleTest, TransactionCase): } ], ) + self.assertAlmostEqual(20.67, avg_product_1.recommended_qty, places=2) self.assertAlmostEqual(10.33, avg_product_1.average_qty_by_sale, places=2) avg_product_2 = self.env["stock.average.daily.sale"].search( diff --git a/stock_average_daily_sale/views/stock_average_daily_sale.xml b/stock_average_daily_sale/views/stock_average_daily_sale.xml index 9aca7b5..b58b1e0 100644 --- a/stock_average_daily_sale/views/stock_average_daily_sale.xml +++ b/stock_average_daily_sale/views/stock_average_daily_sale.xml @@ -50,7 +50,7 @@ - +