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.
This commit is contained in:
@@ -12,6 +12,8 @@ import {
|
|||||||
MaxLength,
|
MaxLength,
|
||||||
ValidateNested,
|
ValidateNested,
|
||||||
} from 'class-validator';
|
} from 'class-validator';
|
||||||
|
|
||||||
|
const DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
||||||
import {
|
import {
|
||||||
PaginationQueryDto,
|
PaginationQueryDto,
|
||||||
UserRelationDto,
|
UserRelationDto,
|
||||||
@@ -163,6 +165,17 @@ export class ListSalesPaymentsQueryDto extends PaginationQueryDto {
|
|||||||
@IsOptional()
|
@IsOptional()
|
||||||
@IsString()
|
@IsString()
|
||||||
search?: string;
|
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 {
|
export class SalesPaymentDto {
|
||||||
|
|||||||
@@ -65,6 +65,8 @@ export type ListSalesPaymentsFilters = {
|
|||||||
readonly code?: string;
|
readonly code?: string;
|
||||||
readonly status?: string;
|
readonly status?: string;
|
||||||
readonly search?: string;
|
readonly search?: string;
|
||||||
|
readonly date?: number;
|
||||||
|
readonly createdBy?: string;
|
||||||
readonly orderBy?: string;
|
readonly orderBy?: string;
|
||||||
readonly orderType?: string;
|
readonly orderType?: string;
|
||||||
readonly limit: number;
|
readonly limit: number;
|
||||||
|
|||||||
@@ -316,6 +316,12 @@ export class SalesPaymentsRepository {
|
|||||||
parts.push(search);
|
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) {
|
if (parts.length === 0) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 () => {
|
it('approving a payment recomputes referenced invoices', async () => {
|
||||||
repository.findById.mockResolvedValue({
|
repository.findById.mockResolvedValue({
|
||||||
...sample,
|
...sample,
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ export type ListSalesPaymentsQuery = {
|
|||||||
readonly code?: string;
|
readonly code?: string;
|
||||||
readonly status?: string;
|
readonly status?: string;
|
||||||
readonly search?: string;
|
readonly search?: string;
|
||||||
|
readonly date?: string;
|
||||||
|
readonly createdBy?: string;
|
||||||
readonly orderBy?: string;
|
readonly orderBy?: string;
|
||||||
readonly orderType?: string;
|
readonly orderType?: string;
|
||||||
readonly page?: number;
|
readonly page?: number;
|
||||||
@@ -75,6 +77,10 @@ export class SalesPaymentsService {
|
|||||||
code: query.code,
|
code: query.code,
|
||||||
status: query.status,
|
status: query.status,
|
||||||
search: query.search,
|
search: query.search,
|
||||||
|
date: query.date
|
||||||
|
? this.assertDate(query.date).startOfDay().value
|
||||||
|
: undefined,
|
||||||
|
createdBy: query.createdBy,
|
||||||
orderBy: query.orderBy,
|
orderBy: query.orderBy,
|
||||||
orderType: query.orderType,
|
orderType: query.orderType,
|
||||||
limit: page.limit,
|
limit: page.limit,
|
||||||
|
|||||||
Reference in New Issue
Block a user