{% extends "admin/base_site_gridpivot.html" %} {% load i18n %} {% block tools %} {% if active_tab == "inventory" %} {% include "common/snippet_follow.html" %}{% tabs "input.item" %} {% elif args.0 %} {% include "common/snippet_follow.html" %}{% tabs "input.buffer" %} {% endif %} {{block.super}} {% endblock %} {% block before_table %}{% if args.0 %}
{% endif %}{% endblock %} {% block crosses %} // dict that gives from an id the name of the cross var field_by_id = {}; // dict that gives from the name of a cross the id var id_by_field = {}; $(function(){ {% if args.0 %} // Resize top graph var available = $(window).height() - $("#graph").offset().top - cross_idx.length * 21 - 145; if (available > 350) available = 350; else if (available < 200) available = 200; $("#graph").width($(window).width()-60).height(available); {% endif %} for (var i in cross_idx) field_by_id[cross_idx[i]] = cross[cross_idx[i]]["key"]; for (var i in cross) id_by_field[cross[i]["key"]] = i; }); {% if args.0 or mode == "graph" %} function drawGraphs(jsondata) { $('#curerror').html(""); {% if args.0 %}var margin = {top: 0, right: 100, bottom: 30, left: 70}; {% else %}var margin = {top: 0, right: 0, bottom: 0, left: 70}; {% endif %}var width = Math.max($({% if args.0 %}"#graph"{% else %}"#grid_graph"{% endif %}).width() - margin.left - margin.right, 0); var height = {% if args.0 %}$("#graph").height(){% else %}80{% endif %} - margin.top - margin.bottom; // Lookup table of displayed columns var fields = new Set(); for (var i of cross_idx) fields.add(cross[i]["key"]); // Define X-axis var domain_x = []; var bucketnamelength = 0; for (var i in timebuckets) { domain_x.push(timebuckets[i]['name']); bucketnamelength = Math.max(timebuckets[i]['name'].length, bucketnamelength); } var x = d3.scale.ordinal() .domain(domain_x) .rangeRoundBands([0, width], 0); var x_width = x.rangeBand(); {% if mode == "graph" and not args.0 %}graph.header(margin.left, x);{% endif %} // Define Y-axis var y = d3.scale.linear().rangeRound([height, 0]); // Draw all graphs $("#grid"){% if not args.0 %}.find(".graph"){% endif %}.each(function(index) { // Create a new SVG element $({% if args.0 %}$("#graph").get(0){% else %}this{% endif %}).html(""); var svg = d3.select({% if args.0 %}$("#graph").get(0){% else %}this{% endif %}) .append("svg") .attr("class","graphcell") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); // Build the data for d3 var max_y = 0; var min_y = 0; var data = []; for (var bckt in timebuckets) { var tmp = jsondata['rows'][index][timebuckets[bckt]['name']]; data.push({ 'buffer': jsondata['rows'][index]['buffer'], 'bucket': bckt, 'startinv': tmp[id_by_field['startoh']], 'startohdoc': tmp[id_by_field['startohdoc']], 'safetystock': tmp[id_by_field['safetystock']], 'consumed': tmp[id_by_field['consumed']], 'consumed_proposed': tmp[id_by_field['consumed_proposed']], 'consumed_confirmed': tmp[id_by_field['consumed_confirmed']], 'consumedMO': tmp[id_by_field['consumedMO']], 'consumedDO': tmp[id_by_field['consumedDO']], 'consumedMO_confirmed': tmp[id_by_field['consumedMO_confirmed']], 'consumedMO_proposed': tmp[id_by_field['consumedMO_proposed']], 'consumedDO_confirmed': tmp[id_by_field['consumedDO_confirmed']], 'consumedDO_proposed': tmp[id_by_field['consumedDO_proposed']], 'consumedSO': tmp[id_by_field['consumedSO']], 'consumedFcst': tmp[id_by_field['consumedFcst']], 'produced': tmp[id_by_field['produced']], 'produced_confirmed': tmp[id_by_field['produced_confirmed']], 'produced_proposed': tmp[id_by_field['produced_proposed']], 'producedMO': tmp[id_by_field['producedMO']], 'producedDO': tmp[id_by_field['producedDO']], 'producedPO': tmp[id_by_field['producedPO']], 'producedMO_proposed': tmp[id_by_field['producedMO_proposed']], 'producedDO_proposed': tmp[id_by_field['producedDO_proposed']], 'producedPO_proposed': tmp[id_by_field['producedPO_proposed']], 'producedMO_confirmed': tmp[id_by_field['producedMO_confirmed']], 'producedDO_confirmed': tmp[id_by_field['producedDO_confirmed']], 'producedPO_confirmed': tmp[id_by_field['producedPO_confirmed']], 'endinv': tmp[id_by_field['endoh']], 'total_in_progress': tmp[id_by_field['total_in_progress']], 'work_in_progress_mo': tmp[id_by_field['work_in_progress_mo']], 'on_order_po': tmp[id_by_field['on_order_po']], 'in_transit_do': tmp[id_by_field['in_transit_do']], 'total_demand': tmp[id_by_field['total_demand']], 'total_backlog': tmp[id_by_field['total_backlog']], 'reasons': tmp[id_by_field['reasons']] }); for (var i in cross_idx) { var t = field_by_id[cross_idx[i]]; if (t == 'startoh' || t == 'safetystock' || t == 'consumed' || t == 'produced' || t == 'endoh' || t == 'total_backlog') { if (tmp[cross_idx[i]] < min_y) min_y = tmp[cross_idx[i]]; if (tmp[cross_idx[i]] > max_y) max_y = tmp[cross_idx[i]]; } } } // Update the scale of the Y-axis by looking for the max value y.domain([min_y,max_y]); var y_zero = y(0); // Create D3 bars var y_top; var y_top_confirmed; svg.selectAll("g") .data(data) .enter() .append("g") .attr("transform", function(d) { return "translate(" + x(timebuckets[d['bucket']]['name']) + ",0)"; }) .each(function(d) { var bucket = d3.select(this); if (d['produced'] > 0 && fields.has('produced')) { y_top = y(d['produced']); y_top_low = y(d['produced_confirmed']); if (d['produced_confirmed'] > 0) bucket.append("rect") .attr("width", x_width/2) .attr("height", y_zero - y_top_low) .attr("x", x_width/2) .attr("y", y_top_low) .style("fill","#113C5E"); if (d['produced_proposed'] > 0) bucket.append("rect") .attr("width", x_width/2) .attr("height", y_top_low - y_top) .attr("x", x_width/2) .attr("y", y_top) .style("fill","#2B95EC"); } if (d['consumed'] > 0 && fields.has('consumed')) { y_top = y(d['consumed']); y_top_low = y(d['consumed_confirmed']); if (d['consumed_confirmed'] > 0) bucket.append("rect") .attr("width", x_width/2) .attr("height", y_zero - y_top_low) .attr("y", y_top_low) .style("fill","#7B5E08"); if (d['consumed_proposed'] > 0) bucket.append("rect") .attr("width", x_width/2) .attr("height", y_top_low - y_top) .attr("y", y_top) .style("fill","#F6BD0F"); } // Invisible rectangle for the tooltip bucket.append("rect") .attr("height", height) .attr("width", x_width) .attr("fill-opacity", function(d) { if (d["startinv"] >= 0 && (d["startinv"] >= d["safetystock"] || d["safetystock"] == 0)) return 0; else return 0.2; }) .attr("fill", function(d) { if (d["startinv"] < 0) var gradient_idx = 0; else if (d["startinv"] >= d["safetystock"] || d["safetystock"] == 0) return null; else var gradient_idx = Math.round(d["startinv"] / d["safetystock"] * 165); var grad = d3.selectAll("#gradient_" + gradient_idx); if (grad.size() == 0) { var newgrad = d3.select("#gradients") .append("linearGradient") .attr("id", "gradient_" + gradient_idx) .attr("x1", 0) .attr("x2", 0) .attr("y1", 0) .attr("y2", 1); newgrad.append("stop") .attr("offset", "0%") .attr("stop-color", "white") .attr("stop-opacity", 1); newgrad.append("stop") .attr("offset", "40%") .attr("stop-color", "rgb(255," + gradient_idx + ",0)") .attr("stop-opacity", 1); newgrad.append("stop") .attr("offset", "60%") .attr("stop-color", "rgb(255," + gradient_idx + ",0)") .attr("stop-opacity", 1); newgrad.append("stop") .attr("offset", "100%") .attr("stop-color", "white") .attr("stop-opacity", 0); } return "url(#gradient_" + gradient_idx + ")"; }) .on("click", function(d) { if (d3.event.defaultPrevented || (d['produced'] == 0 && d['consumed'] == 0)) return; d3.select("#tooltip").style('display', 'none'); window.location = url_prefix + "/data/input/operationplanmaterial/buffer/" + admin_escape(d['buffer']) + "/?noautofilter&flowdate__gte=" + timebuckets[d['bucket']]['startdate'] + "&flowdate__lt=" + timebuckets[d['bucket']]['enddate']; d3.event.stopPropagation(); }) .on("mouseenter", function(d) { if (timebuckets[d['bucket']]['history']) { var tiptext = '
{{_('Archived')}} ' + timebuckets[d['bucket']]['name'] + '
' + '
{{_('start inventory')|capfirst}}' + grid.formatNumber(d['startinv']) + '
{{_('safety stock')|capfirst}}' + grid.formatNumber(d['safetystock']); } else { var tiptext = '
' + timebuckets[d['bucket']]['name'] + '
' + '
{{_('start inventory days of cover')|capfirst}}' + d['startohdoc'] + " {{_('days')}}" + '
{{_('start inventory')|capfirst}}' + grid.formatNumber(d['startinv']); if (d['producedPO_confirmed']) tiptext += '
{{_('produced by PO confirmed')|capfirst}}+ ' + grid.formatNumber(d['producedPO_confirmed']); if (d['producedPO_proposed']) tiptext += '
{{_('produced by PO confirmed')|capfirst}}+ ' + grid.formatNumber(d['producedPO_proposed']); if (d['producedMO_confirmed']) tiptext += '
{{_('produced by MO confirmed')|capfirst}}+ ' + grid.formatNumber(d['producedMO_confirmed']); if (d['producedMO_proposed']) tiptext += '
{{_('produced by MO proposed')|capfirst}}+ ' + grid.formatNumber(d['producedMO_proposed']); if (d['producedDO_confirmed']) tiptext += '
{{_('produced by DO confirmed')|capfirst}}+ ' + grid.formatNumber(d['producedDO_confirmed']); if (d['producedDO_proposed']) tiptext += '
{{_('produced by DO proposed')|capfirst}}+ ' + grid.formatNumber(d['producedDO_proposed']); if (d['consumedMO_confirmed']) tiptext += '
{{_('consumed by MO confirmed')|capfirst}}- ' + grid.formatNumber(d['consumedMO_confirmed']); if (d['consumedMO_proposed']) tiptext += '
{{_('consumed by MO proposed')|capfirst}}- ' + grid.formatNumber(d['consumedMO_proposed']); if (d['consumedSO']) tiptext += '
{{_('consumed by SO')|capfirst}}- ' + grid.formatNumber(d['consumedSO']); if (d['consumedFcst']) tiptext += '
{{_('consumed by Fcst')|capfirst}}- ' + grid.formatNumber(d['consumedFcst']); if (d['consumedDO_confirmed']) tiptext += '
{{_('consumed by DO confirmed')|capfirst}}- ' + grid.formatNumber(d['consumedDO_confirmed']); if (d['consumedDO_proposed']) tiptext += '
{{_('consumed by DO proposed')|capfirst}}- ' + grid.formatNumber(d['consumedDO_proposed']); tiptext += '
{{_('end inventory')|capfirst}}= ' + grid.formatNumber(d['startinv']+d['produced']-d['consumed']); if (d['safetystock']) tiptext += '
{{_('safety stock')|capfirst}}' + grid.formatNumber(d['safetystock']); if (d['total_in_progress']) tiptext += '
{{_('total in progress')|capfirst}}' + grid.formatNumber(d['total_in_progress']); if (d['work_in_progress_mo']) tiptext += '
{{_('work in progress MO')|capfirst}}' + grid.formatNumber(d['work_in_progress_mo']); if (d['on_order_po']) tiptext += '
{{_('on order PO')|capfirst}}' + grid.formatNumber(d['on_order_po']); if (d['in_transit_do']) tiptext += '
{{_('in transit DO')|capfirst}}' + grid.formatNumber(d['in_transit_do']); if (d['total_demand']) tiptext += '
{{_('total demand')|capfirst}}' + grid.formatNumber(d['total_demand']); if (d['total_backlog']) tiptext += '
{{_('total backlog')|capfirst}}' + grid.formatNumber(d['total_backlog']); tiptext += '
'; if (d['reasons']) { tiptext += '
' + '{{_('constraints')|capfirst}}
'; for (var r of d['reasons']) tiptext += ''; tiptext += '
' + r[0] + '' + r[1] + '
'; } } graph.showTooltip(tiptext); }) .on("mouseleave", graph.hideTooltip) .on("mousemove", graph.moveTooltip); }); // Create D3 line if (fields.has('startoh')) { var line = d3.svg.line() .x(function(d) { return x(timebuckets[d['bucket']]['name']) + x_width / 2; }) .y(function(d) { return y(d['startinv']); }); svg.append("svg:path") .attr('class', 'graphline') .attr("stroke","#8BBA00") .attr("d", line(data)); } else if (fields.has('endoh')) { var line = d3.svg.line() .x(function(d) { return x(timebuckets[d['bucket']]['name']) + x_width / 2; }) .y(function(d) { return y(d['endinv']); }); svg.append("svg:path") .attr('class', 'graphline') .attr("stroke","#8BBA00") .attr("d", line(data)); } if (fields.has('safetystock')) { var line = d3.svg.line() .x(function(d) { return x(timebuckets[d['bucket']]['name']) + x_width / 2; }) .y(function(d) { return y(d['safetystock']); }); svg.append("svg:path") .attr('class', 'graphline') .attr("stroke","#FF0000") .attr("d", line(data)); } if (fields.has('total_backlog')) { var line = d3.svg.line() .x(function(d) { return x(timebuckets[d['bucket']]['name']) + x_width / 2; }) .y(function(d) { return y(d['total_backlog']); }); svg.append("svg:path") .attr('class', 'graphline') .attr("stroke","#000000") .attr("d", line(data)); } // Display Y-Axis var yAxis = d3.svg.axis() .scale(y) .orient("left") .tickFormat(d3.format("s")); {% if not args.0 %} svg.append("g") .attr("class", "miniaxis") .call(graph.miniAxis.bind(yAxis)); {% else %} svg.append("g") .attr("class", "y axis") .call(yAxis); // Display 0 line if (min_y < 0 && max_y > 0) svg.append("line") .attr("x1", 0) .attr("x2", width) .attr("y1", y(0)) .attr("y2", y(0)) .attr("stroke-width", 1) .attr("stroke", "black") .attr("shape-rendering", "crispEdges"); // Display X-axis for a single buffer var nth = Math.ceil(timebuckets.length / width * bucketnamelength * 10); var myticks = []; for (var i in timebuckets) if (i % nth == 0) myticks.push(timebuckets[i]['name']); var xAxis = d3.svg.axis() .scale(x) .tickValues(myticks) .orient("bottom"); svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(xAxis); // Define legend var code_legend = []; if (cross_idx.includes(parseInt(id_by_field["startoh"]))) code_legend.push(['{{_('start inventory')|capfirst}}',"#8BBA00"]); else if (cross_idx.includes(parseInt(id_by_field["endoh"]))) code_legend.push(['{{_('end inventory')|capfirst}}',"#8BBA00"]); if (cross_idx.includes(parseInt(id_by_field["safetystock"]))) code_legend.push(['{{_('safety stock')|capfirst}}',"#FF0000"]); code_legend.push(['{{_('consumed')|capfirst}}',"#F6BD0F"]); code_legend.push(['{{_('consumed confirmed')|capfirst}}',"#7B5E08"]); code_legend.push(['{{_('produced')|capfirst}}',"#2B95EC"]); code_legend.push(['{{_('produced confirmed')|capfirst}}',"#113C5E"]); if (cross_idx.includes(parseInt(id_by_field["total_backlog"]))) code_legend.push(['{{_('total backlog')|capfirst}}',"#000000"]); // Display legend var legend = svg.append("g"); var cnt = 0; for (var i of code_legend) { legend.append("rect") .attr("x", width + 82) .attr("width", 18) .attr("height", 18) .style("fill", i[1]) .attr("transform", "translate(0," + (cnt*20+10) + ")"); legend.append("text") .attr("x", width + 76) .attr("y", 9) .attr("dy", ".35em") .style("text-anchor", "end") .text(i[0]) .attr("transform", "translate(0," + (cnt*20+10) + ")"); ++cnt; }{% endif %} }); } {% endif %} {% if args.0 or mode == "table" %} function crosses (cellvalue, options, rowdata) { var last_currentdate = "{{request.current_date}}"; // Cell background var oh = cellvalue[id_by_field['startoh']]; var safety = cellvalue[id_by_field['safetystock']]; if (oh < 0) var result = '
'; else if (oh >= safety || safety == 0) var result = '
'; else var result = '
'; for (var i in cross_idx) switch(field_by_id[cross_idx[i]]) { case 'startohdoc': if (!options.colModel.history) result += cellvalue[cross_idx[i]]; result += '
'; break; case 'consumed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['consumed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['consumed']]) + " 
"; else result += '0
'; break; case 'consumed_confirmed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['consumed_confirmed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['consumed_confirmed']]) + " 
"; else result += '0
'; break; case 'consumed_proposed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['consumed_proposed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['consumed_proposed']]) + " 
"; else result += '0
'; break; case 'consumedMO': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['consumedMO']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['consumedMO']]) + " 
"; else result += '0
'; break; case 'consumedMO_confirmed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['consumedMO_confirmed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['consumedMO_confirmed']]) + " 
"; else result += '0
'; break; case 'consumedMO_proposed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['consumedMO_proposed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['consumedMO_proposed']]) + " 
"; else result += '0
'; break; case 'consumedDO': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['consumedDO']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['consumedDO']]) + " 
"; else result += '0
'; break; case 'consumedDO_confirmed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['consumedDO_confirmed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['consumedDO_confirmed']]) + " 
"; else result += '0
'; break; case 'consumedDO_proposed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['consumedDO_proposed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['consumedDO_proposed']]) + " 
"; else result += '0
'; break; case 'consumedSO': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['consumedSO']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['consumedSO']]) + " 
"; else result += '0
'; break; case 'consumedFcst': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['consumedFcst']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['consumedFcst']]) + " 
"; else result += '0
'; break; case 'produced': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['produced']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['produced']]) + " 
"; else result += '0
'; break; case 'produced_confirmed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['produced_confirmed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['produced_confirmed']]) + " 
"; else result += '0
'; break; case 'produced_proposed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['produced_proposed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['produced_proposed']]) + " 
"; else result += '0
'; break; case 'producedMO': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['producedMO']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['producedMO']]) + " 
"; else result += '0
'; break; case 'producedMO_confirmed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['producedMO_confirmed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['producedMO_confirmed']]) + " 
"; else result += '0
'; break; case 'producedMO_proposed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['producedMO_proposed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['producedMO_proposed']]) + " 
"; else result += '0
'; break; case 'producedDO': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['producedDO']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['producedDO']]) + " 
"; else result += '0
'; break; case 'producedDO_confirmed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['producedDO_confirmed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['producedDO_confirmed']]) + " 
"; else result += '0
'; break; case 'producedDO_proposed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['producedDO_proposed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['producedDO_proposed']]) + " 
"; else result += '0
'; break; case 'producedPO': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['producedPO']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['producedPO']]) + " 
"; else result += '0
'; break; case 'producedPO_confirmed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['producedPO_confirmed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['producedPO_confirmed']]) + " 
"; else result += '0
'; break; case 'producedPO_proposed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['producedPO_proposed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['producedPO_proposed']]) + " 
"; else result += '0
'; break; case 'work_in_progress_mo': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['work_in_progress_mo']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['work_in_progress_mo']]) + " 
"; else result += '0
'; break; case 'work_in_progress_mo_confirmed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['work_in_progress_mo_confirmed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['work_in_progress_mo_confirmed']]) + " 
"; else result += '0
'; break; case 'work_in_progress_mo_proposed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['work_in_progress_mo_proposed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['work_in_progress_mo_proposed']]) + " 
"; else result += '0
'; break; case 'on_order_po': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['on_order_po']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['on_order_po']]) + " 
"; else result += '0
'; break; case 'proposed_ordering': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['proposed_ordering']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['proposed_ordering']]) + " 
"; else result += '0
'; break; case 'on_order_po_confirmed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['on_order_po_confirmed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['on_order_po_confirmed']]) + " 
"; else result += '0
'; break; case 'on_order_po_proposed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['on_order_po_proposed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['on_order_po_proposed']]) + " 
"; else result += '0
'; break; case 'in_transit_do': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['in_transit_do']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['in_transit_do']]) + " 
"; else result += '0
'; break; case 'in_transit_do_confirmed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['in_transit_do_confirmed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['in_transit_do_confirmed']]) + " 
"; else result += '0
'; break; case 'in_transit_do_proposed': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['in_transit_do_proposed']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['in_transit_do_proposed']]) + " 
"; else result += '0
'; break; case 'open_orders': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['open_orders']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['open_orders']]) + " 
"; else result += '0
'; break; case 'net_forecast': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['net_forecast']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['net_forecast']]) + " 
"; else result += '0
'; break; case 'total_demand': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['total_demand']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['total_demand']]) + " 
"; else result += '0
'; break; case 'order_backlog': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['order_backlog']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['order_backlog']]) + " 
"; else result += '0
'; break; case 'forecast_backlog': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['forecast_backlog']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['forecast_backlog']]) + " 
"; else result += '0
'; break; case 'total_backlog': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['total_backlog']] != 0.0) result += grid.formatNumber(cellvalue[id_by_field['total_backlog']]) + " 
"; else result += '0
'; break; case 'color': if (options.colModel.history) result += '
'; else if (cellvalue[id_by_field['color']] != 0) { result += grid.formatNumber(rowdata['is_ip_buffer'] == "True" ? cellvalue[id_by_field['color']] : Math.abs(cellvalue[id_by_field['color']])) + (rowdata['is_ip_buffer'] == "True" ? " %" : (" days " + (cellvalue[id_by_field['color']] < 0 ? "early" : "late"))) + "
"; } else result += '0' + (rowdata['is_ip_buffer'] == "True" ? " %" : "") + '
'; break; case 'startoh': if (cellvalue[cross_idx[i]] !== null) { if (oh < 0 || !(oh >= safety || safety == 0)) result += ''+ grid.formatNumber(cellvalue[cross_idx[i]]) + ''; else result += grid.formatNumber(cellvalue[cross_idx[i]]); } result += '
'; break; case 'safetystock': if (cellvalue[cross_idx[i]] !== null) result += grid.formatNumber(cellvalue[cross_idx[i]]); result += '
'; break; default: if(!cross[cross_idx[i]].hidden) { if (!options.colModel.history) result += grid.formatNumber(cellvalue[cross_idx[i]]); result += '
'; } } result += "
"; return result; }; {% endif %}{% endblock %} {% block extra_grid %}{% if args.0 or mode == "graph" %}loadComplete: drawGraphs, {% endif %}{% endblock %} {% block after_table %} {% endblock %}