diff --git a/GPW.CORE.Api/Controllers/TimbraCheckController.cs b/GPW.CORE.Api/Controllers/TimbraCheckController.cs index a425813..f75328f 100644 --- a/GPW.CORE.Api/Controllers/TimbraCheckController.cs +++ b/GPW.CORE.Api/Controllers/TimbraCheckController.cs @@ -89,10 +89,9 @@ namespace GPW.CORE.Api.Controllers } } - protected async Task sendEmail(string subject, string message) + protected async Task sendEmail(string destList, string subject, string message) { - string emailRaw = _configuration["MailDest:ProjCheck"]; - List emailDestList = emailRaw.Split(",").ToList(); + List emailDestList = destList.Split(",").ToList(); foreach (var dest in emailDestList) { try @@ -119,7 +118,7 @@ namespace GPW.CORE.Api.Controllers DateTime fine = inizio.AddDays(1); var dailyChecks = await dataService.RegEventiGetFilt(inizio, fine, "checkAnomalie"); // cerco se sia già stato fatto altrimenti ripeto... - if (dailyChecks != null && dailyChecks.Count > 10) + if (dailyChecks != null && dailyChecks.Count > 1) { // loggo solo che è stato richeisto di nuovo... var currCheck = dailyChecks[0]; @@ -152,7 +151,6 @@ namespace GPW.CORE.Api.Controllers * *******************************************************/ - // oggetti base StringBuilder sbMain = new StringBuilder(); DateTime oggi = DateTime.Today; @@ -168,11 +166,16 @@ namespace GPW.CORE.Api.Controllers int gg2Chk = _configuration.GetValue("TimbraCheck:gg2Chk"); int gg2ChkCont = _configuration.GetValue("TimbraCheck:gg2ChkCont"); int gg2ChkOreCaricate = _configuration.GetValue("TimbraCheck:gg2ChkOreCaricate"); + int maxErrMin = _configuration.GetValue("TimbraCheck:maxErrMin"); + int maxErrPlus = _configuration.GetValue("TimbraCheck:maxErrPlus"); string msgTopic = ""; string msgBody = ""; int numChk = 0; int numErr = 0; + string headRow = "style=\"background-color: #232323; color: #DEDEDE\""; + string stripeRow = "style=\"background-color: #DEDEDE;\""; + // (A) recupero mancate approvazioni, mando solo ad admin if (checkAnomAppr) { @@ -192,11 +195,11 @@ namespace GPW.CORE.Api.Controllers { doLog($"Risultano a sistema le seguenti anomalie: timbrature da approvare{Environment.NewLine}", logType.info, ref sbMain); } + // tabella! doLog("", logType.none, ref sbMain); - doLog("", logType.none, ref sbMain); + doLog($"", logType.none, ref sbMain); doLog("", logType.none, ref sbMain); int nRow = 0; - string stripeRow = "style=\"background-color: #DEDEDE;\""; foreach (var riga in tabTimbExpl) { string sfondo = nRow % 2 == 0 ? "" : stripeRow; @@ -207,11 +210,205 @@ namespace GPW.CORE.Api.Controllers doLog("", logType.none, ref sbMain); doLog("
DATADipendente
DATADipendente
", logType.none, ref sbMain); msgBody = sbMain.ToString(); - await sendEmail(msgTopic, msgBody.Replace($"{Environment.NewLine}", "
")); + await sendEmail(adminDestEmail, msgTopic, msgBody.Replace($"{Environment.NewLine}", "
")); + } + } + + // (B) recupero errori entrate/uscite, mando ad admin + utenti + if (checkAnomTimb) + { + numChk++; + sbMain = new StringBuilder(); + var tabDipAndAnom = await dataService.DipAndAnomGetAll(oggi.AddDays(-gg2Chk), oggi.AddHours(1), false, true, false); + var tabTimbExpl = await dataService.TimbExplGetAnomalie(0, oggi.AddDays(-gg2Chk), oggi.AddDays(1), false, true, false); + // se ho trovato record... + if (tabTimbExpl != null && tabTimbExpl.Count > 0) + { + doLog("Trovate anomalie timbrature IN/OUT non corrispondenti, invio email!", logType.info, ref sbMain); + // mando email ad admin! + msgTopic = "Anomalie GPW: Timbrature mancanti"; + if (includeDirectUrl) + { + doLog($"Risultano a sistema le seguenti anomalie:{Environment.NewLine}timbrature mancanti{Environment.NewLine}", logType.info, ref sbMain); + } + else + { + doLog($"Risultano a sistema le seguenti anomalie: timbrature mancanti{Environment.NewLine}", logType.info, ref sbMain); + } + // tabella! + doLog("", logType.none, ref sbMain); + doLog($"", logType.none, ref sbMain); + doLog("", logType.none, ref sbMain); + int nRow = 0; + foreach (var riga in tabTimbExpl) + { + string sfondo = nRow % 2 == 0 ? "" : stripeRow; + doLog($"", logType.none, ref sbMain); + numErr++; + nRow++; + } + doLog("", logType.none, ref sbMain); + doLog("
DATADipendente
{riga.DataLav:yyyy.MM.dd ddd}{riga.CognomeNome}
", logType.none, ref sbMain); + msgBody = sbMain.ToString(); + await sendEmail(adminDestEmail, msgTopic, msgBody.Replace($"{Environment.NewLine}", "
")); + + + // re richiesto invio email utenti x warning entrate/uscrite + if (sendEmailToUser) + { + // mando singole email ai dipendenti SE C'è EMAIL!!!! + foreach (var rigaDip in tabDipAndAnom) + { + sbMain = new StringBuilder(); + if (!string.IsNullOrEmpty(rigaDip.email)) + { + var tabTimbExplDip = tabTimbExpl.Where(x => x.IdxDipendente == rigaDip.IdxDipendente); + // reimposto testo + doLog($"Risultano a sistema le seguenti anomalie: timbrature mancanti{Environment.NewLine}", logType.info, ref sbMain); + + // tabella! + doLog("", logType.none, ref sbMain); + doLog($"", logType.none, ref sbMain); + doLog("", logType.none, ref sbMain); + nRow = 0; + foreach (var riga in tabTimbExplDip) + { + string sfondo = nRow % 2 == 0 ? "" : stripeRow; + doLog($"", logType.none, ref sbMain); + nRow++; + } + doLog("", logType.none, ref sbMain); + doLog("
DATADipendente
{riga.DataLav:yyyy.MM.dd ddd}{riga.CognomeNome}
", logType.none, ref sbMain); + msgBody = sbMain.ToString(); + await sendEmail(rigaDip.email, msgTopic, msgBody.Replace($"{Environment.NewLine}", "
")); + } + } + } } } + // (C) recupero errori mancata copertura orario, mando ad admin + if (checkAnomOreLav) + { + numChk++; + sbMain = new StringBuilder(); + var tabDipAndAnom = await dataService.DipAndAnomGetAll(oggi.AddDays(-gg2Chk), oggi.AddHours(1), false, false, true); + var tabTimbExpl = await dataService.TimbExplGetAnomalie(0, oggi.AddDays(-gg2Chk), oggi.AddDays(1), false, false, true); + + // se ho trovato record... + if (tabTimbExpl != null && tabTimbExpl.Count > 0) + { + doLog("Trovate anomalie copertura orario, invio email!", logType.info, ref sbMain); + // mando email ad admin! + msgTopic = "Anomalie GPW: Ore timbrate"; + if (includeDirectUrl) + { + doLog($"Risultano a sistema le seguenti anomalie:{Environment.NewLine}Orario timbrato non suff a copertura standard{Environment.NewLine}", logType.info, ref sbMain); + } + else + { + doLog($"Risultano a sistema le seguenti anomalie: Orario timbrato non suff a copertura standard{Environment.NewLine}", logType.info, ref sbMain); + } + // tabella! + doLog("", logType.none, ref sbMain); + doLog($"", logType.none, ref sbMain); + doLog("", logType.none, ref sbMain); + int nRow = 0; + foreach (var riga in tabTimbExpl) + { + string sfondo = nRow % 2 == 0 ? "" : stripeRow; + doLog($"", logType.none, ref sbMain); + numErr++; + nRow++; + } + doLog("", logType.none, ref sbMain); + doLog("
DATADipendente
{riga.DataLav:yyyy.MM.dd ddd}{riga.CognomeNome}
", logType.none, ref sbMain); + msgBody = sbMain.ToString(); + await sendEmail(adminDestEmail, msgTopic, msgBody.Replace($"{Environment.NewLine}", "
")); + } + } + + // (D) recupero errori copertura ore lavorate / ore caricate a commessa... + if (checkAnomOreLavComm) + { + numChk++; + sbMain = new StringBuilder(); + var tabTimbRegAtt = await dataService.TeRaExplGetAll(0, oggi.AddDays(-gg2ChkOreCaricate), oggi.AddHours(1), false, true, maxErrMin, maxErrPlus); + // sulla tabella seleziono SE NON E' OK colonna okLavCom + var listErrCopertura = tabTimbRegAtt.Where(x => x.okLAvCom == 0).ToList(); + if (listErrCopertura != null && listErrCopertura.Count() > 0) + { + doLog("Trovate anomalie ore lavorate / commesse caricate, invio email!", logType.info, ref sbMain); + // mando email ad admin! + msgTopic = "Anomalie GPW: Ore Caricate a commessa"; + if (includeDirectUrl) + { + doLog($"Risultano a sistema le seguenti anomalie:{Environment.NewLine}Ore caricate a commessa non corrispondenti ad ore lavorate secondo standard{Environment.NewLine}", logType.info, ref sbMain); + } + else + { + doLog($"Risultano a sistema le seguenti anomalie: Ore caricate a commessa non corrispondenti ad ore lavorate secondo standard{Environment.NewLine}", logType.info, ref sbMain); + } + // tabella! + doLog("", logType.none, ref sbMain); + doLog($"", logType.none, ref sbMain); + doLog("", logType.none, ref sbMain); + int nRow = 0; + foreach (var riga in listErrCopertura) + { + string sfondo = nRow % 2 == 0 ? "" : stripeRow; + doLog($"", logType.none, ref sbMain); + numErr++; + nRow++; + } + doLog("", logType.none, ref sbMain); + doLog("
DATADipendente
{riga.DataLav:yyyy.MM.dd ddd}{riga.CognomeNome}
", logType.none, ref sbMain); + msgBody = sbMain.ToString(); + await sendEmail(adminDestEmail, msgTopic, msgBody.Replace($"{Environment.NewLine}", "
")); + } + } + + + + // (E) cerco anomalie x orario continuato (no Pausa Pranzo, solo 1 IN, 1 OUT) + if (checkAnomContinuato) + { + numChk++; + sbMain = new StringBuilder(); + var tabTimbExpl = await dataService.TimbExplGetContinuato(0, oggi.AddDays(-gg2ChkCont), oggi.AddHours(1)); + // se ho trovato record... + if (tabTimbExpl != null && tabTimbExpl.Count > 0) + { + doLog("Trovate anomalie orario continuato, invio email!", logType.info, ref sbMain); + // mando email ad admin! + msgTopic = "Anomalie GPW: Orario Continuato"; + if (includeDirectUrl) + { + doLog($"Risultano a sistema le seguenti anomalie:{Environment.NewLine}Orari continuati da approvare{Environment.NewLine}", logType.info, ref sbMain); + } + else + { + doLog($"Risultano a sistema le seguenti anomalie: Orari continuati da approvare{Environment.NewLine}", logType.info, ref sbMain); + } + // tabella! + doLog("", logType.none, ref sbMain); + doLog($"", logType.none, ref sbMain); + doLog("", logType.none, ref sbMain); + int nRow = 0; + foreach (var riga in tabTimbExpl) + { + string sfondo = nRow % 2 == 0 ? "" : stripeRow; + doLog($"", logType.none, ref sbMain); + numErr++; + nRow++; + } + doLog("", logType.none, ref sbMain); + doLog("
DATADipendente
{riga.DataLav:yyyy.MM.dd ddd}{riga.CognomeNome}
", logType.none, ref sbMain); + msgBody = sbMain.ToString(); + await sendEmail(adminDestEmail, msgTopic, msgBody.Replace($"{Environment.NewLine}", "
")); + } + } // Summary di cosa fatto answ = numErr == 0 ? $"Check Anomalie Timbr ALL OK | effettuati {numChk} check" : $"Check Anomalie Timbr KO | effettuati {numChk} check | trovate {numErr} anomalie"; diff --git a/GPW.CORE.Api/Data/ApiDataService.cs b/GPW.CORE.Api/Data/ApiDataService.cs index b19a0d2..3a30b8d 100644 --- a/GPW.CORE.Api/Data/ApiDataService.cs +++ b/GPW.CORE.Api/Data/ApiDataService.cs @@ -4,7 +4,6 @@ using Microsoft.AspNetCore.Identity.UI.Services; using Newtonsoft.Json; using NLog; using StackExchange.Redis; -using System.Data; using System.Diagnostics; namespace GPW.CORE.Api.Data @@ -348,6 +347,26 @@ namespace GPW.CORE.Api.Data return await Task.FromResult(dbResult); } + /// + /// Recupera record anomalie dipendenti + /// + /// singolo idx oppure 0 = tutti + /// + /// + /// + public async Task> TimbExplGetContinuato(int idxDipendente, DateTime inizio, DateTime fine) + { + List dbResult = new List(); + Stopwatch stopWatch = new Stopwatch(); + stopWatch.Start(); + dbResult = dbController.TimbExplGetContinuato(idxDipendente, inizio, fine); + stopWatch.Stop(); + TimeSpan ts = stopWatch.Elapsed; + Log.Trace($"Effettuata lettura da DB per TimbExplGetContinuato: {ts.TotalMilliseconds} ms"); + + return await Task.FromResult(dbResult); + } + #endregion Public Methods #region Protected Fields diff --git a/GPW.CORE.Api/Program.cs b/GPW.CORE.Api/Program.cs index 0fe7cb4..6cb825a 100644 --- a/GPW.CORE.Api/Program.cs +++ b/GPW.CORE.Api/Program.cs @@ -25,7 +25,8 @@ builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // abilitazione x email management con MailKit -builder.Services.AddTransient(); +//builder.Services.AddTransient(); +builder.Services.AddSingleton(); builder.Services.Configure(options => { options.Host_Address = configuration["ExternalProviders:MailKit:SMTP:Address"]; diff --git a/GPW.CORE.Api/appsettings.json b/GPW.CORE.Api/appsettings.json index a0e063d..87017d7 100644 --- a/GPW.CORE.Api/appsettings.json +++ b/GPW.CORE.Api/appsettings.json @@ -47,16 +47,18 @@ "ServerConv": { "baseUrl": "https://iis03.egalware.com/GPW/ADMIN/" }, - "TimbraCheck": { - "checkAnomAppr": true, - "checkAnomTimb": true, - "checkAnomOreLav": true, - "checkAnomOreLavComm": true, - "checkAnomContinuato": true, - "sendEmailToUser": true, - "includeDirectUrl": true, - "gg2Chk": 60, - "gg2ChkCont": 30, - "gg2ChkOreCaricate": 30 - } + "TimbraCheck": { + "checkAnomAppr": true, + "checkAnomTimb": true, + "checkAnomOreLav": true, + "checkAnomOreLavComm": true, + "checkAnomContinuato": true, + "sendEmailToUser": false, + "includeDirectUrl": true, + "gg2Chk": 60, + "gg2ChkCont": 30, + "gg2ChkOreCaricate": 30, + "maxErrMin": -29, + "maxErrPlus": 91 } +} diff --git a/GPW.CORE.Data/Controllers/GPWController.cs b/GPW.CORE.Data/Controllers/GPWController.cs index 01dc395..73d6d00 100644 --- a/GPW.CORE.Data/Controllers/GPWController.cs +++ b/GPW.CORE.Data/Controllers/GPWController.cs @@ -619,7 +619,7 @@ namespace GPW.CORE.Data.Controllers SqlParameter parFine = new SqlParameter("@fine", fine); SqlParameter parNotOkApp = new SqlParameter("@notOkApp", notOkApp); SqlParameter parNotOkTim = new SqlParameter("@notOkTim", notOkTim); - SqlParameter parNotOkLav = new SqlParameter("@notOkApp", notOkLav); + SqlParameter parNotOkLav = new SqlParameter("@notOkLav", notOkLav); var rawResult = localDbCtx .DbSetDipAndAnom @@ -1494,6 +1494,30 @@ namespace GPW.CORE.Data.Controllers return dbResult; } + /// + /// Recupera record anomalie dipendenti x orario continuato + /// + /// singolo idx oppure 0 = tutti + /// + /// + /// + public List TimbExplGetContinuato(int idxDipendente, DateTime inizio, DateTime fine) + { + List dbResult = new List(); + using (GPWContext localDbCtx = new GPWContext(_configuration)) + { + SqlParameter parIdxDip = new SqlParameter("@idxDipendente", idxDipendente); + SqlParameter parInizio = new SqlParameter("@inizio", inizio); + SqlParameter parFine = new SqlParameter("@fine", fine); + + dbResult = localDbCtx + .DbSetTimbratureExpl + .FromSqlRaw("EXEC stp_timbratureExpl_getContinuato @idxDipendente,@inizio,@fine", parIdxDip, parInizio, parFine) + .ToList(); + } + return dbResult; + } + public List TimbratureDay(DateTime dateRif, int IdxDip) { List dbResult = new List(); diff --git a/GPW.CORE.Data/DbModels/TeRaExplModel.cs b/GPW.CORE.Data/DbModels/TeRaExplModel.cs index 743c66f..09df007 100644 --- a/GPW.CORE.Data/DbModels/TeRaExplModel.cs +++ b/GPW.CORE.Data/DbModels/TeRaExplModel.cs @@ -11,13 +11,13 @@ namespace GPW.CORE.Data.DbModels public string CognomeNome { get; set; } = ""; public double h_lav { get; set; } = 0; public double h_giust { get; set; } = 0; - public double h_com { get; set; } = 0; + public decimal h_com { get; set; } = 0; public string progetti { get; set; } = ""; - public bool okLAvCom { get; set; } = false; + public int okLAvCom { get; set; } = 0; public bool isOkTim { get; set; } = false; public bool isOkApp { get; set; } = false; - public bool isOkLav { get; set; } = false; - public bool isOk { get; set; } = false; + public int isOkLav { get; set; } = 0; + public int isOk { get; set; } = 0; public bool block { get; set; } = false; public int minOrd { get; set; } = 0; public int minNonLav { get; set; } = 0; @@ -27,14 +27,14 @@ namespace GPW.CORE.Data.DbModels public int minMal { get; set; } = 0; public int minFest { get; set; } = 0; public int minRegAtt { get; set; } = 0; - public DateTime? entrata1 { get; set; } - public DateTime? uscita1 { get; set; } - public DateTime? entrata2 { get; set; } - public DateTime? uscita2 { get; set; } - public DateTime? entrata3 { get; set; } - public DateTime? uscita3 { get; set; } - public DateTime? entrata4 { get; set; } - public DateTime? uscita4 { get; set; } + public DateTime? entrata_1 { get; set; } + public DateTime? uscita_1 { get; set; } + public DateTime? entrata_2 { get; set; } + public DateTime? uscita_2 { get; set; } + public DateTime? entrata_3 { get; set; } + public DateTime? uscita_3 { get; set; } + public DateTime? entrata_4 { get; set; } + public DateTime? uscita_4 { get; set; } public int minArcoPres { get; set; } = 0; public string chkFunCod { get; set; } = ""; public string chkFunRes { get; set; } = ""; diff --git a/GPW.CORE.WRKLOG/GPW.CORE.WRKLOG.csproj b/GPW.CORE.WRKLOG/GPW.CORE.WRKLOG.csproj index b80f335..20c5d29 100644 --- a/GPW.CORE.WRKLOG/GPW.CORE.WRKLOG.csproj +++ b/GPW.CORE.WRKLOG/GPW.CORE.WRKLOG.csproj @@ -2,7 +2,7 @@ net6.0 - 3.0.2301.2516 + 3.0.2301.2518 enable enable diff --git a/Resources/ChangeLog.html b/Resources/ChangeLog.html index ae08c3c..a09a8b7 100644 --- a/Resources/ChangeLog.html +++ b/Resources/ChangeLog.html @@ -1,6 +1,6 @@ GPW - Gestione Presenze Web -

Versione: 3.0.2301.2516

+

Versione: 3.0.2301.2518


Note di rilascio:
  • diff --git a/Resources/VersNum.txt b/Resources/VersNum.txt index 2e8696c..76481ec 100644 --- a/Resources/VersNum.txt +++ b/Resources/VersNum.txt @@ -1 +1 @@ -3.0.2301.2516 +3.0.2301.2518 diff --git a/Resources/manifest.xml b/Resources/manifest.xml index 84ae400..97a4a75 100644 --- a/Resources/manifest.xml +++ b/Resources/manifest.xml @@ -1,6 +1,6 @@ - 3.0.2301.2516 + 3.0.2301.2518 http://nexus.steamware.net/repository/SWS/GPW/stable/GPW.UI.zip http://nexus.steamware.net/repository/SWS/GPW/stable/ChangeLog.html false