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,