Doorlooptijden in Timewindows berekenen
Ik heb de volgende uitdaging, waar ik zo ff niet uitkom.
Achtergrond:
In de DB zijn meerdere timewindows gedefinieerd.
Een mogelijke timewindow is:
Ma 9:00 - 17:00
Di 9:00 - 18:00
Wo 10:00 - 21:00
Do 9:00 - 18:00
Vr 9:00 - 18:00
Za Geen window
Zo Geen window
Table layout:
id
ma_active (of er wel of geen timespan is dus)
ma_start (uur-cijfer van start timespan)
ma_end (uur-cijfer van einde timespan)
en zo door voor di,wo,do,vr,za en zo
Er worden elementen in een andere table aangemaakt, welke gekoppeld worden naar timewindow.id
Deze elementen hebben een StartDatum en een MaximaleDoorlooptijd (in uren).
So far, so good.
Nu is mijn probleempje gebaseerd op het feit, dat er berekeningen gemaakt moeten worden, die enkel in de bovenstaand gedefinieerde timespans doorgeteld mogen worden.
Nu wil ik een aantal dingen berekenen.
- Wat is de uiteindelijke datum van "MaximaleDoorloopTijd"?
Bijv. Bij bovenstaande timespan, krijgt het element een StartDatum van -ma 14:00- en een MaximaleDoorlooptijd van -6 uur-? De functie die ik nodig ben, moet antwoorden: -di 12:00- zeg maar.
- Gevolgvraag: Wat is de tijd ten opzicht van time() (zou ook buiten timewindow kunnen vallen dus) die nog over is tot het antwoord op vraag 1?
- Gevolgvraag: Op hoeveel % van de doorlooptijd zitten we dus?
Volgens mij moet het niet te moeilijk zijn, maar op de een of andere manier krijg ik het niet uit mijn hersenen...
Wie van jullie heeft zin om hier even over te bomen?
Alvast super bedankt!
Grtz, Stephan
Table layout:
id
ma_active (of er wel of geen timespan is dus)
ma_start (uur-cijfer van start timespan)
ma_end (uur-cijfer van einde timespan)
is niet genormaliseerd en je slaat daarmee de de verkeerde weg mee in
Even de achtergrond van hetgene wat ik zoek:
De timewindows zijn contractuele afspraken met klanten.
En de elementen zijn bestellingen.
Het gaat er dus om wanneer de bestelling maximaal gereed moet zijn, en een weergave van de tijd tot voorgaand tijdstip en een procentuele weergave van deze verhouding.
Toevoeging op 12/02/2011 15:00:48:
Hey...
Inmiddels 3 uur hersenslopend knutselen heeft een werkend iets opgeleverd (op het eerste deel dan, het berekenen van de eindtijd..)
De code is nog lang niet netjes, maar goed...
Hierbij een volledige copy & paste van de code.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?PHP
function calc_sla_ssr($ticketnr)
{
global $db;
$uitkomst=0;
$sql = "SELECT active,date_open,date_close,ssr_id FROM tickets WHERE id=".$ticketnr;
$r1 = $db->sql_query($sql,true);
$sql = "SELECT servicelevel_window,doorlooptijd_werkuren FROM standard_changes WHERE id=".$r1->ssr_id;
$r2 = $db->sql_query($sql,true);
$tr = calc_tr_datum($ticketnr);
$uitkomst = round($uitkomst);
return $uitkomst;
}
function calc_tr_datum($ticketnr)
{
global $db;
$sql = "SELECT active,date_open,date_close,ssr_id FROM tickets WHERE id=".$ticketnr;
$r1 = $db->sql_query($sql,true);
$sql = "SELECT servicelevel_window,doorlooptijd_werkuren FROM standard_changes WHERE id=".$r1->ssr_id;
$r2 = $db->sql_query($sql,true);
$sql = "SELECT * FROM timewindows WHERE id=".$r2->servicelevel_window;
$r3 = $db->sql_query($sql,true);
$dag_van_start=date("N",$r1->date_open);
/* 1=Maandag, t/m 7=Zondag*/
$totaltime = scanday($r3,date("N",$r1->date_open),$r1->date_open,($r2->doorlooptijd_werkuren*60*60));
$totaltime = $_SESSION['tr'];
return $totaltime;
}
function scanday($r1,$daykind,$startscantime,$dlt)
{
// Doorloop een dag
$start=0;
$eind=0;
$target_resolution=0;
$deze_dag_berekenen=0;
if ($daykind==1)
{
$deze_dag_berekenen = $r1->ma_active;
$start = mktime($r1->ma_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->ma_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($daykind==2)
{
$deze_dag_berekenen = $r1->di_active;
$start = mktime($r1->di_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->di_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($daykind==3)
{
$deze_dag_berekenen = $r1->wo_active;
$start = mktime($r1->wo_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->wo_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($daykind==4)
{
$deze_dag_berekenen = $r1->do_active;
$start = mktime($r1->do_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->do_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($daykind==5)
{
$deze_dag_berekenen = $r1->vr_active;
$start = mktime($r1->vr_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->vr_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($daykind==6)
{
$deze_dag_berekenen = $r1->za_active;
$start = mktime($r1->za_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->za_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($daykind==7)
{
$deze_dag_berekenen = $r1->zo_active;
$start = mktime($r1->zo_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->zo_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($deze_dag_berekenen == 1)
{
if ($startscantime > $start)
{
// niet de hele dag pakken
$start = $startscantime;
}
if ($startscantime > $eind)
{
// door naar de volgende dag
$day_new=1;
if ($daykind < 7) { $day_new = $daykind+1; }
$start_new_day_at = mktime(0,0,0,date("m",$startscantime),date("d",$startscantime)+1,date("Y",$startscantime));
scanday($r1,$day_new,$start_new_day_at,$dlt);
}
if (($start+$dlt) < $eind)
{
// deze dag verloopt ie ergens
$target_resolution = $start+$dlt;
$_SESSION['tr'] = $target_resolution;
} else {
// door naar de volgende dag met herberekening 'time-left'
$day_new=1;
if ($daykind < 7) { $day_new = $daykind+1; }
$start_new_day_at = mktime(0,0,0,date("m",$start),date("d",$start)+1,date("Y",$start));
$dltdone = $eind-$start;
scanday($r1,$day_new,$start_new_day_at,$dlt-$dltdone);
}
} else {
// door naar de volgende dag
$day_new=1;
if ($daykind < 7) { $day_new = $daykind+1; }
$start_new_day_at = mktime(0,0,0,date("m",$startscantime),date("d",$startscantime)+1,date("Y",$startscantime));
scanday($r1,$day_new,$start_new_day_at,$dlt);
}
return $target_resolution;
}
?>
function calc_sla_ssr($ticketnr)
{
global $db;
$uitkomst=0;
$sql = "SELECT active,date_open,date_close,ssr_id FROM tickets WHERE id=".$ticketnr;
$r1 = $db->sql_query($sql,true);
$sql = "SELECT servicelevel_window,doorlooptijd_werkuren FROM standard_changes WHERE id=".$r1->ssr_id;
$r2 = $db->sql_query($sql,true);
$tr = calc_tr_datum($ticketnr);
$uitkomst = round($uitkomst);
return $uitkomst;
}
function calc_tr_datum($ticketnr)
{
global $db;
$sql = "SELECT active,date_open,date_close,ssr_id FROM tickets WHERE id=".$ticketnr;
$r1 = $db->sql_query($sql,true);
$sql = "SELECT servicelevel_window,doorlooptijd_werkuren FROM standard_changes WHERE id=".$r1->ssr_id;
$r2 = $db->sql_query($sql,true);
$sql = "SELECT * FROM timewindows WHERE id=".$r2->servicelevel_window;
$r3 = $db->sql_query($sql,true);
$dag_van_start=date("N",$r1->date_open);
/* 1=Maandag, t/m 7=Zondag*/
$totaltime = scanday($r3,date("N",$r1->date_open),$r1->date_open,($r2->doorlooptijd_werkuren*60*60));
$totaltime = $_SESSION['tr'];
return $totaltime;
}
function scanday($r1,$daykind,$startscantime,$dlt)
{
// Doorloop een dag
$start=0;
$eind=0;
$target_resolution=0;
$deze_dag_berekenen=0;
if ($daykind==1)
{
$deze_dag_berekenen = $r1->ma_active;
$start = mktime($r1->ma_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->ma_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($daykind==2)
{
$deze_dag_berekenen = $r1->di_active;
$start = mktime($r1->di_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->di_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($daykind==3)
{
$deze_dag_berekenen = $r1->wo_active;
$start = mktime($r1->wo_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->wo_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($daykind==4)
{
$deze_dag_berekenen = $r1->do_active;
$start = mktime($r1->do_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->do_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($daykind==5)
{
$deze_dag_berekenen = $r1->vr_active;
$start = mktime($r1->vr_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->vr_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($daykind==6)
{
$deze_dag_berekenen = $r1->za_active;
$start = mktime($r1->za_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->za_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($daykind==7)
{
$deze_dag_berekenen = $r1->zo_active;
$start = mktime($r1->zo_start,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
$eind = mktime($r1->zo_end,0,0,date("m",$startscantime),date("d",$startscantime),date("Y",$startscantime));
}
if ($deze_dag_berekenen == 1)
{
if ($startscantime > $start)
{
// niet de hele dag pakken
$start = $startscantime;
}
if ($startscantime > $eind)
{
// door naar de volgende dag
$day_new=1;
if ($daykind < 7) { $day_new = $daykind+1; }
$start_new_day_at = mktime(0,0,0,date("m",$startscantime),date("d",$startscantime)+1,date("Y",$startscantime));
scanday($r1,$day_new,$start_new_day_at,$dlt);
}
if (($start+$dlt) < $eind)
{
// deze dag verloopt ie ergens
$target_resolution = $start+$dlt;
$_SESSION['tr'] = $target_resolution;
} else {
// door naar de volgende dag met herberekening 'time-left'
$day_new=1;
if ($daykind < 7) { $day_new = $daykind+1; }
$start_new_day_at = mktime(0,0,0,date("m",$start),date("d",$start)+1,date("Y",$start));
$dltdone = $eind-$start;
scanday($r1,$day_new,$start_new_day_at,$dlt-$dltdone);
}
} else {
// door naar de volgende dag
$day_new=1;
if ($daykind < 7) { $day_new = $daykind+1; }
$start_new_day_at = mktime(0,0,0,date("m",$startscantime),date("d",$startscantime)+1,date("Y",$startscantime));
scanday($r1,$day_new,$start_new_day_at,$dlt);
}
return $target_resolution;
}
?>