initial commit

This commit is contained in:
2026-07-21 15:03:40 +07:00
commit 5c20bb8a9e
2752 changed files with 864209 additions and 0 deletions
@@ -0,0 +1,49 @@
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.InventoryTransactionManager.Queries;
public class DeliveryOrderGetInvenTransListResult
{
public List<InventoryTransaction>? Data { get; set; }
}
public class DeliveryOrderGetInvenTransListRequest : IRequest<DeliveryOrderGetInvenTransListResult>
{
public string? ModuleId { get; init; }
}
public class DeliveryOrderGetInvenTransListValidator : AbstractValidator<DeliveryOrderGetInvenTransListRequest>
{
public DeliveryOrderGetInvenTransListValidator()
{
RuleFor(x => x.ModuleId).NotEmpty();
}
}
public class DeliveryOrderGetInvenTransListHandler : IRequestHandler<DeliveryOrderGetInvenTransListRequest, DeliveryOrderGetInvenTransListResult>
{
private readonly InventoryTransactionService _inventoryTransactionService;
public DeliveryOrderGetInvenTransListHandler(
InventoryTransactionService inventoryTransactionService
)
{
_inventoryTransactionService = inventoryTransactionService;
}
public async Task<DeliveryOrderGetInvenTransListResult> Handle(DeliveryOrderGetInvenTransListRequest request, CancellationToken cancellationToken = default)
{
var entity = await _inventoryTransactionService.DeliveryOrderGetInvenTransList(
request.ModuleId,
nameof(DeliveryOrder),
cancellationToken);
return new DeliveryOrderGetInvenTransListResult
{
Data = entity
};
}
}
@@ -0,0 +1,91 @@
using Application.Common.CQS.Queries;
using Application.Common.Extensions;
using AutoMapper;
using MediatR;
using Microsoft.EntityFrameworkCore;
namespace Application.Features.InventoryTransactionManager.Queries;
public record GetInventoryStockListDto
{
public string? StatusName { get; init; }
public string? WarehouseId { get; set; }
public string? WarehouseName { get; init; }
public string? ProductId { get; set; }
public string? ProductName { get; init; }
public string? ProductNumber { get; init; }
public double? Stock { get; init; }
public DateTime? CreatedAtUtc { get; init; }
}
public class GetInventoryStockListProfile : Profile
{
public GetInventoryStockListProfile()
{
}
}
public class GetInventoryStockListResult
{
public List<GetInventoryStockListDto>? Data { get; init; }
}
public class GetInventoryStockListRequest : IRequest<GetInventoryStockListResult>
{
public bool IsDeleted { get; init; } = false;
}
public class GetInventoryStockListHandler : IRequestHandler<GetInventoryStockListRequest, GetInventoryStockListResult>
{
private readonly IMapper _mapper;
private readonly IQueryContext _context;
public GetInventoryStockListHandler(IMapper mapper, IQueryContext context)
{
_mapper = mapper;
_context = context;
}
public async Task<GetInventoryStockListResult> Handle(GetInventoryStockListRequest request, CancellationToken cancellationToken)
{
var query = _context
.InventoryTransaction
.AsNoTracking()
.ApplyIsDeletedFilter(request.IsDeleted)
.Include(x => x.Warehouse)
.Include(x => x.Product)
.Where(x =>
x.Product!.Physical == true &&
x.Warehouse!.SystemWarehouse == false &&
x.Status == Domain.Enums.InventoryTransactionStatus.Confirmed
)
.GroupBy(x => new { x.WarehouseId, x.ProductId })
.Select(group => new GetInventoryStockListDto
{
WarehouseId = group.Key.WarehouseId,
ProductId = group.Key.ProductId,
WarehouseName = group.Max(x => x.Warehouse!.Name),
ProductName = group.Max(x => x.Product!.Name),
ProductNumber = group.Max(x => x.Product!.Number),
Stock = group.Sum(x => x.Stock),
StatusName = group.Max(x => x.Status.ToString()),
CreatedAtUtc = group.Max(x => x.CreatedAtUtc)
})
.AsQueryable();
var entities = await query.ToListAsync(cancellationToken);
return new GetInventoryStockListResult
{
Data = entities
};
}
}
@@ -0,0 +1,118 @@
using Application.Common.CQS.Queries;
using Application.Common.Extensions;
using AutoMapper;
using Domain.Entities;
using MediatR;
using Microsoft.EntityFrameworkCore;
namespace Application.Features.InventoryTransactionManager.Queries;
public record GetInventoryTransactionListDto
{
public string? Id { get; init; }
public string? ModuleId { get; init; }
public string? ModuleName { get; init; }
public string? ModuleCode { get; init; }
public string? ModuleNumber { get; init; }
public DateTime? MovementDate { get; init; }
public string? StatusName { get; init; }
public string? Number { get; init; }
public string? WarehouseName { get; init; }
public string? ProductName { get; init; }
public double? Movement { get; init; }
public string? TransTypeName { get; init; }
public double? Stock { get; init; }
public string? WarehouseFromName { get; init; }
public string? WarehouseToName { get; init; }
public DateTime? CreatedAtUtc { get; init; }
}
public class GetInventoryTransactionListProfile : Profile
{
public GetInventoryTransactionListProfile()
{
CreateMap<InventoryTransaction, GetInventoryTransactionListDto>()
.ForMember(
dest => dest.StatusName,
opt => opt.MapFrom(src => src.Status.HasValue ? src.Status.Value.ToFriendlyName() : string.Empty)
)
.ForMember(
dest => dest.TransTypeName,
opt => opt.MapFrom(src => src.TransType.HasValue ? src.TransType.Value.ToFriendlyName() : string.Empty)
)
.ForMember(
dest => dest.WarehouseName,
opt => opt.MapFrom(src => src.Warehouse != null ? src.Warehouse.Name : string.Empty)
)
.ForMember(
dest => dest.WarehouseToName,
opt => opt.MapFrom(src => src.WarehouseTo != null ? src.WarehouseTo.Name : string.Empty)
)
.ForMember(
dest => dest.WarehouseFromName,
opt => opt.MapFrom(src => src.WarehouseFrom != null ? src.WarehouseFrom.Name : string.Empty)
)
.ForMember(
dest => dest.ProductName,
opt => opt.MapFrom(src => src.Product != null ? src.Product.Number + ' ' + src.Product.Name : string.Empty)
);
}
}
public class GetInventoryTransactionListResult
{
public List<GetInventoryTransactionListDto>? Data { get; init; }
}
public class GetInventoryTransactionListRequest : IRequest<GetInventoryTransactionListResult>
{
public bool IsDeleted { get; init; } = false;
}
public class GetInventoryTransactionListHandler : IRequestHandler<GetInventoryTransactionListRequest, GetInventoryTransactionListResult>
{
private readonly IMapper _mapper;
private readonly IQueryContext _context;
public GetInventoryTransactionListHandler(IMapper mapper, IQueryContext context)
{
_mapper = mapper;
_context = context;
}
public async Task<GetInventoryTransactionListResult> Handle(GetInventoryTransactionListRequest request, CancellationToken cancellationToken)
{
var query = _context
.InventoryTransaction
.AsNoTracking()
.ApplyIsDeletedFilter(request.IsDeleted)
.Include(x => x.Warehouse)
.Include(x => x.Product)
.Include(x => x.WarehouseFrom)
.Include(x => x.WarehouseTo)
.Where(x =>
x.Product!.Physical == true &&
x.Warehouse!.SystemWarehouse == false &&
x.Status == Domain.Enums.InventoryTransactionStatus.Confirmed
)
.OrderByDescending(x => x.CreatedAtUtc)
.AsQueryable();
var entities = await query.ToListAsync(cancellationToken);
var dtos = _mapper.Map<List<GetInventoryTransactionListDto>>(entities);
return new GetInventoryTransactionListResult
{
Data = dtos
};
}
}
@@ -0,0 +1,49 @@
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.InventoryTransactionManager.Queries;
public class GoodsReceiveGetInvenTransListResult
{
public List<InventoryTransaction>? Data { get; set; }
}
public class GoodsReceiveGetInvenTransListRequest : IRequest<GoodsReceiveGetInvenTransListResult>
{
public string? ModuleId { get; init; }
}
public class GoodsReceiveGetInvenTransListValidator : AbstractValidator<GoodsReceiveGetInvenTransListRequest>
{
public GoodsReceiveGetInvenTransListValidator()
{
RuleFor(x => x.ModuleId).NotEmpty();
}
}
public class GoodsReceiveGetInvenTransListHandler : IRequestHandler<GoodsReceiveGetInvenTransListRequest, GoodsReceiveGetInvenTransListResult>
{
private readonly InventoryTransactionService _inventoryTransactionService;
public GoodsReceiveGetInvenTransListHandler(
InventoryTransactionService inventoryTransactionService
)
{
_inventoryTransactionService = inventoryTransactionService;
}
public async Task<GoodsReceiveGetInvenTransListResult> Handle(GoodsReceiveGetInvenTransListRequest request, CancellationToken cancellationToken = default)
{
var entity = await _inventoryTransactionService.GoodsReceiveGetInvenTransList(
request.ModuleId,
nameof(GoodsReceive),
cancellationToken);
return new GoodsReceiveGetInvenTransListResult
{
Data = entity
};
}
}
@@ -0,0 +1,49 @@
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.InventoryTransactionManager.Queries;
public class NegativeAdjustmentGetInvenTransListResult
{
public List<InventoryTransaction>? Data { get; set; }
}
public class NegativeAdjustmentGetInvenTransListRequest : IRequest<NegativeAdjustmentGetInvenTransListResult>
{
public string? ModuleId { get; init; }
}
public class NegativeAdjustmentGetInvenTransListValidator : AbstractValidator<NegativeAdjustmentGetInvenTransListRequest>
{
public NegativeAdjustmentGetInvenTransListValidator()
{
RuleFor(x => x.ModuleId).NotEmpty();
}
}
public class NegativeAdjustmentGetInvenTransListHandler : IRequestHandler<NegativeAdjustmentGetInvenTransListRequest, NegativeAdjustmentGetInvenTransListResult>
{
private readonly InventoryTransactionService _inventoryTransactionService;
public NegativeAdjustmentGetInvenTransListHandler(
InventoryTransactionService inventoryTransactionService
)
{
_inventoryTransactionService = inventoryTransactionService;
}
public async Task<NegativeAdjustmentGetInvenTransListResult> Handle(NegativeAdjustmentGetInvenTransListRequest request, CancellationToken cancellationToken = default)
{
var entity = await _inventoryTransactionService.NegativeAdjustmentGetInvenTransList(
request.ModuleId,
nameof(NegativeAdjustment),
cancellationToken);
return new NegativeAdjustmentGetInvenTransListResult
{
Data = entity
};
}
}
@@ -0,0 +1,49 @@
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.InventoryTransactionManager.Queries;
public class PositiveAdjustmentGetInvenTransListResult
{
public List<InventoryTransaction>? Data { get; set; }
}
public class PositiveAdjustmentGetInvenTransListRequest : IRequest<PositiveAdjustmentGetInvenTransListResult>
{
public string? ModuleId { get; init; }
}
public class PositiveAdjustmentGetInvenTransListValidator : AbstractValidator<PositiveAdjustmentGetInvenTransListRequest>
{
public PositiveAdjustmentGetInvenTransListValidator()
{
RuleFor(x => x.ModuleId).NotEmpty();
}
}
public class PositiveAdjustmentGetInvenTransListHandler : IRequestHandler<PositiveAdjustmentGetInvenTransListRequest, PositiveAdjustmentGetInvenTransListResult>
{
private readonly InventoryTransactionService _inventoryTransactionService;
public PositiveAdjustmentGetInvenTransListHandler(
InventoryTransactionService inventoryTransactionService
)
{
_inventoryTransactionService = inventoryTransactionService;
}
public async Task<PositiveAdjustmentGetInvenTransListResult> Handle(PositiveAdjustmentGetInvenTransListRequest request, CancellationToken cancellationToken = default)
{
var entity = await _inventoryTransactionService.PositiveAdjustmentGetInvenTransList(
request.ModuleId,
nameof(PositiveAdjustment),
cancellationToken);
return new PositiveAdjustmentGetInvenTransListResult
{
Data = entity
};
}
}
@@ -0,0 +1,49 @@
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.InventoryTransactionManager.Queries;
public class PurchaseReturnGetInvenTransListResult
{
public List<InventoryTransaction>? Data { get; set; }
}
public class PurchaseReturnGetInvenTransListRequest : IRequest<PurchaseReturnGetInvenTransListResult>
{
public string? ModuleId { get; init; }
}
public class PurchaseReturnGetInvenTransListValidator : AbstractValidator<PurchaseReturnGetInvenTransListRequest>
{
public PurchaseReturnGetInvenTransListValidator()
{
RuleFor(x => x.ModuleId).NotEmpty();
}
}
public class PurchaseReturnGetInvenTransListHandler : IRequestHandler<PurchaseReturnGetInvenTransListRequest, PurchaseReturnGetInvenTransListResult>
{
private readonly InventoryTransactionService _inventoryTransactionService;
public PurchaseReturnGetInvenTransListHandler(
InventoryTransactionService inventoryTransactionService
)
{
_inventoryTransactionService = inventoryTransactionService;
}
public async Task<PurchaseReturnGetInvenTransListResult> Handle(PurchaseReturnGetInvenTransListRequest request, CancellationToken cancellationToken = default)
{
var entity = await _inventoryTransactionService.PurchaseReturnGetInvenTransList(
request.ModuleId,
nameof(PurchaseReturn),
cancellationToken);
return new PurchaseReturnGetInvenTransListResult
{
Data = entity
};
}
}
@@ -0,0 +1,49 @@
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.InventoryTransactionManager.Queries;
public class SalesReturnGetInvenTransListResult
{
public List<InventoryTransaction>? Data { get; set; }
}
public class SalesReturnGetInvenTransListRequest : IRequest<SalesReturnGetInvenTransListResult>
{
public string? ModuleId { get; init; }
}
public class SalesReturnGetInvenTransListValidator : AbstractValidator<SalesReturnGetInvenTransListRequest>
{
public SalesReturnGetInvenTransListValidator()
{
RuleFor(x => x.ModuleId).NotEmpty();
}
}
public class SalesReturnGetInvenTransListHandler : IRequestHandler<SalesReturnGetInvenTransListRequest, SalesReturnGetInvenTransListResult>
{
private readonly InventoryTransactionService _inventoryTransactionService;
public SalesReturnGetInvenTransListHandler(
InventoryTransactionService inventoryTransactionService
)
{
_inventoryTransactionService = inventoryTransactionService;
}
public async Task<SalesReturnGetInvenTransListResult> Handle(SalesReturnGetInvenTransListRequest request, CancellationToken cancellationToken = default)
{
var entity = await _inventoryTransactionService.SalesReturnGetInvenTransList(
request.ModuleId,
nameof(SalesReturn),
cancellationToken);
return new SalesReturnGetInvenTransListResult
{
Data = entity
};
}
}
@@ -0,0 +1,49 @@
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.InventoryTransactionManager.Queries;
public class ScrappingGetInvenTransListResult
{
public List<InventoryTransaction>? Data { get; set; }
}
public class ScrappingGetInvenTransListRequest : IRequest<ScrappingGetInvenTransListResult>
{
public string? ModuleId { get; init; }
}
public class ScrappingGetInvenTransListValidator : AbstractValidator<ScrappingGetInvenTransListRequest>
{
public ScrappingGetInvenTransListValidator()
{
RuleFor(x => x.ModuleId).NotEmpty();
}
}
public class ScrappingGetInvenTransListHandler : IRequestHandler<ScrappingGetInvenTransListRequest, ScrappingGetInvenTransListResult>
{
private readonly InventoryTransactionService _inventoryTransactionService;
public ScrappingGetInvenTransListHandler(
InventoryTransactionService inventoryTransactionService
)
{
_inventoryTransactionService = inventoryTransactionService;
}
public async Task<ScrappingGetInvenTransListResult> Handle(ScrappingGetInvenTransListRequest request, CancellationToken cancellationToken = default)
{
var entity = await _inventoryTransactionService.ScrappingGetInvenTransList(
request.ModuleId,
nameof(Scrapping),
cancellationToken);
return new ScrappingGetInvenTransListResult
{
Data = entity
};
}
}
@@ -0,0 +1,49 @@
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.InventoryTransactionManager.Queries;
public class StockCountGetInvenTransListResult
{
public List<InventoryTransaction>? Data { get; set; }
}
public class StockCountGetInvenTransListRequest : IRequest<StockCountGetInvenTransListResult>
{
public string? ModuleId { get; init; }
}
public class StockCountGetInvenTransListValidator : AbstractValidator<StockCountGetInvenTransListRequest>
{
public StockCountGetInvenTransListValidator()
{
RuleFor(x => x.ModuleId).NotEmpty();
}
}
public class StockCountGetInvenTransListHandler : IRequestHandler<StockCountGetInvenTransListRequest, StockCountGetInvenTransListResult>
{
private readonly InventoryTransactionService _inventoryTransactionService;
public StockCountGetInvenTransListHandler(
InventoryTransactionService inventoryTransactionService
)
{
_inventoryTransactionService = inventoryTransactionService;
}
public async Task<StockCountGetInvenTransListResult> Handle(StockCountGetInvenTransListRequest request, CancellationToken cancellationToken = default)
{
var entity = await _inventoryTransactionService.StockCountGetInvenTransList(
request.ModuleId,
nameof(StockCount),
cancellationToken);
return new StockCountGetInvenTransListResult
{
Data = entity
};
}
}
@@ -0,0 +1,49 @@
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.InventoryTransactionManager.Queries;
public class TransferInGetInvenTransListResult
{
public List<InventoryTransaction>? Data { get; set; }
}
public class TransferInGetInvenTransListRequest : IRequest<TransferInGetInvenTransListResult>
{
public string? ModuleId { get; init; }
}
public class TransferInGetInvenTransListValidator : AbstractValidator<TransferInGetInvenTransListRequest>
{
public TransferInGetInvenTransListValidator()
{
RuleFor(x => x.ModuleId).NotEmpty();
}
}
public class TransferInGetInvenTransListHandler : IRequestHandler<TransferInGetInvenTransListRequest, TransferInGetInvenTransListResult>
{
private readonly InventoryTransactionService _inventoryTransactionService;
public TransferInGetInvenTransListHandler(
InventoryTransactionService inventoryTransactionService
)
{
_inventoryTransactionService = inventoryTransactionService;
}
public async Task<TransferInGetInvenTransListResult> Handle(TransferInGetInvenTransListRequest request, CancellationToken cancellationToken = default)
{
var entity = await _inventoryTransactionService.TransferInGetInvenTransList(
request.ModuleId,
nameof(TransferIn),
cancellationToken);
return new TransferInGetInvenTransListResult
{
Data = entity
};
}
}
@@ -0,0 +1,49 @@
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.InventoryTransactionManager.Queries;
public class TransferOutGetInvenTransListResult
{
public List<InventoryTransaction>? Data { get; set; }
}
public class TransferOutGetInvenTransListRequest : IRequest<TransferOutGetInvenTransListResult>
{
public string? ModuleId { get; init; }
}
public class TransferOutGetInvenTransListValidator : AbstractValidator<TransferOutGetInvenTransListRequest>
{
public TransferOutGetInvenTransListValidator()
{
RuleFor(x => x.ModuleId).NotEmpty();
}
}
public class TransferOutGetInvenTransListHandler : IRequestHandler<TransferOutGetInvenTransListRequest, TransferOutGetInvenTransListResult>
{
private readonly InventoryTransactionService _inventoryTransactionService;
public TransferOutGetInvenTransListHandler(
InventoryTransactionService inventoryTransactionService
)
{
_inventoryTransactionService = inventoryTransactionService;
}
public async Task<TransferOutGetInvenTransListResult> Handle(TransferOutGetInvenTransListRequest request, CancellationToken cancellationToken = default)
{
var entity = await _inventoryTransactionService.TransferOutGetInvenTransList(
request.ModuleId,
nameof(TransferOut),
cancellationToken);
return new TransferOutGetInvenTransListResult
{
Data = entity
};
}
}