using EgwCoreLib.Lux.Data.DbModel.Items; using EgwCoreLib.Lux.Data.DbModel.Sales; using Microsoft.EntityFrameworkCore; using static EgwCoreLib.Lux.Core.Enums; namespace EgwCoreLib.Lux.Data.Repository.Sales { public class OrderRowRepository : BaseRepository, IOrderRowRepository { #region Public Constructors public OrderRowRepository(IDbContextFactory ctxFactory) : base(ctxFactory) { } #endregion Public Constructors #region Public Methods public async Task AddAsync(OrderRowModel entity) { await using var dbCtx = await CreateContextAsync(); await dbCtx.DbSetOrderRow.AddAsync(entity); return await dbCtx.SaveChangesAsync() > 0; } public async Task DeleteAsync(OrderRowModel entity) { await using var dbCtx = await CreateContextAsync(); // Wrap in transaction for atomicity (multi-row update + delete) await using var tx = dbCtx.Database.BeginTransaction(); try { // 1. Recupero il record da eliminare var dbResult = await dbCtx.DbSetOrderRow .FirstOrDefaultAsync(x => x.OrderRowID == entity.OrderRowID); if (dbResult == null) return false; // 2. Recupero i record successivi da shiftare var list2Move = await dbCtx.DbSetOrderRow .Where(x => x.OrderID == entity.OrderID && x.RowNum > dbResult.RowNum) .ToListAsync(); foreach (var item in list2Move) { item.RowNum--; dbCtx.Entry(item).State = EntityState.Modified; } // 3. Rimuovo il record dbCtx.DbSetOrderRow.Remove(dbResult); // 4. Salvo tutto bool done = await dbCtx.SaveChangesAsync() > 0; if (done) tx.Commit(); return done; } catch { tx.Rollback(); throw; } } public async Task> GetBomItemsAsync() { await using var dbCtx = await CreateContextAsync(); return await dbCtx.DbSetItem .Where(x => x.ItemType == ItemClassType.Bom || x.ItemType == ItemClassType.BomAlt) .ToListAsync(); } public async Task GetByIdAsync(int OrderRowId) { await using var dbCtx = await CreateContextAsync(); return await dbCtx.DbSetOrderRow .Include(r => r.SellingItemNav) .FirstOrDefaultAsync(x => x.OrderRowID == OrderRowId); } public async Task> GetByParentAsync(int orderId) { await using var dbCtx = await CreateContextAsync(); return await dbCtx.DbSetOrderRow .Where(x => x.OrderID == orderId) .Include(r => r.SellingItemNav) .AsNoTracking() .ToListAsync(); } public async Task> GetByStateAsync(OrderStates reqState, DateTime dtStart, DateTime dtEnd) { await using var dbCtx = await CreateContextAsync(); return await dbCtx.DbSetOrderRow .Where(x => x.OrderRowState == reqState && x.Inserted >= dtStart && x.Inserted <= dtEnd) .Include(r => r.SellingItemNav) .AsNoTracking() .ToListAsync(); } public async Task> GetByStateMinAsync(OrderStates reqState, DateTime dtStart, DateTime dtEnd) { await using var dbCtx = await CreateContextAsync(); return await dbCtx.DbSetOrderRow .Where(x => x.OrderRowState >= reqState && x.Inserted >= dtStart && x.Inserted <= dtEnd) .Include(r => r.SellingItemNav) .AsNoTracking() .ToListAsync(); } public async Task GetByUidAsync(string OrderRowUid) { await using var dbCtx = await CreateContextAsync(); return await dbCtx.DbSetOrderRow .Include(r => r.SellingItemNav) .FirstOrDefaultAsync(x => x.OrderRowUID == OrderRowUid); } public async Task> GetItemGroupsAsync() { await using var dbCtx = await CreateContextAsync(); return await dbCtx.DbSetItemGroup.ToListAsync(); } public async Task SaveRowsAsync(List rows) { await using var dbCtx = await CreateContextAsync(); // Wrap in transaction for atomicity (batch update multiple rows) await using var tx = dbCtx.Database.BeginTransaction(); try { foreach (var row in rows) dbCtx.Entry(row).State = EntityState.Modified; bool done = await dbCtx.SaveChangesAsync() > 0; if (done) tx.Commit(); return done; } catch { tx.Rollback(); throw; } } public async Task UpdateAsync(OrderRowModel entity) { await using var dbCtx = await CreateContextAsync(); // Recuperiamo l'entità tracciata dal context var trackedEntity = dbCtx.DbSetOrderRow.Local.FirstOrDefault(x => x.OrderRowID == entity.OrderRowID); if (trackedEntity != null) { // Aggiorna i valori dell'entità tracciata con quelli della nuova dbCtx.Entry(trackedEntity).CurrentValues.SetValues(entity); } else { dbCtx.DbSetOrderRow.Update(entity); } return await dbCtx.SaveChangesAsync() > 0; } #endregion Public Methods } }