diff --git a/InvenTree/templates/js/translated/bom.js b/InvenTree/templates/js/translated/bom.js index 0d27a5e028..2d7796edcd 100644 --- a/InvenTree/templates/js/translated/bom.js +++ b/InvenTree/templates/js/translated/bom.js @@ -691,8 +691,24 @@ function loadBomTable(table, options={}) { setupFilterList('bom', $(table)); - // Construct the table columns + function availableQuantity(row) { + // Base stock + var available = row.available_stock; + + // Substitute stock + available += (row.available_substitute_stock || 0); + + // Variant stock + if (row.allow_variants) { + available += (row.available_variant_stock || 0); + } + + return available; + + } + + // Construct the table columns var cols = []; if (options.editable) { @@ -807,11 +823,10 @@ function loadBomTable(table, options={}) { var url = `/part/${row.sub_part_detail.pk}/?display=part-stock`; // Calculate total "available" (unallocated) quantity - var base_stock = row.available_stock; var substitute_stock = row.available_substitute_stock || 0; var variant_stock = row.allow_variants ? (row.available_variant_stock || 0) : 0; - var available_stock = base_stock + substitute_stock + variant_stock; + var available_stock = availableQuantity(row); var text = `${available_stock}`; @@ -923,7 +938,7 @@ function loadBomTable(table, options={}) { formatter: function(value, row) { var can_build = 0; - var available = row.available_stock + (row.available_substitute_stock || 0) + (row.available_variant_stock || 0); + var available = availableQuantity(row); if (row.quantity > 0) { can_build = available / row.quantity; @@ -937,11 +952,11 @@ function loadBomTable(table, options={}) { var cb_b = 0; if (rowA.quantity > 0) { - cb_a = (rowA.available_stock + rowA.available_substitute_stock) / rowA.quantity; + cb_a = availableQuantity(rowA) / rowA.quantity; } if (rowB.quantity > 0) { - cb_b = (rowB.available_stock + rowB.available_substitute_stock) / rowB.quantity; + cb_b = availableQuantity(rowB) / rowB.quantity; } return (cb_a > cb_b) ? 1 : -1; diff --git a/InvenTree/templates/js/translated/build.js b/InvenTree/templates/js/translated/build.js index eb955d7ff0..65fc3a4d6c 100644 --- a/InvenTree/templates/js/translated/build.js +++ b/InvenTree/templates/js/translated/build.js @@ -1031,6 +1031,23 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) { return row.required; } + function availableQuantity(row) { + + // Base stock + var available = row.available_stock; + + // Substitute stock + available += (row.available_substitute_stock || 0); + + // Variant stock + if (row.allow_variants) { + available += (row.available_variant_stock || 0); + } + + return available; + + } + function sumAllocations(row) { // Calculat total allocations for a given row if (!row.allocations) { @@ -1429,16 +1446,27 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) { var url = `/part/${row.sub_part_detail.pk}/?display=part-stock`; // Calculate total "available" (unallocated) quantity - var base_stock = row.available_stock; var substitute_stock = row.available_substitute_stock || 0; var variant_stock = row.allow_variants ? (row.available_variant_stock || 0) : 0; - var available_stock = base_stock + substitute_stock + variant_stock; + var available_stock = availableQuantity(row); - var text = `${available_stock}`; + var required = requiredQuantity(row); + + var text = ''; + + if (available_stock > 0) { + text += `${available_stock}`; + } + + if (available_stock < required) { + text += ``; + } else { + text += ``; + } if (available_stock <= 0) { - text = `{% trans "No Stock Available" %}`; + text += `{% trans "No Stock Available" %}`; } else { var extra = ''; if ((substitute_stock > 0) && (variant_stock > 0)) { @@ -1455,7 +1483,11 @@ function loadBuildOutputAllocationTable(buildInfo, output, options={}) { } return renderLink(text, url); - } + }, + sorter: function(valA, valB, rowA, rowB) { + + return availableQuantity(rowA) > availableQuantity(rowB) ? 1 : -1; + }, }, { field: 'allocated',