diff --git a/EgwCoreLib.Lux.Data/DbModel/Supplier/BuyOrderRowModel.cs b/EgwCoreLib.Lux.Data/DbModel/Supplier/BuyOrderRowModel.cs
index 29dffe7..dc2a08a 100644
--- a/EgwCoreLib.Lux.Data/DbModel/Supplier/BuyOrderRowModel.cs
+++ b/EgwCoreLib.Lux.Data/DbModel/Supplier/BuyOrderRowModel.cs
@@ -19,9 +19,9 @@
public int BuyOrderID { get; set; }
///
- /// ID Ordine cliente di riferimento
+ /// Riga Ordine (per ordinamento)
///
- public int OrderID { get; set; }
+ public int RowNum { get; set; } = 0;
///
/// ID dell'item richiesto
@@ -77,12 +77,6 @@
}
}
- ///
- /// Navigazione Ordine Cliente
- ///
- [ForeignKey("OrderID")]
- public virtual OrderModel? OrderNav { get; set; } = null;
-
///
/// Navigazione Ordine Acquisto
///
diff --git a/EgwCoreLib.Lux.Data/Repository/Supplier/BuyOrderRepository.cs b/EgwCoreLib.Lux.Data/Repository/Supplier/BuyOrderRepository.cs
new file mode 100644
index 0000000..ce806c4
--- /dev/null
+++ b/EgwCoreLib.Lux.Data/Repository/Supplier/BuyOrderRepository.cs
@@ -0,0 +1,127 @@
+namespace EgwCoreLib.Lux.Data.Repository.Supplier
+{
+ public class BuyOrderRepository : BaseRepository, IBuyOrderRepository
+ {
+ #region Public Constructors
+
+ public BuyOrderRepository(IDbContextFactory ctxFactory) : base(ctxFactory)
+ {
+ }
+
+ #endregion Public Constructors
+
+ #region Public Methods
+
+ ///
+ public async Task AddAsync(BuyOrderModel entity)
+ {
+ await using var dbCtx = await CreateContextAsync();
+ await dbCtx.DbSetBuyOrder.AddAsync(entity);
+ return await dbCtx.SaveChangesAsync() > 0;
+ }
+
+ ///
+ public async Task DeleteAsync(BuyOrderModel entity)
+ {
+ await using var dbCtx = await CreateContextAsync();
+ dbCtx.DbSetBuyOrder.Remove(entity);
+ return await dbCtx.SaveChangesAsync() > 0;
+ }
+
+ ///
+ public async Task> 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();
+ }
+
+ ///
+ public async Task 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();
+ }
+
+ ///
+ public async Task> 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();
+ }
+
+ ///
+ public async Task> GetRowsAsync(int recId)
+ {
+ await using var dbCtx = await CreateContextAsync();
+ return await dbCtx.DbSetBuyOrderRow
+ .Where(x => x.BuyOrderID == recId)
+ .ToListAsync();
+ }
+
+ ///
+ public async Task SaveRowsAsync(List 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;
+ }
+ }
+
+ ///
+ public async Task 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
+ }
+}
\ No newline at end of file
diff --git a/EgwCoreLib.Lux.Data/Repository/Supplier/BuyOrderRowrepository.cs b/EgwCoreLib.Lux.Data/Repository/Supplier/BuyOrderRowrepository.cs
new file mode 100644
index 0000000..4202621
--- /dev/null
+++ b/EgwCoreLib.Lux.Data/Repository/Supplier/BuyOrderRowrepository.cs
@@ -0,0 +1,135 @@
+namespace EgwCoreLib.Lux.Data.Repository.Supplier
+{
+ public class BuyOrderRowrepository : BaseRepository, IBuyOrderRowrepository
+ {
+ #region Public Constructors
+
+ public BuyOrderRowrepository(IDbContextFactory ctxFactory) : base(ctxFactory)
+ {
+ }
+
+ #endregion Public Constructors
+
+ #region Public Methods
+
+ ///
+ public async Task AddAsync(BuyOrderRowModel entity)
+ {
+ await using var dbCtx = await CreateContextAsync();
+ await dbCtx.DbSetBuyOrderRow.AddAsync(entity);
+ return await dbCtx.SaveChangesAsync() > 0;
+ }
+
+ ///
+ public async Task 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;
+ }
+ }
+
+ ///
+ public async Task GetByIdAsync(int buyOrderRowId)
+ {
+ await using var dbCtx = await CreateContextAsync();
+ return await dbCtx.DbSetBuyOrderRow
+ .Include(r => r.ItemNav)
+ .FirstOrDefaultAsync(x => x.BuyOrderRowID == buyOrderRowId);
+ }
+
+ ///
+ public async Task> GetByParentAsync(int buyOrderId)
+ {
+ await using var dbCtx = await CreateContextAsync();
+ return await dbCtx.DbSetBuyOrderRow
+ .Where(x => x.BuyOrderID == buyOrderId)
+ .Include(r => r.ItemNav)
+ .AsNoTracking()
+ .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 = 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;
+ }
+ }
+
+ ///
+ public async Task 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
+ }
+}
\ No newline at end of file
diff --git a/EgwCoreLib.Lux.Data/Repository/Supplier/IBuyOrderRepository.cs b/EgwCoreLib.Lux.Data/Repository/Supplier/IBuyOrderRepository.cs
index b0b9681..75d72cc 100644
--- a/EgwCoreLib.Lux.Data/Repository/Supplier/IBuyOrderRepository.cs
+++ b/EgwCoreLib.Lux.Data/Repository/Supplier/IBuyOrderRepository.cs
@@ -12,13 +12,6 @@
/// True se l'inserimento ha successo, false altrimenti.
Task AddAsync(BuyOrderModel entity);
- ///
- /// Esegue il cloning completo di un'Offerta e di tutte le relative righe.
- ///
- /// L'offerta da clonare.
- /// L'ordine creato, o null se l'offerta non esiste.
- Task CloneOfferAsync(OfferModel rec2clone);
-
///
/// Elimina un ordine dal database.
///
@@ -32,12 +25,6 @@
/// L'elenco di tutti gli ordini con clienti, rivenditori e righe associate.
Task> GetAllAsync();
- ///
- /// Recupera l'elenco degli elementi BOM (Bill of Materials) utilizzati negli ordini.
- ///
- /// L'elenco degli elementi BOM.
- Task> GetBomItemsAsync();
-
///
/// Recupera un ordine per il suo identificatore.
///
@@ -53,12 +40,6 @@
/// L'elenco degli ordini nell'intervallo specificato.
Task> GetFiltAsync(DateTime inizio, DateTime fine);
- ///
- /// Recupera l'elenco dei gruppi di articoli.
- ///
- /// L'elenco dei gruppi di articoli.
- Task> GetItemGroupsAsync();
-
///
/// Recupera le righe dell'ordine per un ordine specifico.
///
diff --git a/EgwCoreLib.Lux.Data/Repository/Supplier/IBuyOrderRowrepository.cs b/EgwCoreLib.Lux.Data/Repository/Supplier/IBuyOrderRowrepository.cs
index 446dd97..6412df5 100644
--- a/EgwCoreLib.Lux.Data/Repository/Supplier/IBuyOrderRowrepository.cs
+++ b/EgwCoreLib.Lux.Data/Repository/Supplier/IBuyOrderRowrepository.cs
@@ -19,64 +19,19 @@
/// True se l'eliminazione ha successo, false altrimenti.
Task DeleteAsync(BuyOrderRowModel entity);
- ///
- /// Recupera l'elenco degli elementi BOM (Bill of Materials).
- ///
- /// L'elenco degli elementi BOM.
- Task> GetBomItemsAsync();
-
///
/// Recupera una riga d'ordine per il suo identificatore.
///
- /// L'identificatore della riga d'ordine.
+ /// L'identificatore della riga d'ordine.
/// La riga d'ordine corrispondente, o null se non esiste.
- Task GetByIdAsync(int BuyOrderRowId);
+ Task GetByIdAsync(int buyOrderRowId);
///
/// Recupera tutte le righe d'ordine per un ordine specifico.
///
- /// L'identificatore dell'ordine.
+ /// L'identificatore dell'ordine.
/// L'elenco delle righe d'ordine associate all'ordine.
- Task> GetByParentAsync(int orderId);
-
- ///
- /// Recupera le righe d'ordine per stato e intervallo di date.
- ///
- /// Lo stato richiesto della riga.
- /// La data di inizio del periodo.
- /// La data di fine del periodo.
- /// L'elenco delle righe d'ordine con lo stato e le date specificate.
- Task> GetByStateAsync(OrderStates reqState, DateTime dtStart, DateTime dtEnd);
-
- ///
- /// Recupera le righe d'ordine per stato minimo e intervallo di date.
- ///
- /// Lo stato minimo richiesto.
- /// La data di inizio del periodo.
- /// La data di fine del periodo.
- /// L'elenco delle righe d'ordine con stato >= a quello specificato.
- Task> GetByStateMinAsync(OrderStates reqState, DateTime dtStart, DateTime dtEnd);
-
- ///
- /// Recupera una riga d'ordine per il suo UID.
- ///
- /// L'UID della riga d'ordine.
- /// La riga d'ordine corrispondente, o null se non esiste.
- Task GetByUidAsync(string BuyOrderRowUid);
-
- ///
- /// Recupera l'elenco dei gruppi di articoli.
- ///
- /// L'elenco dei gruppi di articoli.
- Task> GetItemGroupsAsync();
-
- ///
- /// Aggiorna la stima di produzione per una riga d'ordine.
- ///
- /// L'UID della riga d'ordine.
- /// La nuova stima di produzione.
- /// True se l'aggiornamento ha successo, false altrimenti.
- Task SaveProdEstAsync(string uID, string prodEstim);
+ Task> GetByParentAsync(int buyOrderId);
///
/// Aggiorna in batch le righe d'ordine.
@@ -92,11 +47,5 @@
/// True se l'aggiornamento ha successo, false altrimenti.
Task UpdateAsync(BuyOrderRowModel entity);
- ///
- /// Convalida un elenco di righe d'ordine e aggiorna lo stato se necessario.
- ///
- /// L'elenco delle righe da convalidare.
- /// Il numero di righe elaborate correttamente.
- Task ValidateAsync(List list2chk);
}
}
diff --git a/Lux.API/Lux.API.csproj b/Lux.API/Lux.API.csproj
index a3c6e34..02bbcde 100644
--- a/Lux.API/Lux.API.csproj
+++ b/Lux.API/Lux.API.csproj
@@ -4,7 +4,7 @@
net8.0
enable
enable
- 1.1.2604.1411
+ 1.1.2604.1412
diff --git a/Lux.UI/Lux.UI.csproj b/Lux.UI/Lux.UI.csproj
index 05f0a95..8af1268 100644
--- a/Lux.UI/Lux.UI.csproj
+++ b/Lux.UI/Lux.UI.csproj
@@ -5,7 +5,7 @@
enable
enable
aspnet-Lux.UI-a758c101-a2f4-4e38-977d-1c4887dbbd50
- 1.1.2604.1411
+ 1.1.2604.1412
diff --git a/Resources/ChangeLog.html b/Resources/ChangeLog.html
index 7494332..d3263c8 100644
--- a/Resources/ChangeLog.html
+++ b/Resources/ChangeLog.html
@@ -1,6 +1,6 @@
LUX - Web Windows MES
- Versione: 1.1.2604.1411
+ Versione: 1.1.2604.1412
Note di rilascio:
-
diff --git a/Resources/VersNum.txt b/Resources/VersNum.txt
index c1d7d9a..464ef7e 100644
--- a/Resources/VersNum.txt
+++ b/Resources/VersNum.txt
@@ -1 +1 @@
-1.1.2604.1411
+1.1.2604.1412
diff --git a/Resources/manifest.xml b/Resources/manifest.xml
index 361c4c4..69b6ba7 100644
--- a/Resources/manifest.xml
+++ b/Resources/manifest.xml
@@ -1,6 +1,6 @@
-
- 1.1.2604.1411
+ 1.1.2604.1412
http://nexus.steamware.net/repository/SWS/GPW/stable/GPW.UI.zip
http://nexus.steamware.net/repository/SWS/GPW/stable/ChangeLog.html
false