diff --git a/addons/stock/__openerp__.py b/addons/stock/__openerp__.py index cd39d7ec2cf..5d1b7c6fa2b 100644 --- a/addons/stock/__openerp__.py +++ b/addons/stock/__openerp__.py @@ -90,6 +90,7 @@ Dashboard / Reports for Warehouse Management will include: 'views/report_stockpicking.xml', 'views/report_stockinventory.xml', 'views/stock.xml', + 'report/report_stock_forecast.xml', ], 'test': [ 'test/inventory.yml', diff --git a/addons/stock/report/__init__.py b/addons/stock/report/__init__.py index 74e96fa8860..76b462baf83 100644 --- a/addons/stock/report/__init__.py +++ b/addons/stock/report/__init__.py @@ -21,3 +21,4 @@ import product_stock import report_stock +import report_stock_forecast diff --git a/addons/stock/report/report_stock_forecast.py b/addons/stock/report/report_stock_forecast.py new file mode 100644 index 00000000000..e89efad5b31 --- /dev/null +++ b/addons/stock/report/report_stock_forecast.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- + + +from openerp import fields, models +from openerp import tools + + +class report_stock_forecast(models.Model): + _name = 'report.stock.forecast' + _auto = False + + date = fields.Date(string='Date') + product_id = fields.Many2one('product.product', string='Product', readonly=True) + cumulative_quantity = fields.Float(string='Cumulative Quantity', readonly=True) + quantity = fields.Float(readonly=True) + + def init(self, cr): + tools.drop_view_if_exists(cr, 'report_stock_forecast') + cr.execute("""CREATE or REPLACE VIEW report_stock_forecast AS (SELECT + max(id) as id, + product_id as product_id, + date as date, + sum(product_qty) AS quantity, + sum(sum(product_qty)) OVER(PARTITION BY product_id ORDER BY date ) AS cumulative_quantity + FROM + (SELECT + max(id) as id, + MAIN.product_id as product_id, + SUB.date as date, + CASE WHEN MAIN.date = SUB.date THEN sum(MAIN.product_qty) ELSE 0 END as product_qty + FROM + (SELECT + max(sq.id) as id, + sq.product_id, + CASE WHEN sm.date < CURRENT_DATE + THEN to_date(to_char(sm.date, 'YYYY/MM/DD'), 'YYYY/MM/DD') + ELSE to_date(to_char(CURRENT_DATE, 'YYYY/MM/DD'), 'YYYY/MM/DD') + END AS date, + SUM(sq.qty) AS product_qty + FROM + (SELECT min(date) AS date FROM stock_move AS sm + LEFT JOIN + stock_location source_location ON sm.location_id = source_location.id + LEFT JOIN + stock_location dest_location ON sm.location_dest_id = dest_location.id + WHERE + sm.state IN ('confirmed','assigned','waiting') AND + (dest_location.usage = 'internal' AND source_location.usage != 'internal') + or (source_location.usage = 'internal' AND dest_location.usage != 'internal')) AS sm, + stock_quant as sq + LEFT JOIN + product_product ON product_product.id = sq.product_id + LEFT JOIN + stock_location location_id ON sq.location_id = location_id.id + WHERE + location_id.usage = 'internal' + GROUP BY date, sq.product_id + UNION ALL + SELECT + max(sm.id) as id, + sm.product_id, + to_date(to_char(sm.date, 'YYYY/MM/DD'), 'YYYY/MM/DD') AS date, + SUM(sm.product_qty) AS product_qty + FROM + stock_move as sm + LEFT JOIN + product_product ON product_product.id = sm.product_id + LEFT JOIN + stock_location dest_location ON sm.location_dest_id = dest_location.id + LEFT JOIN + stock_location source_location ON sm.location_id = source_location.id + WHERE + sm.state IN ('confirmed','assigned','waiting') and + source_location.usage != 'internal' and dest_location.usage = 'internal' + GROUP BY sm.date,sm.product_id + UNION ALL + SELECT + max(sm.id) as id, + sm.product_id, + to_date(to_char(sm.date, 'YYYY/MM/DD'), 'YYYY/MM/DD') AS date, + SUM(-(sm.product_qty)) AS product_qty + FROM + stock_move as sm + LEFT JOIN + product_product ON product_product.id = sm.product_id + LEFT JOIN + stock_location source_location ON sm.location_id = source_location.id + LEFT JOIN + stock_location dest_location ON sm.location_dest_id = dest_location.id + WHERE + sm.state IN ('confirmed','assigned','waiting') and + source_location.usage = 'internal' and dest_location.usage != 'internal' + GROUP BY sm.date,sm.product_id) + as MAIN + LEFT JOIN + (SELECT DISTINCT date + FROM + ( + SELECT CURRENT_DATE AS DATE + UNION ALL + SELECT to_date(to_char(sm.date, 'YYYY/MM/DD'), 'YYYY/MM/DD') AS date + FROM stock_move sm + LEFT JOIN + stock_location source_location ON sm.location_id = source_location.id + LEFT JOIN + stock_location dest_location ON sm.location_dest_id = dest_location.id + WHERE + sm.state IN ('confirmed','assigned','waiting') and + (dest_location.usage = 'internal' AND source_location.usage != 'internal') + or (source_location.usage = 'internal' AND dest_location.usage != 'internal')) AS DATE_SEARCH) + SUB ON (SUB.date IS NOT NULL) + GROUP BY MAIN.product_id,SUB.date, MAIN.date + ) AS FINAL + GROUP BY product_id,date)""") diff --git a/addons/stock/report/report_stock_forecast.xml b/addons/stock/report/report_stock_forecast.xml new file mode 100644 index 00000000000..5e40b79cc68 --- /dev/null +++ b/addons/stock/report/report_stock_forecast.xml @@ -0,0 +1,54 @@ + + + + + Stock.forecast.pivot + report.stock.forecast + + + + + + + + + + + Stock.forecast.graph + report.stock.forecast + + + + + + + + + + view.stock.level.forecast.filter + report.stock.forecast + + + + + + + + + + + + + + Stock Level Forecast + report.stock.forecast + form + pivot,graph + + {'search_default_pivot_by':1,'search_default_graph_by':1} + + + + + + diff --git a/addons/stock/security/ir.model.access.csv b/addons/stock/security/ir.model.access.csv index 4bb2c1cbf52..77679c5b49d 100644 --- a/addons/stock/security/ir.model.access.csv +++ b/addons/stock/security/ir.model.access.csv @@ -80,4 +80,6 @@ access_product_price_history_stock_manager,prices.history stock manager,product. access_barcode_nomenclature_stock_user,barcode.nomenclature.stock.user,barcodes.model_barcode_nomenclature,stock.group_stock_user,1,0,0,0 access_barcode_nomenclature_stock_manager,barcode.nomenclature.stock.manager,barcodes.model_barcode_nomenclature,stock.group_stock_manager,1,1,1,1 access_barcode_rule_stock_user,barcode.rule.stock.user,barcodes.model_barcode_rule,stock.group_stock_user,1,0,0,0 -access_barcode_rule_stock_manager,barcode.rule.stock.manager,barcodes.model_barcode_rule,stock.group_stock_manager,1,1,1,1 \ No newline at end of file +access_barcode_rule_stock_manager,barcode.rule.stock.manager,barcodes.model_barcode_rule,stock.group_stock_manager,1,1,1,1 +access_stock_forecast_user,report.stock.forecast.user,model_report_stock_forecast,stock.group_stock_user,1,0,0,0 +access_stock_forecast_manager,report.stock.forecast.manager,model_report_stock_forecast,stock.group_stock_manager,1,1,1,1