194 lines
10 KiB
TypeScript
194 lines
10 KiB
TypeScript
import React, { useEffect } from 'react'
|
|
import { CompareProduct, useCompareProductDataStore, useInputValues, useMachineDowntime, useMachineUptime, useProductionCapacityData, useROISummaryData, useThroughPutData } from '../../../../store/builder/store';
|
|
import { usePlayButtonStore } from '../../../../store/usePlayButtonStore';
|
|
import { useProductContext } from '../../products/productContext';
|
|
import { useProductStore } from '../../../../store/simulation/useProductStore';
|
|
|
|
export default function ROIData() {
|
|
const { selectedProductStore } = useProductContext();
|
|
const { inputValues } = useInputValues();
|
|
const { productionCapacityData } = useProductionCapacityData()
|
|
const { selectedProduct } = selectedProductStore();
|
|
const { isPlaying } = usePlayButtonStore();
|
|
const { setRoiSummaryData } = useROISummaryData();
|
|
const { products, getProductById } = useProductStore();
|
|
const { compareProductsData, setCompareProductsData } = useCompareProductDataStore();
|
|
const { machineActiveTime, setMachineActiveTime } = useMachineUptime();
|
|
const { machineIdleTime, setMachineIdleTime } = useMachineDowntime();
|
|
const { throughputData } = useThroughPutData()
|
|
|
|
useEffect(() => {
|
|
if (isPlaying) return;
|
|
setRoiSummaryData({
|
|
productName: "",
|
|
roiPercentage: 0,
|
|
paybackPeriod: 0,
|
|
totalCost: 0,
|
|
revenueGenerated: 0,
|
|
netProfit: 0,
|
|
netLoss: 0,
|
|
});
|
|
}, [isPlaying]);
|
|
|
|
useEffect(() => {
|
|
if (inputValues === undefined || !isPlaying) return;
|
|
const electricityCost = parseFloat(inputValues["Electricity cost"]);
|
|
const fixedCost = parseFloat(inputValues["Fixed costs"]);
|
|
const laborCost = parseFloat(inputValues["Labor Cost"]);
|
|
const laborCount = parseFloat(inputValues["Labor Count"]);
|
|
const maintenanceCost = parseFloat(inputValues["Maintenance cost"]);
|
|
const materialCost = parseFloat(inputValues["Material cost"]);
|
|
const productionPeriod = parseFloat(inputValues["Production period"]);
|
|
const salvageValue = parseFloat(inputValues["Salvage value"]);
|
|
const sellingPrice = parseFloat(inputValues["Selling price"]);
|
|
const initialInvestment = parseFloat(inputValues["Initial Investment"]);
|
|
const shiftLength = parseFloat(inputValues["Shift length"]);
|
|
const shiftsPerDay = parseFloat(inputValues["Shifts / day"]);
|
|
const workingDaysPerYear = parseFloat(inputValues["Working days / year"]);
|
|
|
|
if (!isNaN(electricityCost) && !isNaN(fixedCost) && !isNaN(laborCost) && !isNaN(maintenanceCost) &&
|
|
!isNaN(materialCost) && !isNaN(productionPeriod) && !isNaN(salvageValue) && !isNaN(sellingPrice) &&
|
|
!isNaN(shiftLength) && !isNaN(shiftsPerDay) && !isNaN(workingDaysPerYear) && productionCapacityData > 0) {
|
|
console.log('productionCapacityData: ', productionCapacityData);
|
|
|
|
// const totalHoursPerYear = shiftLength * shiftsPerDay * workingDaysPerYear;
|
|
// const annualProductionUnits = productionCapacityData * totalHoursPerYear;
|
|
// const annualRevenue = annualProductionUnits * sellingPrice;
|
|
|
|
// const totalMaterialCost = annualProductionUnits * materialCost;
|
|
// const totalLaborCost = laborCost * totalHoursPerYear;
|
|
// const totalEnergyCost = electricityCost * totalHoursPerYear;
|
|
// const totalMaintenanceCost = maintenanceCost + fixedCost;
|
|
// const totalAnnualCost = totalMaterialCost + totalLaborCost + totalEnergyCost + totalMaintenanceCost;
|
|
// const annualProfit = annualRevenue - totalAnnualCost;
|
|
|
|
// const netProfit = annualProfit * productionPeriod;
|
|
// const roiPercentage = ((annualProfit + salvageValue - initialInvestment) / initialInvestment) * 100;
|
|
// const paybackPeriod = initialInvestment / (annualProfit || 1); // Avoid division by 0
|
|
|
|
// setRoiSummaryData({
|
|
// productName: selectedProduct.productName,
|
|
// roiPercentage: parseFloat((roiPercentage / 100).toFixed(2)),
|
|
// paybackPeriod: parseFloat(paybackPeriod.toFixed(2)),
|
|
// totalCost: parseFloat(totalAnnualCost.toFixed(2)),
|
|
// revenueGenerated: parseFloat(annualRevenue.toFixed(2)),
|
|
// netProfit: netProfit > 0 ? parseFloat(netProfit.toFixed(2)) : 0,
|
|
// netLoss: netProfit < 0 ? -netProfit : 0
|
|
// });
|
|
|
|
// const productCount = 1000;
|
|
// const costPerUnit = totalAnnualCost / annualProductionUnits;
|
|
// const costForTargetUnits = productCount * costPerUnit;
|
|
// const revenueForTargetUnits = productCount * sellingPrice;
|
|
// const profitForTargetUnits = revenueForTargetUnits - costForTargetUnits;
|
|
|
|
// const netProfitForTarget = profitForTargetUnits > 0 ? profitForTargetUnits : 0;
|
|
// const netLossForTarget = profitForTargetUnits < 0 ? -profitForTargetUnits : 0;
|
|
|
|
// const productData = getProductById(selectedProduct.productUuid);
|
|
// const prev = useCompareProductDataStore.getState().compareProductsData;
|
|
// const newData: CompareProduct = {
|
|
// productUuid: productData?.productUuid ?? '',
|
|
// productName: productData?.productName ?? '',
|
|
// simulationData: {
|
|
// // costPerUnit: parseFloat(costPerUnit.toFixed(2)),
|
|
// // workingDaysPerYear: parseFloat(workingDaysPerYear.toFixed(2)),
|
|
// // shiftLength: parseFloat(shiftLength.toFixed(2)),
|
|
// // shiftsPerDay: parseFloat(shiftsPerDay.toFixed(2)),
|
|
// roiPercentage: parseFloat((roiPercentage / 100).toFixed(2)),
|
|
// // paybackPeriod: parseFloat(paybackPeriod.toFixed(2)),
|
|
// // totalCost: parseFloat(totalAnnualCost.toFixed(2)),
|
|
// // revenueGenerated: parseFloat(annualRevenue.toFixed(2)),
|
|
// netProfit: netProfit > 0 ? parseFloat(netProfit.toFixed(2)) : 0,
|
|
// productionCapacity: parseFloat(productionCapacityData.toFixed(2)),
|
|
// // netLoss: netProfit < 0 ? parseFloat((-netProfit).toFixed(2)) : 0,
|
|
// machineIdleTime: parseFloat(machineIdleTime.toFixed(2)),
|
|
// machineActiveTime: parseFloat(machineActiveTime.toFixed(2)),
|
|
// throughputData: throughputData,
|
|
// }
|
|
// };
|
|
|
|
// const existingIndex = prev.findIndex((item: CompareProduct) =>
|
|
// item.productUuid === productData?.productUuid
|
|
// );
|
|
|
|
// if (existingIndex !== -1) {
|
|
// const updated = [...prev];
|
|
// updated[existingIndex] = newData;
|
|
// setCompareProductsData(updated);
|
|
// } else {
|
|
// setCompareProductsData([...prev, newData]);
|
|
// }
|
|
|
|
const Annual_units = throughputData * workingDaysPerYear
|
|
const Total_units = Annual_units * productionPeriod
|
|
|
|
const Total_revenue = Total_units * sellingPrice
|
|
const Total_variable_cost = Total_units * (materialCost + (laborCost))
|
|
|
|
const Total_fixed_cost = (maintenanceCost + electricityCost + fixedCost) * workingDaysPerYear * productionPeriod
|
|
const Total_cost = Total_variable_cost + Total_fixed_cost
|
|
|
|
const Net_profit = Total_revenue - Total_cost + (salvageValue * workingDaysPerYear * productionPeriod)
|
|
|
|
const ROI = (Net_profit / initialInvestment) * 100
|
|
|
|
const Annual_net_profit = (Annual_units * (sellingPrice - materialCost - laborCost)) - (maintenanceCost + electricityCost + fixedCost) * workingDaysPerYear + (salvageValue * workingDaysPerYear)
|
|
const Payback_period_years = initialInvestment / Annual_net_profit;
|
|
|
|
setRoiSummaryData({
|
|
productName: selectedProduct.productName,
|
|
roiPercentage: ROI,
|
|
paybackPeriod: Payback_period_years,
|
|
totalCost: Total_cost,
|
|
revenueGenerated: Total_revenue,
|
|
netProfit: Net_profit > 0 ? Net_profit : 0,
|
|
netLoss: Net_profit < 0 ? -Net_profit : 0
|
|
});
|
|
|
|
|
|
const productData = getProductById(selectedProduct.productUuid);
|
|
const prev = useCompareProductDataStore.getState().compareProductsData;
|
|
const newData: CompareProduct = {
|
|
productUuid: productData?.productUuid ?? '',
|
|
productName: productData?.productName ?? '',
|
|
simulationData: {
|
|
// costPerUnit: costPerUnit,
|
|
// workingDaysPerYear: workingDaysPerYear,
|
|
// shiftLength: shiftLength,
|
|
// shiftsPerDay: shiftsPerDay,
|
|
roiPercentage: ROI,
|
|
// paybackPeriod: paybackPeriod,
|
|
// totalCost: totalAnnualCost,
|
|
// revenueGenerated: annualRevenue,
|
|
netProfit: Net_profit > 0 ? Net_profit : 0,
|
|
productionCapacity: productionCapacityData,
|
|
// netLoss: netProfit < 0 ? (-netProfit) : 0,
|
|
machineIdleTime: machineIdleTime,
|
|
machineActiveTime: machineActiveTime,
|
|
throughputData: throughputData,
|
|
}
|
|
};
|
|
|
|
const existingIndex = prev.findIndex((item: CompareProduct) =>
|
|
item.productUuid === productData?.productUuid
|
|
);
|
|
|
|
if (existingIndex !== -1) {
|
|
const updated = [...prev];
|
|
updated[existingIndex] = newData;
|
|
setCompareProductsData(updated);
|
|
} else {
|
|
setCompareProductsData([...prev, newData]);
|
|
}
|
|
}
|
|
|
|
}, [inputValues, productionCapacityData, throughputData, isPlaying]);
|
|
|
|
useEffect(() => {
|
|
console.log('compareProductsData: ', compareProductsData);
|
|
}, [compareProductsData])
|
|
|
|
return null;
|
|
}
|