Ciclo PHP molto complesso

Syd Chino Barrett

Nuovo Utente
22 Ott 2015
3
0
0
Salve a tutti, sono abbastanza nuovo al PHP e sto affrontando alcune problematiche molto toste.
Vi spiego il mio problema che ormai mi assilla da due giorni e ancora non ho trovato una soluzione.
Il risultato è un "cartellino online" delle ore lavorate al netto dell'inattività dell'utente. Vi spiego il funzionamento: la mattina l'utente fa "Avvio" su di una pagina e viene registrato un datalog, nel caso il mouse resti fermi per 10 minuti parte uno script che registra i minuti di inattività, al movimento del mouse vengono registrate i minuti di inattività in tabella, al termine del lavoro l'utente fa "Stop" e viene anche qui registrato un datalog. Il risultato come ho detto è cercare le ore lavorate al netto dell'inattività, e questo sono riuscito a farlo seppur con qualche difficoltà, con una sottrazione tra stop e avvio - il tempo di inattività. Il problema sorge quando gli utenti non fanno ciò che gli si era chiesto di fare, ossia premono "Start" o "Stop" più volte o "a caso". Infatti succede che se viene premuto START - STOP, poi di nuovo START - STOP, io a video ho due colonne che mi riportano la stessa data e il risultato (ad esempio 01/10/2015 1 ora - 1/10/2015 1 ora e mezza), ciò che io vorrei è la somma di queste ore lavorate e un controllo sulle azioni che fa l'utente perchè ci sono problemi anche nel caso in cui l'utente faccia START - START - STOP, il programma prende in considerazione solamente il secondo start. Inoltre vorrei che il punto di partenza sia sempre e solo lo start (capita a volta che parte l'inattività per colpa delle donne delle pulizie che muovono il muose e poi lo script parte, ma questi sono casi proprio eccezionali e poi ci penso). Purtroppo educare gli utenti è complicato vorrei risolvere il problema magari con un'indicazione da parte Vostra. Vi posto il codice sotto. A monte di tutto c'è una query che mi tira fuori i vari dati idoperatore, datalog, etc, poi me li vado a recuperare sotto.
La logica che ho utilizzato: il programma entra e mette blank a tutti i campi fino a che non trova stesso operatore e stessa data e fa il check sulle azioni (da me nominate 1 - Start, 3 - Overtime che andrà ad autoincrementarsi , 4 - Stop). Sul 4 lui fa i calcoli necessari per tirarmi fuori il tempo e funziona benissimo. Ora stavo provando ad utilizzare 2 altre variabili azioneold e azionenew per dirgli se azioneold è diversa da azionenew fai che vai oltre, ma giuro che mi sono perso.
Idee?


PHP:
$RsSql=$oConn->Query($strSql);
if ($oConn->RecordCount>0) 
$nRec = $oConn->RecordCount;
else
$nRec = 0;

$operatore1 = "";
$ora1 = "";
$data1 = "";

$operatore0 = "";
$ora0 = "";
$data0 = "";
//$nextstep = "1";
//$primostep = "";
$azioneold = "";

/* $str1 = "prova";
$str2 = "si";
$pos = strpos($str1,$str2);
echo $pos; 
*/
while(!$oConn->EOF) {

$azionenew = $RsSql['azione'];
//echo $azione ;
$datafunk = "";
$data = $RsSql['Data'];
$cellaora = "";
$operatore1 = $RsSql['nome'];
$descrizione = $RsSql['Descrizione'];
$pos = strpos($azione,$nextstep);
//echo $pos."-".$nextstep."<br/>";



SWITCH ($azionenew) {

case 1:
//if ( isset($pos) && !empty($pos) ) {
//$nextstep = 3 || 4; 
if ($azionenew != $azioneold) {

$datafunk1 = $RsSql['datafunk'];
//$data1 = substr($RsSql['Data'], 0 , 10); 
$data1 = $RsSql['Data']; 
$overtime = "";
}	

echo $azionenew;
//}
break;	

case 3:
//if ($pos >0)	{
//	$nextstep = 4;
$overtime += $RsSql['Overtime'];
echo $azionenew;
//}

break;

case 4:
//if ($pos >0)	{
//$primostep = 1;
$descrizione = "Ore Lavorate";
$datafunk = $RsSql['datafunk']; 
echo $azionenew;

break;
//}
}

if (($operatore1 == $operatore0) && ($data1 == $data0) && ($azionenew == 4) ) {
//$stop = $datafunk;

$lavorato = abs(strtotime($datafunk) - strtotime($datafunk1));
$minutes = floor($lavorato / 60);
$cellaora = $minutes - $overtime;
$cellaora = substr(($cellaora / 60),0,4);
$StrDati.=" <tr>";
$StrDati.=" <td>".$RsSql['nome']."</td>
<td>".$data0."</td>

<td>".$descrizione."</td>
<td>".$cellaora."</td>
</tr>";
}
 
confesso di non aver esattamente capito ma parte del problema assomiglia all'invio multiplo di form perché ripetutamente cliccato il bottone.
come prima contromisura dovresti far sì che una volta premuto START sia impossibile cliccarlo di nuovo fino a che non viene cliccato STOP. in questo modo eviteresti il problema START - START - STOP perché impossibile da fare.
per gli START - STOP multipli direi che ad ogni START dovresti controllare la data e se uguale a quella corrente invece di iniziare il conteggio da zero lo fai iniziare dal valore nel db.
ovviamente avendo solo parzialmente compreso potrei aver scritto un sacco di stro... stupidaggini, non adirarti
 
da come lo proponi, sembra uno spudoratissimo controllo delle persone, antisindacale ....
probabilmente lo hanno capito benissimo e te lo boicottano ... giustamente
 

Discussioni simili