refactor(nestjs): bank transactions matching

This commit is contained in:
Ahmed Bouhuolia
2025-06-05 14:41:26 +02:00
parent f87bd341e9
commit 51988dba3b
43 changed files with 484 additions and 105 deletions

View File

@@ -13,6 +13,7 @@ import {
CreateWarehouseTransferDto,
EditWarehouseTransferDto,
} from './dtos/WarehouseTransfer.dto';
import { GetWarehouseTransfersQueryDto } from '../Warehouses/dtos/GetWarehouseTransfersQuery.dto';
@Injectable()
export class WarehouseTransferApplication {
@@ -86,7 +87,7 @@ export class WarehouseTransferApplication {
* @returns {Promise<IWarehouseTransfer>}
*/
public getWarehousesTransfers = (
filterDTO: IGetWarehousesTransfersFilterDTO,
filterDTO: GetWarehouseTransfersQueryDto,
) => {
return this.getWarehousesTransfersService.getWarehouseTransfers(filterDTO);
};

View File

@@ -15,6 +15,7 @@ import {
CreateWarehouseTransferDto,
EditWarehouseTransferDto,
} from './dtos/WarehouseTransfer.dto';
import { GetWarehouseTransfersQueryDto } from '../Warehouses/dtos/GetWarehouseTransfersQuery.dto';
@Controller('warehouse-transfers')
@ApiTags('warehouse-transfers')
@@ -129,7 +130,7 @@ export class WarehouseTransfersController {
description:
'The warehouse transfer transactions have been retrieved successfully.',
})
async getWarehousesTransfers(@Query() query: any) {
async getWarehousesTransfers(@Query() query: GetWarehouseTransfersQueryDto) {
const { warehousesTransfers, pagination, filter } =
await this.warehouseTransferApplication.getWarehousesTransfers(query);

View File

@@ -1,18 +1,18 @@
import { ToNumber } from '@/common/decorators/Validators';
import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
IsArray,
IsBoolean,
IsDate,
IsDecimal,
IsInt,
IsNotEmpty,
IsNumber,
IsOptional,
IsPositive,
IsString,
ValidateNested,
ArrayMinSize,
IsDateString,
} from 'class-validator';
export class WarehouseTransferEntryDto {
@@ -39,6 +39,7 @@ export class WarehouseTransferEntryDto {
export class CommandWarehouseTransferDto {
@IsNotEmpty()
@ToNumber()
@IsInt()
@ApiProperty({
description: 'The id of the warehouse to transfer from',
@@ -47,6 +48,7 @@ export class CommandWarehouseTransferDto {
fromWarehouseId: number;
@IsNotEmpty()
@ToNumber()
@IsInt()
@ApiProperty({
description: 'The id of the warehouse to transfer to',
@@ -55,7 +57,7 @@ export class CommandWarehouseTransferDto {
toWarehouseId: number;
@IsNotEmpty()
@IsDate()
@IsDateString()
@ApiProperty({
description: 'The date of the warehouse transfer',
example: '2021-01-01',

View File

@@ -0,0 +1,70 @@
function StatusFieldFilterQuery(query, role) {
query.modify('filterByStatus', role.value);
}
export const WarehouseTransferMeta = {
defaultFilterField: 'name',
defaultSort: {
sortField: 'name',
sortOrder: 'DESC',
},
columns: {
date: {
name: 'warehouse_transfer.field.date',
type: 'date',
exportable: true,
},
transaction_number: {
name: 'warehouse_transfer.field.transaction_number',
type: 'text',
exportable: true,
},
status: {
name: 'warehouse_transfer.field.status',
fieldType: 'enumeration',
options: [
{ key: 'draft', label: 'Draft' },
{ key: 'in-transit', label: 'In Transit' },
{ key: 'transferred', label: 'Transferred' },
],
sortable: false,
},
created_at: {
name: 'warehouse_transfer.field.created_at',
column: 'created_at',
columnType: 'date',
fieldType: 'date',
},
},
fields: {
date: {
name: 'warehouse_transfer.field.date',
column: 'date',
columnType: 'date',
fieldType: 'date',
},
transaction_number: {
name: 'warehouse_transfer.field.transaction_number',
column: 'transaction_number',
fieldType: 'text',
},
status: {
name: 'warehouse_transfer.field.status',
fieldType: 'enumeration',
options: [
{ key: 'draft', label: 'Draft' },
{ key: 'in-transit', label: 'In Transit' },
{ key: 'transferred', label: 'Transferred' },
],
filterCustomQuery: StatusFieldFilterQuery,
sortable: false,
},
created_at: {
name: 'warehouse_transfer.field.created_at',
column: 'created_at',
columnType: 'date',
fieldType: 'date',
},
},
};

View File

@@ -2,7 +2,10 @@ import { Model, mixin } from 'objection';
import { TenantBaseModel } from '@/modules/System/models/TenantBaseModel';
import { Warehouse } from '@/modules/Warehouses/models/Warehouse.model';
import { WarehouseTransferEntry } from './WarehouseTransferEntry';
import { InjectModelMeta } from '@/modules/Tenancy/TenancyModels/decorators/InjectModelMeta.decorator';
import { WarehouseTransferMeta } from './WarehouseTransfer.meta';
@InjectModelMeta(WarehouseTransferMeta)
export class WarehouseTransfer extends TenantBaseModel {
public date!: Date;
public transferInitiatedAt!: Date;
@@ -14,7 +17,6 @@ export class WarehouseTransfer extends TenantBaseModel {
public fromWarehouse!: Warehouse;
public toWarehouse!: Warehouse;
/**
* Table name.
*/
@@ -104,7 +106,7 @@ export class WarehouseTransfer extends TenantBaseModel {
},
/**
*
*
*/
fromWarehouse: {
relation: Model.BelongsToOneRelation,
@@ -126,27 +128,13 @@ export class WarehouseTransfer extends TenantBaseModel {
};
}
/**
* Model settings.
*/
// static get meta() {
// return WarehouseTransferSettings;
// }
// /**
// * Retrieve the default custom views, roles and columns.
// */
// static get defaultViews() {
// return DEFAULT_VIEWS;
// }
/**
* Model search roles.
*/
static get searchRoles() {
return [
// { fieldKey: 'name', comparator: 'contains' },
// { condition: 'or', fieldKey: 'code', comparator: 'like' },
{ fieldKey: 'name', comparator: 'contains' },
{ condition: 'or', fieldKey: 'code', comparator: 'like' },
];
}
}

View File

@@ -6,6 +6,7 @@ import { TransformerInjectable } from '../../Transformer/TransformerInjectable.s
import { DynamicListService } from '../../DynamicListing/DynamicList.service';
import { TenantModelProxy } from '../../System/models/TenantBaseModel';
import { WarehouseTransfer } from '../models/WarehouseTransfer';
import { GetWarehouseTransfersQueryDto } from '@/modules/Warehouses/dtos/GetWarehouseTransfersQuery.dto';
@Injectable()
export class GetWarehouseTransfers {
@@ -30,16 +31,19 @@ export class GetWarehouseTransfers {
/**
* Retrieves warehouse transfers paginated list.
* @param {number} tenantId
* @param {IGetWarehousesTransfersFilterDTO} filterDTO
* @returns {}
* @param {IGetWarehousesTransfersFilterDTO} filterDTO
*/
public getWarehouseTransfers = async (
filterDTO: IGetWarehousesTransfersFilterDTO,
filterDTO: GetWarehouseTransfersQueryDto,
) => {
// Parses stringified filter roles.
const filter = this.parseListFilterDTO(filterDTO);
const filter = this.parseListFilterDTO({
sortOrder: 'desc',
columnSortBy: 'created_at',
page: 1,
pageSize: 12,
...filterDTO,
});
// Dynamic list service.
const dynamicFilter = await this.dynamicListService.dynamicList(
this.warehouseTransferModel(),