Files
bigcapital/packages/server/src/services/TransactionsLocking/TransactionsLockingGuard.ts
2023-02-03 11:57:50 +02:00

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
);
};
}