Doorlooptijden in Timewindows berekenen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Stephan Engberts

Stephan Engberts

12/02/2011 12:03:45
Quote Anchor link
Hoi hoi,

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
 
PHP hulp

PHP hulp

05/01/2025 08:55:46
 
Noppes Homeland

Noppes Homeland

12/02/2011 12:46:22
Quote Anchor link
Het volgende:
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
 
Stephan Engberts

Stephan Engberts

12/02/2011 12:50:21
Quote Anchor link
Thnx voor je reactie. Hoe vind jij dat het beter kan?

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
}

?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.