refactor: inventory transfers to nestjs

This commit is contained in:
Ahmed Bouhuolia
2025-03-13 00:44:11 +02:00
parent 67ae7ad037
commit cf496909a5
48 changed files with 2334 additions and 135 deletions

View File

@@ -0,0 +1,43 @@
import { WarehouseTransferTransformer } from './WarehouseTransferTransfomer';
import { Inject, Injectable } from '@nestjs/common';
import { TransformerInjectable } from '@/modules/Transformer/TransformerInjectable.service';
import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel';
import { WarehouseTransfer } from '../models/WarehouseTransfer';
import { ModelObject } from 'objection';
@Injectable()
export class GetWarehouseTransfer {
constructor(
private readonly transformer: TransformerInjectable,
@Inject(WarehouseTransfer.name)
private readonly warehouseTransferModel: TenantModelProxy<
typeof WarehouseTransfer
>,
) {}
/**
* Retrieves the specific warehouse transfer transaction.
* @param {number} warehouseTransferId
* @param {IEditWarehouseTransferDTO} editWarehouseDTO
* @returns {Promise<IWarehouseTransfer>}
*/
public getWarehouseTransfer = async (
warehouseTransferId: number,
): Promise<ModelObject<WarehouseTransfer>> => {
// Retrieves the old warehouse transfer transaction.
const warehouseTransfer = await this.warehouseTransferModel()
.query()
.findById(warehouseTransferId)
.withGraphFetched('entries.item')
.withGraphFetched('fromWarehouse')
.withGraphFetched('toWarehouse')
.throwIfNotFound();
// Retrieves the transfromed warehouse transfers.
return this.transformer.transform(
warehouseTransfer,
new WarehouseTransferTransformer(),
);
};
}

View File

@@ -0,0 +1,70 @@
import * as R from 'ramda';
import { WarehouseTransferTransformer } from './WarehouseTransferTransfomer';
import { IGetWarehousesTransfersFilterDTO } from '../../Warehouses/Warehouse.types';
import { TransformerInjectable } from '../../Transformer/TransformerInjectable.service';
import { Inject, Injectable } from '@nestjs/common';
import { DynamicListService } from '../../DynamicListing/DynamicList.service';
import { TenantModelProxy } from '../../System/models/TenantBaseModel';
import { WarehouseTransfer } from '../models/WarehouseTransfer';
@Injectable()
export class GetWarehouseTransfers {
constructor(
private readonly dynamicListService: DynamicListService,
private readonly transformer: TransformerInjectable,
@Inject(WarehouseTransfer.name)
private readonly warehouseTransferModel: TenantModelProxy<
typeof WarehouseTransfer
>,
) {}
/**
* Parses the sale invoice list filter DTO.
* @param filterDTO
* @returns
*/
private parseListFilterDTO(filterDTO) {
return R.compose(this.dynamicListService.parseStringifiedFilter)(filterDTO);
}
/**
* Retrieves warehouse transfers paginated list.
* @param {number} tenantId
* @param {IGetWarehousesTransfersFilterDTO} filterDTO
* @returns {}
*/
public getWarehouseTransfers = async (
filterDTO: IGetWarehousesTransfersFilterDTO,
) => {
// Parses stringified filter roles.
const filter = this.parseListFilterDTO(filterDTO);
// Dynamic list service.
const dynamicFilter = await this.dynamicListService.dynamicList(
this.warehouseTransferModel(),
filter,
);
const { results, pagination } = await this.warehouseTransferModel()
.query()
.onBuild((query) => {
query.withGraphFetched('entries.item');
query.withGraphFetched('fromWarehouse');
query.withGraphFetched('toWarehouse');
dynamicFilter.buildQuery()(query);
})
.pagination(filter.page - 1, filter.pageSize);
// Retrieves the transformed warehouse transfers
const warehousesTransfers = await this.transformer.transform(
results,
new WarehouseTransferTransformer(),
);
return {
warehousesTransfers,
pagination,
filter,
};
};
}

View File

@@ -0,0 +1,38 @@
import { Transformer } from "../../Transformer/Transformer";
export class WarehouseTransferItemTransformer extends Transformer {
/**
* Include these attributes to sale invoice object.
* @returns {Array}
*/
public includeAttributes = (): string[] => {
return ['formattedQuantity', 'formattedCost', 'formattedTotal'];
};
/**
* Formats the total.
* @param {IWarehouseTransferEntry} entry
* @returns {string}
*/
public formattedTotal = (entry) => {
return this.formatMoney(entry.total);
};
/**
* Formats the quantity.
* @param {IWarehouseTransferEntry} entry
* @returns {string}
*/
public formattedQuantity = (entry) => {
return this.formatNumber(entry.quantity);
};
/**
* Formats the cost.
* @param {IWarehouseTransferEntry} entry
* @returns {string}
*/
public formattedCost = (entry) => {
return this.formatMoney(entry.cost);
};
}

View File

@@ -0,0 +1,27 @@
import { WarehouseTransferItemTransformer } from './WarehouseTransferItemTransformer';
import { Transformer } from '@/modules/Transformer/Transformer';
export class WarehouseTransferTransformer extends Transformer {
/**
* Include these attributes to sale invoice object.
* @returns {Array}
*/
public includeAttributes = (): string[] => {
return ['formattedDate', 'entries'];
};
/**
*
* @param transfer
* @returns
*/
protected formattedDate = (transfer) => {
return this.formatDate(transfer.date);
};
/**
*
*/
protected entries = (transfer) => {
return this.item(transfer.entries, new WarehouseTransferItemTransformer());
};
}