using GPW.CORE.Data.DbModels; using GPW.CORE.Data.DTO; using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using NLog; namespace GPW.CORE.Data.Controllers { public class GPWController : IDisposable { #region Private Fields private static IConfiguration _configuration = null!; private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); #endregion Private Fields #region Public Constructors public GPWController(IConfiguration configuration) { _configuration = configuration; } #endregion Public Constructors #region Public Methods /// /// Recupera l'elenco Clienti (tutti) /// /// public List AnagClientiAll() { // init dati necessari List dbResult = new List(); // cerco su DB recuperando set di dati.... using (GPWContext localDbCtx = new GPWContext(_configuration)) { try { // recupero intero set... dbResult = localDbCtx .DbSetAnagClienti .OrderBy(x => x.RagSociale) .ToList(); } catch (Exception exc) { Log.Error($"Errore in AnagClientiAll:{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Recupera l'elenco delle fasi (tutte) /// /// public List AnagFasiAll() { // init dati necessari List dbResult = new List(); // cerco su DB recuperando set di dati.... using (GPWContext localDbCtx = new GPWContext(_configuration)) { try { // recupero intero set... dbResult = localDbCtx .DbSetAnagFasi .ToList(); } catch (Exception exc) { Log.Error($"Errore in AnagFasiAll:{Environment.NewLine}{exc}"); } } return dbResult; } public List AnagGruppiAll() { // init dati necessari List dbResult = new List(); // cerco su DB recuperando set di dati.... using (GPWContext localDbCtx = new GPWContext(_configuration)) { try { // recupero intero set... dbResult = localDbCtx .DbSetAnagGruppi .ToList(); } catch (Exception exc) { Log.Error($"Errore in AnagGruppiAll:{Environment.NewLine}{exc}"); } } return dbResult; } public List AnagProjAll() { // init dati necessari List dbResult = new List(); // cerco su DB recuperando set di dati.... using (GPWContext localDbCtx = new GPWContext(_configuration)) { try { // recupero intero set.... dbResult = localDbCtx .DbSetAnagProgetti .Include(c => c.ClienteNav) .OrderBy(x => x.NomeProj) .ToList(); } catch (Exception exc) { Log.Error($"Errore in AnagProjAll:{Environment.NewLine}{exc}"); } } return dbResult; } /// /// Vista dati per progetto con totalizzaizone ore budget/real /// /// /// public CalcOreProgettiModel CalcOreProj(int idxProj) { CalcOreProgettiModel dbResult = new CalcOreProgettiModel(); using (GPWContext localDbCtx = new GPWContext(_configuration)) { var idxProgetto = new SqlParameter("@idxProgetto", idxProj); var rawResult = localDbCtx .DbSetCalcOreProj .FromSqlRaw("EXEC stp_AP_getByIdxPrj @idxProgetto", idxProgetto) .ToList(); if (rawResult != null && rawResult.Count > 0) { dbResult = rawResult[0]; } } return dbResult; } /// /// Recupera l'elenco dei Rilievi temperatura nel periodo indicato x dipendente /// /// Dipendente interessato /// Data di riferimento (ultima/corrente) /// NUm settimane precedenti da recuperare /// public List CheckVC19List(int idxDipendente, DateTime dtInizio, DateTime dtFine) { // init dati necessari List dbResult = new List(); // cerco su DB recuperando set di dati.... using (GPWContext localDbCtx = new GPWContext(_configuration)) { dbResult = localDbCtx .DbSetCheckVc19 .Where(x => x.IdxDipendente == idxDipendente && dtInizio <= x.DtCheck && x.DtCheck <= dtFine) .ToList(); } return dbResult; } /// /// Recupera l'elenco dei dettagli giornalieri attività di un dipendente, dato periodo riferimento /// /// Dipendente interessato /// Data di riferimento (ultima/corrente) /// NUm settimane precedenti da recuperare /// public List DailyDetails(int idxDipendente, DateTime dtInizio, DateTime dtFine) { // init dati necessari List dbResult = new List(); List rawTimbExp = new List(); List rawTimbr = new List(); List rawRegAtt = new List(); List rawRilTemp = new List(); List rawCheckC19 = new List(); // cerco su DB recuperando set di dati.... using (GPWContext localDbCtx = new GPWContext(_configuration)) { // recupero intero set dati timbrature e attività.... rawTimbExp = localDbCtx .DbSetTimbratureExpl .Where(x => x.IdxDipendente == idxDipendente && dtInizio <= x.DataLav && x.DataLav <= dtFine) .ToList(); rawTimbr = localDbCtx .DbSetTimbrature .Where(x => x.IdxDipendente == idxDipendente && dtInizio <= x.DataOra && x.DataOra <= dtFine) .ToList(); rawRegAtt = localDbCtx .DbSetRegAttivita .Where(x => x.IdxDipendente == idxDipendente && dtInizio <= x.Inizio && x.Inizio <= dtFine) .Include(a => a.FasiNav).ThenInclude(p => p.ProgettoNav).ThenInclude(c => c.ClienteNav) .ToList(); rawRilTemp = localDbCtx .DbSetRilievoTemp .Where(x => x.IdxDipendente == idxDipendente && dtInizio <= x.DtRilievo && x.DtRilievo <= dtFine) .ToList(); rawCheckC19 = localDbCtx .DbSetCheckVc19 .Where(x => x.IdxDipendente == idxDipendente && dtInizio <= x.DtCheck && x.DtCheck <= dtFine) .ToList(); // calcolo intervallo date... int numDays = dtFine.Subtract(dtInizio).Days; // x ogni giorno scompongo il set di info... for (int i = 0; i <= numDays; i++) { DateTime thisDay = dtInizio.AddDays(i); DailyDataDTO currDayDto = new DailyDataDTO() { IdxDipendente = idxDipendente, DtRif = thisDay, ListRA = rawRegAtt .Where(x => thisDay <= x.Inizio && x.Inizio <= thisDay.AddDays(1)) .ToList(), ListTimbr = rawTimbr .Where(x => thisDay <= x.DataOra && x.DataOra <= thisDay.AddDays(1)) .ToList(), TimbrExpl = rawTimbExp .Where(x => thisDay == x.DataLav) .FirstOrDefault(), ListRilTemp = rawRilTemp .Where(x => thisDay <= x.DtRilievo && x.DtRilievo <= thisDay.AddDays(1)) .ToList(), ListCheckC19 = rawCheckC19 .Where(x => thisDay <= x.DtCheck && x.DtCheck <= thisDay.AddDays(1)) .ToList() }; dbResult.Add(currDayDto); } } return dbResult; } public bool DbForceMigrate() { bool answ = false; using (GPWContext localDbCtx = new GPWContext(_configuration)) { try { localDbCtx.DbForceMigrate(); answ = true; } catch (Exception exc) { Log.Error($"Eccezione in DbForceMigrate{Environment.NewLine}{exc}"); } } return answ; } public List DipendentiGetAll() { List dbResult = new List(); using (GPWContext localDbCtx = new GPWContext(_configuration)) { dbResult = localDbCtx .DbSetDipendenti .ToList(); } return dbResult; } public List AnagKeyValGetAll() { List dbResult = new List(); using (GPWContext localDbCtx = new GPWContext(_configuration)) { dbResult = localDbCtx .DbSetAnagKeyValue .ToList(); } return dbResult; } public void Dispose() { Log.Info("Dispose di GPWController"); } /// /// Elenco pareto progetti ordinati da filtro /// /// /// /// /// /// public List ParetoRegAtt(int idxDip, DateTime dataStart, DateTime dataEnd, int maxResult) { List dbResult = new List(); using (GPWContext localDbCtx = new GPWContext(_configuration)) { var idxDipendente = new SqlParameter("@idxDipendente", idxDip); var inizio = new SqlParameter("@inizio", dataStart); var fine = new SqlParameter("@fine", dataEnd); var maxRes = new SqlParameter("@maxRes", maxResult); dbResult = localDbCtx .DbSetParetoRegAtt .FromSqlRaw("EXEC stp_freqProjByDipPeriodo @idxDipendente, @inizio,@fine,@maxRes", idxDipendente, inizio, fine, maxRes) .ToList(); } return dbResult; } public bool RegAttDelete(RegAttivitaModel currItem) { bool answ = false; using (GPWContext localDbCtx = new GPWContext(_configuration)) { try { localDbCtx.Remove(currItem); localDbCtx.SaveChanges(); answ = true; } catch (Exception exc) { Log.Error($"Eccezione in RegAttUpdate{Environment.NewLine}{exc}"); } } return answ; } public RegAttivitaModel RegAttLastByDip(int IdxDipendente) { RegAttivitaModel dbResult = new RegAttivitaModel(); using (GPWContext localDbCtx = new GPWContext(_configuration)) { try { dbResult = localDbCtx .DbSetRegAttivita .OrderByDescending(x => x.IdxRa) .FirstOrDefault(x => x.IdxDipendente == IdxDipendente); } catch (Exception exc) { Log.Error($"Eccezione in RegAttLastByDip{Environment.NewLine}{exc}"); } if (dbResult == null) { dbResult = new RegAttivitaModel(); } } return dbResult; } public bool RegAttUpdate(RegAttivitaModel currItem) { bool answ = false; using (GPWContext localDbCtx = new GPWContext(_configuration)) { try { var currRec = localDbCtx .DbSetRegAttivita .FirstOrDefault(x => x.IdxRa == currItem.IdxRa); if (currRec != null) { currRec.IdxDipendente = currItem.IdxDipendente; currRec.IdxFase = currItem.IdxFase; currRec.Inizio = currItem.Inizio; currRec.Fine = currItem.Fine; currRec.Descrizione = currItem.Descrizione; localDbCtx .DbSetRegAttivita .Update(currRec); } // altrimenti aggiungo else { localDbCtx .DbSetRegAttivita .Update(currItem); } localDbCtx.SaveChanges(); answ = true; } catch (Exception exc) { Log.Error($"Eccezione in RegAttUpdate{Environment.NewLine}{exc}"); } } return answ; } /// /// Recupera l'elenco dei Rilievi temperatura nel periodo indicato x dipendente /// /// Dipendente interessato /// Data di riferimento (ultima/corrente) /// NUm settimane precedenti da recuperare /// public List RilTempList(int idxDipendente, DateTime dtInizio, DateTime dtFine) { // init dati necessari List dbResult = new List(); // cerco su DB recuperando set di dati.... using (GPWContext localDbCtx = new GPWContext(_configuration)) { dbResult = localDbCtx .DbSetRilievoTemp .Where(x => x.IdxDipendente == idxDipendente && dtInizio <= x.DtRilievo && x.DtRilievo <= dtFine) .ToList(); } return dbResult; } public bool RilTempUpdate(RilievoTempModel currItem) { bool answ = false; using (GPWContext localDbCtx = new GPWContext(_configuration)) { try { var currRec = localDbCtx .DbSetRilievoTemp .FirstOrDefault(x => x.IdxDipendente == currItem.IdxDipendente && x.DtRilievo == currItem.DtRilievo); if (currRec != null) { // aggiorno solo entrata/uscita currRec.TempRil = currItem.TempRil; localDbCtx .DbSetRilievoTemp .Update(currRec); } // altrimenti aggiungo else { localDbCtx .DbSetRilievoTemp .Add(currItem); } localDbCtx.SaveChanges(); answ = true; } catch (Exception exc) { Log.Error($"Eccezione in RilTempUpdate{Environment.NewLine}{exc}"); } } return answ; } /// /// Annulla modifiche su una specifica entity (cancel update) /// /// /// public bool rollBackEntity(object item) { bool answ = false; using (GPWContext localDbCtx = new GPWContext(_configuration)) { try { if (localDbCtx.Entry(item).State == EntityState.Deleted || localDbCtx.Entry(item).State == EntityState.Modified) { localDbCtx.Entry(item).Reload(); } } catch (Exception exc) { Log.Error($"Eccezione in rollBackEntity{Environment.NewLine}{exc}"); } } return answ; } public bool TimbratureDelete(TimbratureModel currItem) { bool answ = false; using (GPWContext localDbCtx = new GPWContext(_configuration)) { try { localDbCtx.Remove(currItem); localDbCtx.SaveChanges(); answ = true; } catch (Exception exc) { Log.Error($"Eccezione in TimbratureDelete{Environment.NewLine}{exc}"); } } return answ; } public bool TimbratureUpdate(TimbratureModel currItem) { bool answ = false; using (GPWContext localDbCtx = new GPWContext(_configuration)) { try { var currRec = localDbCtx .DbSetTimbrature .FirstOrDefault(x => x.IdxDipendente == currItem.IdxDipendente && x.DataOra == currItem.DataOra); if (currRec != null) { // aggiorno solo entrata/uscita currRec.Entrata = currItem.Entrata; localDbCtx .DbSetTimbrature .Update(currRec); } // altrimenti aggiungo else { localDbCtx .DbSetTimbrature .Add(currItem); } localDbCtx.SaveChanges(); answ = true; } catch (Exception exc) { Log.Error($"Eccezione in TimbratureUpdate{Environment.NewLine}{exc}"); } } return answ; } /// /// Recupera overview di un periodo settimanale x dipendente, data riferimento, numero settimane precedenti /// /// Dipendente interessato /// Data di riferimento (ultima/corrente) /// NUm settimane precedenti da recuperare /// public List WeekOverview(int idxDipendente, DateTime dtRif, int numWeek) { // init dati necessari List dbResult = new List(); List weekList = new List(); // aggiungo sett corrente + quelle richeiste... for (int i = numWeek; i >= 0; i--) { var currWeek = new WeekData(dtRif.AddDays(-i * 7)); weekList.Add(currWeek); } // cerco su DB settimana x settimana.... using (GPWContext localDbCtx = new GPWContext(_configuration)) { foreach (var item in weekList) { var totOreTim = localDbCtx .DbSetTimbratureExpl .Where(x => x.IdxDipendente == idxDipendente && x.DataLav >= item.inizio && x.DataLav <= item.fine) .Sum(x => (double)x.HLav); var totMinLav = localDbCtx .DbSetRegAttivitaExpl .Where(x => x.IdxDipendente == idxDipendente && x.DataLav >= item.inizio && x.DataLav <= item.fine) .Sum(x => (int)x.MinRegAtt); // aggiungo alla lista... var weekData = new WeekStatDTO() { IdxDipendente = idxDipendente, Anno = item.anno, WeekNumber = item.weekNumber, Inizio = item.inizio, Fine = item.fine, SumOreLav = totOreTim, SumOreComm = (double)totMinLav / 60, }; dbResult.Add(weekData); } } return dbResult; } #endregion Public Methods } }