mah, un pò un casino... cmq direi:
click su START -> log inizio attività ( da ora non esisterà piu il pulsante start ma solo il pulsante stop e non si potrà piu in nessun modo umano e non avere un altro start senza prima uno stop)
click su STOP -> log fine attività ( da ora non esisterà piu il pulsante stop ma solo il pulsante start e non si potrà piu in nessun modo umano e non avere un altro stop senza prima uno start)
da cui il calcolo è banale. pure se l'utente fà seimila volte start/stop, avrai sempre start e stop a coppie ben distinte
per gestire l'inattività invece, diciamo che "dipende" da quello che fai. Un'idea potrebbe essere che dopo X minuti di mouse fermo, il sistema inserisce in automatico un log "STOP" e, appena il mouse torna a muoversi, rimette un log "START" ( al limite entrambi fleggati in maniera particolare per riconoscere il caso di inattività da uno start/stop volontario dell'utente). Detto questo a fine lavoro dovresti avere una serie di log del tipo:
codice:
START - 8:00
STOP(i) - 9:00
START(i) - 9:15
STOP - 13:00
START - 14:00
STOP(i) - 15:30
START(i) - 15:50
STOP - 18:00
simulando due periodi di inattività (quelli con la (i) ). a quel punto per il calcolo delle ore lavorate, istanzi un contatore di minuti a 0 e aggiungi a questo contatore i minuti che interrcorrono tra uno start e uno stop. a meta codice:
Codice PHP:
$minutes = 0;
$records = get_from_db("select * from datalog where id_utente = " & id_utente & " and giorno(data_log) = giorno_che_voglio_conteggiare order by data_log asc")
$start = null;
foreach($records as $record)
{
se record['tipo_di_log'] == START do: $start = $record['data_log'];
se record['tipo_di_log'] == STOP do:
$minutes += get_differenza_in_minuti($record['data_log'], $start);
$start = null;
done;
}
print "ore lavorate: " . ($minutes/60);
i problemi li hai se:
a) non hai lo stop alla fine della giornata di lavoro (l'utente magari ha chiuso il programma senza cliccare stop e non si è salvato il log). a quel punto un'idea di massima è dire: "caro utente, visto che non hai chiuso il programma spingendo stop, io ti conteggio le ore a partire dal primo start della giornata fino ad uno stop ipotetico avvenuto alle ore XX. Se poi hai lavorato di più, cavoli tuoi"
b) se il programma salva male i log
c) se il lavoro cade a cavallo di due giorni (il mio pseudo script non comprende tale eventualità)
un'idea anche per l'utente che usa il programma: quando scatta lo stop per inattività, mettere nella pagina un overlay con l'avviso "il sistema ha rilevato l'inattività dell'utente, il conteggio dei minuti a fine retributivo ripartirà al riprisitino dell'attività dell'utente" o qualcosa del genere.