Quindi, sembra che tu voglia qualcosa di relativamente fluido. Se ieri era un giorno di neve, è possibile aggiungerlo il giorno successivo e quindi eseguire nuovamente i calcoli per esaminare i carichi di lavoro (teoricamente) necessari per rispettare le scadenze.
Basta pensare al volo qui:
Jobs:
Job ID, Name, Start Date, End Date
Depts:
Dept ID, Name, WeekType
JobHours:
Job ID, Dept ID, Allotted Hours
Ora, se hai bisogno di ricorrere a ricalcoli a causa di ore aggiuntive, scadenze estese, scadenze perse o altri problemi reali che si intromettono su soluzioni semplici, avrai bisogno di un modo per "rifondere" il progetto da un punto in tempo.
Hai anche la flessibilità, nel tempo, per aggiungere ulteriori reparti. Forse se un programma non può essere raggiunto, gli sviluppatori di terze parti sono programmati e forse hanno aspettative di giorni lavorativi o orari al giorno diversi.
Altre idee sulla pseudo-tabella:
JobDeptRecast:
Job ID, Dept ID, Recast Date, Hours Consumed, Hours Added, New End Date
In sostanza, per scopi di programmazione a nessuno interessa il passato dopo la rifusione (dato che non stai cercando di tenere traccia delle ore lavorate o qualcosa del genere). La rifusione è concettualmente un "nuovo" progetto alla data della rifusione.
Ora arriviamo all'elenco delle eccezioni alle ore "previste" al giorno. Dico atteso perché potrebbero facilmente passare giorni in cui le ore sono più elevate della capacità di lavorare per qualsiasi numero di motivi, inclusi quelli che menzioni.
E altro materiale per i DB finti:
WorkExceptions:
Job ID, Dept ID, Date, Hours Excepted, Reason
Cucendo un po 'di questo insieme, sembrerebbe che potresti fare un calcolo matematico sul numero di giorni del progetto (aggiustando per i fine settimana se per elenco, stimando i fine settimana nel periodo o semplicemente facendo scorrere i giorni e cercando i giorni non lavorativi come il progetto non sarà così lungo) meno il numero di ore di eccezioni trovate tra le date di inizio e di fine.
Tuttavia, se autorizzi una rifusione, dovresti prima vedere se hai delle modifiche al progetto che devono essere prese in considerazione.
Mi aspetto che questo modello sia abbastanza fluido per un sistema che prevede di spargere ore tra le date in poi senza tentare di tenere conto dell'effettivo utilizzo del tempo o dei dettagli del livello dei dipendenti.
Fondamentalmente, è sufficiente eseguire tutti i lavori senza fine dall'ultima rifusione, se ce ne sono, sommando le eccezioni * in passato per ottenere lavoro mancato e sommando le eccezioni * andando avanti per ridurre i giorni di lavoro previsti da ora alla data di scadenza. A meno che tu non abbia un lavoro di zillion dovrebbe essere molto veloce - e ogni eccezione aggiunta dopo il fatto trasforma comunque i calcoli precedenti in bugie.
Per i punti bonus, perché questa situazione esiste nella società per cui lavoro, potresti avere un diverso numero di ore nel giorno lavorativo per i dipartimenti in diverse aree geografiche. Se si desidera mostrare il numero di persone necessarie per soddisfare lo sforzo di lavoro pianificato, è possibile inserire le ore giornaliere nella tabella dipartimento per eseguire il calcolo corretto.
Spero che ti dia alcune cose a cui pensare. Naturalmente, non farò promesse per una serie di pensieri rapidi, ma sarei disposto a prototipare sulla base di quanto sopra se avessi lo stesso compito (assumendo che io abbia interpretato correttamente la tua domanda).
Spero di darti qualche idea.
[*] Non dimenticare di stimare, generare al volo o caricare eccezioni del weekend precedentemente compilate.