diff --git a/src/reports/sfdc/sfdc-reports.controller.spec.ts b/src/reports/sfdc/sfdc-reports.controller.spec.ts index 7f6fe76..d149f07 100644 --- a/src/reports/sfdc/sfdc-reports.controller.spec.ts +++ b/src/reports/sfdc/sfdc-reports.controller.spec.ts @@ -14,12 +14,12 @@ import { import { SfdcReportsController } from "./sfdc-reports.controller"; import { SfdcReportsService } from "./sfdc-reports.service"; import { - mockChallengeData, mockChallengeQueryDto, mockBaFeesData, mockBaFeesQueryDto, - mockPaymentData, mockPaymentQueryDto, + normalizedChallengeData, + normalizedPaymentData, mockTaasJobsData, mockTaasJobsQueryDto, mockTaasMemberVerificationData, @@ -71,7 +71,7 @@ describe("SfdcReportsController", () => { it("returns the challenges report on success", async () => { mockSfdcReportsService.getChallengesReport.mockResolvedValue( - mockChallengeData, + normalizedChallengeData, ); const result = await controller.getChallengesReport( @@ -81,7 +81,7 @@ describe("SfdcReportsController", () => { expect(mockSfdcReportsService.getChallengesReport).toHaveBeenCalledWith( mockChallengeQueryDto.billingAccount, ); - expect(result).toEqual(mockChallengeData); + expect(result).toEqual(normalizedChallengeData); }); it("returns an empty array when no results are found", async () => { @@ -129,7 +129,7 @@ describe("SfdcReportsController", () => { describe("getPaymentsReport", () => { it("returns the payments report on success", async () => { mockSfdcReportsService.getPaymentsReport.mockResolvedValue( - mockPaymentData, + normalizedPaymentData, ); const result = await controller.getPaymentsReport( @@ -139,7 +139,7 @@ describe("SfdcReportsController", () => { expect(mockSfdcReportsService.getPaymentsReport).toHaveBeenCalledWith( mockPaymentQueryDto.billingAccount, ); - expect(result).toEqual(mockPaymentData); + expect(result).toEqual(normalizedPaymentData); }); it("returns an empty array when no results are found", async () => { diff --git a/src/reports/sfdc/sfdc-reports.service.spec.ts b/src/reports/sfdc/sfdc-reports.service.spec.ts index 031d64f..c2c93e0 100644 --- a/src/reports/sfdc/sfdc-reports.service.spec.ts +++ b/src/reports/sfdc/sfdc-reports.service.spec.ts @@ -16,6 +16,8 @@ import { mockBaFeesQueryDto, mockPaymentData, mockPaymentQueryDto, + normalizedChallengeData, + normalizedPaymentData, mockSqlQuery, mockTaasJobsData, mockTaasJobsQueryDto, @@ -81,7 +83,7 @@ describe("SfdcReportsService - getChallengesReport", () => { undefined, undefined, ]); - expect(result).toEqual(mockChallengeData); + expect(result).toEqual(normalizedChallengeData); }); it("runs a challengeId query successfully", async () => { @@ -315,7 +317,7 @@ describe("SfdcReportsService - getPaymentsReport", () => { undefined, undefined, ]); - expect(result).toEqual(mockPaymentData); + expect(result).toEqual(normalizedPaymentData); }); it("splits include/exclude billing account filters", async () => { diff --git a/src/reports/sfdc/sfdc-reports.service.ts b/src/reports/sfdc/sfdc-reports.service.ts index 156b266..f5ab52c 100644 --- a/src/reports/sfdc/sfdc-reports.service.ts +++ b/src/reports/sfdc/sfdc-reports.service.ts @@ -20,6 +20,7 @@ import { } from "./sfdc-reports.dto"; import { SqlLoaderService } from "src/common/sql-loader.service"; import { multiValueArrayFilter } from "src/common/filtering"; +import { normalizeChallengeStatus } from "./status-normalizer"; @Injectable() export class SfdcReportsService { @@ -96,7 +97,10 @@ export class SfdcReportsService { this.logger.debug("Mapped challenges to the final report format"); - return challenges; + return challenges.map((challenge) => ({ + ...challenge, + challengeStatus: normalizeChallengeStatus(challenge.challengeStatus), + })); } async getPaymentsReport(filters: PaymentsReportQueryDto) { @@ -122,7 +126,10 @@ export class SfdcReportsService { this.logger.debug("Mapped payments to the final report format"); - return payments; + return payments.map((payment) => ({ + ...payment, + challengeStatus: normalizeChallengeStatus(payment.challengeStatus), + })); } async getTaasJobsReport(filters: TaasJobsReportQueryDto) { diff --git a/src/reports/sfdc/status-normalizer.ts b/src/reports/sfdc/status-normalizer.ts new file mode 100644 index 0000000..5acbfda --- /dev/null +++ b/src/reports/sfdc/status-normalizer.ts @@ -0,0 +1,28 @@ +const CHALLENGE_STATUS_LABELS: Record = { + NEW: "New", + DRAFT: "Draft", + APPROVED: "Approved", + ACTIVE: "Active", + COMPLETED: "Completed", + DELETED: "Deleted", + CANCELLED: "Cancelled", + CANCELLED_FAILED_REVIEW: "Cancelled - Failed Review", + CANCELLED_FAILED_SCREENING: "Cancelled - Failed Screening", + CANCELLED_ZERO_SUBMISSIONS: "Cancelled - Zero Submissions", + CANCELLED_WINNER_UNRESPONSIVE: "Cancelled - Winner Unresponsive", + CANCELLED_CLIENT_REQUEST: "Cancelled - Client Request", + CANCELLED_REQUIREMENTS_INFEASIBLE: "Cancelled - Requirements Infeasible", + CANCELLED_ZERO_REGISTRATIONS: "Cancelled - Zero Registrations", + CANCELLED_PAYMENT_FAILED: "Cancelled - Payment Failed", +}; + +export const normalizeChallengeStatus = ( + status: string | null | undefined, +): string | null | undefined => { + if (status === null || status === undefined) return status; + const trimmed = String(status).trim(); + if (!trimmed) return status; + const normalized = CHALLENGE_STATUS_LABELS[trimmed.toUpperCase()]; + + return normalized ?? status; +}; diff --git a/src/reports/sfdc/test-helpers/mock-data.ts b/src/reports/sfdc/test-helpers/mock-data.ts index dca493b..cd2d638 100644 --- a/src/reports/sfdc/test-helpers/mock-data.ts +++ b/src/reports/sfdc/test-helpers/mock-data.ts @@ -15,6 +15,7 @@ import { WesternUnionPaymentsReportQueryDto, WesternUnionPaymentsReportResponse, } from "../sfdc-reports.dto"; +import { normalizeChallengeStatus } from "../status-normalizer"; export const mockChallengeData: ChallengesReportResponse[] = [ { @@ -154,6 +155,18 @@ export const mockPaymentQueryDto: Record = { }, }; +export const normalizedChallengeData = mockChallengeData.map((challenge) => ({ + ...challenge, + challengeStatus: normalizeChallengeStatus( + challenge.challengeStatus, + ) as string, +})); + +export const normalizedPaymentData = mockPaymentData.map((payment) => ({ + ...payment, + challengeStatus: normalizeChallengeStatus(payment.challengeStatus) as string, +})); + export const mockBaFeesData: BaFeesReportResponse[] = [ { billingAccountId: "80001012",