mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-16 21:00:31 +00:00
100 lines
3.0 KiB
TypeScript
100 lines
3.0 KiB
TypeScript
import { isEmpty, castArray } from 'lodash';
|
|
import { AccountTransaction } from 'models';
|
|
import TenantRepository from '@/repositories/TenantRepository';
|
|
|
|
interface IJournalTransactionsFilter {
|
|
fromDate: string | Date;
|
|
toDate: string | Date;
|
|
accountsIds: number[];
|
|
sumationCreditDebit: boolean;
|
|
fromAmount: number;
|
|
toAmount: number;
|
|
contactsIds?: number[];
|
|
contactType?: string;
|
|
referenceType?: string[];
|
|
referenceId?: number[];
|
|
index: number | number[];
|
|
indexGroup: number | number[];
|
|
branchesIds: number | number[];
|
|
}
|
|
|
|
export default class AccountTransactionsRepository extends TenantRepository {
|
|
/**
|
|
* Gets the repository's model.
|
|
*/
|
|
get model() {
|
|
return AccountTransaction.bindKnex(this.knex);
|
|
}
|
|
|
|
journal(filter: IJournalTransactionsFilter) {
|
|
return this.model
|
|
.query()
|
|
.modify('filterAccounts', filter.accountsIds)
|
|
.modify('filterDateRange', filter.fromDate, filter.toDate)
|
|
.withGraphFetched('account')
|
|
.onBuild((query) => {
|
|
if (filter.sumationCreditDebit) {
|
|
query.modify('sumationCreditDebit');
|
|
}
|
|
if (filter.fromAmount || filter.toAmount) {
|
|
query.modify('filterAmountRange', filter.fromAmount, filter.toAmount);
|
|
}
|
|
if (filter.contactsIds) {
|
|
query.modify('filterContactIds', filter.contactsIds);
|
|
}
|
|
if (filter.contactType) {
|
|
query.where('contact_type', filter.contactType);
|
|
}
|
|
if (filter.referenceType && filter.referenceType.length > 0) {
|
|
query.whereIn('reference_type', filter.referenceType);
|
|
}
|
|
if (filter.referenceId && filter.referenceId.length > 0) {
|
|
query.whereIn('reference_id', filter.referenceId);
|
|
}
|
|
if (filter.index) {
|
|
if (Array.isArray(filter.index)) {
|
|
query.whereIn('index', filter.index);
|
|
} else {
|
|
query.where('index', filter.index);
|
|
}
|
|
}
|
|
if (filter.indexGroup) {
|
|
if (Array.isArray(filter.indexGroup)) {
|
|
query.whereIn('index_group', filter.indexGroup);
|
|
} else {
|
|
query.where('index_group', filter.indexGroup);
|
|
}
|
|
}
|
|
if (!isEmpty(filter.branchesIds)) {
|
|
query.modify('filterByBranches', filter.branchesIds);
|
|
}
|
|
});
|
|
}
|
|
|
|
openingBalance(fromDate) {
|
|
return AccountTransaction.query().modify('openingBalance', fromDate);
|
|
}
|
|
|
|
closingOpening(toDate) {
|
|
return AccountTransaction.query().modify('closingBalance', toDate);
|
|
}
|
|
|
|
/**
|
|
* Reverts the jouranl entries.
|
|
* @param {number|number[]} referenceId - Reference id.
|
|
* @param {string} referenceType - Reference type.
|
|
*/
|
|
public getTransactionsByReference = async (
|
|
referenceId: number | number[],
|
|
referenceType: string | string[]
|
|
) => {
|
|
const transactions = await this.model
|
|
.query()
|
|
.whereIn('reference_type', castArray(referenceType))
|
|
.whereIn('reference_id', castArray(referenceId))
|
|
.withGraphFetched('account');
|
|
|
|
return transactions;
|
|
};
|
|
}
|