Files
lux/EgwCoreLib.Lux.Data/Repository/Sales/OrderRowRepository.cs
T
2026-03-18 12:44:27 +01:00

176 lines
6.3 KiB
C#

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<DataLayerContext> ctxFactory) : base(ctxFactory)
{
}
#endregion Public Constructors
#region Public Methods
public async Task<bool> AddAsync(OrderRowModel entity)
{
await using var dbCtx = await CreateContextAsync();
await dbCtx.DbSetOrderRow.AddAsync(entity);
return await dbCtx.SaveChangesAsync() > 0;
}
public async Task<bool> 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<List<ItemModel>> 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<OrderRowModel?> 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<List<OrderRowModel>> 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<List<OrderRowModel>> 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<List<OrderRowModel>> 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<OrderRowModel?> 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<List<ItemGroupModel>> GetItemGroupsAsync()
{
await using var dbCtx = await CreateContextAsync();
return await dbCtx.DbSetItemGroup.ToListAsync();
}
public async Task<bool> SaveRowsAsync(List<OrderRowModel> 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<bool> 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
}
}