mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-14 20:00:33 +00:00
122 lines
3.6 KiB
TypeScript
122 lines
3.6 KiB
TypeScript
import { Service, Inject } from 'typedi';
|
|
import moment from 'moment';
|
|
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
|
import { ServiceError, ServiceErrors } from '@/exceptions';
|
|
import { TransactionsLockingGroup } from '@/interfaces';
|
|
import TransactionsLockingRepository from './TransactionsLockingRepository';
|
|
import { ERRORS } from './constants';
|
|
|
|
@Service()
|
|
export default class TransactionsLockingGuard {
|
|
@Inject()
|
|
tenancy: HasTenancyService;
|
|
|
|
@Inject()
|
|
transactionsLockingRepo: TransactionsLockingRepository;
|
|
|
|
/**
|
|
* Detarmines whether the transaction date between the locking date period.
|
|
* @param {number} tenantId
|
|
* @param {Date} transactionDate
|
|
* @param {TransactionsLockingGroup} lockingGroup
|
|
* @returns {boolean}
|
|
*/
|
|
public isTransactionsLocking = (
|
|
tenantId: number,
|
|
transactionDate: Date,
|
|
lockingGroup: string = TransactionsLockingGroup.All
|
|
): boolean => {
|
|
const { isEnabled, unlockFromDate, unlockToDate, lockToDate } =
|
|
this.transactionsLockingRepo.getTransactionsLocking(
|
|
tenantId,
|
|
lockingGroup
|
|
);
|
|
// Returns false anyway in case if the transaction locking is disabled.
|
|
if (!isEnabled) return false;
|
|
|
|
const inLockingDate = moment(transactionDate).isSameOrBefore(lockToDate);
|
|
const inUnlockDate =
|
|
unlockFromDate && unlockToDate
|
|
? moment(transactionDate).isSameOrAfter(unlockFromDate) &&
|
|
moment(transactionDate).isSameOrBefore(unlockFromDate)
|
|
: false;
|
|
|
|
// Retruns true in case the transaction date between locking date
|
|
// and not between unlocking date.
|
|
return !!(isEnabled && inLockingDate && !inUnlockDate);
|
|
};
|
|
|
|
/**
|
|
* Validates the transaction date between the locking date period
|
|
* or throw service error.
|
|
* @param {number} tenantId
|
|
* @param {Date} transactionDate
|
|
* @param {TransactionsLockingGroup} lockingGroup
|
|
*
|
|
* @throws {ServiceError}
|
|
*/
|
|
public validateTransactionsLocking = (
|
|
tenantId: number,
|
|
transactionDate: Date,
|
|
lockingGroup: TransactionsLockingGroup
|
|
) => {
|
|
const isLocked = this.isTransactionsLocking(
|
|
tenantId,
|
|
transactionDate,
|
|
lockingGroup
|
|
);
|
|
if (isLocked) {
|
|
this.throwTransactionsLockError(tenantId, lockingGroup);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Throws transactions locking error.
|
|
* @param {number} tenantId
|
|
* @param {TransactionsLockingGroup} lockingGroup
|
|
*/
|
|
public throwTransactionsLockError = (
|
|
tenantId: number,
|
|
lockingGroup: TransactionsLockingGroup
|
|
) => {
|
|
const { lockToDate } = this.transactionsLockingRepo.getTransactionsLocking(
|
|
tenantId,
|
|
lockingGroup
|
|
);
|
|
throw new ServiceError(ERRORS.TRANSACTIONS_DATE_LOCKED, null, {
|
|
lockedToDate: lockToDate,
|
|
formattedLockedToDate: moment(lockToDate).format('YYYY/MM/DD'),
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Validate the transaction locking of the given locking group and transaction date.
|
|
* @param {number} tenantId -
|
|
* @param {TransactionsLockingGroup} lockingGroup - transaction group
|
|
* @param {Date} fromDate -
|
|
*/
|
|
public transactionsLockingGuard = (
|
|
tenantId: number,
|
|
transactionDate: Date,
|
|
moduleType: TransactionsLockingGroup
|
|
) => {
|
|
const lockingType =
|
|
this.transactionsLockingRepo.getTransactionsLockingType(tenantId);
|
|
|
|
//
|
|
if (lockingType === TransactionsLockingGroup.All) {
|
|
return this.validateTransactionsLocking(
|
|
tenantId,
|
|
transactionDate,
|
|
TransactionsLockingGroup.All
|
|
);
|
|
}
|
|
//
|
|
return this.validateTransactionsLocking(
|
|
tenantId,
|
|
transactionDate,
|
|
moduleType
|
|
);
|
|
};
|
|
}
|