using Indotalent.Infrastructure.Database; using MediatR; using Microsoft.EntityFrameworkCore; namespace Indotalent.Features.Purchase.PurchaseOrder.Cqrs; public class PurchaseOrderItemResponse { public string? Id { get; set; } public string? ProductId { get; set; } public string? ProductName { get; set; } public string? Summary { get; set; } public decimal? UnitPrice { get; set; } public double? Quantity { get; set; } public decimal? Total { get; set; } } public class GetPurchaseOrderByIdResponse { public string? Id { get; set; } public string? AutoNumber { get; set; } public DateTime? OrderDate { get; set; } public Data.Enums.PurchaseOrderStatus OrderStatus { get; set; } public string? Description { get; set; } public string? VendorId { get; set; } public string? VendorName { get; set; } public string? VendorStreet { get; set; } public string? VendorCity { get; set; } public string? VendorState { get; set; } public string? VendorZipCode { get; set; } public string? VendorPhone { get; set; } public string? VendorEmail { get; set; } public string? VendorFax { get; set; } public string? CompanyName { get; set; } public string? CompanyStreet { get; set; } public string? CompanyCity { get; set; } public string? CompanyState { get; set; } public string? CompanyZipCode { get; set; } public string? CompanyPhone { get; set; } public string? CompanyEmail { get; set; } public string? CurrencySymbol { get; set; } public string? TaxId { get; set; } public decimal? BeforeTaxAmount { get; set; } public decimal? TaxAmount { get; set; } public decimal? AfterTaxAmount { get; set; } public DateTimeOffset? CreatedAt { get; set; } public string? CreatedBy { get; set; } public DateTimeOffset? UpdatedAt { get; set; } public string? UpdatedBy { get; set; } public List Items { get; set; } = new(); } public record GetPurchaseOrderByIdQuery(string Id) : IRequest; public class GetPurchaseOrderByIdHandler : IRequestHandler { private readonly AppDbContext _context; public GetPurchaseOrderByIdHandler(AppDbContext context) => _context = context; public async Task Handle(GetPurchaseOrderByIdQuery request, CancellationToken cancellationToken) { var company = await _context.Company .AsNoTracking() .Include(x => x.Currency) .OrderByDescending(x => x.IsDefault) .FirstOrDefaultAsync(cancellationToken); return await _context.PurchaseOrder .AsNoTracking() .Include(x => x.Vendor) .Include(x => x.PurchaseOrderItemList) .ThenInclude(x => x.Product) .Where(x => x.Id == request.Id) .Select(x => new GetPurchaseOrderByIdResponse { Id = x.Id, AutoNumber = x.AutoNumber, OrderDate = x.OrderDate, OrderStatus = x.OrderStatus, Description = x.Description, VendorId = x.VendorId, VendorName = x.Vendor!.Name, VendorStreet = x.Vendor!.Street, VendorCity = x.Vendor!.City, VendorState = x.Vendor!.State, VendorZipCode = x.Vendor!.ZipCode, VendorPhone = x.Vendor!.PhoneNumber, VendorEmail = x.Vendor!.EmailAddress, VendorFax = x.Vendor!.FaxNumber, CompanyName = company != null ? company.Name : string.Empty, CompanyStreet = company != null ? company.StreetAddress : string.Empty, CompanyCity = company != null ? company.City : string.Empty, CompanyState = company != null ? company.StateProvince : string.Empty, CompanyZipCode = company != null ? company.ZipCode : string.Empty, CompanyPhone = company != null ? company.Phone : string.Empty, CompanyEmail = company != null ? company.Email : string.Empty, CurrencySymbol = company != null && company.Currency != null ? company.Currency.Symbol : "IDR", TaxId = x.TaxId, BeforeTaxAmount = x.BeforeTaxAmount, TaxAmount = x.TaxAmount, AfterTaxAmount = x.AfterTaxAmount, CreatedAt = x.CreatedAt, CreatedBy = x.CreatedBy, UpdatedAt = x.UpdatedAt, UpdatedBy = x.UpdatedBy, Items = x.PurchaseOrderItemList.Select(i => new PurchaseOrderItemResponse { Id = i.Id, ProductId = i.ProductId, ProductName = i.Product!.Name, Summary = i.Summary, UnitPrice = i.UnitPrice, Quantity = i.Quantity, Total = i.Total }).ToList() }).FirstOrDefaultAsync(cancellationToken); } }