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 MySqlConnector; using NLog; using NLog.LayoutRenderers; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.ConstrainedExecution; using System.Text; using System.Threading.Tasks; using System.Xml; using static MagMan.Core.Enums; using static MagMan.Core.RestPayload; 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 /// /// Elimina Alias da magazzino /// /// Stringa connessione (variabile x cliente) /// Alias da eliminare /// public bool AliasDelete(string connString, AliasModel rec2del) { bool done = false; using (MagManContext dbCtx = new MagManContext(connString)) { try { var currData = dbCtx .DbSetAlias .Where(x => x.Family == rec2del.Family && x.ValueOriginal == rec2del.ValueOriginal) .FirstOrDefault(); if (currData != null) { // 2024.04.04: cancellazione logica al posto di delete! //dbCtx // .DbSetAlias // .Remove(currData); currData.IsActive = false; dbCtx.Entry(currData).State = EntityState.Modified; dbCtx.SaveChanges(); done = true; } } catch (Exception exc) { Log.Error($"Eccezione in AliasDelete{Environment.NewLine}{exc}"); } } return done; } /// /// Elenco Alias gestiti a magazzino data famiglia /// /// Stringa connessione (variabile x cliente) /// Famiglia richiesta, "" = tutti /// public List AliasGetFilt(string connString, string family) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { dbResult = dbCtx .DbSetAlias .Where(x => (string.IsNullOrEmpty(family) || x.Family == family)) .OrderBy(x => x.ValueOriginal) .ToList(); } return dbResult; } /// /// Upsert record alias /// /// Stringa connessione (variabile x cliente) /// Record da aggiornare/inserire /// public bool AliasUpsert(string connString, AliasModel rec2upd) { bool done = false; using (MagManContext dbCtx = new MagManContext(connString)) { try { /* * Ricerca record */ var currData = dbCtx .DbSetAlias .Where(x => x.Family == rec2upd.Family && x.ValueOriginal.ToLower() == rec2upd.ValueOriginal.ToLower()) .FirstOrDefault(); if (currData != null) { currData.ValueAlias = rec2upd.ValueAlias; currData.IsActive = rec2upd.IsActive; dbCtx.Entry(currData).State = EntityState.Modified; } else { dbCtx .DbSetAlias .Add(rec2upd); } dbCtx.SaveChanges(); done = true; } catch (Exception exc) { Log.Error($"Eccezione in AliasUpsert{Environment.NewLine}{exc}"); } } return done; } /// /// Upsert record alias /// /// Stringa connessione (variabile x cliente) /// Lista Record da aggiornare/inserire /// public bool AliasUpsert(string connString, List recList) { bool done = false; using (MagManContext dbCtx = new MagManContext(connString)) { try { foreach (var rec2upd in recList) { var currData = dbCtx .DbSetAlias .Where(x => x.Family == rec2upd.Family && x.ValueOriginal.ToLower() == rec2upd.ValueOriginal.ToLower()) .FirstOrDefault(); if (currData != null) { if (currData.ValueAlias != rec2upd.ValueAlias || currData.IsActive != rec2upd.IsActive) { currData.ValueAlias = rec2upd.ValueAlias; currData.IsActive = rec2upd.IsActive; dbCtx.Entry(currData).State = EntityState.Modified; } } else { dbCtx .DbSetAlias .Add(rec2upd); } } dbCtx.SaveChanges(); done = true; } catch (Exception exc) { Log.Error($"Eccezione in AliasUpsert{Environment.NewLine}{exc}"); } } return done; } 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); // eliminazione logica... currData.IsDeleted = true; // 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) { RawItemModel answ = new RawItemModel() { MatId = origItem.MatCloudId, IsDeleted = origItem.IsDeleted, IsRemn = origItem.IsRemn, Location = origItem.Location, QtyAvail = origItem.QtyAvail, HMm = origItem.HMm, LMm = origItem.LMm, WMm = origItem.WMm, Note = origItem.Note }; 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.IsDeleted || !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.IsDeleted || !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; } /// /// Riattiva Item da magazzino /// /// Stringa connessione (variabile x cliente) /// Item da riattivare /// public bool ItemReactiv(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) { // riattivazione logica... currData.IsDeleted = false; // registro modifica RawItem dbCtx.Entry(currData).State = EntityState.Modified; dbCtx.SaveChanges(); done = true; } } catch (Exception exc) { Log.Error($"Eccezione in ItemReactiv{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, IsDeleted = origItem.IsDeleted, 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 /// Se true ignora aggiornamento remnant in cloud /// public bool ItemUpdate(string connString, RawItemModel rec2upd, string userId, bool forceQty, bool ignoreRemn) { 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.IsDeleted = rec2upd.IsDeleted; if (!ignoreRemn) { 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; } /// /// Elenco Materiali gestiti a magazzino formato DTO /// /// Stringa connessione (variabile x cliente) /// idMacchina di cui si vuole log /// num rec max da recuperare /// public List LogMacGetLast(string connString, int machineId, int numRec) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { dbResult = dbCtx .DbSetLogMac .Where(x => x.MachineID == machineId) .OrderByDescending(x => x.DtEvent) .Take(numRec) .ToList(); } return dbResult; } /// /// Elimina un range di dati dal DB per poter inserire in blocco /// /// /// Key di riferimento /// Id Macchina /// Data inizio set da eliminare /// Data fine set da eliminare /// public int LogMacRemoveRange(string connString, int keyNum, int machineId, DateTime dtStart, DateTime dtEnd) { int numMod = 0; using (MagManContext dbCtx = new MagManContext(connString)) { try { // eseguo stored string sqlCommand = $"CALL stp_removeLogMachine ({keyNum}, {machineId}, '{dtStart:yyyy-MM-dd HH:mm:ss.fff}', '{dtEnd:yyyy-MM-dd HH:mm:ss.fff}');"; dbCtx.Database.ExecuteSqlRaw(sqlCommand); } catch (Exception exc) { Log.Error($"Eccezione in LogMacRemoveRange{Environment.NewLine}{exc}"); } } return numMod; } public int LogMacUpdate(string connString, List recList) { bool useStored = true; int numMod = 0; using (MagManContext dbCtx = new MagManContext(connString)) { try { if (useStored) { // eseguo stored x ogni record... foreach (var item in recList) { string sqlCommand = $"CALL stp_mergeLogMachine ({item.KeyNum}, {item.MachineID}, {item.ProjDbId}, '{item.DtEvent:yyyy-MM-dd HH:mm:ss.fff}', {(int)item.EvType}, '{item.SupervId}', '{item.VarValue}');"; dbCtx.Database.ExecuteSqlRaw(sqlCommand); } } else { // verifico record x data/progetto... foreach (var item in recList) { // cerco var recOld = dbCtx .DbSetLogMac .Where(x => x.KeyNum == item.KeyNum && x.MachineID == item.MachineID && x.ProjDbId == item.ProjDbId && x.DtEvent == item.DtEvent && x.EvType == item.EvType && x.SupervId == item.SupervId && x.VarValue == item.VarValue) .FirstOrDefault(); if (recOld == null) { dbCtx .DbSetLogMac .Add(item); numMod++; } } // salvo su DB dbCtx.SaveChanges(); } } catch (Exception exc) { Log.Error($"Eccezione in LogMacUpdate{Environment.NewLine}{exc}"); } } return numMod; } /// /// 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) /// Se true allora include record remnants (Items) nei conteggi qty /// public List MaterialDtoGetAll(string connString, bool withChild, bool withRemn) { 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.IsDeleted).Count(), QtyTot = x.RawItemList == null ? 0 : calcQty(x.IsBeam, x.RawItemList.Where(x => !x.IsDeleted && (withRemn || !x.IsRemn)).ToList()), 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; } protected decimal calcQty(bool isBeam, List items) { decimal answ = 0; if (isBeam) { answ = items.Sum(x => x.QtyAvail * x.LMm / 1000); } else { answ = items.Sum(x => x.QtyAvail * x.LMm / 1000 * x.WMm / 1000); } return answ; } /// /// 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; } /// /// Record progetto dato cliente e Key (ID) /// /// Stringa connessione (variabile x cliente) /// Key del record cercato (>0) /// public ProjModel ProjectGetById(string connString, int ProjCloudId) { ProjModel? dbResult = new ProjModel(); using (MagManContext dbCtx = new MagManContext(connString)) { dbResult = dbCtx .DbSetProjects .Where(x => ProjCloudId > 0 && x.ProjDbId == ProjCloudId) .FirstOrDefault(); if (dbResult == null) { dbResult = new ProjModel(); } } return dbResult; } /// /// Elenco progetti modificati dopo data /// /// Stringa connessione (variabile x cliente) /// Data rispetto cui cercare modifiche successive /// Elenco records progetti public List ProjectGetModAfter(string connString, DateTime DtRif) { List dbResult = new List(); using (MagManContext dbCtx = new MagManContext(connString)) { dbResult = dbCtx .DbSetProjects .Where(x => x.DtLastAction >= DtRif) .ToList(); if (dbResult == null) { dbResult = new List(); } } 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 progetti dato cliente e macchina + periodo /// /// 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; } /// /// Upsert di un record Project /// /// Stringa connessione (variabile x cliente) /// ID Record progetto da aggiornare /// Durata progetto (cumulata) /// Valore Progresso attuale (tipicamente num barre/pezzi) /// Valore Progresso max atteso (tipicamente num barre/pezzi) /// Esito update public bool ProjectSetProgr(string connString, int projDbId, double procTime, double valAct, double valMax) { bool fatto = false; using (MagManContext dbCtx = new MagManContext(connString)) { try { /* * Ricerca: * - DbId corrisponde e > 0... * */ var currData = dbCtx .DbSetProjects .Where(x => (projDbId > 0 && x.ProjDbId == projDbId)) .FirstOrDefault(); if (currData != null) { // aggiorno solo se > 0... if (procTime > 0) { currData.ProcTimeReal = procTime; } currData.ValAct = valAct; currData.ValMax = valMax; currData.DtLastAction = DateTime.Now; dbCtx.Entry(currData).State = EntityState.Modified; } var done = dbCtx.SaveChanges(); // registro esito ok fatto = done > 0; } catch (Exception exc) { Log.Error($"Eccezione in ProjectSetProgr{Environment.NewLine}{exc}"); } } return fatto; } /// /// Upsert di un record Project /// /// Stringa connessione (variabile x cliente) /// Record da aggiungere/aggiornare /// ID del progetto creato/aggiornato da usare come CloudId public int ProjectUpsert(string connString, ProjModel rec2upd) { int newId = 0; using (MagManContext dbCtx = new MagManContext(connString)) { try { /* * Ricerca: * - DbId (cloud) corrisponde e > 0... * [[ RIMOSSO - Key + Id remoti corrispondono]] * */ var currData = dbCtx .DbSetProjects .Where(x => (rec2upd.ProjDbId > 0 && x.ProjDbId == rec2upd.ProjDbId)) .FirstOrDefault(); //.Where(x => (rec2upd.projDbId > 0 && x.projDbId == rec2upd.projDbId) || // ((x.ProjExtDbId == rec2upd.ProjExtDbId && x.KeyNum == rec2upd.KeyNum) && (x.ProjExtId == rec2upd.ProjExtId && x.KeyNum == rec2upd.KeyNum))) 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; // imposto comunque adesso come aggiornamento //currData.DtLastAction = rec2upd.DtLastAction; currData.DtLastAction = DateTime.Now; 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(); // il mio ID è quello originale o appena creato post save... newId = rec2upd.ProjDbId; } catch (Exception exc) { Log.Error($"Eccezione in ProjectUpsert{Environment.NewLine}{exc}"); } } return newId; } /// /// Recupera ultimo record attivo di un progetto/stato indicato /// /// Stringa connessione (variabile x cliente) /// ID del progetto da cercare /// Stato richiesta da cercare /// public RequestPlanModel ReqPlanGetLast(string connString, int ProjCloudId, ProjResState ResState) { RequestPlanModel dbResult = new RequestPlanModel(); ; using (MagManContext dbCtx = new MagManContext(connString)) { try { /* * Ricerca x Id corrispondente * */ var currData = dbCtx .DbSetReqPlan .Where(x => x.ProjDbId == ProjCloudId && x.ReqState == ResState && x.IsActive) .OrderByDescending(x => x.DtRequest) .FirstOrDefault(); dbResult = currData ?? new RequestPlanModel(); } catch (Exception exc) { Log.Error($"Eccezione in ReqPlanGetLast{Environment.NewLine}{exc}"); } } return dbResult; } /// /// 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 { DateTime adesso = DateTime.Now; // imposto data update Proj relativo ad adesso... var recProj = dbCtx .DbSetProjects .Where(x => x.ProjDbId == rec2upd.ProjDbId) .FirstOrDefault(); if (recProj != null) { recProj.DtLastAction = adesso; dbCtx.Entry(recProj).State = EntityState.Modified; } /* * Ricerca ReqPlan 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 PRECEDENTI... if (rec2upd.ReqState > Enums.ProjResState.Consumed) { var rec2disable = dbCtx .DbSetReqPlan .Where(x => x.IsActive && x.ProjDbId == rec2upd.ProjDbId && x.ReqState > Enums.ProjResState.Consumed && x.DtRequest <= rec2upd.DtRequest) .ToList(); if (rec2disable != null) { foreach (var recAct in rec2disable) { recAct.IsActive = false; dbCtx.Entry(recAct).State = EntityState.Modified; } } } // verifico se ho richieste successive così da disattivare la corrente... var recActive = dbCtx .DbSetReqPlan .Where(x => x.IsActive && x.ProjDbId == rec2upd.ProjDbId && x.ReqState > Enums.ProjResState.Consumed && x.DtRequest > rec2upd.DtRequest) .ToList(); // se ci fossero... if (recActive != null && recActive.Count > 0) { // disattivo richiesta corrente rec2upd.IsActive = false; } // aggiungo record dbCtx .DbSetReqPlan .Add(rec2upd); } dbCtx.SaveChanges(); newId = rec2upd.RequestId; } catch (Exception exc) { Log.Error($"Eccezione in ReqPlanUpdate{Environment.NewLine}{exc}"); } } return newId; } /// /// Converte il DTO in ResourceModel /// /// DTO di partenza /// public ResourceModel ResourceFromDto(ResourceDTO origItem, int reqId) { ResourceModel answ = new ResourceModel() { Qty = origItem.Qty, RawItemId = origItem.RawItemCloudId, RequestId = reqId, ResourceId = 0 }; return answ; } /// /// 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, IsDeleted = x.ItemNav.IsDeleted, 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) /// Key della richiesta di riferimento /// Elenco record da aggiungere/aggiornare /// Tipo di aggiornamento da registratre /// User corrente (SE applicabile) /// public int ResourceUpdate(string connString, int requestPlanId, List recList, Enums.ProjResState resState, string noteUid) { int numMod = 0; using (MagManContext dbCtx = new MagManContext(connString)) { try { foreach (var rec2upd in recList) { if (resState == Enums.ProjResState.Consumed) { // aggiungo record variazione quantità... MovMagModel recMovMag = new MovMagModel() { DtRec = DateTime.Now, RawItemId = rec2upd.RawItemCloudId, QtyRec = rec2upd.Qty, UserId = noteUid, Note = rec2upd.Qty > 0 ? "M05+: Aggiunta Risorsa" : "M05-: Consumo Risorsa" }; dbCtx.DbSetMovMag.Add(recMovMag); } // aggiungo record dbCtx .DbSetResources .Add(ResourceFromDto(rec2upd, requestPlanId)); // 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.RawItemCloudId) .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; } /// /// Update record Project + refresh cache x info archived /// /// Stringa connessione (variabile x cliente) /// IDizionario ProdId / IsArchived da impostare /// Esito update public bool ProjectUpdArchived(string connString, Dictionary newData) { bool fatto = false; using (MagManContext dbCtx = new MagManContext(connString)) { try { DateTime adesso = DateTime.Now; foreach (var item in newData) { /* * Ricerca: * - DbId corrisponde e > 0... * */ var currData = dbCtx .DbSetProjects .Where(x => (item.Key > 0 && x.ProjDbId == item.Key)) .FirstOrDefault(); if (currData != null) { currData.IsArchived = item.Value; currData.DtLastAction = adesso; dbCtx.Entry(currData).State = EntityState.Modified; } } var done = dbCtx.SaveChanges(); // registro esito ok fatto = done > 0; } catch (Exception exc) { Log.Error($"Eccezione in ProjectUpdArchived{Environment.NewLine}{exc}"); } } return fatto; } #endregion Public Methods #region Private Fields private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); #endregion Private Fields } }