From 0ff38c19a43a0e70c534cae9198fe5d05a05debb Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 14 Apr 2026 12:06:29 +0200 Subject: [PATCH] Completo repository BuyOrder + aggiungo repository BuyOrderRow --- .../DbModel/Supplier/BuyOrderRowModel.cs | 10 +- .../Repository/Supplier/BuyOrderRepository.cs | 127 ++++++++++++++++ .../Supplier/BuyOrderRowrepository.cs | 135 ++++++++++++++++++ .../Supplier/IBuyOrderRepository.cs | 19 --- .../Supplier/IBuyOrderRowrepository.cs | 59 +------- Lux.API/Lux.API.csproj | 2 +- Lux.UI/Lux.UI.csproj | 2 +- Resources/ChangeLog.html | 2 +- Resources/VersNum.txt | 2 +- Resources/manifest.xml | 2 +- 10 files changed, 273 insertions(+), 87 deletions(-) create mode 100644 EgwCoreLib.Lux.Data/Repository/Supplier/BuyOrderRepository.cs create mode 100644 EgwCoreLib.Lux.Data/Repository/Supplier/BuyOrderRowrepository.cs 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