• User Newbie

    Ciclo PHP molto complesso

    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>";
    } [/PHP]


  • User Attivo
    1. per evitare il problema "donne delle pulizie" potrestio aggiiungere un** codice** - password

    2. con lo stesso sistema potresti evitare i duplicati di start e stop

    3. in ogni caso implementerei delle funzioni di controllo per fare un check, ovvero** aggiungere un valore "status"** che dice se lo stato attuale è start o stop.
      Quindi se arriva un nuovo valore start è il valore precedente era start, lo riscrive. idem per stop.


  • User Newbie

    Il problema è che mi sono bloccato con la logica e non riesco a mettere in codice un ragionamento simile.


  • User Attivo

    Visto che non mi sembra svilppato in modo molto chiaro,
    ne potresti approfittare per resettare e sviluppare tutto da zeero, con una nuova logica più pulita.

    A volte è la cosa migliroe da fare in questi casi.

    Cmq un controllo potresti farlo aiutandoti con ajax, ad esempio.