using Lagerbestand.Data; using Lagerbestand.Models; using Microsoft.EntityFrameworkCore; namespace Lagerbestand.Services; public interface IInventoryService { Task> GetAllAsync(); Task GetByIdAsync(Guid id); Task GetByQrCodeAsync(string qrCode); Task ExistsAsync(string qrCode); Task AddItemAsync(string qrCode, Guid? catalogItemId = null, string? name = null); Task> AddItemsAsync(List qrCodes, Guid? catalogItemId = null); Task RemoveItemAsync(string qrCode); Task RemoveItemsAsync(List qrCodes); Task UpdateCategoryAsync(Guid id, Guid? catalogItemId); Task UpdateCategoryForItemsAsync(List itemIds, Guid? catalogItemId); Task DeleteAsync(Guid id); } public class InventoryService : IInventoryService { private readonly AppDbContext _context; private readonly ILogger _logger; public InventoryService(AppDbContext context, ILogger logger) { _context = context; _logger = logger; } public async Task> GetAllAsync() { return await _context.InventoryItems .AsNoTracking() .Include(x => x.CatalogItem) .OrderByDescending(x => x.CreatedAt) .ToListAsync(); } public async Task GetByIdAsync(Guid id) { return await _context.InventoryItems .Include(x => x.CatalogItem) .FirstOrDefaultAsync(x => x.Id == id); } public async Task GetByQrCodeAsync(string qrCode) { return await _context.InventoryItems .Include(x => x.CatalogItem) .FirstOrDefaultAsync(x => x.QrCode == qrCode); } public async Task ExistsAsync(string qrCode) { return await _context.InventoryItems.AnyAsync(x => x.QrCode == qrCode); } public async Task AddItemAsync(string qrCode, Guid? catalogItemId = null, string? name = null) { if (await _context.InventoryItems.AnyAsync(x => x.QrCode == qrCode)) throw new InvalidOperationException($"Artikel mit QR-Code '{qrCode}' ist bereits im Bestand."); var item = new InventoryItem { Id = Guid.NewGuid(), QrCode = qrCode, CatalogItemId = catalogItemId, Name = name, CreatedAt = DateTime.UtcNow }; _context.InventoryItems.Add(item); await _context.SaveChangesAsync(); return await GetByIdAsync(item.Id) ?? item; } public async Task> AddItemsAsync(List qrCodes, Guid? catalogItemId = null) { var addedItems = new List(); var now = DateTime.UtcNow; var distinctCodes = qrCodes.Distinct().ToList(); var existingCodes = await _context.InventoryItems .Where(x => distinctCodes.Contains(x.QrCode)) .Select(x => x.QrCode) .ToListAsync(); var existingSet = existingCodes.ToHashSet(); foreach (var qrCode in distinctCodes) { if (existingSet.Contains(qrCode)) continue; var item = new InventoryItem { Id = Guid.NewGuid(), QrCode = qrCode, CatalogItemId = catalogItemId, CreatedAt = now }; _context.InventoryItems.Add(item); addedItems.Add(item); } if (addedItems.Count > 0) await _context.SaveChangesAsync(); return addedItems; } public async Task RemoveItemAsync(string qrCode) { var item = await _context.InventoryItems.FirstOrDefaultAsync(x => x.QrCode == qrCode); if (item == null) return false; _context.InventoryItems.Remove(item); await _context.SaveChangesAsync(); return true; } public async Task RemoveItemsAsync(List qrCodes) { var count = 0; foreach (var qrCode in qrCodes.Distinct()) { var item = await _context.InventoryItems.FirstOrDefaultAsync(x => x.QrCode == qrCode); if (item != null) { _context.InventoryItems.Remove(item); count++; } } if (count > 0) await _context.SaveChangesAsync(); return count; } public async Task UpdateCategoryAsync(Guid id, Guid? catalogItemId) { var item = await _context.InventoryItems.FindAsync(id) ?? throw new InvalidOperationException("Artikel nicht gefunden"); item.CatalogItemId = catalogItemId; item.UpdatedAt = DateTime.UtcNow; await _context.SaveChangesAsync(); return item; } public async Task UpdateCategoryForItemsAsync(List itemIds, Guid? catalogItemId) { var now = DateTime.UtcNow; var count = 0; foreach (var id in itemIds) { var item = await _context.InventoryItems.FindAsync(id); if (item != null) { item.CatalogItemId = catalogItemId; item.UpdatedAt = now; count++; } } if (count > 0) await _context.SaveChangesAsync(); return count; } public async Task DeleteAsync(Guid id) { var item = await _context.InventoryItems.FindAsync(id); if (item != null) { _context.InventoryItems.Remove(item); await _context.SaveChangesAsync(); } } }