diff --git a/src/ledger/balanceAppraisal.spec.ts b/src/ledger/balanceAppraisal.spec.ts new file mode 100644 index 0000000..1f0559c --- /dev/null +++ b/src/ledger/balanceAppraisal.spec.ts @@ -0,0 +1,34 @@ +import {describe, expect, test} from 'vitest'; +import {appraiseItemBalances} from './balanceAppraisal'; +import type {MarketTypePrice} from '@/market'; + +const price = (id: number, buy: number, sell: number): MarketTypePrice => ({ + type: {id, name: `type-${id}`} as MarketTypePrice['type'], + buy, + sell, + orderCount: 1, +}); + +describe('appraiseItemBalances', () => { + test('sums quantity times buy and sell across stacks', () => { + const result = appraiseItemBalances( + [{typeId: 1, quantity: 2}, {typeId: 2, quantity: 3}], + [price(1, 10, 12), price(2, 100, 110)], + ); + + expect(result).toEqual({buy: 2 * 10 + 3 * 100, sell: 2 * 12 + 3 * 110}); + }); + + test('ignores stacks with no resolved price', () => { + const result = appraiseItemBalances( + [{typeId: 1, quantity: 2}, {typeId: 99, quantity: 5}], + [price(1, 10, 12)], + ); + + expect(result).toEqual({buy: 20, sell: 24}); + }); + + test('returns zero totals for no items', () => { + expect(appraiseItemBalances([], [])).toEqual({buy: 0, sell: 0}); + }); +}); diff --git a/src/ledger/balanceAppraisal.ts b/src/ledger/balanceAppraisal.ts new file mode 100644 index 0000000..79b8d91 --- /dev/null +++ b/src/ledger/balanceAppraisal.ts @@ -0,0 +1,25 @@ +import {ItemBalanceResponse} from "@/generated/mammon"; +import {MarketTypePrice} from "@/market"; + +export interface ItemBalanceAppraisal { + buy: number; + sell: number; +} + +export const appraiseItemBalances = ( + itemBalances: ItemBalanceResponse[], + prices: MarketTypePrice[], +): ItemBalanceAppraisal => { + const priceByTypeId = new Map(prices.map(p => [p.type.id, p])); + + return itemBalances.reduce((totals, {typeId, quantity}) => { + const price = priceByTypeId.get(typeId); + + if (price) { + totals.buy += quantity * price.buy; + totals.sell += quantity * price.sell; + } + + return totals; + }, {buy: 0, sell: 0}); +}; diff --git a/src/ledger/index.ts b/src/ledger/index.ts index 441a9d3..ea43500 100644 --- a/src/ledger/index.ts +++ b/src/ledger/index.ts @@ -1,4 +1,5 @@ export * from './ledger'; +export * from './balanceAppraisal'; export {default as LedgerLabel} from './LedgerLabel.vue'; export {default as LedgerSelect} from './LedgerSelect.vue'; diff --git a/src/pages/ledger/ViewLedger.vue b/src/pages/ledger/ViewLedger.vue index 4d8bd07..b472fde 100644 --- a/src/pages/ledger/ViewLedger.vue +++ b/src/pages/ledger/ViewLedger.vue @@ -1,10 +1,29 @@ @@ -14,8 +33,12 @@ const {ledger} = useLedgerParam();
-
- +
+ + ~ buy / + ~ sell + +