Completo repository BuyOrder + aggiungo repository BuyOrderRow
This commit is contained in:
@@ -19,9 +19,9 @@
|
||||
public int BuyOrderID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// ID Ordine cliente di riferimento
|
||||
/// Riga Ordine (per ordinamento)
|
||||
/// </summary>
|
||||
public int OrderID { get; set; }
|
||||
public int RowNum { get; set; } = 0;
|
||||
|
||||
/// <summary>
|
||||
/// ID dell'item richiesto
|
||||
@@ -77,12 +77,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Navigazione Ordine Cliente
|
||||
/// </summary>
|
||||
[ForeignKey("OrderID")]
|
||||
public virtual OrderModel? OrderNav { get; set; } = null;
|
||||
|
||||
/// <summary>
|
||||
/// Navigazione Ordine Acquisto
|
||||
/// </summary>
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
namespace EgwCoreLib.Lux.Data.Repository.Supplier
|
||||
{
|
||||
public class BuyOrderRepository : BaseRepository, IBuyOrderRepository
|
||||
{
|
||||
#region Public Constructors
|
||||
|
||||
public BuyOrderRepository(IDbContextFactory<DataLayerContext> ctxFactory) : base(ctxFactory)
|
||||
{
|
||||
}
|
||||
|
||||
#endregion Public Constructors
|
||||
|
||||
#region Public Methods
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<bool> AddAsync(BuyOrderModel entity)
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
await dbCtx.DbSetBuyOrder.AddAsync(entity);
|
||||
return await dbCtx.SaveChangesAsync() > 0;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<bool> DeleteAsync(BuyOrderModel entity)
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
dbCtx.DbSetBuyOrder.Remove(entity);
|
||||
return await dbCtx.SaveChangesAsync() > 0;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<List<BuyOrderModel>> GetAllAsync()
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
return await dbCtx.DbSetBuyOrder
|
||||
.Include(c => c.SupplierNav)
|
||||
.Include(o => o.BuyOrderRowNav)
|
||||
.ThenInclude(s => s.ItemNav)
|
||||
.AsNoTracking()
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<BuyOrderModel?> GetByIdAsync(int recId)
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
return await dbCtx.DbSetBuyOrder
|
||||
.Where(x => x.BuyOrderID == recId)
|
||||
.Include(c => c.SupplierNav)
|
||||
.Include(o => o.BuyOrderRowNav)
|
||||
.ThenInclude(s => s.ItemNav)
|
||||
.FirstOrDefaultAsync();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<List<BuyOrderModel>> GetFiltAsync(DateTime inizio, DateTime fine)
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
return await dbCtx.DbSetBuyOrder
|
||||
.Where(x => x.Inserted >= inizio && x.Inserted <= fine)
|
||||
.Include(c => c.SupplierNav)
|
||||
.Include(o => o.BuyOrderRowNav)
|
||||
.ThenInclude(s => s.ItemNav)
|
||||
.AsNoTracking()
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<List<BuyOrderRowModel>> GetRowsAsync(int recId)
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
return await dbCtx.DbSetBuyOrderRow
|
||||
.Where(x => x.BuyOrderID == recId)
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<bool> SaveRowsAsync(List<BuyOrderRowModel> rows)
|
||||
{
|
||||
// Add validation for null or empty list
|
||||
if (rows == null || rows.Count == 0) return false;
|
||||
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
|
||||
// Wrap in transaction for atomicity (batch update multiple rows)
|
||||
await using var tx = await dbCtx.Database.BeginTransactionAsync();
|
||||
try
|
||||
{
|
||||
foreach (var row in rows)
|
||||
dbCtx.Entry(row).State = EntityState.Modified;
|
||||
|
||||
bool done = await dbCtx.SaveChangesAsync() > 0;
|
||||
|
||||
if (done)
|
||||
await tx.CommitAsync();
|
||||
|
||||
return done;
|
||||
}
|
||||
catch
|
||||
{
|
||||
await tx.RollbackAsync();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<bool> UpdateAsync(BuyOrderModel entity)
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
// Recuperiamo l'entità tracciata dal context
|
||||
var trackedEntity = await dbCtx.DbSetBuyOrder.FirstOrDefaultAsync(x => x.BuyOrderID == entity.BuyOrderID);
|
||||
|
||||
if (trackedEntity != null)
|
||||
{
|
||||
// Aggiorna i valori dell'entità tracciata con quelli della nuova
|
||||
dbCtx.Entry(trackedEntity).CurrentValues.SetValues(entity);
|
||||
}
|
||||
else
|
||||
{
|
||||
dbCtx.DbSetBuyOrder.Update(entity);
|
||||
}
|
||||
return await dbCtx.SaveChangesAsync() > 0;
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
namespace EgwCoreLib.Lux.Data.Repository.Supplier
|
||||
{
|
||||
public class BuyOrderRowrepository : BaseRepository, IBuyOrderRowrepository
|
||||
{
|
||||
#region Public Constructors
|
||||
|
||||
public BuyOrderRowrepository(IDbContextFactory<DataLayerContext> ctxFactory) : base(ctxFactory)
|
||||
{
|
||||
}
|
||||
|
||||
#endregion Public Constructors
|
||||
|
||||
#region Public Methods
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<bool> AddAsync(BuyOrderRowModel entity)
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
await dbCtx.DbSetBuyOrderRow.AddAsync(entity);
|
||||
return await dbCtx.SaveChangesAsync() > 0;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<bool> DeleteAsync(BuyOrderRowModel entity)
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
|
||||
// Wrap in transaction for atomicity (multi-row update + delete)
|
||||
await using var tx = await dbCtx.Database.BeginTransactionAsync();
|
||||
try
|
||||
{
|
||||
// 1. Recupero il record da eliminare
|
||||
var dbResult = await dbCtx.DbSetBuyOrderRow
|
||||
.FirstOrDefaultAsync(x => x.BuyOrderRowID == entity.BuyOrderRowID);
|
||||
|
||||
if (dbResult == null)
|
||||
return false;
|
||||
|
||||
// 2. Recupero i record successivi da shiftare
|
||||
var list2Move = await dbCtx.DbSetBuyOrderRow
|
||||
.Where(x => x.BuyOrderID == entity.BuyOrderID && x.RowNum > dbResult.RowNum)
|
||||
.ToListAsync();
|
||||
|
||||
foreach (var item in list2Move)
|
||||
{
|
||||
item.RowNum--;
|
||||
dbCtx.Entry(item).State = EntityState.Modified;
|
||||
}
|
||||
|
||||
// 3. Rimuovo il record
|
||||
dbCtx.DbSetBuyOrderRow.Remove(dbResult);
|
||||
|
||||
// 4. Salvo tutto
|
||||
bool done = await dbCtx.SaveChangesAsync() > 0;
|
||||
|
||||
if (done)
|
||||
await tx.CommitAsync();
|
||||
|
||||
return done;
|
||||
}
|
||||
catch
|
||||
{
|
||||
await tx.RollbackAsync();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<BuyOrderRowModel?> GetByIdAsync(int buyOrderRowId)
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
return await dbCtx.DbSetBuyOrderRow
|
||||
.Include(r => r.ItemNav)
|
||||
.FirstOrDefaultAsync(x => x.BuyOrderRowID == buyOrderRowId);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<List<BuyOrderRowModel>> GetByParentAsync(int buyOrderId)
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
return await dbCtx.DbSetBuyOrderRow
|
||||
.Where(x => x.BuyOrderID == buyOrderId)
|
||||
.Include(r => r.ItemNav)
|
||||
.AsNoTracking()
|
||||
.ToListAsync();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<bool> SaveRowsAsync(List<BuyOrderRowModel> rows)
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
|
||||
// Wrap in transaction for atomicity (batch update multiple rows)
|
||||
await using var tx = await dbCtx.Database.BeginTransactionAsync();
|
||||
try
|
||||
{
|
||||
foreach (var row in rows)
|
||||
dbCtx.Entry(row).State = EntityState.Modified;
|
||||
|
||||
bool done = await dbCtx.SaveChangesAsync() > 0;
|
||||
|
||||
if (done)
|
||||
await tx.CommitAsync();
|
||||
|
||||
return done;
|
||||
}
|
||||
catch
|
||||
{
|
||||
await tx.RollbackAsync();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<bool> UpdateAsync(BuyOrderRowModel entity)
|
||||
{
|
||||
await using var dbCtx = await CreateContextAsync();
|
||||
// Recuperiamo l'entità tracciata dal context
|
||||
var trackedEntity = await dbCtx.DbSetBuyOrderRow.FirstOrDefaultAsync(x => x.BuyOrderRowID == entity.BuyOrderRowID);
|
||||
|
||||
if (trackedEntity != null)
|
||||
{
|
||||
// Aggiorna i valori dell'entità tracciata con quelli della nuova
|
||||
dbCtx.Entry(trackedEntity).CurrentValues.SetValues(entity);
|
||||
}
|
||||
else
|
||||
{
|
||||
dbCtx.DbSetBuyOrderRow.Update(entity);
|
||||
}
|
||||
return await dbCtx.SaveChangesAsync() > 0;
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
}
|
||||
}
|
||||
@@ -12,13 +12,6 @@
|
||||
/// <returns>True se l'inserimento ha successo, false altrimenti.</returns>
|
||||
Task<bool> AddAsync(BuyOrderModel entity);
|
||||
|
||||
/// <summary>
|
||||
/// Esegue il cloning completo di un'Offerta e di tutte le relative righe.
|
||||
/// </summary>
|
||||
/// <param name="rec2clone">L'offerta da clonare.</param>
|
||||
/// <returns>L'ordine creato, o null se l'offerta non esiste.</returns>
|
||||
Task<BuyOrderModel?> CloneOfferAsync(OfferModel rec2clone);
|
||||
|
||||
/// <summary>
|
||||
/// Elimina un ordine dal database.
|
||||
/// </summary>
|
||||
@@ -32,12 +25,6 @@
|
||||
/// <returns>L'elenco di tutti gli ordini con clienti, rivenditori e righe associate.</returns>
|
||||
Task<List<BuyOrderModel>> GetAllAsync();
|
||||
|
||||
/// <summary>
|
||||
/// Recupera l'elenco degli elementi BOM (Bill of Materials) utilizzati negli ordini.
|
||||
/// </summary>
|
||||
/// <returns>L'elenco degli elementi BOM.</returns>
|
||||
Task<List<ItemModel>> GetBomItemsAsync();
|
||||
|
||||
/// <summary>
|
||||
/// Recupera un ordine per il suo identificatore.
|
||||
/// </summary>
|
||||
@@ -53,12 +40,6 @@
|
||||
/// <returns>L'elenco degli ordini nell'intervallo specificato.</returns>
|
||||
Task<List<BuyOrderModel>> GetFiltAsync(DateTime inizio, DateTime fine);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera l'elenco dei gruppi di articoli.
|
||||
/// </summary>
|
||||
/// <returns>L'elenco dei gruppi di articoli.</returns>
|
||||
Task<List<ItemGroupModel>> GetItemGroupsAsync();
|
||||
|
||||
/// <summary>
|
||||
/// Recupera le righe dell'ordine per un ordine specifico.
|
||||
/// </summary>
|
||||
|
||||
@@ -19,64 +19,19 @@
|
||||
/// <returns>True se l'eliminazione ha successo, false altrimenti.</returns>
|
||||
Task<bool> DeleteAsync(BuyOrderRowModel entity);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera l'elenco degli elementi BOM (Bill of Materials).
|
||||
/// </summary>
|
||||
/// <returns>L'elenco degli elementi BOM.</returns>
|
||||
Task<List<ItemModel>> GetBomItemsAsync();
|
||||
|
||||
/// <summary>
|
||||
/// Recupera una riga d'ordine per il suo identificatore.
|
||||
/// </summary>
|
||||
/// <param name="BuyOrderRowId">L'identificatore della riga d'ordine.</param>
|
||||
/// <param name="buyOrderRowId">L'identificatore della riga d'ordine.</param>
|
||||
/// <returns>La riga d'ordine corrispondente, o null se non esiste.</returns>
|
||||
Task<BuyOrderRowModel?> GetByIdAsync(int BuyOrderRowId);
|
||||
Task<BuyOrderRowModel?> GetByIdAsync(int buyOrderRowId);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera tutte le righe d'ordine per un ordine specifico.
|
||||
/// </summary>
|
||||
/// <param name="orderId">L'identificatore dell'ordine.</param>
|
||||
/// <param name="buyOrderId">L'identificatore dell'ordine.</param>
|
||||
/// <returns>L'elenco delle righe d'ordine associate all'ordine.</returns>
|
||||
Task<List<BuyOrderRowModel>> GetByParentAsync(int orderId);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera le righe d'ordine per stato e intervallo di date.
|
||||
/// </summary>
|
||||
/// <param name="reqState">Lo stato richiesto della riga.</param>
|
||||
/// <param name="dtStart">La data di inizio del periodo.</param>
|
||||
/// <param name="dtEnd">La data di fine del periodo.</param>
|
||||
/// <returns>L'elenco delle righe d'ordine con lo stato e le date specificate.</returns>
|
||||
Task<List<BuyOrderRowModel>> GetByStateAsync(OrderStates reqState, DateTime dtStart, DateTime dtEnd);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera le righe d'ordine per stato minimo e intervallo di date.
|
||||
/// </summary>
|
||||
/// <param name="reqState">Lo stato minimo richiesto.</param>
|
||||
/// <param name="dtStart">La data di inizio del periodo.</param>
|
||||
/// <param name="dtEnd">La data di fine del periodo.</param>
|
||||
/// <returns>L'elenco delle righe d'ordine con stato >= a quello specificato.</returns>
|
||||
Task<List<BuyOrderRowModel>> GetByStateMinAsync(OrderStates reqState, DateTime dtStart, DateTime dtEnd);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera una riga d'ordine per il suo UID.
|
||||
/// </summary>
|
||||
/// <param name="BuyOrderRowUid">L'UID della riga d'ordine.</param>
|
||||
/// <returns>La riga d'ordine corrispondente, o null se non esiste.</returns>
|
||||
Task<BuyOrderRowModel?> GetByUidAsync(string BuyOrderRowUid);
|
||||
|
||||
/// <summary>
|
||||
/// Recupera l'elenco dei gruppi di articoli.
|
||||
/// </summary>
|
||||
/// <returns>L'elenco dei gruppi di articoli.</returns>
|
||||
Task<List<ItemGroupModel>> GetItemGroupsAsync();
|
||||
|
||||
/// <summary>
|
||||
/// Aggiorna la stima di produzione per una riga d'ordine.
|
||||
/// </summary>
|
||||
/// <param name="uID">L'UID della riga d'ordine.</param>
|
||||
/// <param name="prodEstim">La nuova stima di produzione.</param>
|
||||
/// <returns>True se l'aggiornamento ha successo, false altrimenti.</returns>
|
||||
Task<bool> SaveProdEstAsync(string uID, string prodEstim);
|
||||
Task<List<BuyOrderRowModel>> GetByParentAsync(int buyOrderId);
|
||||
|
||||
/// <summary>
|
||||
/// Aggiorna in batch le righe d'ordine.
|
||||
@@ -92,11 +47,5 @@
|
||||
/// <returns>True se l'aggiornamento ha successo, false altrimenti.</returns>
|
||||
Task<bool> UpdateAsync(BuyOrderRowModel entity);
|
||||
|
||||
/// <summary>
|
||||
/// Convalida un elenco di righe d'ordine e aggiorna lo stato se necessario.
|
||||
/// </summary>
|
||||
/// <param name="list2chk">L'elenco delle righe da convalidare.</param>
|
||||
/// <returns>Il numero di righe elaborate correttamente.</returns>
|
||||
Task<int> ValidateAsync(List<BuyOrderRowModel> list2chk);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Version>1.1.2604.1411</Version>
|
||||
<Version>1.1.2604.1412</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<UserSecretsId>aspnet-Lux.UI-a758c101-a2f4-4e38-977d-1c4887dbbd50</UserSecretsId>
|
||||
<Version>1.1.2604.1411</Version>
|
||||
<Version>1.1.2604.1412</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<body>
|
||||
<i>LUX - Web Windows MES</i>
|
||||
<h4>Versione: 1.1.2604.1411</h4>
|
||||
<h4>Versione: 1.1.2604.1412</h4>
|
||||
<br /> Note di rilascio:
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
@@ -1 +1 @@
|
||||
1.1.2604.1411
|
||||
1.1.2604.1412
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<item>
|
||||
<version>1.1.2604.1411</version>
|
||||
<version>1.1.2604.1412</version>
|
||||
<url>http://nexus.steamware.net/repository/SWS/GPW/stable/GPW.UI.zip</url>
|
||||
<changelog>http://nexus.steamware.net/repository/SWS/GPW/stable/ChangeLog.html</changelog>
|
||||
<mandatory>false</mandatory>
|
||||
|
||||
Reference in New Issue
Block a user