diff --git a/sql/reports/sfdc/ba-fees.sql b/sql/reports/sfdc/ba-fees.sql new file mode 100644 index 0000000..3592f12 --- /dev/null +++ b/sql/reports/sfdc/ba-fees.sql @@ -0,0 +1,12 @@ +SELECT + p.billing_account as billing_account_id, + COALESCE(SUM(p.challenge_fee), 0) AS total_feels, + COALESCE(SUM(p.total_amount), 0) AS total_member_payments +FROM finance.payment p +LEFT JOIN finance.winnings w + ON w.winning_id = p.winnings_id +WHERE + p.created_at >= $1::timestamptz + AND ($2::timestamptz IS NULL OR p.created_at <= $2::timestamptz) +GROUP BY p.billing_account +ORDER BY p.billing_account; diff --git a/src/common/logger.ts b/src/common/logger.ts index 20d8e9d..ead836a 100644 --- a/src/common/logger.ts +++ b/src/common/logger.ts @@ -1,7 +1,5 @@ import { Logger as NestLogger } from "@nestjs/common"; import * as stringify from "json-stringify-safe"; -console.log('here', stringify); - export class Logger extends NestLogger { log(...messages: any[]): void { diff --git a/src/sfdc-reports/sfdc-reports.controller.ts b/src/sfdc-reports/sfdc-reports.controller.ts index 7f2f778..8e60c3c 100644 --- a/src/sfdc-reports/sfdc-reports.controller.ts +++ b/src/sfdc-reports/sfdc-reports.controller.ts @@ -14,6 +14,8 @@ import { Scopes as AppScopes } from "../app-constants"; import { SfdcReportsService } from "./sfdc-reports.service"; import { + BaFeesReportQueryDto, + BaFeesReportResponse, PaymentsReportQueryDto, PaymentsReportResponse, } from "./sfdc-reports.dto"; @@ -29,19 +31,40 @@ export class SfdcReportsController { @Scopes(AppScopes.AllReports) @ApiBearerAuth() @ApiOperation({ - summary: "Export search winnings result in csv file format", - description: "Roles: Payment Admin, Payment Editor, Payment Viewer", + summary: "SFDC Payments report", + description: "", }) @ApiQuery({ type: PaymentsReportQueryDto, }) @ApiResponse({ status: 200, - description: "Export winnings successfully.", + description: "Export successfully.", type: ResponseDto, }) async getPaymentsReport(@Query() query: PaymentsReportQueryDto) { const report = await this.reportsService.getPaymentsReport(query); return report; } + + @Get("/ba-fees") + @UseGuards(PermissionsGuard) + @Scopes(AppScopes.AllReports) + @ApiBearerAuth() + @ApiOperation({ + summary: "Report of BA to fee / member payment", + description: "", + }) + @ApiQuery({ + type: BaFeesReportQueryDto, + }) + @ApiResponse({ + status: 200, + description: "Export successfully.", + type: ResponseDto, + }) + async getBaFeesReport(@Query() query: BaFeesReportQueryDto) { + const report = await this.reportsService.getBaFeesReport(query); + return report; + } } diff --git a/src/sfdc-reports/sfdc-reports.dto.ts b/src/sfdc-reports/sfdc-reports.dto.ts index 4b11774..033fd70 100644 --- a/src/sfdc-reports/sfdc-reports.dto.ts +++ b/src/sfdc-reports/sfdc-reports.dto.ts @@ -110,3 +110,29 @@ export class PaymentsReportResponse { challengeFee: number; paymentAmount: number; } + +export class BaFeesReportQueryDto { + @ApiProperty({ + required: false, + description: "Start date for the report query in ISO format", + example: "2023-01-01T00:00:00.000Z", + }) + @IsOptional() + @IsDateString() + startDate?: Date; + + @ApiProperty({ + required: false, + description: "End date for the report query in ISO format", + example: "2023-01-31T23:59:59.000Z", + }) + @IsOptional() + @IsDateString() + endDate?: Date; +} + +export interface BaFeesReportResponse { + billing_account: string; + total_fees: string; + total_member_payments: string; +} diff --git a/src/sfdc-reports/sfdc-reports.service.ts b/src/sfdc-reports/sfdc-reports.service.ts index f2724ee..f145b7f 100644 --- a/src/sfdc-reports/sfdc-reports.service.ts +++ b/src/sfdc-reports/sfdc-reports.service.ts @@ -1,7 +1,7 @@ import { Injectable } from "@nestjs/common"; import { DbService } from "../db/db.service"; import { Logger } from "src/common/logger"; -import { PaymentsReportQueryDto } from "./sfdc-reports.dto"; +import { BaFeesReportQueryDto, BaFeesReportResponse, PaymentsReportQueryDto, PaymentsReportResponse } from "./sfdc-reports.dto"; import { SqlLoaderService } from "src/common/sql-loader.service"; @Injectable() @@ -18,21 +18,7 @@ export class SfdcReportsService { const query = this.sql.load("reports/sfdc/payments.sql"); - const payments = await this.db.query<{ - billingAccountId: string, - challengeName: string, - challengeId: string, - paymentDate: Date, - paymentId: string, - paymentStatus: string, - winnerId: string, - winnerHandle: string, - winnerFirstName: string, - winnerLastName: string, - isTask: boolean, - challengeFee: number, - paymentAmount: number, - }>( + const payments = await this.db.query( query, [ filters.billingAccountIds, @@ -50,4 +36,22 @@ export class SfdcReportsService { return payments; } + + async getBaFeesReport(filters: BaFeesReportQueryDto) { + this.logger.debug("Starting getBaFeesReport with filters:", filters); + + const query = this.sql.load("reports/sfdc/ba-fees.sql"); + + const report = await this.db.query( + query, + [ + filters.startDate, + filters.endDate, + ] + ); + + this.logger.debug("Mapped BA fees to the final report format"); + + return report; + } }