Published
Edited
Oct 22, 2019
1 fork
Insert cell
md`Модель экономии в Тириуме`
Insert cell
Insert cell
Insert cell
function series (params) {
const {
uniqueTests: initialUniqueTests,
periods,
growthFactor,
thiriumFactor,
autotestersAmountOfWork,
timeToAutomateTest,
breeding,
performance,
launchesPerMonth,
maintainanceCost: maintainanceFactor,
maintainanceTime,
manualHourPayment,
autoHourPayment
} = params;
const capacity = Math.round(autotestersAmountOfWork / timeToAutomateTest);
let testsPerMonth = [];

for (let i = 0; i < periods; i++) {
const previous = testsPerMonth[i - 1];
const previousUniqueTests = previous
? previous.uniqueTests
: initialUniqueTests;
// growth
const uniqueTests = Math.round(
previousUniqueTests * (1 + growthFactor * (i === 0 ? 0 : 1))
);
const automateLimit = Math.round(thiriumFactor * uniqueTests);
const maxiumCapacity = Math.round(Math.min(capacity, uniqueTests));
const previousAutomated = previous && previous.automated || 0;
const automated = Math.min(
previousAutomated + maxiumCapacity,
automateLimit
);

testsPerMonth[i] = {
uniqueTests,
automated,
automatedInMonth: automated - previousAutomated,
manual: uniqueTests - automated
};
}
const today = new Date();
let prevEconomy = 0;
testsPerMonth = testsPerMonth.flatMap(({ uniqueTests, automated, manual, limit, automatedInMonth }, ix) => {
const manualCost = manual * breeding * launchesPerMonth / performance;
const automatedCost = automatedInMonth * timeToAutomateTest;
const manualOnlyCost = uniqueTests * breeding * launchesPerMonth / performance
const maintainanceCost = automated * maintainanceTime * maintainanceFactor;
const totalCostWithThirium = automatedCost * autoHourPayment + manualCost * manualHourPayment + maintainanceCost * automatedCost;
const month = new Date(today.getTime());
month.setMonth(today.getMonth() + ix);
const date = ix + 1;
const economy = manualOnlyCost * manualHourPayment - totalCostWithThirium;
const cumulativeEconomy = prevEconomy + economy;
prevEconomy = cumulativeEconomy;
return [
{ date, type: 'uniqueTests', value: uniqueTests },
{ date, type: 'automated', value: automated },
{ date, type: 'manual', value: manual },
{ date, type: 'limit', value: limit },
{ date, type: 'manualOnlyCost', value: manualOnlyCost },
{ date, type: 'automatedCost', value: automatedCost },
{ date, type: 'manualCost', value: manualCost },
{ date, type: 'maintainanceCost', value: maintainanceCost },
{ date, type: 'economy', value: economy },
{ date, type: 'cumulativeEconomy', value: cumulativeEconomy }
];
});
console.log(testsPerMonth);

return testsPerMonth;
}
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more