Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
gkalabin committed Jan 26, 2025
1 parent bc14de6 commit 558a8bd
Show file tree
Hide file tree
Showing 13 changed files with 414 additions and 205 deletions.
8 changes: 4 additions & 4 deletions src/app/(authenticated)/overview/balance.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {AmountWithCurrency} from '@/lib/AmountWithCurrency';
import {AmountWithUnit} from '@/lib/AmountWithUnit';
import {useCoreDataContext} from '@/lib/context/CoreDataContext';
import {useTransactionDataContext} from '@/lib/context/TransactionDataContext';
import {BankAccount, accountUnit} from '@/lib/model/BankAccount';
import {Account, accountUnit} from '@/lib/model/Account';
import {useOpenBankingBalances} from '@/lib/openbanking/context';
import {cn} from '@/lib/utils';
import {
Expand All @@ -26,7 +26,7 @@ export function BankBalance({
return <>{amount.round().format()}</>;
}

export function AccountBalance({account}: {account: BankAccount}) {
export function AccountBalance({account}: {account: Account}) {
const {balances} = useOpenBankingBalances();
const {stocks} = useCoreDataContext();
const obBalance = balances?.find(b => b.internalAccountId === account.id);
Expand All @@ -41,7 +41,7 @@ export function AccountBalance({account}: {account: BankAccount}) {
return <RemoteBalance account={account} remoteBalance={remoteBalance} />;
}

function LocalBalance({account}: {account: BankAccount}) {
function LocalBalance({account}: {account: Account}) {
const hideBalances = useHideBalances();
const {stocks} = useCoreDataContext();
const {transactions} = useTransactionDataContext();
Expand All @@ -56,7 +56,7 @@ function RemoteBalance({
account,
remoteBalance,
}: {
account: BankAccount;
account: Account;
remoteBalance: AmountWithUnit;
}) {
const hideBalances = useHideBalances();
Expand Down
16 changes: 9 additions & 7 deletions src/app/(authenticated)/overview/bank.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@ import {useDisplayCurrency} from '@/lib/context/DisplaySettingsContext';
import {useMarketDataContext} from '@/lib/context/MarketDataContext';
import {useTransactionDataContext} from '@/lib/context/TransactionDataContext';
import {
Bank,
BankAccount,
Account,
accountPageURL,
accountsForBank,
} from '@/lib/model/Account';
import {
Bank,
bankPageURL,
} from '@/lib/model/BankAccount';
} from '@/lib/model/Bank';
import {cn} from '@/lib/utils';
import Link from 'next/link';

Expand All @@ -48,18 +50,18 @@ const ITEM_BORDER_COLORS = [

export function BanksListItem({bank}: {bank: Bank}) {
const displayCurrency = useDisplayCurrency();
const {stocks, bankAccounts} = useCoreDataContext();
const {stocks, accounts} = useCoreDataContext();
const {exchange} = useMarketDataContext();
const {transactions} = useTransactionDataContext();
const accounts = accountsForBank(bank, bankAccounts);
const bankAccounts = accountsForBank(bank, accounts);
const bankTotal = accountsSum(
accounts,
displayCurrency,
exchange,
transactions,
stocks
);
const activeAccounts = accounts.filter(a => !a.archived);
const activeAccounts = bankAccounts.filter(a => !a.archived);
return (
<Card>
<CardHeader>
Expand Down Expand Up @@ -96,7 +98,7 @@ export function BankAccountListItem({
bank,
colorIndex,
}: {
account: BankAccount;
account: Account;
bank: Bank;
colorIndex: number;
}) {
Expand Down
8 changes: 4 additions & 4 deletions src/app/(authenticated)/overview/modelHelpers.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import {AmountWithCurrency} from '@/lib/AmountWithCurrency';
import {AmountWithUnit} from '@/lib/AmountWithUnit';
import {StockAndCurrencyExchange} from '@/lib/ClientSideModel';
import {BankAccount, accountUnit} from '@/lib/model/BankAccount';
import {Account, accountUnit} from '@/lib/model/Account';
import {Currency} from '@/lib/model/Currency';
import {Stock} from '@/lib/model/Stock';
import {isCurrency, isStock} from '@/lib/model/Unit';
import {Transaction} from '@/lib/model/transaction/Transaction';

export function transactionBelongsToAccount(
t: Transaction,
account: BankAccount
account: Account
): boolean {
switch (t.kind) {
case 'ThirdPartyExpense':
Expand All @@ -26,7 +26,7 @@ export function transactionBelongsToAccount(
}

export function accountBalance(
account: BankAccount,
account: Account,
allTransactions: Transaction[],
stocks: Stock[]
): AmountWithUnit {
Expand Down Expand Up @@ -59,7 +59,7 @@ export function accountBalance(

// TODO: move to the model folder.
export function accountsSum(
accounts: BankAccount[],
accounts: Account[],
targetCurrency: Currency,
exchange: StockAndCurrencyExchange,
allTransactions: Transaction[],
Expand Down
62 changes: 29 additions & 33 deletions src/lib/ClientSideModel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,9 @@ import {
MarketData as MarketDataDB,
TransactionData as TransactionDataDB,
} from '@/lib/db/fetch';
import {Account, accountModelFromDB} from '@/lib/model/Account';
import {AllDatabaseData} from '@/lib/model/AllDatabaseDataModel';
import {
Bank,
BankAccount,
bankAccountModelFromDB,
bankModelFromDB,
} from '@/lib/model/BankAccount';
import {Bank, bankModelFromDB} from '@/lib/model/Bank';
import {
Category,
categoryModelFromDB,
Expand All @@ -30,8 +26,8 @@ import {
} from '@/lib/model/TransactionLink';
import {Trip, tripModelFromDB} from '@/lib/model/Trip';
import {
AccountNEW as DBAccount,
Bank as DBBank,
BankAccount as DBBankAccount,
ExchangeRate as DBExchangeRate,
Stock as DBStock,
StockQuote as DBStockQuote,
Expand Down Expand Up @@ -235,7 +231,7 @@ export class StockQuotes {
export type CoreDataModel = {
categories: Category[];
banks: Bank[];
bankAccounts: BankAccount[];
accounts: Account[];
stocks: Stock[];
trips: Trip[];
tags: Tag[];
Expand All @@ -255,7 +251,7 @@ export type AllClientDataModel = {
transactions: Transaction[];
categories: Category[];
banks: Bank[];
bankAccounts: BankAccount[];
accounts: Account[];
stocks: Stock[];
trips: Trip[];
tags: Tag[];
Expand All @@ -273,50 +269,50 @@ function mustBank(bank: Bank | undefined, message: string): Bank {

export const banksModelFromDatabaseData = (
dbBanks: DBBank[],
dbBankAccounts: DBBankAccount[],
dbAccounts: DBAccount[],
dbStocks: DBStock[]
): [Bank[], BankAccount[], Stock[]] => {
): [Bank[], Account[], Stock[]] => {
const stocks = dbStocks.map(stockModelFromDB);
const banks = dbBanks
.map(bankModelFromDB)
.sort((a, b) => a.displayOrder - b.displayOrder);
const bankAccounts = dbBankAccounts.map(bankAccountModelFromDB);
const accounts = dbAccounts.map(accountModelFromDB);
// Sort bank accounts by display order, but taking precedence of the bank display order.
const bankById = new Map<number, Bank>(banks.map(b => [b.id, b]));
const bankByBankAccountId = new Map<number, Bank>(
bankAccounts.map(a => {
const bank = mustBank(
bankById.get(a.bankId),
`Bank ${a.bankId} for account ${a.id}`
);
return [a.id, bank];
})
);
bankAccounts.sort((a, b) => {
const bankA = mustBank(bankByBankAccountId.get(a.id), `Bank ${a.id}`);
const bankB = mustBank(bankByBankAccountId.get(b.id), `Bank ${b.id}`);
if (bankA.displayOrder != bankB.displayOrder) {
return bankA.displayOrder - bankB.displayOrder;
const bankByAccountId = new Map<number, Bank>();
accounts.forEach(a => {
if (a.bankId) {
const bank = mustBank(bankById.get(a.bankId), `${a.id}`);
bankByAccountId.set(a.id, bank);
}
});
accounts.sort((a, b) => {
const bankA = bankByAccountId.get(a.id);
const bankB = bankByAccountId.get(b.id);
const bankADisplayOrder = bankA?.displayOrder ?? -1;
const bankBDisplayOrder = bankB?.displayOrder ?? -1;
if (bankADisplayOrder != bankBDisplayOrder) {
return bankADisplayOrder - bankBDisplayOrder;
}
return a.displayOrder - b.displayOrder;
});
return [banks, bankAccounts, stocks];
return [banks, accounts, stocks];
};

export function coreModelFromDB(dbData: CoreDataDB): CoreDataModel {
const categories = sortCategories(
dbData.dbCategories.map(categoryModelFromDB)
);
const [banks, bankAccounts, stocks] = banksModelFromDatabaseData(
const [banks, accounts, stocks] = banksModelFromDatabaseData(
dbData.dbBanks,
dbData.dbBankAccounts,
dbData.dbAccounts,
dbData.dbStocks
);
const trips = dbData.dbTrips.map(tripModelFromDB);
const tags = dbData.dbTags.map(tagModelFromDB);
return {
banks,
bankAccounts,
accounts,
stocks,
categories,
trips,
Expand Down Expand Up @@ -358,9 +354,9 @@ export const modelFromDatabaseData = (
const stockQuotes = new StockQuotes(dbData.dbStockQuotes);
const exchange = new StockAndCurrencyExchange(exchangeRates, stockQuotes);

const [banks, bankAccounts, stocks] = banksModelFromDatabaseData(
const [banks, accounts, stocks] = banksModelFromDatabaseData(
dbData.dbBanks,
dbData.dbBankAccounts,
dbData.dbAccounts,
dbData.dbStocks
);

Expand All @@ -377,7 +373,7 @@ export const modelFromDatabaseData = (
);
return {
banks,
bankAccounts,
accounts,
stocks,
categories,
trips,
Expand Down
16 changes: 9 additions & 7 deletions src/lib/db/fetch.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
import {updateRatesFallback} from '@/lib/asset-rates/backfill';
import {DB} from '@/lib/db';
import {TransactionWithTagIds} from '@/lib/model/AllDatabaseDataModel';
import {TransactionNEWWithTagIds} from '@/lib/model/AllDatabaseDataModel';
import {
AccountNEW,
Bank,
BankAccount,
Category,
DisplaySettings,
ExchangeRate,
Stock,
StockQuote,
Tag,
TransactionLink,
TransactionLineNEW,
TransactionLinkNEW,
TransactionPrototype,
Trip,
} from '@prisma/client';

export type TransactionData = {
dbTransactions: TransactionWithTagIds[];
dbTransactionLinks: TransactionLink[];
dbTransactions: TransactionNEWWithTagIds[];
dbTransactionLines: TransactionLineNEW[];
dbTransactionLinks: TransactionLinkNEW[];
dbTransactionPrototypes: TransactionPrototype[];
};

Expand Down Expand Up @@ -55,7 +57,7 @@ export async function fetchTransactionData({
export type CoreData = {
dbCategories: Category[];
dbBanks: Bank[];
dbBankAccounts: BankAccount[];
dbAccounts: AccountNEW[];
dbTrips: Trip[];
dbTags: Tag[];
dbStocks: Stock[];
Expand Down Expand Up @@ -90,7 +92,7 @@ export async function fetchCoreData({
},
async () => {
console.time(timeLabel('dbBankAccounts'));
data.dbBankAccounts = await db.bankAccountFindMany();
data.dbAccounts = await db.accountFindMany();
console.timeEnd(timeLabel('dbBankAccounts'));
},
async () => {
Expand Down
11 changes: 6 additions & 5 deletions src/lib/db/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
import {CoreData, MarketData, TransactionData} from '@/lib/db/fetch';
import {
AllDatabaseData,
TransactionNEWWithTagIds,
TransactionWithTagIds,
} from '@/lib/model/AllDatabaseDataModel';
import {USD} from '@/lib/model/Currency';
Expand All @@ -20,8 +21,8 @@ export class DB {
this.userId = userId;
}

async transactionFindAll(): Promise<TransactionWithTagIds[]> {
return await prisma.transaction.findMany({
async transactionFindAll(): Promise<TransactionNEWWithTagIds[]> {
return await prisma.transactionNEW.findMany({
where: {
userId: this.userId,
},
Expand Down Expand Up @@ -50,7 +51,7 @@ export class DB {
});
}
async transactionLinkFindAll() {
const transactionLinks = await prisma.transactionLink.findMany({
const transactionLinks = await prisma.transactionLinkNEW.findMany({
// Where either of the transactions has this user id.
where: {
OR: [
Expand Down Expand Up @@ -92,8 +93,8 @@ export class DB {
async bankFindMany(args?: Prisma.BankFindManyArgs) {
return await prisma.bank.findMany(this.whereUser(args ?? {}));
}
async bankAccountFindMany(args?: Prisma.BankAccountFindManyArgs) {
return await prisma.bankAccount.findMany(this.whereUser(args ?? {}));
async accountFindMany(args?: Prisma.AccountNEWFindManyArgs) {
return await prisma.accountNEW.findMany(this.whereUser(args ?? {}));
}
async categoryFindMany(args?: Prisma.CategoryFindManyArgs) {
return await prisma.category.findMany(this.whereUser(args ?? {}));
Expand Down
Loading

0 comments on commit 558a8bd

Please sign in to comment.