Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Balance sheet and P/L nested accounts #501

Merged
merged 1 commit into from
Jun 12, 2024
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import { BalanceSheetPercentage } from './BalanceSheetPercentage';
import { BalanceSheetSchema } from './BalanceSheetSchema';
import { BalanceSheetBase } from './BalanceSheetBase';
import { BalanceSheetQuery } from './BalanceSheetQuery';
import { flatToNestedArray } from '@/utils';
import BalanceSheetRepository from './BalanceSheetRepository';

export const BalanceSheetAccounts = (Base: any) =>
class extends R.compose(
Expand Down Expand Up @@ -56,6 +58,11 @@ export const BalanceSheetAccounts = (Base: any) =>
*/
readonly i18n: any;

/**
* Balance sheet repository.
*/
readonly repository: BalanceSheetRepository;

/**
* Retrieve the accounts node of accounts types.
* @param {string} accountsTypes
Expand All @@ -78,8 +85,12 @@ export const BalanceSheetAccounts = (Base: any) =>
private reportSchemaAccountNodeMapper = (
account: IAccount
): IBalanceSheetAccountNode => {
const childrenAccountsIds = this.repository.accountsGraph.dependenciesOf(
account.id
);
const accountIds = R.uniq(R.append(account.id, childrenAccountsIds));
const total = this.repository.totalAccountsLedger
.whereAccountId(account.id)
.whereAccountsIds(accountIds)
.getClosingBalance();

return {
Expand Down Expand Up @@ -128,8 +139,19 @@ export const BalanceSheetAccounts = (Base: any) =>
private getAccountsNodesByAccountTypes = (
accountsTypes: string[]
): IBalanceSheetAccountNode[] => {
// Retrieves accounts from the given defined node account types.
const accounts = this.getAccountsByAccountTypes(accountsTypes);
return R.map(this.reportSchemaAccountNodeComposer, accounts);

// Converts the flatten accounts to tree.
const accountsTree = flatToNestedArray(accounts, {
id: 'id',
parentId: 'parentAccountId',
});
// Maps over the accounts tree.
return this.mapNodesDeep(
accountsTree,
this.reportSchemaAccountNodeComposer
);
};

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import * as R from 'ramda';
import { Knex } from 'knex';
import { isEmpty } from 'lodash';
import {
IAccount,
IAccountTransactionsGroupBy,
IBalanceSheetQuery,
ILedger,
Expand All @@ -12,7 +11,6 @@ import { transformToMapBy } from 'utils';
import Ledger from '@/services/Accounting/Ledger';
import { BalanceSheetQuery } from './BalanceSheetQuery';
import { FinancialDatePeriods } from '../FinancialDatePeriods';
import { ACCOUNT_PARENT_TYPE, ACCOUNT_TYPE } from '@/data/AccountTypes';
import { BalanceSheetRepositoryNetIncome } from './BalanceSheetRepositoryNetIncome';

@Service()
Expand Down Expand Up @@ -40,6 +38,11 @@ export default class BalanceSheetRepository extends R.compose(
*/
public accounts: any;

/**
* @param {}
*/
public accountsGraph: any;

/**
*
*/
Expand Down Expand Up @@ -163,6 +166,8 @@ export default class BalanceSheetRepository extends R.compose(
*/
public asyncInitialize = async () => {
await this.initAccounts();
await this.initAccountsGraph();

await this.initAccountsTotalLedger();

// Date periods.
Expand Down Expand Up @@ -204,6 +209,15 @@ export default class BalanceSheetRepository extends R.compose(
this.accountsByParentType = transformToMapBy(accounts, 'accountParentType');
};

/**
* Initialize accounts graph.
*/
public initAccountsGraph = async () => {
const { Account } = this.models;

this.accountsGraph = Account.toDependencyGraph(this.accounts);
};

// ----------------------------
// # Closing Total
// ----------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { ProfitLossSheetPreviousYear } from './ProfitLossSheetPreviousYear';
import { ProfitLossSheetPreviousPeriod } from './ProfitLossSheetPreviousPeriod';
import { FinancialDateRanges } from '../FinancialDateRanges';
import { ProfitLossSheetFilter } from './ProfitLossSheetFilter';
import { flatToNestedArray } from '@/utils';

export default class ProfitLossSheet extends R.compose(
ProfitLossSheetPreviousYear,
Expand Down Expand Up @@ -82,14 +83,22 @@ export default class ProfitLossSheet extends R.compose(

/**
* Retrieve the sheet account node from the given account.
* @param {IAccount} account
* @param {IAccount} account
* @returns {IProfitLossSheetAccountNode}
*/
private accountNodeMapper = (
account: IAccount
): IProfitLossSheetAccountNode => {
// Retrieves the children account ids of the given account id.
const childrenAccountIds = this.repository.accountsGraph.dependenciesOf(
account.id
);
// Concat the children and the given account id.
const accountIds = R.uniq(R.append(account.id, childrenAccountIds));

// Retrieves the closing balance of the account included children accounts.
const total = this.repository.totalAccountsLedger
.whereAccountId(account.id)
.whereAccountsIds(accountIds)
.getClosingBalance();

return {
Expand Down Expand Up @@ -126,18 +135,19 @@ export default class ProfitLossSheet extends R.compose(
};

/**
* Retrieve report accounts nodes by the given accounts types.
* @param {string[]} types
* Retrieves report accounts nodes by the given accounts types.
* @param {string[]} types
* @returns {IBalanceSheetAccountNode}
*/
private getAccountsNodesByTypes = (
types: string[]
): IProfitLossSheetAccountNode[] => {
return R.compose(
R.map(this.accountNodeCompose),
R.flatten,
R.map(this.repository.getAccountsByType)
)(types);
const accounts = this.repository.getAccountsByType(types);
const accountsTree = flatToNestedArray(accounts, {
id: 'id',
parentId: 'parentAccountId',
});
return this.mapNodesDeep(accountsTree, this.accountNodeCompose);
};

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { defaultTo } from 'lodash';
import { castArray, defaultTo } from 'lodash';
import * as R from 'ramda';
import { Knex } from 'knex';
import { isEmpty } from 'lodash';
Expand Down Expand Up @@ -31,6 +31,11 @@ export class ProfitLossSheetRepository extends R.compose(FinancialDatePeriods)(
*/
public accounts: IAccount[];

/**
*
*/
public accountsGraph: any;

/**
* Transactions group type.
* @param {IAccountTransactionsGroupBy}
Expand Down Expand Up @@ -135,6 +140,8 @@ export class ProfitLossSheetRepository extends R.compose(FinancialDatePeriods)(
*/
public asyncInitialize = async () => {
await this.initAccounts();
await this.initAccountsGraph();

await this.initAccountsTotalLedger();

// Date Periods.
Expand Down Expand Up @@ -177,6 +184,15 @@ export class ProfitLossSheetRepository extends R.compose(FinancialDatePeriods)(
this.accountsByType = transformToMapBy(accounts, 'accountType');
};

/**
* Initialize accounts graph.
*/
private initAccountsGraph = async () => {
const { Account } = this.models;

this.accountsGraph = Account.toDependencyGraph(this.accounts);
};

// ----------------------------
// # Closing Total.
// ----------------------------
Expand Down Expand Up @@ -337,7 +353,18 @@ export class ProfitLossSheetRepository extends R.compose(FinancialDatePeriods)(
return Account.query();
};

public getAccountsByType = (type: string) => {
return defaultTo(this.accountsByType.get(type), []);
/**
*
* @param type
* @returns
*/
public getAccountsByType = (type: string[] | string) => {
return R.compose(
R.flatten,
R.map((accountType) =>
R.defaultTo([], this.accountsByType.get(accountType))
),
castArray
)(type);
};
}
Loading