using Fitness_core_BE.Interfaces; using Fitness_core_BE.Models; using Fitness_core_BE; using Microsoft.EntityFrameworkCore; namespace Fitness_core_BE.Repos { public class ClientInvoiceRepository : IClientInvoiceRepository { private readonly CentralDbContext _context; public ClientInvoiceRepository(CentralDbContext context) { _context = context; } public async Task CreateClientInvoiceFromSubscription(Guid subscriptionId) { var subscription = await _context.ClientSubscriptions .Include(cs => cs.ClientPackage) .Include(cs => cs.Client) .ThenInclude(c => c.User) .FirstOrDefaultAsync(cs => cs.SubscriptionId == subscriptionId); if (subscription == null) { throw new Exception("Subscription not found"); } var subItems = await _context.ClientSubItems .Where(si => si.FKClientSubscriptionId == subscriptionId && si.IsActive) .ToListAsync(); decimal totalAmount = subscription.ClientPackage.PackagePrice; totalAmount += subItems.Sum(si => si.SubItemPrice); var clientCard = await _context.ClientCard .FirstOrDefaultAsync(cc => cc.FK_ClientId == subscription.Client.ClientId); if (clientCard == null) { throw new Exception("Client card not found"); } var clientInvoice = new ClientInvoice { ClientInvoiceId = Guid.NewGuid(), FKClientSubscriptionId = subscriptionId, FKUserId = subscription.Client.FKUserId, FKClientCardId = clientCard.CardId, Amount = totalAmount, Status = "Pending", ClientInvoiceDate = DateTime.UtcNow }; _context.ClientInvoices.Add(clientInvoice); var packageItem = new ClientInvoiceItem { ClientInvoiceItemId = Guid.NewGuid(), FKClientInvoiceId = clientInvoice.ClientInvoiceId, ItemName = subscription.ClientPackage.PackageName, ItemDescription = subscription.ClientPackage.PackageDescription, ItemPrice = subscription.ClientPackage.PackagePrice, CreatedAt = DateTime.UtcNow }; _context.ClientInvoiceItems.Add(packageItem); foreach (var subItem in subItems) { var clientInvoiceItem = new ClientInvoiceItem { ClientInvoiceItemId = Guid.NewGuid(), FKClientInvoiceId = clientInvoice.ClientInvoiceId, ItemName = subItem.SubItemName, ItemDescription = subItem.SubItemDescription, ItemPrice = subItem.SubItemPrice, CreatedAt = DateTime.UtcNow }; _context.ClientInvoiceItems.Add(clientInvoiceItem); } return clientInvoice; } public async Task GetClientInvoiceById(Guid clientInvoiceId) { return await _context.ClientInvoices .Include(i => i.ClientSubscription) .ThenInclude(cs => cs.ClientPackage) .Include(i => i.ClientSubscription) .ThenInclude(cs => cs.Client) .Include(i => i.User) .Include(i => i.ClientCard) .Include(i => i.Items) .FirstOrDefaultAsync(i => i.ClientInvoiceId == clientInvoiceId); } public async Task> GetClientInvoicesByClientId(Guid clientId) { return await _context.ClientInvoices .Include(i => i.ClientSubscription) .ThenInclude(cs => cs.ClientPackage) .Include(i => i.User) .Include(i => i.ClientCard) .Include(i => i.Items) .Where(i => i.ClientSubscription.FKClientId == clientId) .OrderByDescending(i => i.ClientInvoiceDate) .ToListAsync(); } public async Task> GetClientInvoicesByUserId(Guid userId) { return await _context.ClientInvoices .Include(i => i.ClientSubscription) .ThenInclude(cs => cs.ClientPackage) .Include(i => i.ClientSubscription) .ThenInclude(cs => cs.Client) .Include(i => i.ClientCard) .Include(i => i.Items) .Where(i => i.FKUserId == userId) .OrderByDescending(i => i.ClientInvoiceDate) .ToListAsync(); } public async Task UpdateClientInvoiceStatus(Guid clientInvoiceId, string status) { var clientInvoice = await _context.ClientInvoices.FindAsync(clientInvoiceId); if (clientInvoice == null) { throw new Exception("ClientInvoice not found"); } clientInvoice.Status = status; return clientInvoice; } } }