using MagMan.Core; using MagMan.Core.DTO; using MagMan.Data.Tenant.DbModels; using MagMan.Data.Tenant.Services; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using NLog; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace MagMan.Data.Tenant.Controllers { public class TenantController : IDisposable { #region Public Constructors public TenantController() { } #endregion Public Constructors #region Public Methods public async Task DatabaseMigrate(string connString) { bool answ = false; using (MagManContext dbCtx = new MagManContext(connString)) { await dbCtx.Database.MigrateAsync(); answ = true; } return answ; } public void Dispose() { // Clear database context Log.Info("Dispose di TenantController"); } /// /// Elimina Item da magazzino /// /// Stringa connessione (variabile x cliente) /// Item da eliminare /// public bool ItemDelete(string connString, RawItemModel rec2del) { bool done = false; using (MagManContext dbCtx = new MagManContext(connString)) { try { var currData = dbCtx .DbSetItems .Where(x => x.RawItemId == rec2del.RawItemId) .FirstOrDefault(); if (currData != null) { //dbCtx // .DbSetItems // .Remove(currData); // non vera eliminazione ma logica... currData.IsActive = false; // registro modifica RawItem dbCtx.Entry(currData).State = EntityState.Modified; dbCtx.SaveChanges(); done = true; } } catch (Exception exc) { Log.Error($"Eccezione in ItemDelete{Environment.NewLine}{exc}"); } } return done; } /// /// Converte il DTO in ItemModel /// /// DTO di partenza /// Parametro active da impostare /// public RawItemModel ItemFromDto(ItemDTO origItem, bool isActive) { RawItemModel answ = new RawItemModel() { MatId = origItem.MatCloudId, IsRemn = origItem.IsRemn, Location = origItem.Location, QtyAvail = origItem.QtyAvail, HMm = origItem.HMm, LMm = origItem.LMm, WMm = origItem.WMm, Note = origItem.Note, IsActive = isActive }; return answ; } /// /// Elenco Items gestiti a magazzino (all) /// /// Stringa connessione (variabile x cliente) /// Solo attivi (default) o anche cancellati /// public List ItemGetAll(string connString, bool onlyActive = true) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { dbResult = dbCtx .DbSetItems .Where(x => x.IsActive || !onlyActive) .Include(c => c.MaterialNav) .OrderBy(x => x.MatId) .ToList(); } return dbResult; } /// /// Elenco Items gestiti a magazzino dato Materiale /// /// Stringa connessione (variabile x cliente) /// ID del materiale x cui filtrare, 0 = tutti /// Solo attivi (default) o anche cancellati /// public List ItemGetByMat(string connString, int matID, bool onlyActive = true) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { dbResult = dbCtx .DbSetItems .Where(x => (matID == 0 || x.MatId == matID) && (x.IsActive || !onlyActive)) .Include(c => c.MaterialNav) .OrderBy(x => x.WMm) .ThenBy(x => x.HMm) .ThenBy(x => x.LMm) .ToList(); } return dbResult; } /// /// Elenco Items gestiti a magazzino dato Materiale /// /// Stringa connessione (variabile x cliente) /// QrCode/Dtmx cercato /// public RawItemModel ItemGetByQr(string connString, string qrCode) { RawItemModel? dbResult = new RawItemModel(); using (MagManContext dbCtx = new MagManContext(connString)) { var rawList = dbCtx .DbSetItems .Include(m => m.MaterialNav) .ToList(); dbResult = rawList .Where(x => x.ItemDtmx == qrCode) .FirstOrDefault(); if (dbResult == null) { dbResult = new RawItemModel(); } } return dbResult; } /// Aggiunge/Modifica un item in magazzino Stringa connessione (variabile x cliente) Record da aggiornare quantità da /// aggiornare (se <0 è consumo) User corrente (SE /// applicabile) Messaggio registrato x variazione /// positiva Messaggio registrato x variazione negativa public bool ItemModQty(string connString, RawItemModel rec2upd, int deltaQty, string userId, string msgAdd, string msgRem) { bool done = false; using (MagManContext dbCtx = new MagManContext(connString)) { try { /* * Verifica se esistesse: deve essere valido TUTTO * - stesso materiale * - stesse dimensioni * */ var currData = dbCtx .DbSetItems .Where(x => (x.RawItemId == rec2upd.RawItemId) || (x.MatId == rec2upd.MatId && (x.WMm == rec2upd.WMm && x.HMm == rec2upd.HMm && x.LMm == rec2upd.LMm))) .FirstOrDefault(); if (currData != null) { // calcolo variazione currData.QtyAvail += deltaQty; // salvo SOLO SE è >=0,,, if (currData.QtyAvail >= 0) { MovMagModel recMovMag = new MovMagModel() { DtRec = DateTime.Now, RawItemId = rec2upd.RawItemId, QtyRec = deltaQty, UserId = userId, Note = deltaQty > 0 ? msgAdd : msgRem }; // registro movimento dbCtx.DbSetMovMag.Add(recMovMag); // registro modifica RawItem dbCtx.Entry(currData).State = EntityState.Modified; // salvo il tutto dbCtx.SaveChanges(); done = true; } } } catch (Exception exc) { Log.Error($"Eccezione in ItemModQty{Environment.NewLine}{exc}"); } } return done; } /// /// Converte lista ItemModel in DTO /// /// Elenco ItemModel di partenza /// public List ItemsToDto(List origItem) { List answ = answ = origItem.Select(x => ItemToDto(x)).ToList(); return answ; } /// /// Converte ItemModel in DTO /// /// ItemModel di partenza /// public ItemDTO ItemToDto(RawItemModel origItem) { ItemDTO answ = new ItemDTO() { MatCloudId = origItem.MatId, RawItemCloudId = origItem.RawItemId, IsRemn = origItem.IsRemn, Location = origItem.Location, QtyAvail = origItem.QtyAvail, HMm = origItem.HMm, LMm = origItem.LMm, WMm = origItem.WMm, Note = origItem.Note, ItemDtmx = origItem.ItemDtmx }; return answ; } /// /// Aggiunge/Modifica un item in magazzino /// /// Stringa connessione (variabile x cliente) /// Record da aggiungere/aggiornare /// User corrente (SE applicabile) /// Se true aggiorna giacenze quantita correnti /// public bool ItemUpdate(string connString, RawItemModel rec2upd, string userId, bool forceQty) { bool done = false; using (MagManContext dbCtx = new MagManContext(connString)) { try { /* * Verifica se esistesse: deve essere valido TUTTO * - stesso materiale * - stesse dimensioni * */ var currData = dbCtx .DbSetItems .Where(x => (x.RawItemId == rec2upd.RawItemId) || (x.MatId == rec2upd.MatId && (x.WMm == rec2upd.WMm && x.HMm == rec2upd.HMm && x.LMm == rec2upd.LMm))) .FirstOrDefault(); if (currData != null) { // SOLO SE modifico quantità... if (forceQty) { // aggiungo record variazione quantità... int delta = rec2upd.QtyAvail - currData.QtyAvail; if (delta != 0) { MovMagModel recMovMag = new MovMagModel() { DtRec = DateTime.Now, RawItemId = currData.RawItemId, //RawItemId = rec2upd.RawItemId, QtyRec = delta, UserId = userId, Note = delta > 0 ? "M02+: Rettifica Inventariale" : "M02-: Rettifica Inventariale" }; dbCtx.DbSetMovMag.Add(recMovMag); } // aggiorno qty registrata currData.QtyAvail = rec2upd.QtyAvail; } // sistemo record... currData.MatId = rec2upd.MatId; currData.IsActive = rec2upd.IsActive; currData.IsRemn = rec2upd.IsRemn; currData.Location = rec2upd.Location; currData.LMm = rec2upd.LMm; currData.HMm = rec2upd.HMm; currData.WMm = rec2upd.WMm; currData.Note = rec2upd.Note; dbCtx.Entry(currData).State = EntityState.Modified; } else { // levo il matNav... if (rec2upd.MaterialNav != null) { dbCtx.Entry(rec2upd.MaterialNav).State = EntityState.Unchanged; } // se non FORZA la quantità --> la imposto a zero... if (!forceQty) { rec2upd.QtyAvail = 0; } // aggiungo record dbCtx .DbSetItems .Add(rec2upd); dbCtx.SaveChanges(); // di nuovo registro movimento se va impostata quantità if (forceQty) { // aggiungo record variazione quantità... MovMagModel recMovMag = new MovMagModel() { DtRec = DateTime.Now, RawItemId = rec2upd.RawItemId, QtyRec = rec2upd.QtyAvail, Note = rec2upd.QtyAvail > 0 ? "M03+: Aggiunta Record" : "M03+: Aggiunta Record" }; dbCtx.DbSetMovMag.Add(recMovMag); } } dbCtx.SaveChanges(); done = true; } catch (Exception exc) { Log.Error($"Eccezione in ItemUpdate{Environment.NewLine}{exc}"); } } return done; } /// /// Elimina Materiale da magazzino /// /// Stringa connessione (variabile x cliente) /// Item da eliminare /// public bool MaterialDelete(string connString, MaterialModel rec2del) { bool done = false; using (MagManContext dbCtx = new MagManContext(connString)) { try { var currData = dbCtx .DbSetMaterials .Where(x => x.MatId == rec2del.MatId) .FirstOrDefault(); if (currData != null) { dbCtx .DbSetMaterials .Remove(currData); dbCtx.SaveChanges(); done = true; } } catch (Exception exc) { Log.Error($"Eccezione in MaterialDelete{Environment.NewLine}{exc}"); } } return done; } /// /// Elenco Materiali gestiti a magazzino formato DTO /// /// Stringa connessione (variabile x cliente) /// Se true allora include record child (Items) /// public List MaterialDtoGetAll(string connString, bool withChild) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { // recupero modello base var rawList = MaterialGetAll(connString, true); // converto if (rawList != null) { dbResult = rawList .Select(x => new MaterialDTO() { MatCloudId = x.MatId, MatCode = x.MatCode, MatDesc = x.MatDesc, HMm = x.HMm, LMm = x.LMm, WMm = x.WMm, SizeNum = x.RawItemList == null ? 0 : x.RawItemList.Where(x => x.IsActive).Count(), QtyTot = x.RawItemList == null ? 0 : x.RawItemList.Where(x => x.IsActive).Sum(r => r.QtyAvail), MatDtmx = x.MatDtmx, IsBeam = x.IsBeam, IsWall = x.IsWall, ItemList = withChild ? ItemsToDto(x.RawItemList != null ? x.RawItemList.ToList() : new List()) : new List() }) .OrderBy(x => x.MatDesc) .ThenBy(x => x.WMm) .ThenBy(x => x.HMm) .ThenBy(x => x.LMm) .ToList(); } } return dbResult; } /// /// Elenco Materiali gestiti a magazzino formato DTO /// /// Stringa connessione (variabile x cliente) /// Materiale richiesto, 0=tutti /// Se true allora include record child (Items) /// public List MaterialDtoGetFilt(string connString, int matID, bool withChild) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { // recupero modello base var rawList = MaterialGetFilt(connString, matID, true); // converto if (rawList != null) { dbResult = rawList .Select(x => new MaterialDTO() { MatCloudId = x.MatId, MatCode = x.MatCode, MatDesc = x.MatDesc, HMm = x.HMm, LMm = x.LMm, WMm = x.WMm, SizeNum = x.RawItemList == null ? 0 : x.RawItemList.Count, QtyTot = x.RawItemList == null ? 0 : x.RawItemList.Sum(r => r.QtyAvail), MatDtmx = x.MatDtmx, IsBeam = x.IsBeam, IsWall = x.IsWall, ItemList = withChild ? ItemsToDto(x.RawItemList != null ? x.RawItemList.ToList() : new List()) : new List() }) .OrderBy(x => x.MatDesc) .ThenBy(x => x.WMm) .ThenBy(x => x.HMm) .ThenBy(x => x.LMm) .ToList(); } } return dbResult; } /// /// Elenco Materiali gestiti a magazzino /// /// Stringa connessione (variabile x cliente) /// public List MaterialGetAll(string connString, bool withChild) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { if (withChild) { dbResult = dbCtx .DbSetMaterials .Include(x => x.RawItemList) .OrderBy(x => x.MatDesc) .ThenBy(x => x.WMm) .ThenBy(x => x.HMm) .ThenBy(x => x.LMm) .ToList(); } else { dbResult = dbCtx .DbSetMaterials .OrderBy(x => x.MatDesc) .ThenBy(x => x.WMm) .ThenBy(x => x.HMm) .ThenBy(x => x.LMm) .ToList(); } } return dbResult; } /// /// Elenco Materiali gestiti a magazzino /// /// Stringa connessione (variabile x cliente) /// Materiale richiesto, 0 = tutti /// Se true allora include record child (Items) /// public List MaterialGetFilt(string connString, int matID, bool withChild) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { if (withChild) { dbResult = dbCtx .DbSetMaterials .Where(x => matID == 0 || x.MatId == matID) .Include(x => x.RawItemList) .OrderBy(x => x.MatDesc) .ThenBy(x => x.WMm) .ThenBy(x => x.HMm) .ThenBy(x => x.LMm) .ToList(); } else { dbResult = dbCtx .DbSetMaterials .Where(x => matID == 0 || x.MatId == matID) .OrderBy(x => x.MatDesc) .ThenBy(x => x.WMm) .ThenBy(x => x.HMm) .ThenBy(x => x.LMm) .ToList(); } } return dbResult; } /// /// Aggiunge/Modifica un Materiale in magazzino /// /// Stringa connessione (variabile x cliente) /// Record da aggiungere/aggiornare /// public bool MaterialUpdate(string connString, MaterialModel rec2upd) { bool done = false; using (MagManContext dbCtx = new MagManContext(connString)) { try { /* * Ricerca equal: corrisponde se * - MatCloudId identico * - se Uguali + NonNulli [MatCode oppure MatDescript] + uguali [W/H/L]... */ var currData = dbCtx .DbSetMaterials .Where(x => (rec2upd.MatId > 0 && x.MatId == rec2upd.MatId) || ((x.WMm == rec2upd.WMm && x.HMm == rec2upd.HMm && x.LMm == rec2upd.LMm) && ((!string.IsNullOrEmpty(rec2upd.MatCode) && x.MatCode == rec2upd.MatCode) || (!string.IsNullOrEmpty(rec2upd.MatDesc) && x.MatDesc == rec2upd.MatDesc)) )) .FirstOrDefault(); if (currData != null) { currData.MatCode = rec2upd.MatCode; currData.MatDesc = rec2upd.MatDesc; currData.LMm = rec2upd.LMm; currData.HMm = rec2upd.HMm; currData.WMm = rec2upd.WMm; dbCtx.Entry(currData).State = EntityState.Modified; } else { dbCtx .DbSetMaterials .Add(rec2upd); } dbCtx.SaveChanges(); done = true; } catch (Exception exc) { Log.Error($"Eccezione in MaterialUpdate{Environment.NewLine}{exc}"); } } return done; } /// /// Elenco MovMag dato Item /// /// Stringa connessione (variabile x cliente) /// ID dell'item x cui filtrare, 0 = tutti /// numMax record da leggere, default 1000 /// public List MovMagGetFilt(string connString, int rawItemID, int maxRec = 1000) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { dbResult = dbCtx .DbSetMovMag .Where(x => rawItemID == 0 || x.RawItemId == rawItemID) //.Include(c => c.ItemNav) .OrderByDescending(x => x.DtRec) .Take(maxRec) .ToList(); } return dbResult; } /// /// Elimina record Project /// /// Stringa connessione (variabile x cliente) /// Item da eliminare /// public bool ProjectDelete(string connString, ProjModel rec2del) { bool done = false; using (MagManContext dbCtx = new MagManContext(connString)) { try { var currData = dbCtx .DbSetProjects .Where(x => x.ProjDbId == rec2del.ProjDbId) .FirstOrDefault(); if (currData != null) { dbCtx .DbSetProjects .Remove(currData); dbCtx.SaveChanges(); done = true; } } catch (Exception exc) { Log.Error($"Eccezione in ProjectDelete{Environment.NewLine}{exc}"); } } return done; } /// /// Elenco Projects (all) /// /// Stringa connessione (variabile x cliente) /// public List ProjectGetAll(string connString) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { dbResult = dbCtx .DbSetProjects .OrderBy(x => x.DtCreated) .ToList(); } return dbResult; } /// /// Elenco progetti dato cliente e macchina /// /// Stringa connessione (variabile x cliente) /// ID macchina, 0 = tutti /// public List ProjectGetByMachine(string connString, int machineID) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { dbResult = dbCtx .DbSetProjects .Where(x => (machineID == 0 || x.MachineID == machineID)) .OrderBy(x => x.DtCreated) .ToList(); } return dbResult; } /// /// Elenco Items gestiti a magazzino dato Materiale /// /// Stringa connessione (variabile x cliente) /// ID master key, 0 = tutti /// periodo x filtraggio /// public List ProjectGetFilt(string connString, int numKey, SelectData period) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { dbResult = dbCtx .DbSetProjects .Where(x => (numKey == 0 || x.KeyNum == numKey) && ((x.DtCreated >= period.DateStart && x.DtCreated <= period.DateEnd) || (x.DtSchedule >= period.DateStart && x.DtSchedule <= period.DateEnd) || (x.DtLastAction >= period.DateStart && x.DtLastAction <= period.DateEnd) )) .OrderBy(x => x.DtCreated) .ToList(); } return dbResult; } /// /// Aggiunge/Modifica un record Project /// /// Stringa connessione (variabile x cliente) /// Record da aggiungere/aggiornare /// public bool ProjectUpdate(string connString, ProjModel rec2upd) { bool done = false; using (MagManContext dbCtx = new MagManContext(connString)) { try { /* * Ricerca: * - DbId corrisponde * - Key + Id remoti corrispondono * */ var currData = dbCtx .DbSetProjects .Where(x => (x.ProjDbId == rec2upd.ProjDbId) || (x.ProjExtDbId == rec2upd.ProjExtDbId && x.KeyNum == rec2upd.KeyNum) || (x.ProjExtId == rec2upd.ProjExtId && x.KeyNum == rec2upd.KeyNum)) .FirstOrDefault(); if (currData != null) { currData.MachineID = rec2upd.MachineID; currData.KeyNum = rec2upd.KeyNum; currData.ProjExtDbId = rec2upd.ProjExtDbId; currData.ProjExtId = rec2upd.ProjExtId; currData.BTLFileName = rec2upd.BTLFileName; currData.PType = rec2upd.PType; currData.Machine = rec2upd.Machine; currData.ProjDescription = rec2upd.ProjDescription; currData.DtCreated = rec2upd.DtCreated; currData.DtLastAction = rec2upd.DtLastAction; currData.DtSchedule = rec2upd.DtSchedule; currData.DtStartProd = rec2upd.DtStartProd; currData.ListName = rec2upd.ListName; currData.ProcTimeEst = rec2upd.ProcTimeEst; currData.ProcTimeReal = rec2upd.ProcTimeReal; currData.IsActive = rec2upd.IsActive; currData.IsArchived = rec2upd.IsArchived; dbCtx.Entry(currData).State = EntityState.Modified; } else { dbCtx .DbSetProjects .Add(rec2upd); } dbCtx.SaveChanges(); done = true; } catch (Exception exc) { Log.Error($"Eccezione in ItemUpdate{Environment.NewLine}{exc}"); } } return done; } /// /// Aggiunge/Modifica un record ReqPlan /// /// Stringa connessione (variabile x cliente) /// Record da aggiungere/aggiornare /// public int ReqPlanUpdate(string connString, RequestPlanModel rec2upd) { int newId = 0; using (MagManContext dbCtx = new MagManContext(connString)) { try { /* * Ricerca x Id corrispondente * */ var currData = dbCtx .DbSetReqPlan .Where(x => x.RequestId == rec2upd.RequestId) .FirstOrDefault(); // aggiorno if (currData != null) { currData.ProjDbId = rec2upd.ProjDbId; currData.DtRequest = rec2upd.DtRequest; currData.ReqState = rec2upd.ReqState; currData.IsActive = rec2upd.IsActive; dbCtx.Entry(currData).State = EntityState.Modified; } else { // se NON di consumo prima rendo disattivi altri.... if (rec2upd.ReqState > Core.Enums.ProjResState.Consumed) { var rec2disable = dbCtx .DbSetReqPlan .Where(x => x.IsActive && x.ProjDbId == rec2upd.ProjDbId && x.ReqState > Core.Enums.ProjResState.Consumed) .ToList(); if (rec2disable != null) { foreach (var recAct in rec2disable) { recAct.IsActive = false; dbCtx.Entry(recAct).State = EntityState.Modified; } } } // aggiungo record dbCtx .DbSetReqPlan .Add(rec2upd); } dbCtx.SaveChanges(); newId = rec2upd.RequestId; } catch (Exception exc) { Log.Error($"Eccezione in ReqPlanUpdate{Environment.NewLine}{exc}"); } } return newId; } /// /// Elenco risorse dato progetto e stato /// /// Stringa connessione (variabile x cliente) /// ID progetto /// true = ultima stima attiva / false = consumi effettivi /// public List ResourcesExpGetByProject(string connString, int projDbId, bool isEstim, bool showAll) { List dbResult = new List(); List rawData = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { if (isEstim) { rawData = dbCtx .DbSetResources .Include(p => p.RequestNav) .Include(i => i.ItemNav) .Where(x => x.RequestNav.ProjDbId == projDbId && (x.RequestNav.IsActive || showAll) && x.RequestNav.ReqState > Enums.ProjResState.ND) .ToList(); } else { rawData = dbCtx .DbSetResources .Include(p => p.RequestNav) .Include(i => i.ItemNav) .Where(x => x.RequestNav.ProjDbId == projDbId && x.RequestNav.IsActive && x.RequestNav.ReqState == Enums.ProjResState.Consumed) .OrderBy(x => x.ResourceId) .ToList(); } try { dbResult = rawData.Select(x => new ResourceExpDTO() { ResourceCloudId = x.ResourceId, RawItemCloudId = x.RawItemId, Qty = x.Qty, Note = x.ItemNav.Note, DtRequest = x.RequestNav.DtRequest, HMm = x.ItemNav.HMm, LMm = x.ItemNav.LMm, WMm = x.ItemNav.WMm, IsActive = x.RequestNav.IsActive, IsRemn = x.ItemNav.IsRemn, MatCloudId = x.ItemNav.MatId, RequestId = x.RequestId }) .OrderByDescending(x => x.DtRequest) .ThenByDescending(x => x.ResourceCloudId) .ToList(); } catch (Exception exc) { Log.Error($"Eccezione ResourcesExpGetByProject{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Elenco risorse dato progetto e stato /// /// Stringa connessione (variabile x cliente) /// ID progetto /// true = ultima stima attiva / false = consumi effettivi /// public List ResourcesGetByProject(string connString, int projDbId, bool isEstim, bool showAll) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { if (isEstim) { dbResult = dbCtx .DbSetResources .Where(x => x.RequestNav.ProjDbId == projDbId && (x.RequestNav.IsActive || showAll) && x.RequestNav.ReqState > Enums.ProjResState.ND) .OrderBy(x => x.ResourceId) .ToList(); } else { dbResult = dbCtx .DbSetResources .Where(x => x.RequestNav.ProjDbId == projDbId && x.RequestNav.IsActive && x.RequestNav.ReqState == Enums.ProjResState.Consumed) .OrderBy(x => x.ResourceId) .ToList(); } } return dbResult; } /// /// Aggiunge/Modifica un elenco di Resource (+ eventuali update giacenze) /// /// Stringa connessione (variabile x cliente) /// Elenco record da aggiungere/aggiornare /// Tipo di aggiornamento da registratre /// User corrente (SE applicabile) /// public int ResourceUpdate(string connString, List recList, Enums.ProjResState resState, string userId) { int numMod = 0; using (MagManContext dbCtx = new MagManContext(connString)) { try { foreach (var rec2upd in recList) { /* * Ricerca x Id corrispondente * */ var currData = dbCtx .DbSetResources .Where(x => rec2upd.ResourceId > 0 && x.ResourceId == rec2upd.ResourceId) .FirstOrDefault(); // aggiorno if (currData != null) { if (resState == Enums.ProjResState.Consumed) { // aggiungo record variazione quantità... int delta = rec2upd.Qty - currData.Qty; if (delta != 0) { MovMagModel recMovMag = new MovMagModel() { DtRec = DateTime.Now, RawItemId = rec2upd.RawItemId, QtyRec = delta, UserId = userId, Note = delta > 0 ? "M04+: Aggiunta Risorsa" : "M04-: Consumo Risorsa" }; dbCtx.DbSetMovMag.Add(recMovMag); } } // aggiorno le risorse currData.Qty = rec2upd.Qty; currData.RawItemId = rec2upd.RawItemId; dbCtx.Entry(currData).State = EntityState.Modified; } else { if (resState == Enums.ProjResState.Consumed) { // aggiungo record variazione quantità... MovMagModel recMovMag = new MovMagModel() { DtRec = DateTime.Now, RawItemId = rec2upd.RawItemId, QtyRec = rec2upd.Qty, UserId = userId, Note = rec2upd.Qty > 0 ? "M05+: Aggiunta Risorsa" : "M05-: Consumo Risorsa" }; dbCtx.DbSetMovMag.Add(recMovMag); } // aggiungo record dbCtx .DbSetResources .Add(rec2upd); } // se si tratta di consumo --> aggiorno giacenze! if (resState == Enums.ProjResState.Consumed) { // cerco record giacenza da aggiornare... var recGiac = dbCtx .DbSetItems .Where(x => x.RawItemId == rec2upd.RawItemId) .FirstOrDefault(); if (recGiac != null) { recGiac.QtyAvail += rec2upd.Qty; dbCtx.Entry(recGiac).State = EntityState.Modified; } } numMod++; } // salvo su DB dbCtx.SaveChanges(); } catch (Exception exc) { Log.Error($"Eccezione in ResourceUpdate{Environment.NewLine}{exc}"); } } return numMod; } #endregion Public Methods #region Private Fields private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); #endregion Private Fields } }