From 773dd3b210a61bd00669675e5ce72d7f150f5233 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 6 Jul 2023 12:54:05 +1000 Subject: [PATCH] Fix quantity aggregation for stock table (#5188) * Fix quantity aggregation for stock table - Stock quantity can only be added together if units are the same * Add stock total footer to part table --- InvenTree/templates/js/translated/part.js | 33 ++++++++++++++++++++++ InvenTree/templates/js/translated/stock.js | 25 +++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/InvenTree/templates/js/translated/part.js b/InvenTree/templates/js/translated/part.js index fd1798fbeb..46655fa2af 100644 --- a/InvenTree/templates/js/translated/part.js +++ b/InvenTree/templates/js/translated/part.js @@ -2372,6 +2372,38 @@ function loadPartTable(table, url, options={}) { }); return text; + }, + footerFormatter: function(data) { + // Display "total" stock quantity of all rendered rows + // Requires that all parts have the same base units! + + let total = 0; + let units = new Set(); + + data.forEach(function(row) { + units.add(row.units || null); + if (row.total_in_stock != null) { + total += row.total_in_stock; + } + }); + + if (data.length == 0) { + return '-'; + } else if (units.size > 1) { + return '-'; + } else { + let output = `${total}`; + + if (units.size == 1) { + let unit = units.values().next().value; + + if (unit) { + output += ` [${unit}]`; + } + } + + return output; + } } }); @@ -2447,6 +2479,7 @@ function loadPartTable(table, url, options={}) { showColumns: true, showCustomView: grid_view, showCustomViewButton: false, + showFooter: true, onPostBody: function() { grid_view = inventreeLoad('part-grid-view') == 1; if (grid_view) { diff --git a/InvenTree/templates/js/translated/stock.js b/InvenTree/templates/js/translated/stock.js index 94d77e8719..931d3e2600 100644 --- a/InvenTree/templates/js/translated/stock.js +++ b/InvenTree/templates/js/translated/stock.js @@ -2068,13 +2068,36 @@ function loadStockTable(table, options) { // Display "total" stock quantity of all rendered rows let total = 0; + // Keep track of the whether all units are the same + // If different units are found, we cannot aggregate the quantities + let units = new Set(); + data.forEach(function(row) { + + units.add(row.part_detail.units || null); + if (row.quantity != null) { total += row.quantity; } }); - return total; + if (data.length == 0) { + return '-'; + } else if (units.size > 1) { + return '-'; + } else { + let output = `${total}`; + + if (units.size == 1) { + let unit = units.values().next().value; + + if (unit) { + output += ` [${unit}]`; + } + } + + return output; + } } };