88 lines
2.4 KiB
TypeScript
88 lines
2.4 KiB
TypeScript
import { Inject, Service } from 'typedi';
|
|
import { ServiceError } from '@/exceptions';
|
|
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
|
import { ISaleEstimate } from '@/interfaces';
|
|
import { ERRORS } from './constants';
|
|
import { SaleEstimate } from '@/models';
|
|
|
|
@Service()
|
|
export class SaleEstimateValidators {
|
|
@Inject()
|
|
private tenancy: HasTenancyService;
|
|
|
|
/**
|
|
* Validates the given estimate existance.
|
|
* @param {SaleEstimate | undefined | null} estimate -
|
|
*/
|
|
public validateEstimateExistance(estimate: SaleEstimate | undefined | null) {
|
|
if (!estimate) {
|
|
throw new ServiceError(ERRORS.SALE_ESTIMATE_NOT_FOUND);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Validate the estimate number unique on the storage.
|
|
* @param {Request} req
|
|
* @param {Response} res
|
|
* @param {Function} next
|
|
*/
|
|
public async validateEstimateNumberExistance(
|
|
tenantId: number,
|
|
estimateNumber: string,
|
|
notEstimateId?: number
|
|
) {
|
|
const { SaleEstimate } = this.tenancy.models(tenantId);
|
|
|
|
const foundSaleEstimate = await SaleEstimate.query()
|
|
.findOne('estimate_number', estimateNumber)
|
|
.onBuild((builder) => {
|
|
if (notEstimateId) {
|
|
builder.whereNot('id', notEstimateId);
|
|
}
|
|
});
|
|
if (foundSaleEstimate) {
|
|
throw new ServiceError(ERRORS.SALE_ESTIMATE_NUMBER_EXISTANCE);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Validates the given sale estimate not already converted to invoice.
|
|
* @param {ISaleEstimate} saleEstimate -
|
|
*/
|
|
public validateEstimateNotConverted(saleEstimate: ISaleEstimate) {
|
|
if (saleEstimate.isConvertedToInvoice) {
|
|
throw new ServiceError(ERRORS.SALE_ESTIMATE_CONVERTED_TO_INVOICE);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Validate the sale estimate number require.
|
|
* @param {ISaleEstimate} saleInvoiceObj
|
|
*/
|
|
public validateEstimateNoRequire(estimateNumber: string) {
|
|
if (!estimateNumber) {
|
|
throw new ServiceError(ERRORS.SALE_ESTIMATE_NO_IS_REQUIRED);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Validate the given customer has no sales estimates.
|
|
* @param {number} tenantId
|
|
* @param {number} customerId - Customer id.
|
|
*/
|
|
public async validateCustomerHasNoEstimates(
|
|
tenantId: number,
|
|
customerId: number
|
|
) {
|
|
const { SaleEstimate } = this.tenancy.models(tenantId);
|
|
|
|
const estimates = await SaleEstimate.query().where(
|
|
'customer_id',
|
|
customerId
|
|
);
|
|
if (estimates.length > 0) {
|
|
throw new ServiceError(ERRORS.CUSTOMER_HAS_SALES_ESTIMATES);
|
|
}
|
|
}
|
|
}
|