Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 16 additions & 21 deletions src/features/empire/components/EmpireCostOverview.vue
Original file line number Diff line number Diff line change
Expand Up @@ -19,27 +19,17 @@
? props.costOverview.totalProfit / props.costOverview.totalAreaUsed
: 0;
});

const revenuePercentage = (value: number) =>
props.costOverview.totalRevenue
? (value / props.costOverview.totalRevenue) * 100
: 0;
</script>

<template>
<div
class="grid grid-cols-[auto_auto] grid-rows-2 sm:grid-rows-1 sm:grid-cols-[1fr_auto_auto_auto_auto_1fr] gap-6 child:child:text-center">
<div class="sm:col-2">
<div class="text-white/40 text-xs">{{ $t("terms.profit") }}</div>
<div class="text-white text-xl">
{{ formatNumber(costOverview.totalProfit) }}
</div>
<div class="text-white/40 text-xs">
{{
formatNumber(
(costOverview.totalProfit / costOverview.totalRevenue) *
100
)
}}
%
</div>
</div>
<div>
<div class="text-white/40 text-xs">{{ $t("terms.revenue") }}</div>
<div class="text-white text-xl">
{{ formatNumber(costOverview.totalRevenue) }}
Expand All @@ -51,12 +41,17 @@
{{ formatNumber(costOverview.totalCost) }}
</div>
<div class="text-white/40 text-xs">
{{
formatNumber(
(costOverview.totalCost / costOverview.totalRevenue) *
100
)
}}
{{ formatNumber(revenuePercentage(costOverview.totalCost)) }}
%
</div>
</div>
<div>
<div class="text-white/40 text-xs">{{ $t("terms.profit") }}</div>
<div class="text-white text-xl">
{{ formatNumber(costOverview.totalProfit) }}
</div>
<div class="text-white/40 text-xs">
{{ formatNumber(revenuePercentage(costOverview.totalProfit)) }}
%
</div>
</div>
Expand Down
29 changes: 26 additions & 3 deletions src/features/planning/util/materialIO.util.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Composables
import {
IEmpireMaterialIO,
IEmpireCostOverview,
IEmpireMaterialIOPlanet,
IEmpireMaterialIOState,
IEmpirePlanMaterialIO,
Expand Down Expand Up @@ -149,9 +150,9 @@ export async function useMaterialIOUtil() {
*/

Object.entries(combinedMap).map(([ticker, pre]) => {
const flatPlanets = [pre.inputPlanets, pre.outputPlanets]
.flat()
.filter((v) => v);
const flatPlanets = [...pre.inputPlanets, ...pre.outputPlanets].filter(
(p) => p.delta
);

const flatValues: number[] = flatPlanets.map((pv) =>
Math.abs(pv.delta)
Expand Down Expand Up @@ -180,6 +181,27 @@ export async function useMaterialIOUtil() {
);
}

function calculateEmpireCostOverview(
data: IEmpireMaterialIO[],
totalAreaUsed: number
): IEmpireCostOverview {
const { totalRevenue, totalCost } = data.reduce(
(totals, { deltaPrice }) => {
if (deltaPrice > 0) totals.totalRevenue += deltaPrice;
if (deltaPrice < 0) totals.totalCost -= deltaPrice;
return totals;
},
{ totalRevenue: 0, totalCost: 0 }
);

return {
totalRevenue,
totalCost,
totalProfit: totalRevenue - totalCost,
totalAreaUsed,
};
}

async function empireMaterialIOState(
empire: IPlanEmpireElement | undefined,
data: IEmpireMaterialIO[]
Expand Down Expand Up @@ -250,6 +272,7 @@ export async function useMaterialIOUtil() {
combineMaterialIOMinimal,
enhanceMaterialIOMinimal,
combineEmpireMaterialIO,
calculateEmpireCostOverview,
empireMaterialIOState,
};
}
71 changes: 33 additions & 38 deletions src/tests/features/planning/util/materialIO.util.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,35 +160,32 @@ describe("Util: materialIO ", async () => {
});

it("combineEmpireMaterialIO", async () => {
const material = (
ticker: string,
input: number,
output: number,
price: number
) => ({
ticker,
input,
output,
delta: output - input,
individualVolume: 0,
individualWeight: 0,
totalWeight: 0,
totalVolume: 0,
price,
});
const fakeInput: IEmpirePlanMaterialIO[] = [
{
planetId: "foo",
planUuid: "foo#1",
planName: "foo",
planCOGC: "---",
materialIO: [
{
ticker: "RAT",
input: 10,
output: 2,
delta: 8,
individualVolume: 0,
individualWeight: 0,
totalWeight: 0,
totalVolume: 0,
price: 5,
},
{
ticker: "DW",
input: 0,
output: 3,
delta: -3,
individualVolume: 0,
individualWeight: 0,
totalWeight: 0,
totalVolume: 0,
price: 5,
},
material("OUT", 0, 2, 5),
material("DW", 0, 3, 5),
material("OUT", 1, 1, 0),
],
},
{
Expand All @@ -197,36 +194,34 @@ describe("Util: materialIO ", async () => {
planName: "moo",
planCOGC: "---",
materialIO: [
{
ticker: "DW",
input: 3,
output: 0,
delta: -3,
individualVolume: 0,
individualWeight: 0,
totalWeight: 0,
totalVolume: 0,
price: 5,
},
material("DW", 3, 0, -5),
material("IN", 3, 0, -9),
],
},
];

const { combineEmpireMaterialIO } = await useMaterialIOUtil();
const { combineEmpireMaterialIO, calculateEmpireCostOverview } =
await useMaterialIOUtil();

const result = combineEmpireMaterialIO(fakeInput);

expect(result.length).toBe(2);
expect(result.length).toBe(3);
// sorting
expect(result[0].ticker).toBe("DW");
expect(result[1].ticker).toBe("RAT");
expect(result[1].ticker).toBe("IN");
expect(result[2].ticker).toBe("OUT");

expect(result[0].delta).toBe(-6);
expect(result[0].deltaPrice).toBe(-10);
expect(result[0].delta).toBe(0);
expect(result[0].deltaPrice).toBe(0);
expect(result[0].input).toBe(3);
expect(result[0].output).toBe(3);
expect(result[0].inputPlanets.length).toBe(1);
expect(result[0].outputPlanets.length).toBe(1);
expect(calculateEmpireCostOverview(result, 25)).toMatchObject({
totalRevenue: 5,
totalCost: 9,
totalProfit: -4,
});
});
it("combineEmpireMaterialIO", async () => {
const fakeInput: IEmpirePlanMaterialIO[] = [
Expand Down
48 changes: 16 additions & 32 deletions src/views/EmpireView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@
import { usePlanCalculation } from "@/features/planning/usePlanCalculation";
import { useMaterialIOUtil } from "@/features/planning/util/materialIO.util";
import { usePreferences } from "@/features/preferences/usePreferences";
const { combineEmpireMaterialIO, empireMaterialIOState } =
const {
calculateEmpireCostOverview,
combineEmpireMaterialIO,
empireMaterialIOState,
} =
await useMaterialIOUtil();
const { defaultEmpireUuid } = usePreferences();

Expand Down Expand Up @@ -119,7 +123,7 @@
// note, calculation depends on empire + cx, so a plan is only
// calculated properly within this context

const cacheKey: string = `${plan.uuid}#${selectedCXUuid.value}#${selectedCXUuid.value}`;
const cacheKey: string = `${plan.uuid}#${selectedEmpireUuid.value}#${selectedCXUuid.value}`;

if (cacheCalculatedPlans.has(cacheKey)) {
calculatedPlans.value[plan.uuid!] =
Expand Down Expand Up @@ -186,36 +190,6 @@
);
});

/**
* Holds computed cost overview based on plan results.
* @author jplacht
*
* @type {ComputedRef<IEmpireCostOverview>} Empire Cost overview
*/
const costOverview: ComputedRef<IEmpireCostOverview> = computed(() => {
const totalProfit: number = Object.values(calculatedPlans.value).reduce(
(sum, element) => sum + element.profit,
0
);
const totalRevenue: number = Object.values(
calculatedPlans.value
).reduce((sum, element) => sum + element.revenue, 0);
const totalCost: number = Object.values(calculatedPlans.value).reduce(
(sum, element) => sum + element.cost,
0
);
const totalAreaUsed: number = Object.values(
calculatedPlans.value
).reduce((sum, element) => sum + element.area.areaUsed, 0);

return {
totalProfit,
totalRevenue,
totalCost,
totalAreaUsed,
};
});

/**
* Holds computed empire name.
* @author jplacht
Expand Down Expand Up @@ -283,6 +257,16 @@
() => combineEmpireMaterialIO(empireMaterialIO.value)
);

const costOverview: ComputedRef<IEmpireCostOverview> = computed(() =>
calculateEmpireCostOverview(
combinedEmpireMaterialIO.value,
Object.values(calculatedPlans.value).reduce(
(sum, element) => sum + element.area.areaUsed,
0
)
)
);

/**
* Holds computed empire options
*
Expand Down