feat(#40): Show an appraised estimate of held items on the ledger
This commit is contained in:
1 parent
38e1063ac5
commit
d4b48b05ee
4 files changed
+88
-5
No files matched your search
@@ -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});
|
||||
});
|
||||
});
|
||||
@@ -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<ItemBalanceAppraisal>((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});
|
||||
};
|
||||
@@ -1,4 +1,5 @@
|
||||
export * from './ledger';
|
||||
export * from './balanceAppraisal';
|
||||
|
||||
export {default as LedgerLabel} from './LedgerLabel.vue';
|
||||
export {default as LedgerSelect} from './LedgerSelect.vue';
|
||||
|
||||
Reference in new issue
Block a user