using Newtonsoft.Json; using SteamWare; using System; using System.Collections.Generic; namespace GPW_data { public class utils { #region Public Fields /// /// singleton accesso metodo /// public static utils mng = new utils(); #endregion Public Fields #region Protected Constructors /// /// avvio oggetti utils /// protected utils() { } #endregion Protected Constructors #region Public Properties /// /// dim pagina gridView in sessione /// public static int pageSize { get { int answ = 20; try { answ = SteamWare.memLayer.ML.IntSessionObj("pageSize"); if (answ <= 0) answ = 20; } catch { } return answ; } set { SteamWare.memLayer.ML.setSessionVal("pageSize", value); } } /// /// oggetto elenco clienti organizzato come dizionario con chiave idxCliente e valore la ragione sociale /// public Dictionary elencoClienti { set { string redKey = memLayer.ML.redHash("elencoClienti"); string rawData = JsonConvert.SerializeObject(value); memLayer.ML.setRSV(redKey, rawData, 60); } get { Dictionary answ = new Dictionary(); string redKey = memLayer.ML.redHash("elencoClienti"); string rawData = memLayer.ML.getRSV(redKey); if (!string.IsNullOrEmpty(rawData)) { try { answ = JsonConvert.DeserializeObject>(rawData); } catch { } } if (answ.Count == 0) { answ = ricaricaElencoClienti(); elencoClienti = answ; } return answ; } } #endregion Public Properties #region Protected Methods /// /// restituisce elenco clienti trasformato in dictionary /// /// protected Dictionary ricaricaElencoClienti() { Dictionary answ = new Dictionary(); // recupero elenco clienti da dataproxy foreach (DS_Applicazione.AnagClientiRow riga in DataProxy.DP.taAnCli.GetData()) { answ.Add(riga.idxCliente.ToString(), riga.RagSociale); } return answ; } #endregion Protected Methods #region Public Methods /// /// formatta le ore in ore:minuti /// /// ore centesimali (0,00) /// public static string formOreMin(decimal oreCent) { return string.Format("{0}:{1:00}", Math.Floor(oreCent), Math.Round((oreCent - Math.Floor(oreCent)) * 60)); } /// /// Effettua un insieme di controlli sulle anomalie delel timbrature/orari e invia le relative eventuali email /// /// public bool checkAnomalie() { bool answ = false; try { // log richiesta! logger.lg.scriviLog("Richiesto controllo anomalie!", tipoLog.INFO); /******************************************************* * controllo le varie anomalie delle timbrature: * * (A) mancate approvazioni --> admin * (B) entrate <> uscite --> admin, user * (C) mancata copertura orario --> admin * * (D) mancata copertura commesse (2 be done) * * recupero elenco dip interessati x le varie anomalie con stp_DipendentiAndAnomalie * e poi da timbrExpl recupero le singole istanze di record errori * *******************************************************/ // setup valori base string fromEmail = memLayer.ML.confReadString("_fromEmail"); string adminEmail = memLayer.ML.confReadString("adminAnomalieEmail"); string adminContinuatoEmail = memLayer.ML.confReadString("adminContinuatoEmail"); string adminOreLavEmail = memLayer.ML.confReadString("adminOreLavEmail"); string oggettoEmail = ""; string corpoEmail = ""; DS_Applicazione.stp_DipendentiAndAnomalieDataTable tabDipAndAnom = new DS_Applicazione.stp_DipendentiAndAnomalieDataTable(); DS_Applicazione.TimbratureExplDataTable tabTimbExpl = new DS_Applicazione.TimbratureExplDataTable(); DS_Applicazione.TE_RA_ExplDataTable tabTimbRegAtt = new DS_Applicazione.TE_RA_ExplDataTable(); DateTime oggi = DateTime.Today; int gg2Chk = memLayer.ML.confReadInt("gg2Chk"); int gg2ChkCont = memLayer.ML.confReadInt("gg2ChkCont"); int gg2ChkOreCaricate = memLayer.ML.confReadInt("gg2ChkOreCaricate"); // (A) recupero mancate approvazioni, mando solo ad admin if (memLayer.ML.confReadBool("checkAnomAppr")) { tabTimbExpl = DataProxy.DP.taTimbExpl.getByDipAnomalia(0, oggi.AddDays(-gg2Chk), oggi, true, false, false); // se ho trovato record... if (tabTimbExpl.Rows.Count > 0) { logger.lg.scriviLog("Trovate anomalie mancate approvazioni, invio email ad admin", tipoLog.INFO); oggettoEmail = "Anomalie GPW: Approvazione Timbrature"; if (memLayer.ML.confReadBool("includeDirectUrl")) { corpoEmail = string.Format("Risultano a sistema le seguenti anomalie:
timbrature da approvare

", memLayer.ML.confReadString("baseUrl")); } else { corpoEmail = "Risultano a sistema le seguenti anomalie: timbrature da approvare
"; } corpoEmail += string.Format("{0}
", SteamwareStrings.charLine('-', 80)); corpoEmail += "| -- DATA --\t| Dipendente
"; corpoEmail += string.Format("{0}
", SteamwareStrings.charLine('-', 80)); foreach (DS_Applicazione.TimbratureExplRow riga in tabTimbExpl) { corpoEmail += string.Format("| {0:yyyy.MM.dd ddd}\t| {1}
", riga.dataLav, riga.CognomeNome); } corpoEmail += SteamwareStrings.charLine('-', 80); gestEmail.geAuth.mandaEmail(fromEmail, adminEmail, oggettoEmail, corpoEmail); } } // (B) recupero errori entrate/uscite, mando ad admin + utenti if (memLayer.ML.confReadBool("checkAnomTimb")) { tabDipAndAnom = DataProxy.DP.taDipAnom.GetData(oggi.AddDays(-gg2Chk), oggi.AddHours(1), false, true, false); tabTimbExpl = DataProxy.DP.taTimbExpl.getByDipAnomalia(0, oggi.AddDays(-gg2Chk), oggi.AddHours(1), false, true, false); // se ho trovato record... if (tabTimbExpl.Rows.Count > 0) { logger.lg.scriviLog("Trovate anomalie timbrature IN/OUT non corrispondenti, invio email!", tipoLog.INFO); // mando email ad admin! oggettoEmail = "Anomalie GPW: Timbrature mancanti"; if (memLayer.ML.confReadBool("includeDirectUrl")) { corpoEmail = string.Format("Risultano a sistema le seguenti anomalie:
timbrature mancanti / non corrispondenti

", memLayer.ML.confReadString("baseUrl")); } else { corpoEmail = "Risultano a sistema le seguenti anomalie: timbrature mancanti
"; } corpoEmail += string.Format("{0}
", SteamwareStrings.charLine('-', 80)); corpoEmail += "| -- DATA --\t| Dipendente
"; corpoEmail += string.Format("{0}
", SteamwareStrings.charLine('-', 80)); foreach (DS_Applicazione.TimbratureExplRow riga in tabTimbExpl) { corpoEmail += string.Format("| {0:yyyy.MM.dd ddd}\t| {1}
", riga.dataLav, riga.CognomeNome); } corpoEmail += SteamwareStrings.charLine('-', 80); gestEmail.geAuth.mandaEmail(fromEmail, adminEmail, oggettoEmail, corpoEmail); // re richiesto invio email utenti x warning entrate/uscrite if (memLayer.ML.confReadBool("sendEmailToUser")) { // mando singole email ai dipendenti SE C'è EMAIL!!!! foreach (DS_Applicazione.stp_DipendentiAndAnomalieRow rigaDip in tabDipAndAnom) { if (!string.IsNullOrEmpty(rigaDip.email)) { tabTimbExpl = DataProxy.DP.taTimbExpl.getByDipAnomalia(rigaDip.idxDipendente, oggi.AddDays(-gg2Chk), oggi.AddHours(1), false, true, false); // reimposto testo if (memLayer.ML.confReadBool("includeDirectUrl")) { corpoEmail = string.Format("Risultano a sistema le seguenti anomalie:
timbrature mancanti / non corrispondenti

", memLayer.ML.confReadString("baseUrl")); } else { corpoEmail = "Risultano a sistema le seguenti anomalie: timbrature mancanti / non corrispondenti
"; } corpoEmail += string.Format("{0}
", SteamwareStrings.charLine('-', 80)); corpoEmail += "| -- DATA --\t| -- Dipendente --
"; corpoEmail += string.Format("{0}
", SteamwareStrings.charLine('-', 80)); foreach (DS_Applicazione.TimbratureExplRow riga in tabTimbExpl) { corpoEmail += string.Format("| {0:yyyy.MM.dd ddd}\t| {1}
", riga.dataLav, riga.CognomeNome); } corpoEmail += SteamwareStrings.charLine('-', 80); gestEmail.geAuth.mandaEmail(fromEmail, rigaDip.email, oggettoEmail, corpoEmail); } } } } } // (C) recupero errori mancata copertura orario, mando ad admin if (memLayer.ML.confReadBool("checkAnomOreLav")) { tabDipAndAnom = DataProxy.DP.taDipAnom.GetData(oggi.AddDays(-gg2Chk), oggi.AddHours(1), false, false, true); tabTimbExpl = DataProxy.DP.taTimbExpl.getByDipAnomalia(0, oggi.AddDays(-gg2Chk), oggi.AddHours(1), false, false, true); // se ho trovato record... if (tabTimbExpl.Rows.Count > 0) { logger.lg.scriviLog("Trovate anomalie copertura orario, invio email!", tipoLog.INFO); // mando email ad admin! oggettoEmail = "Anomalie GPW: Ore timbrate"; if (memLayer.ML.confReadBool("includeDirectUrl")) { corpoEmail = string.Format("Risultano a sistema le seguenti anomalie:
Orario timbrato non suff a copertura standard

", memLayer.ML.confReadString("baseUrl")); } else { corpoEmail = "Risultano a sistema le seguenti anomalie: Orario timbrato non suff a copertura standard
"; } corpoEmail += string.Format("{0}
", SteamwareStrings.charLine('-', 80)); corpoEmail += "| -- DATA --\t| -- Dipendente --
"; corpoEmail += string.Format("{0}
", SteamwareStrings.charLine('-', 80)); foreach (DS_Applicazione.TimbratureExplRow riga in tabTimbExpl) { corpoEmail += string.Format("| {0:yyyy.MM.dd ddd}\t| {1}
", riga.dataLav, riga.CognomeNome); } corpoEmail += SteamwareStrings.charLine('-', 80); gestEmail.geAuth.mandaEmail(fromEmail, adminEmail, oggettoEmail, corpoEmail); } } // (D) recupero errori copertura ore lavorate / ore caricate a commessa... if (memLayer.ML.confReadBool("checkAnomOreLavComm")) { tabTimbRegAtt = DataProxy.DP.taTimbRegAtt.GetData(0, oggi.AddDays(-gg2ChkOreCaricate), oggi.AddHours(1), false, true, memLayer.ML.confReadInt("maxErrMin"), memLayer.ML.confReadInt("maxErrPlus")); // sulla tabella seleziono SE NON E' OK colonna okLavCom if (((DS_Applicazione.TE_RA_ExplRow[])tabTimbRegAtt.Select(" okLavCom = 0 ")).Length > 0) { logger.lg.scriviLog("Trovate anomalie ore lavorate / commesse caricate, invio email!", tipoLog.INFO); // mando email ad admin! oggettoEmail = "Anomalie GPW: Ore Caricate a commessa"; if (memLayer.ML.confReadBool("includeDirectUrl")) { corpoEmail = string.Format("Risultano a sistema le seguenti anomalie:
ore caricate a commessa non corrispondenti ad ore lavorate secondo range {1} min / {2} min

", memLayer.ML.confReadString("baseUrl"), memLayer.ML.confReadInt("maxErrMin"), memLayer.ML.confReadInt("maxErrPlus")); } else { corpoEmail = "Risultano a sistema le seguenti anomalie: ore caricate a commessa non corrispondenti ad ore lavorate
"; } corpoEmail += string.Format("{0}
", SteamwareStrings.charLine('-', 80)); corpoEmail += "| -- DATA --\t| -- Dipendente --\t\t| Progetti
"; corpoEmail += string.Format("{0}
", SteamwareStrings.charLine('-', 80)); foreach (DS_Applicazione.TE_RA_ExplRow riga in (DS_Applicazione.TE_RA_ExplRow[])tabTimbRegAtt.Select(" okLavCom = 0 ")) { corpoEmail += string.Format("| {0:yyyy.MM.dd ddd}\t| {1}\t| {2}
", riga.dataLav, riga.CognomeNome, riga.progetti); } corpoEmail += SteamwareStrings.charLine('-', 80); gestEmail.geAuth.mandaEmail(fromEmail, adminOreLavEmail, oggettoEmail, corpoEmail); } } // (E) cerco anomalie x orario continuato (no Pausa Pranzo, solo 1 IN, 1 OUT) if (memLayer.ML.confReadBool("checkAnomContinuato")) { tabTimbExpl = DataProxy.DP.taTimbExpl.getContinuato(0, oggi.AddDays(-gg2ChkCont), oggi.AddHours(1)); // se ho trovato record... if (tabTimbExpl.Rows.Count > 0) { logger.lg.scriviLog("Trovate anomalie orario continuato, invio email ad admin", tipoLog.INFO); oggettoEmail = "Anomalie GPW: Orario Continuato"; if (memLayer.ML.confReadBool("includeDirectUrl")) { corpoEmail = string.Format("Risultano a sistema le seguenti anomalie:
orari continuati da approvare

", memLayer.ML.confReadString("baseUrl")); } else { corpoEmail = "Risultano a sistema le seguenti anomalie: orari continuati da approvare
"; } corpoEmail += string.Format("{0}
", SteamwareStrings.charLine('-', 80)); corpoEmail += "| -- DATA --\t| Dipendente
"; corpoEmail += string.Format("{0}
", SteamwareStrings.charLine('-', 80)); foreach (DS_Applicazione.TimbratureExplRow riga in tabTimbExpl) { corpoEmail += string.Format("| {0:yyyy.MM.dd ddd}\t| {1}
", riga.dataLav, riga.CognomeNome); } corpoEmail += SteamwareStrings.charLine('-', 80); gestEmail.geAuth.mandaEmail(fromEmail, adminContinuatoEmail, oggettoEmail, corpoEmail); } } answ = true; } catch (Exception exc) { logger.lg.scriviLog(string.Format("Errore in procedura check & invio email{0}{1}", Environment.NewLine, exc), tipoLog.EXCEPTION); answ = false; } //registro evento DataProxy.DP.taRE.Insert(DateTime.Now, "checkAnomalie", "-"); return answ; } /// /// Verifica ed eventualmente esegue gli script quotidiani tra cui il check anomalie /// /// public bool dailyDuties() { bool answ = false; if (memLayer.ML.confReadBool("enableDailyCheck")) { int firstHour2Check = memLayer.ML.confReadInt("firstHour2Check"); // controllo sfasato di x ore come da web.config se ci sia già stato il check quotidiano anomalie (con relative email) if (DataProxy.DP.taRE.getByDataEv("checkAnomalie", DateTime.Now.AddHours(-firstHour2Check).Date).Rows.Count == 0) { logger.lg.scriviLog("Richiesto Check Daily Duties", tipoLog.INFO); // chiamo check anomalie checkAnomalie(); //registro evento DataProxy.DP.taRE.Insert(DateTime.Now.AddHours(-firstHour2Check), "dailyDuties", "-"); } } else { if (memLayer.ML.confReadInt("_logLevel") > 5) logger.lg.scriviLog("DISABILITATO Check Daily Duties", tipoLog.INFO); } return answ; } #endregion Public Methods } }