Ore di monitoraggio con orologio in / out

0

Sto lavorando su un'interfaccia web che consentirebbe all'utente di tenere traccia della quantità di tempo che le persone trascorrono presso il loro stabilimento.

Il problema:
Non so quale sarebbe il modo migliore per tenere traccia di questo tempo. Ho trovato un paio di idee su come questo potrebbe essere realizzato, ma nessuno di loro è elegante come vorrei che fossero. Potrei:

  1. Memorizza gli orologi in un database MySQL e calcola le ore quando richiesto.
  2.     
  3. Orologi orari e che verranno calcolati ogni volta che scadono.


Perché queste soluzioni non sono abbastanza buone:

  1. Il calcolo delle ore per richiesta farebbe molto affidamento su una persona che effettua il cronometraggio in sequenza e in sequenza per ottenere questo risultato elegantemente. Ciò non offrirebbe alcuna flessibilità quando si tratta di dimenticare le persone. Forse l'errato ordine del clock potrebbe essere contrassegnato come una discrepanza e non calcolerà le ore fino a quando non verrà risolto? Sembra anche che la query per ottenere inserti / uscite sequenziali di clock e determinare la differenza tra loro sarebbe ingombrante.
  2.      
  3. Il calcolo delle ore ogni volta che una persona esce sembra un po 'più ragionevole, ma in questo caso dovresti tenere conto del fatto che la gente dimentica di scadere. Se qualcuno dimentica di uscire per un mese, tornerà con un mucchio di ore e l'utente avrà registrazioni inaccurate.


Chiedo perché potrei guardare troppo da vicino questo problema e sto fallendo nel vedere una soluzione ovvia. Qualche suggerimento?

    
posta hellaminx 08.10.2015 - 23:12
fonte

1 risposta

4

Il tuo database dovrebbe preoccuparsi dei fatti. L'interpretazione dei fatti non ha bisogno di essere archiviata nel database, perché può essere calcolata su richiesta, ogni volta che è necessario visualizzare il numero di ore tra gli eventi di ingresso e di fine uscita.

Certo, potrebbe essere un po 'più difficile, ma credimi, dovrai comunque elaborare l'algoritmo, perché a un certo punto si presenterà la necessità di ricalcolare le ore di tutti. Quindi, dato che otterrai l'algoritmo, potresti anche continuare a utilizzarlo ogni volta che devi visualizzare le ore nell'applicazione, invece di ogni volta che esegui una temporizzazione nel database.

Le discrepanze nei dati dovute a una persona che dimentica di scadere è qualcosa che devi gestire, sia quando è il momento di mostrare il numero di ore, o, meglio ancora, per mezzo di un processo ricorrente, ricorrente che sembra per discrepanze e le risolve inserendo eventi extra nel database. Quindi, ad esempio, eseguivo un tale processo a mezzanotte ogni giorno per eliminare tutti quelli che apparentemente si dimenticavano di uscire. (Vorrei anche tenere traccia del fatto che questo clock-out è stato emesso dal sistema e non emesso dall'utente.)

Come bonus, ecco una query per Microsoft Access (in modalità compatibilità MS-SQL Server) che ho scritto molto tempo fa per calcolare gli spostamenti dei dipendenti, dati gli eventi di clock in e clock out. Actions.TypeId = 2 significa che abbiamo un cambiamento di stato con clock, (il sistema supporta anche altri tipi di eventi) e quando ciò accade, allora Actions.Data = '0' per un time-out, mentre Actions.Data = '1 'per un orologio in.

SELECT 
    Employees.Id, 
    PunchIn,
    (SELECT TOP 1 DateTime FROM Actions 
      WHERE EmployeeId = Employees.Id AND TypeId=2 AND Data='0' 
        AND DateTime > PunchIn ORDER BY Id) 
    AS PunchOut, 
    (PunchOut-PunchIn) AS Duration
FROM Employees LEFT JOIN 
    (SELECT Actions.EmployeeId, Actions.DateTime AS PunchIn
       FROM Actions 
      WHERE Actions.TypeId=2 AND Actions.Data='1') 
    AS PunchIns 
    ON Employees.Id=PunchIns.EmployeeId
ORDER BY Employees.Id, PunchIn;
    
risposta data 08.10.2015 - 23:26
fonte

Leggi altre domande sui tag