using Distribution.Data; using Distribution.Models; using Microsoft.EntityFrameworkCore; namespace Distribution.Features.Expense; public class ExpenseRepository(AppDBContext context) : IExpenseRepository { private IQueryable Base() => context.Expenses .Include(e => e.Category!).ThenInclude(c => c.Parent) .Include(e => e.Warehouse) .Include(e => e.Vendor) .Include(e => e.ChequePage) .Include(e => e.Attachments.Where(a => a.IsActive)); public async Task GetByIdAsync(Guid id) => await Base().FirstOrDefaultAsync(e => e.Id == id && e.IsActive); private IQueryable Filtered( ExpenseStatus? status, Guid? categoryId, Guid? warehouseId, DateTime? from, DateTime? to) => Base() .Where(e => e.IsActive) .Where(e => !status.HasValue || e.Status == status) .Where(e => !categoryId.HasValue || e.FK_CategoryId == categoryId || e.Category!.FK_ParentCategoryId == categoryId) .Where(e => !warehouseId.HasValue || e.FK_WarehouseId == warehouseId) .Where(e => !from.HasValue || e.BillDate >= from) .Where(e => !to.HasValue || e.BillDate <= to); public async Task> ListAsync( ExpenseStatus? status, Guid? categoryId, Guid? warehouseId, DateTime? from, DateTime? to, int page, int pageSize) => await Filtered(status, categoryId, warehouseId, from, to) .OrderByDescending(e => e.BillDate) .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(); public async Task CountAsync( ExpenseStatus? status, Guid? categoryId, Guid? warehouseId, DateTime? from, DateTime? to) => await Filtered(status, categoryId, warehouseId, from, to).CountAsync(); public async Task AddAsync(Models.Expense entity) => await context.Expenses.AddAsync(entity); public void Update(Models.Expense entity) => context.Expenses.Update(entity); }