|
|
@@ -15,27 +15,35 @@ function render({ recipes, prices }) {
|
|
|
for (const price of prices)
|
|
|
if (price.ExchangeCode == "PP7D_IC1")
|
|
|
priceMap.set(price.MaterialTicker, price.PriceAverage);
|
|
|
+ const fmt = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 });
|
|
|
const tbody = document.querySelector("tbody");
|
|
|
tbody.innerHTML = "";
|
|
|
for (const recipe of recipes) {
|
|
|
if (recipe.BuildingTicker !== "FRM")
|
|
|
continue;
|
|
|
const runsPerDay = 1000 * 60 * 60 * 24 / recipe.TimeMs;
|
|
|
- let costPerRun = 0;
|
|
|
- for (const input of recipe.Inputs) {
|
|
|
+ const revenuePerRun = recipe.Outputs.reduce((sum, output) => {
|
|
|
+ const price = priceMap.get(output.Ticker);
|
|
|
+ if (price === undefined)
|
|
|
+ throw new Error(`missing price for ${output.Ticker}`);
|
|
|
+ return sum + price * output.Amount;
|
|
|
+ }, 0);
|
|
|
+ const costPerRun = recipe.Inputs.reduce((sum, input) => {
|
|
|
const price = priceMap.get(input.Ticker);
|
|
|
if (price === undefined)
|
|
|
throw new Error(`missing price for ${input.Ticker}`);
|
|
|
- costPerRun += price * input.Amount;
|
|
|
- }
|
|
|
+ return sum + price * input.Amount;
|
|
|
+ }, 0);
|
|
|
const row = document.createElement("tr");
|
|
|
row.innerHTML = `
|
|
|
<td>${recipe.RecipeName}</td>
|
|
|
- <td>${(costPerRun * runsPerDay).toFixed(2)}</td>
|
|
|
+ <td>${fmt.format(revenuePerRun * runsPerDay)}</td>
|
|
|
+ <td>${fmt.format(costPerRun * runsPerDay)}</td>
|
|
|
+ <td>${fmt.format((revenuePerRun - costPerRun) * runsPerDay)}</td>
|
|
|
`;
|
|
|
tbody.appendChild(row);
|
|
|
}
|
|
|
}
|
|
|
fetchData().then(render);
|
|
|
|
|
|
-//# debugId=2420FEED6C51286B64756E2164756E21
|
|
|
+//# debugId=E579798A6AFE522164756E2164756E21
|