From 6b3ddfcff9428c0d9f6395f524d80b0fab9f9c5e Mon Sep 17 00:00:00 2001 From: shancheas Date: Tue, 1 Sep 2026 15:29:07 +0700 Subject: [PATCH] Add date and createdBy filters to sales payments functionality - Introduced new filters `date` and `createdBy` in the `ListSalesPaymentsFilters` and `ListSalesPaymentsQuery` types to enhance querying capabilities. - Updated the `SalesPaymentsRepository` to handle filtering based on the new fields. - Enhanced the `SalesPaymentsService` to process the new filters and ensure proper date handling. - Added unit tests to validate the integration of the new filters in the service layer. - Updated DTOs to include validation for the new fields, ensuring correct data formats in API requests. --- .../sales-payments/dto/sales-payment.dto.ts | 13 +++++++++++++ .../sales/sales-payments/sales-payment.ts | 2 ++ .../sales-payments.repository.ts | 6 ++++++ .../sales-payments.service.spec.ts | 18 ++++++++++++++++++ .../sales-payments/sales-payments.service.ts | 6 ++++++ 5 files changed, 45 insertions(+) diff --git a/src/modules/sales/sales-payments/dto/sales-payment.dto.ts b/src/modules/sales/sales-payments/dto/sales-payment.dto.ts index 7cff91c..eb650eb 100644 --- a/src/modules/sales/sales-payments/dto/sales-payment.dto.ts +++ b/src/modules/sales/sales-payments/dto/sales-payment.dto.ts @@ -12,6 +12,8 @@ import { MaxLength, ValidateNested, } from 'class-validator'; + +const DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/; import { PaginationQueryDto, UserRelationDto, @@ -163,6 +165,17 @@ export class ListSalesPaymentsQueryDto extends PaginationQueryDto { @IsOptional() @IsString() search?: string; + + @ApiPropertyOptional({ example: '2026-09-01' }) + @IsOptional() + @IsString() + @Matches(DATE_PATTERN) + date?: string; + + @ApiPropertyOptional({ format: 'uuid' }) + @IsOptional() + @IsUUID('4') + createdBy?: string; } export class SalesPaymentDto { diff --git a/src/modules/sales/sales-payments/sales-payment.ts b/src/modules/sales/sales-payments/sales-payment.ts index 653b06a..b42292e 100644 --- a/src/modules/sales/sales-payments/sales-payment.ts +++ b/src/modules/sales/sales-payments/sales-payment.ts @@ -65,6 +65,8 @@ export type ListSalesPaymentsFilters = { readonly code?: string; readonly status?: string; readonly search?: string; + readonly date?: number; + readonly createdBy?: string; readonly orderBy?: string; readonly orderType?: string; readonly limit: number; diff --git a/src/modules/sales/sales-payments/sales-payments.repository.ts b/src/modules/sales/sales-payments/sales-payments.repository.ts index 92a6d5b..adefcfc 100644 --- a/src/modules/sales/sales-payments/sales-payments.repository.ts +++ b/src/modules/sales/sales-payments/sales-payments.repository.ts @@ -316,6 +316,12 @@ export class SalesPaymentsRepository { parts.push(search); } } + if (filters.date !== undefined) { + parts.push(eq(salesPayments.date, filters.date)); + } + if (filters.createdBy) { + parts.push(eq(salesPayments.createdBy, filters.createdBy)); + } if (parts.length === 0) { return undefined; } diff --git a/src/modules/sales/sales-payments/sales-payments.service.spec.ts b/src/modules/sales/sales-payments/sales-payments.service.spec.ts index 698d60e..3d9c64f 100644 --- a/src/modules/sales/sales-payments/sales-payments.service.spec.ts +++ b/src/modules/sales/sales-payments/sales-payments.service.spec.ts @@ -141,6 +141,24 @@ describe('SalesPaymentsService', () => { ); }); + it('list forwards date and createdBy filters to the repository', async () => { + repository.list.mockResolvedValue({ data: [], total: 0 }); + await service.list({ + date: '2026-09-01', + createdBy: 'user-1', + page: 1, + limit: 10, + }); + expect(repository.list).toHaveBeenCalledWith( + expect.objectContaining({ + date: DateTime.create('2026-09-01').startOfDay().value, + createdBy: 'user-1', + limit: 10, + offset: 0, + }), + ); + }); + it('approving a payment recomputes referenced invoices', async () => { repository.findById.mockResolvedValue({ ...sample, diff --git a/src/modules/sales/sales-payments/sales-payments.service.ts b/src/modules/sales/sales-payments/sales-payments.service.ts index bf2515b..5f9bc1c 100644 --- a/src/modules/sales/sales-payments/sales-payments.service.ts +++ b/src/modules/sales/sales-payments/sales-payments.service.ts @@ -49,6 +49,8 @@ export type ListSalesPaymentsQuery = { readonly code?: string; readonly status?: string; readonly search?: string; + readonly date?: string; + readonly createdBy?: string; readonly orderBy?: string; readonly orderType?: string; readonly page?: number; @@ -75,6 +77,10 @@ export class SalesPaymentsService { code: query.code, status: query.status, search: query.search, + date: query.date + ? this.assertDate(query.date).startOfDay().value + : undefined, + createdBy: query.createdBy, orderBy: query.orderBy, orderType: query.orderType, limit: page.limit,