Source

identitypass/services/credit-bureau-verification.service.ts

import {
  ICreditBureauVerificationService,
  CreditBureauVerificationRequest,
  CreditBureauConsumerBasicRequest,
  CreditBureauConsumerAdvanceRequest,
  CreditBureauCommercialBasicRequest,
  CreditBureauCommercialAdvanceRequest,
  CreditBureauVerificationData,
  VerificationResponse,
} from 'porkate-valid8';
import { BaseIdentityPassService } from './base.service';

/**
 * IdentityPass Credit Bureau Verification Service
 */
export class IdentityPassCreditBureauService
  extends BaseIdentityPassService
  implements ICreditBureauVerificationService
{
  /**
   * Verify Credit Bureau (Consumer/Individual) - Basic
   * @see https://docs.prembly.com/docs/credit-bureau-consumerindividual-basic-copy
   */
  async verifyCreditBureau(
    data: CreditBureauVerificationRequest,
  ): Promise<VerificationResponse<CreditBureauVerificationData>> {
    return this.makeRequest(
      '/verification/credit_bureau/consumer/basic',
      {
        mode: 'ID',
        number: data?.bvn,
        customer_name: `${data?.firstName} ${data?.lastName}`,
        customer_reference: data?.phoneNumber,
        crb_provider: 'crc', // default provider
      },
      this.mapCreditBureauData,
    );
  }

  /**
   * Verify Credit Bureau Consumer (Individual) - Basic
   * @see https://docs.prembly.com/docs/credit-bureau-consumerindividual-basic-copy
   */
  async verifyCreditBureauConsumerBasic(
    data: CreditBureauConsumerBasicRequest,
  ): Promise<VerificationResponse<CreditBureauVerificationData>> {
    return this.makeRequest(
      '/verification/credit_bureau/consumer/basic',
      {
        mode: 'ID',
        number: data?.bvn,
        customer_name: `${data?.firstName} ${data?.lastName}`,
        customer_reference: data?.phoneNumber,
        crb_provider: 'crc', // default provider
      },
      this.mapCreditBureauData,
    );
  }

  /**
   * Verify Credit Bureau Consumer (Individual) - Advance
   * @see https://docs.prembly.com/docs/credit-bureau-consumerindividual-advance-copy-1
   */
  async verifyCreditBureauConsumerAdvance(
    data: CreditBureauConsumerAdvanceRequest,
  ): Promise<VerificationResponse<CreditBureauVerificationData>> {
    return this.makeRequest(
      '/verification/credit_bureau/consumer/advance',
      {
        mode: 'ID',
        number: data?.bvn,
        customer_name: `${data?.firstName} ${data?.lastName}`,
        customer_reference: data?.phoneNumber,
        crb_provider: 'crc', // default provider
      },
      this.mapCreditBureauData,
    );
  }

  /**
   * Verify Credit Bureau Commercial (Business) - Basic
   * @see https://docs.prembly.com/docs/credit-bureau-commercialbusiness-basic-copy-1
   */
  async verifyCreditBureauCommercialBasic(
    data: CreditBureauCommercialBasicRequest,
  ): Promise<VerificationResponse<CreditBureauVerificationData>> {
    return this.makeRequest(
      '/verification/credit_bureau/commercial/basic',
      {
        rc_number: data?.rcNumber,
        customer_name: data?.companyName,
      },
      this.mapCreditBureauData,
    );
  }

  /**
   * Verify Credit Bureau Commercial (Business) - Advance
   * @see https://docs.prembly.com/docs/credit-bureau-commercialbusiness-advance-copy-1
   */
  async verifyCreditBureauCommercialAdvance(
    data: CreditBureauCommercialAdvanceRequest,
  ): Promise<VerificationResponse<CreditBureauVerificationData>> {
    return this.makeRequest(
      '/verification/credit_bureau/commercial/advance',
      {
        rc_number: data?.rcNumber,
        customer_name: data?.companyName,
      },
      this.mapCreditBureauData,
    );
  }

  private mapCreditBureauData(
    verificationData: Record<string, unknown>,
  ): CreditBureauVerificationData {
    const creditHistory = verificationData?.credit_history || verificationData?.creditHistory;
    const defaultRecords = verificationData?.default_records || verificationData?.defaultRecords;
    const score = verificationData?.score as Record<string, unknown> | undefined;

    return {
      creditScore: (verificationData?.credit_score || verificationData?.creditScore) as
        | number
        | undefined,
      creditHistory: Array.isArray(creditHistory)
        ? creditHistory.map((item: Record<string, unknown>) => ({
            lender: (item?.lender as string) || '',
            amount: (item?.amount as number) || 0,
            status: (item?.status as string) || '',
            date: item?.date as string | undefined,
            ...item,
          }))
        : undefined,
      defaultRecords: Array.isArray(defaultRecords)
        ? defaultRecords.map((item: Record<string, unknown>) => ({
            lender: (item?.lender as string) || '',
            amount: (item?.amount as number) || 0,
            date: item?.date as string | undefined,
            ...item,
          }))
        : undefined,
      activeLoans: (verificationData?.active_loans || verificationData?.activeLoans) as
        | number
        | undefined,
      totalDebt: (verificationData?.total_debt || verificationData?.totalDebt) as
        | number
        | undefined,
      // Consumer fields
      bvn: (verificationData?.bvn || verificationData?.BankVerificationNo) as string | undefined,
      name: (verificationData?.name || verificationData?.fullName || verificationData?.Surname) as
        | string
        | undefined,
      phone: (verificationData?.phone ||
        verificationData?.phoneNumber ||
        verificationData?.HomeTelephoneNo ||
        verificationData?.CellularNo) as string | undefined,
      gender: (verificationData?.gender || verificationData?.Gender) as string | undefined,
      dateOfBirth: (verificationData?.dateOfBirth ||
        verificationData?.date_of_birth ||
        verificationData?.BirthDate) as string | undefined,
      address: (verificationData?.address || verificationData?.ResidentialAddress1) as
        | string
        | undefined,
      email: (verificationData?.email || verificationData?.EmailAddress) as string | undefined,
      // Commercial fields
      businessName: (verificationData?.businessName || verificationData?.BusinessName) as
        | string
        | undefined,
      rcNumber: (verificationData?.rcNumber ||
        verificationData?.rc_number ||
        verificationData?.BusinessRegistrationNumber) as string | undefined,
      taxIdentificationNumber: (verificationData?.taxIdentificationNumber ||
        verificationData?.TaxIdentificationNumber) as string | undefined,
      // Advanced scoring (CRC)
      totalNoOfLoans: (verificationData?.totalNoOfLoans || score?.totalNoOfLoans) as
        | string
        | undefined,
      totalNoOfActiveLoans: (verificationData?.totalNoOfActiveLoans ||
        score?.totalNoOfActiveLoans) as string | undefined,
      totalBorrowed: (verificationData?.totalBorrowed || score?.totalBorrowed) as
        | string
        | undefined,
      totalOutstanding: (verificationData?.totalOutstanding || score?.totalOutstanding) as
        | string
        | undefined,
      totalOverdue: (verificationData?.totalOverdue || score?.totalOverdue) as string | undefined,
      // First Central specific fields
      consumerScore: (verificationData?.consumerScore || verificationData?.TotalConsumerScore) as
        | string
        | undefined,
      riskDescription: (verificationData?.riskDescription || verificationData?.Description) as
        | string
        | undefined,
      ...verificationData,
    };
  }
}