Add invoice payment summary
This commit is contained in:
@@ -6,8 +6,9 @@ public interface IInvoiceRepository
|
|||||||
{
|
{
|
||||||
Task<Models.Invoice?> GetByIdAsync(Guid id);
|
Task<Models.Invoice?> GetByIdAsync(Guid id);
|
||||||
Task<Models.Invoice?> GetByShopPOIdAsync(Guid shopPOId);
|
Task<Models.Invoice?> GetByShopPOIdAsync(Guid shopPOId);
|
||||||
Task<List<Models.Invoice>> GetAllAsync(Guid? agentId, Guid? routeId, Guid? shopId, InvoiceStatus? status, int page, int pageSize);
|
Task<List<Models.Invoice>> GetAllAsync(Guid? agentId, Guid? routeId, Guid? shopId, InvoiceStatus? status, PaymentStatus? paymentStatus, int page, int pageSize);
|
||||||
Task<int> GetCountAsync(Guid? agentId, Guid? routeId, Guid? shopId, InvoiceStatus? status);
|
Task<int> GetCountAsync(Guid? agentId, Guid? routeId, Guid? shopId, InvoiceStatus? status, PaymentStatus? paymentStatus);
|
||||||
|
Task<List<Models.Invoice>> GetOutstandingAsync();
|
||||||
Task AddAsync(Models.Invoice invoice);
|
Task AddAsync(Models.Invoice invoice);
|
||||||
void Update(Models.Invoice invoice);
|
void Update(Models.Invoice invoice);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,10 +14,18 @@ public class InvoiceController(InvoiceService service, ICurrentUserService curre
|
|||||||
[FromQuery] Guid? routeId,
|
[FromQuery] Guid? routeId,
|
||||||
[FromQuery] Guid? shopId,
|
[FromQuery] Guid? shopId,
|
||||||
[FromQuery] InvoiceStatus? status,
|
[FromQuery] InvoiceStatus? status,
|
||||||
|
[FromQuery] PaymentStatus? paymentStatus,
|
||||||
[FromQuery] int page = 1,
|
[FromQuery] int page = 1,
|
||||||
[FromQuery] int pageSize = 20)
|
[FromQuery] int pageSize = 20)
|
||||||
{
|
{
|
||||||
var result = await service.GetAllAsync(agentId, routeId, shopId, status, page, pageSize);
|
var result = await service.GetAllAsync(agentId, routeId, shopId, status, paymentStatus, page, pageSize);
|
||||||
|
return Ok(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("outstanding-summary")]
|
||||||
|
public async Task<IActionResult> GetOutstandingSummary()
|
||||||
|
{
|
||||||
|
var result = await service.GetOutstandingSummaryAsync();
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,3 +21,5 @@ public record InvoiceResponse(
|
|||||||
decimal TotalAmount,
|
decimal TotalAmount,
|
||||||
bool IsActive,
|
bool IsActive,
|
||||||
DateTime CreatedAt);
|
DateTime CreatedAt);
|
||||||
|
|
||||||
|
public record OutstandingPaymentsResponse(int InvoiceCount, decimal OutstandingAmount);
|
||||||
|
|||||||
@@ -18,27 +18,35 @@ public class InvoiceRepository(AppDBContext context) : IInvoiceRepository
|
|||||||
.Include(i => i.ShopPO)
|
.Include(i => i.ShopPO)
|
||||||
.FirstOrDefaultAsync(i => i.FK_ShopPOId == shopPOId && i.IsActive);
|
.FirstOrDefaultAsync(i => i.FK_ShopPOId == shopPOId && i.IsActive);
|
||||||
|
|
||||||
public async Task<List<Models.Invoice>> GetAllAsync(Guid? agentId, Guid? routeId, Guid? shopId, InvoiceStatus? status, int page, int pageSize) =>
|
public async Task<List<Models.Invoice>> GetAllAsync(Guid? agentId, Guid? routeId, Guid? shopId, InvoiceStatus? status, PaymentStatus? paymentStatus, int page, int pageSize) =>
|
||||||
await context.Invoices
|
await context.Invoices
|
||||||
.Include(i => i.ShopPO).ThenInclude(p => p.Store)
|
.Include(i => i.ShopPO).ThenInclude(p => p.Store)
|
||||||
.Where(i => i.IsActive
|
.Where(i => i.IsActive
|
||||||
&& (agentId == null || i.ShopPO.RaisedById == agentId)
|
&& (agentId == null || i.ShopPO.RaisedById == agentId)
|
||||||
&& (routeId == null || i.ShopPO.Store.FK_RouteId == routeId)
|
&& (routeId == null || i.ShopPO.Store.FK_RouteId == routeId)
|
||||||
&& (shopId == null || i.ShopPO.FK_StoreId == shopId)
|
&& (shopId == null || i.ShopPO.FK_StoreId == shopId)
|
||||||
&& (status == null || i.Status == status))
|
&& (status == null || i.Status == status)
|
||||||
|
&& (paymentStatus == null || i.PaymentStatus == paymentStatus))
|
||||||
.OrderByDescending(i => i.CreatedAt)
|
.OrderByDescending(i => i.CreatedAt)
|
||||||
.Skip((page - 1) * pageSize)
|
.Skip((page - 1) * pageSize)
|
||||||
.Take(pageSize)
|
.Take(pageSize)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
public async Task<int> GetCountAsync(Guid? agentId, Guid? routeId, Guid? shopId, InvoiceStatus? status) =>
|
public async Task<int> GetCountAsync(Guid? agentId, Guid? routeId, Guid? shopId, InvoiceStatus? status, PaymentStatus? paymentStatus) =>
|
||||||
await context.Invoices
|
await context.Invoices
|
||||||
.Include(i => i.ShopPO).ThenInclude(p => p.Store)
|
.Include(i => i.ShopPO).ThenInclude(p => p.Store)
|
||||||
.CountAsync(i => i.IsActive
|
.CountAsync(i => i.IsActive
|
||||||
&& (agentId == null || i.ShopPO.RaisedById == agentId)
|
&& (agentId == null || i.ShopPO.RaisedById == agentId)
|
||||||
&& (routeId == null || i.ShopPO.Store.FK_RouteId == routeId)
|
&& (routeId == null || i.ShopPO.Store.FK_RouteId == routeId)
|
||||||
&& (shopId == null || i.ShopPO.FK_StoreId == shopId)
|
&& (shopId == null || i.ShopPO.FK_StoreId == shopId)
|
||||||
&& (status == null || i.Status == status));
|
&& (status == null || i.Status == status)
|
||||||
|
&& (paymentStatus == null || i.PaymentStatus == paymentStatus));
|
||||||
|
|
||||||
|
public async Task<List<Models.Invoice>> GetOutstandingAsync() =>
|
||||||
|
await context.Invoices
|
||||||
|
.Include(i => i.Payments.Where(p => p.IsActive))
|
||||||
|
.Where(i => i.IsActive && i.PaymentStatus != PaymentStatus.Paid)
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
public async Task AddAsync(Models.Invoice invoice) =>
|
public async Task AddAsync(Models.Invoice invoice) =>
|
||||||
await context.Invoices.AddAsync(invoice);
|
await context.Invoices.AddAsync(invoice);
|
||||||
|
|||||||
@@ -24,13 +24,21 @@ public class InvoiceService(
|
|||||||
return invoice is null ? null : ToResponse(invoice);
|
return invoice is null ? null : ToResponse(invoice);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PagedResponse<InvoiceResponse>> GetAllAsync(Guid? agentId, Guid? routeId, Guid? shopId, InvoiceStatus? status, int page, int pageSize)
|
public async Task<PagedResponse<InvoiceResponse>> GetAllAsync(Guid? agentId, Guid? routeId, Guid? shopId, InvoiceStatus? status, PaymentStatus? paymentStatus, int page, int pageSize)
|
||||||
{
|
{
|
||||||
var total = await repo.GetCountAsync(agentId, routeId, shopId, status);
|
var total = await repo.GetCountAsync(agentId, routeId, shopId, status, paymentStatus);
|
||||||
var items = await repo.GetAllAsync(agentId, routeId, shopId, status, page, pageSize);
|
var items = await repo.GetAllAsync(agentId, routeId, shopId, status, paymentStatus, page, pageSize);
|
||||||
return new PagedResponse<InvoiceResponse>(page, pageSize, total, items.Select(ToResponse).ToList());
|
return new PagedResponse<InvoiceResponse>(page, pageSize, total, items.Select(ToResponse).ToList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<OutstandingPaymentsResponse> GetOutstandingSummaryAsync()
|
||||||
|
{
|
||||||
|
var invoices = await repo.GetOutstandingAsync();
|
||||||
|
var count = invoices.Count;
|
||||||
|
var outstanding = invoices.Sum(i => i.TotalAmount - i.Payments.Sum(p => p.Amount));
|
||||||
|
return new OutstandingPaymentsResponse(count, outstanding);
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<InvoiceResponse> PrintAsync(Guid id, Guid printedBy, CancellationToken ct = default)
|
public async Task<InvoiceResponse> PrintAsync(Guid id, Guid printedBy, CancellationToken ct = default)
|
||||||
{
|
{
|
||||||
var invoice = await repo.GetByIdAsync(id)
|
var invoice = await repo.GetByIdAsync(id)
|
||||||
|
|||||||
Reference in New Issue
Block a user