contact getContact

 avatar
unknown
plain_text
11 days ago
5.7 kB
3
Indexable
  async getContactData(id: number): Promise<ContactResponseDto> {
    try {
      const existingContactDetails = await this.getExistingContactDetails(id);
      const contactRelations: any = [
        "contactAddresses.address.addressType",
        "contactDocMaps",
        "communicationDetails",
        "companyLocation",
      ];
      if (
        existingContactDetails?.contactRecordType?.lookUpValue.toLowerCase() ===
        enumRecordType.COMPANY
      ) {
        contactRelations.push(
          "companyContactMaps.company.companyAddresses.address.addressType",
          "reportingTo",
          "assistant"
        );
      } else if (
        existingContactDetails?.contactRecordType?.lookUpValue.toLowerCase() ===
        enumRecordType.INSURER
      ) {
        contactRelations.push(
          "insurerContacts.insurer.insurerAddresses.address.addressType",
          "insurerContacts.insurer.isLife",
          "insurerContacts.insurer.companyType",
          "insurerContacts.insurer.companyTag",
          "insurerContacts.insurer.status"
        );
      } else if (
        existingContactDetails?.contactRecordType?.lookUpValue.toLowerCase() ===
        enumRecordType.TPA
      ) {
        contactRelations.push(
          "tpaContacts.tpa.tpaAddresses.address.addressType",
          "tpaContacts.tpa.status"
        );
      }
      const contact = await this.contactRepository.findOne({
        where: { id },
        relations: contactRelations,
      });

      if (!contact) {
        throw new NotFoundException(`Contact with ID ${id} not found`);
      }

      const lookUpValues = await this.entityService.getLookupValues([
        contact.salutationId,
        contact?.tagId ?? 0,
        contact?.contactTypeId ?? 0,
        contact.departmentId,
        contact.designationId,
        contact.statusId,
        contact.contactRecordTypeId,
      ]);

      const salutation =
        lookUpValues.find((item) => item.id === contact.salutationId) ?? null;
      const tag =
        lookUpValues.find((item) => item.id === contact.tagId) ?? null;
      const contactType =
        lookUpValues.find((item) => item.id === contact.contactTypeId) ?? null;
      const department =
        lookUpValues.find((item) => item.id === contact.departmentId) ?? null;
      const designation =
        lookUpValues.find((item) => item.id === contact.designationId) ?? null;
      const status =
        lookUpValues.find((item) => item.id === contact.statusId) ?? null;
      const contactRecordType =
        lookUpValues.find((item) => item.id === contact.contactRecordTypeId) ??
        null;
      // Enrich the contact object with lookup values
      const enrichedContact = {
        ...contact,
        salutation,
        tag,
        contactType,
        department,
        designation,
        status,
        contactRecordType,
      };
      if (
        contactRecordType?.lookUpValue.toLowerCase() === enumRecordType.COMPANY
      ) {
        const [
          contactDetails,
          professionalExperiences,
          qualificationExperiences,
        ] = await Promise.all([
          this.contactDetailsRepository.find({
            where: { contact: { id } },
          }),
          this.professionalExperienceRepository.find({
            where: { contact: { id } },
          }),
          this.qualificationExperienceRepository.find({
            where: { contact: { id } },
          }),
        ]);

        let enrichedContactDetails = contactDetails;

        if (contactDetails.length > 0) {
          const lookupKeys = ["gender", "spouseWorkingStatus", "maritalStatus"];
          const lookupValueSet = new Set<number>();

          // Collect unique lookup IDs
          for (const detail of contactDetails) {
            for (const key of lookupKeys) {
              const value = detail[key];
              if (typeof value === "number") {
                lookupValueSet.add(value);
              }
            }
          }

          // Fetch lookup values in one go
          const lookupValues = await this.entityService.getLookupValues([
            ...lookupValueSet,
          ]);

          // Enrich each contactDetail with lookup values and childDetails
          enrichedContactDetails = await Promise.all(
            contactDetails.map(async (detail: any) => {
              const genderType =
                lookupValues.find((val) => val.id === detail.gender) ?? null;
              const spouseWorkingStatusType =
                lookupValues.find(
                  (val) => val.id === detail.spouseWorkingStatus
                ) ?? null;
              const maritalStatusType =
                lookupValues.find((val) => val.id === detail.maritalStatus) ??
                null;

              const childDetails = await this.childDetailsRepository.find({
                where: { contactDetails: { id: detail.id } },
              });

              return {
                ...detail,
                genderType,
                spouseWorkingStatusType,
                maritalStatusType,
                childDetails,
              };
            })
          );
        }

        const enrichedCompanyContact = {
          ...enrichedContact,
          contactDetails: enrichedContactDetails,
          professionalExperiences,
          qualificationExperiences,
        };
        return this.transformContacts(enrichedCompanyContact);
      } else {
        return this.transformContacts(enrichedContact);
      }
    } catch (error) {
      throw new InternalServerErrorException(
        createErrorResponse(
          statusCode.badRequest,
          errorMessages.contactQueryFetchFailed
        )
      );
    }
  }
Editor is loading...
Leave a Comment