Files
bigcapital/server/src/services/FinancialStatements/BalanceSheet/BalanceSheetService.ts
Ahmed Bouhuolia 188e411f02 feat: rewrite repositories with base entity repository class.
feat: sales and purchases status.
feat: sales and purchases auto-increment number.
fix: settings find query with extra columns.
2020-12-13 19:50:59 +02:00

104 lines
2.8 KiB
TypeScript

import { Service, Inject } from 'typedi';
import moment from 'moment';
import {
IBalanceSheetStatementService,
IBalanceSheetQuery,
IBalanceSheetStatement,
} from 'interfaces';
import TenancyService from 'services/Tenancy/TenancyService';
import Journal from 'services/Accounting/JournalPoster';
import BalanceSheetStatement from './BalanceSheet';
@Service()
export default class BalanceSheetStatementService
implements IBalanceSheetStatementService {
@Inject()
tenancy: TenancyService;
@Inject('logger')
logger: any;
/**
* Defaults balance sheet filter query.
* @return {IBalanceSheetQuery}
*/
get defaultQuery(): IBalanceSheetQuery {
return {
displayColumnsType: 'total',
displayColumnsBy: 'day',
fromDate: moment().startOf('year').format('YYYY-MM-DD'),
toDate: moment().endOf('year').format('YYYY-MM-DD'),
numberFormat: {
noCents: false,
divideOn1000: false,
},
noneZero: false,
noneTransactions: false,
basis: 'cash',
accountIds: [],
};
}
/**
* Retrieve balance sheet statement.
* -------------
* @param {number} tenantId
* @param {IBalanceSheetQuery} query
*
* @return {IBalanceSheetStatement}
*/
public async balanceSheet(
tenantId: number,
query: IBalanceSheetQuery
): Promise<IBalanceSheetStatement> {
const {
accountRepository,
transactionsRepository,
} = this.tenancy.repositories(tenantId);
// Settings tenant service.
const settings = this.tenancy.settings(tenantId);
const baseCurrency = settings.get({ group: 'organization', key: 'base_currency' });
const filter = {
...this.defaultQuery,
...query,
};
this.logger.info('[balance_sheet] trying to calculate the report.', { filter, tenantId });
// Retrieve all accounts on the storage.
const accounts = await accountRepository.all('type');
const accountsGraph = await accountRepository.getDependencyGraph();
// Retrieve all journal transactions based on the given query.
const transactions = await transactionsRepository.journal({
fromDate: query.toDate,
});
// Transform transactions to journal collection.
const transactionsJournal = Journal.fromTransactions(
transactions,
tenantId,
accountsGraph,
);
// Balance sheet report instance.
const balanceSheetInstanace = new BalanceSheetStatement(
tenantId,
filter,
accounts,
transactionsJournal,
baseCurrency
);
// Balance sheet data.
const balanceSheetData = balanceSheetInstanace.reportData();
// Retrieve balance sheet columns.
const balanceSheetColumns = balanceSheetInstanace.reportColumns();
return {
data: balanceSheetData,
columns: balanceSheetColumns,
query: filter,
};
}
}