forked from Yara724/api
YARA-858
This commit is contained in:
@@ -9,6 +9,11 @@ import { Types } from "mongoose";
|
||||
import { ClaimCaseDbService } from "src/claim-request-management/entites/db-service/claim-case.db.service";
|
||||
import { CreateBranchDto } from "src/client/dto/create-branch.dto";
|
||||
import { BranchDbService } from "src/client/entities/db-service/branch.db.service";
|
||||
import {
|
||||
CreateBlameExpertByInsurerDto,
|
||||
CreateClaimExpertByInsurerDto,
|
||||
CreateInsurerExpertDto,
|
||||
} from "./dto/create-insurer-expert.dto";
|
||||
import {
|
||||
blameCaseTouchesClient,
|
||||
claimCaseTouchesClient,
|
||||
@@ -20,6 +25,9 @@ import { DamageExpertDbService } from "src/users/entities/db-service/damage-expe
|
||||
import { ExpertDbService } from "src/users/entities/db-service/expert.db.service";
|
||||
import { ExpertFileActivityDbService } from "src/users/entities/db-service/expert-file-activity.db.service";
|
||||
import { ExpertFileActivityType } from "src/users/entities/schema/expert-file-activity.schema";
|
||||
import { HashService } from "src/utils/hash/hash.service";
|
||||
import { RoleEnum } from "src/Types&Enums/role.enum";
|
||||
import { UserType } from "src/Types&Enums/userType.enum";
|
||||
|
||||
@Injectable()
|
||||
export class ExpertInsurerService {
|
||||
@@ -30,6 +38,7 @@ export class ExpertInsurerService {
|
||||
private readonly blameRequestDbService: BlameRequestDbService,
|
||||
private readonly claimCaseDbService: ClaimCaseDbService,
|
||||
private readonly branchDbService: BranchDbService,
|
||||
private readonly hashService: HashService,
|
||||
) {}
|
||||
|
||||
private getClientId(actorOrId: any): Types.ObjectId {
|
||||
@@ -420,6 +429,112 @@ export class ExpertInsurerService {
|
||||
return newBranch;
|
||||
}
|
||||
|
||||
private async assertBranchBelongsToClient(
|
||||
branchId: string,
|
||||
clientId: Types.ObjectId,
|
||||
) {
|
||||
const branch = await this.branchDbService.findById(branchId);
|
||||
if (!branch) {
|
||||
throw new NotFoundException("Branch not found");
|
||||
}
|
||||
if (String(branch.clientKey) !== String(clientId)) {
|
||||
throw new ForbiddenException(
|
||||
"Selected branch does not belong to your insurance company.",
|
||||
);
|
||||
}
|
||||
return branch;
|
||||
}
|
||||
|
||||
private sanitizeExpertResponse(doc: any) {
|
||||
const obj = typeof doc?.toObject === "function" ? doc.toObject() : doc;
|
||||
if (!obj) return obj;
|
||||
const { password, otp, ...rest } = obj;
|
||||
return rest;
|
||||
}
|
||||
|
||||
private async createExpertForInsurer(
|
||||
insurerClientKey: string,
|
||||
payload: CreateInsurerExpertDto,
|
||||
role: RoleEnum.EXPERT | RoleEnum.DAMAGE_EXPERT,
|
||||
) {
|
||||
const clientObjectId = this.getClientId(insurerClientKey);
|
||||
const branch = await this.assertBranchBelongsToClient(
|
||||
payload.branchId,
|
||||
clientObjectId,
|
||||
);
|
||||
|
||||
const email = payload.email.trim().toLowerCase();
|
||||
const existingByEmail = await this.expertDbService.findOne({ email });
|
||||
const existingDamageByEmail = await this.damageExpertDbService.findOne({ email });
|
||||
if (existingByEmail || existingDamageByEmail) {
|
||||
throw new ConflictException("An expert with this email already exists.");
|
||||
}
|
||||
|
||||
const nationalCode = payload.nationalCode.trim();
|
||||
const existingByNational = await this.expertDbService.findOne({ nationalCode });
|
||||
const existingDamageByNational = await this.damageExpertDbService.findOne({
|
||||
nationalCode,
|
||||
});
|
||||
if (existingByNational || existingDamageByNational) {
|
||||
throw new ConflictException(
|
||||
"An expert with this national code already exists.",
|
||||
);
|
||||
}
|
||||
|
||||
const hashedPassword = await this.hashService.hash(payload.password);
|
||||
const basePayload: any = {
|
||||
...payload,
|
||||
email,
|
||||
nationalCode,
|
||||
password: hashedPassword,
|
||||
role,
|
||||
userType: payload.userType ?? UserType.LEGAL,
|
||||
clientKey:
|
||||
role === RoleEnum.EXPERT ? String(clientObjectId) : clientObjectId,
|
||||
branchId: new Types.ObjectId(payload.branchId),
|
||||
insuActivityCo: String(clientObjectId),
|
||||
};
|
||||
|
||||
const created =
|
||||
role === RoleEnum.EXPERT
|
||||
? await this.expertDbService.create(basePayload)
|
||||
: await this.damageExpertDbService.create(basePayload);
|
||||
|
||||
return {
|
||||
expert: this.sanitizeExpertResponse(created),
|
||||
branch: {
|
||||
_id: (branch as any)._id,
|
||||
name: branch.name,
|
||||
code: branch.code,
|
||||
city: branch.city,
|
||||
state: branch.state,
|
||||
address: branch.address,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
async addBlameExpert(
|
||||
insurerClientKey: string,
|
||||
payload: CreateBlameExpertByInsurerDto,
|
||||
) {
|
||||
return this.createExpertForInsurer(
|
||||
insurerClientKey,
|
||||
payload,
|
||||
RoleEnum.EXPERT,
|
||||
);
|
||||
}
|
||||
|
||||
async addClaimExpert(
|
||||
insurerClientKey: string,
|
||||
payload: CreateClaimExpertByInsurerDto,
|
||||
) {
|
||||
return this.createExpertForInsurer(
|
||||
insurerClientKey,
|
||||
payload,
|
||||
RoleEnum.DAMAGE_EXPERT,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get comprehensive statistics for all experts of a client
|
||||
* Returns:
|
||||
|
||||
Reference in New Issue
Block a user