Fix check controllo timbrature (da provare...)

This commit is contained in:
Samuele Locatelli
2023-01-25 18:49:18 +01:00
parent 8b85b4a2f8
commit 9d62995a70
10 changed files with 282 additions and 39 deletions
@@ -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<string> emailDestList = emailRaw.Split(",").ToList();
List<string> 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<int>("TimbraCheck:gg2Chk");
int gg2ChkCont = _configuration.GetValue<int>("TimbraCheck:gg2ChkCont");
int gg2ChkOreCaricate = _configuration.GetValue<int>("TimbraCheck:gg2ChkOreCaricate");
int maxErrMin = _configuration.GetValue<int>("TimbraCheck:maxErrMin");
int maxErrPlus = _configuration.GetValue<int>("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("<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" style=\"font-size: 1.3em; width:100%;\">", logType.none, ref sbMain);
doLog("<thead style=\"background-color: #232323; color: #DEDEDE\"><th>DATA</th><th>Dipendente</th></thead>", logType.none, ref sbMain);
doLog($"<thead {headRow}><th>DATA</th><th>Dipendente</th></thead>", logType.none, ref sbMain);
doLog("<tbody>", 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("</tbody>", logType.none, ref sbMain);
doLog("</table>", logType.none, ref sbMain);
msgBody = sbMain.ToString();
await sendEmail(msgTopic, msgBody.Replace($"{Environment.NewLine}", "<br/>"));
await sendEmail(adminDestEmail, msgTopic, msgBody.Replace($"{Environment.NewLine}", "<br/>"));
}
}
// (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}<a href=\"{baseUrl}reviewTimbrature.aspx\">timbrature mancanti</a>{Environment.NewLine}", logType.info, ref sbMain);
}
else
{
doLog($"Risultano a sistema le seguenti anomalie: timbrature mancanti{Environment.NewLine}", logType.info, ref sbMain);
}
// tabella!
doLog("<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" style=\"font-size: 1.3em; width:100%;\">", logType.none, ref sbMain);
doLog($"<thead {headRow}><th>DATA</th><th>Dipendente</th></thead>", logType.none, ref sbMain);
doLog("<tbody>", logType.none, ref sbMain);
int nRow = 0;
foreach (var riga in tabTimbExpl)
{
string sfondo = nRow % 2 == 0 ? "" : stripeRow;
doLog($"<tr {sfondo}><td>{riga.DataLav:yyyy.MM.dd ddd}</td><td>{riga.CognomeNome}</td></tr>", logType.none, ref sbMain);
numErr++;
nRow++;
}
doLog("</tbody>", logType.none, ref sbMain);
doLog("</table>", logType.none, ref sbMain);
msgBody = sbMain.ToString();
await sendEmail(adminDestEmail, msgTopic, msgBody.Replace($"{Environment.NewLine}", "<br/>"));
// 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("<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" style=\"font-size: 1.3em; width:100%;\">", logType.none, ref sbMain);
doLog($"<thead {headRow}><th>DATA</th><th>Dipendente</th></thead>", logType.none, ref sbMain);
doLog("<tbody>", logType.none, ref sbMain);
nRow = 0;
foreach (var riga in tabTimbExplDip)
{
string sfondo = nRow % 2 == 0 ? "" : stripeRow;
doLog($"<tr {sfondo}><td>{riga.DataLav:yyyy.MM.dd ddd}</td><td>{riga.CognomeNome}</td></tr>", logType.none, ref sbMain);
nRow++;
}
doLog("</tbody>", logType.none, ref sbMain);
doLog("</table>", logType.none, ref sbMain);
msgBody = sbMain.ToString();
await sendEmail(rigaDip.email, msgTopic, msgBody.Replace($"{Environment.NewLine}", "<br/>"));
}
}
}
}
}
// (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}<a href=\"{baseUrl}reviewTimbrature.aspx\">Orario timbrato non suff a copertura standard</a>{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("<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" style=\"font-size: 1.3em; width:100%;\">", logType.none, ref sbMain);
doLog($"<thead {headRow}><th>DATA</th><th>Dipendente</th></thead>", logType.none, ref sbMain);
doLog("<tbody>", logType.none, ref sbMain);
int nRow = 0;
foreach (var riga in tabTimbExpl)
{
string sfondo = nRow % 2 == 0 ? "" : stripeRow;
doLog($"<tr {sfondo}><td>{riga.DataLav:yyyy.MM.dd ddd}</td><td>{riga.CognomeNome}</td></tr>", logType.none, ref sbMain);
numErr++;
nRow++;
}
doLog("</tbody>", logType.none, ref sbMain);
doLog("</table>", logType.none, ref sbMain);
msgBody = sbMain.ToString();
await sendEmail(adminDestEmail, msgTopic, msgBody.Replace($"{Environment.NewLine}", "<br/>"));
}
}
// (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}<a href=\"{baseUrl}reviewTimbrature.aspx\">Ore caricate a commessa non corrispondenti ad ore lavorate secondo standard</a>{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("<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" style=\"font-size: 1.3em; width:100%;\">", logType.none, ref sbMain);
doLog($"<thead {headRow}><th>DATA</th><th>Dipendente</th></thead>", logType.none, ref sbMain);
doLog("<tbody>", logType.none, ref sbMain);
int nRow = 0;
foreach (var riga in listErrCopertura)
{
string sfondo = nRow % 2 == 0 ? "" : stripeRow;
doLog($"<tr {sfondo}><td>{riga.DataLav:yyyy.MM.dd ddd}</td><td>{riga.CognomeNome}</td></tr>", logType.none, ref sbMain);
numErr++;
nRow++;
}
doLog("</tbody>", logType.none, ref sbMain);
doLog("</table>", logType.none, ref sbMain);
msgBody = sbMain.ToString();
await sendEmail(adminDestEmail, msgTopic, msgBody.Replace($"{Environment.NewLine}", "<br/>"));
}
}
// (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}<a href=\"{baseUrl}approvTimbrature.aspx\">Orari continuati da approvare</a>{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("<table cellpadding=\"0\" cellspacing=\"0\" border=\"1\" style=\"font-size: 1.3em; width:100%;\">", logType.none, ref sbMain);
doLog($"<thead {headRow}><th>DATA</th><th>Dipendente</th></thead>", logType.none, ref sbMain);
doLog("<tbody>", logType.none, ref sbMain);
int nRow = 0;
foreach (var riga in tabTimbExpl)
{
string sfondo = nRow % 2 == 0 ? "" : stripeRow;
doLog($"<tr {sfondo}><td>{riga.DataLav:yyyy.MM.dd ddd}</td><td>{riga.CognomeNome}</td></tr>", logType.none, ref sbMain);
numErr++;
nRow++;
}
doLog("</tbody>", logType.none, ref sbMain);
doLog("</table>", logType.none, ref sbMain);
msgBody = sbMain.ToString();
await sendEmail(adminDestEmail, msgTopic, msgBody.Replace($"{Environment.NewLine}", "<br/>"));
}
}
// 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";
+20 -1
View File
@@ -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);
}
/// <summary>
/// Recupera record anomalie dipendenti
/// </summary>
/// <param name="idxDipendente">singolo idx oppure 0 = tutti</param>
/// <param name="inizio"></param>
/// <param name="fine"></param>
/// <returns></returns>
public async Task<List<TimbratureExplModel>> TimbExplGetContinuato(int idxDipendente, DateTime inizio, DateTime fine)
{
List<TimbratureExplModel> dbResult = new List<TimbratureExplModel>();
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
+2 -1
View File
@@ -25,7 +25,8 @@ builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// abilitazione x email management con MailKit
builder.Services.AddTransient<IEmailSender, MailKitEmailSender>();
//builder.Services.AddTransient<IEmailSender, MailKitEmailSender>();
builder.Services.AddSingleton<IEmailSender, MailKitEmailSender>();
builder.Services.Configure<MailKitEmailSenderOptions>(options =>
{
options.Host_Address = configuration["ExternalProviders:MailKit:SMTP:Address"];
+14 -12
View File
@@ -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
}
}
+25 -1
View File
@@ -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;
}
/// <summary>
/// Recupera record anomalie dipendenti x orario continuato
/// </summary>
/// <param name="idxDipendente">singolo idx oppure 0 = tutti</param>
/// <param name="inizio"></param>
/// <param name="fine"></param>
/// <returns></returns>
public List<TimbratureExplModel> TimbExplGetContinuato(int idxDipendente, DateTime inizio, DateTime fine)
{
List<TimbratureExplModel> dbResult = new List<TimbratureExplModel>();
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<TimbratureModel> TimbratureDay(DateTime dateRif, int IdxDip)
{
List<TimbratureModel> dbResult = new List<TimbratureModel>();
+12 -12
View File
@@ -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; } = "";
+1 -1
View File
@@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Version>3.0.2301.2516</Version>
<Version>3.0.2301.2518</Version>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>GPW - Gestione Presenze Web</i>
<h4>Versione: 3.0.2301.2516</h4>
<h4>Versione: 3.0.2301.2518</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
3.0.2301.2516
3.0.2301.2518
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>3.0.2301.2516</version>
<version>3.0.2301.2518</version>
<url>http://nexus.steamware.net/repository/SWS/GPW/stable/GPW.UI.zip</url>
<changelog>http://nexus.steamware.net/repository/SWS/GPW/stable/ChangeLog.html</changelog>
<mandatory>false</mandatory>