planning bug

Gestart doorStef6 reacties193 weergaven

7 berichten · pagina 1 van 1

Stef

Lid · Topicstarter

Berichten
10.150
Reputatie
2
Punten
0,00
Lid sinds
Laatst gezien
Oke, hou je vast emo
Ik heb dus een planningysteem geprogrammeerd wat werkt met events en beschikbaarheden. Een beschikbaarheid row ziet er zo uit:
Afbeelding

Een event row ziet er zo uit:
Afbeelding
"afbouwUren" is de tijd die erbij word geteld, dus stel dat een event om 23:30 is afgelopen en er is een afbouwtijd van 60 minuten, dan is het eigenlijk de volgende dag om 0:30 afgelopen. Hetzelfde verhaaltje bij opbouwUren smile
Een gebruiker kan zichzelf op deze manier beschikbaar stellen:
Afbeelding

Het is voor de gebruiker dus niet mogelijk om zichzelf in één keer voor meerdere dagen in te plannen.

Om het nog even wat lastiger te maken zijn er voor ieder event ook nog teams: opbouwteam, eventteam, afbouwteam.
Een gebruiker kan ingepland worden in zon team als hij/zij beschikbaar is tijdens de tijden van het team. Dit wordt nu zo bepaald:
foreach($select as $av) {
if($availability->begin <= $eventBegin && $availability->end >= $eventEnd) {

Wat is er nou mis?
Stel dat een event begint om 13:00 uur s middags en is afgelopen om 23:30 uur. Daarna komt er nog een afbouwtijd van 60 minuten bij. De begintijd van het afbouwteam is dan 23:30 en de eindtijd is dan 00:30 de volgende dag.
Een gebruiker kan dan niet ingepland worden omdat er per beschikbaarheid-row wordt gekeken of dat de gebruiker binnen de tijd van het team beschikbaar is.

Ik heb al gedacht om de datums aan elkaar te lijmen, maar heb geen idee hoe ik dit moet doen.

Ik heb mijn best gedaan om het zo duidelijk mogelijk uit te leggen, maar ik kan me voorstellen dat je met vragen zit. Stel deze dan smile
0
Berichten
8.602
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Werken met timestamps ipv datums, dan kun je makkelijk rekenen.
0
Stef

Lid · Topicstarter

Berichten
10.150
Reputatie
2
Punten
0,00
Lid sinds
Laatst gezien
Milan schreef:
Werken met timestamps ipv datums, dan kun je makkelijk rekenen.
Sorry, vergeten te vermelden.
De vier variabelen die gebruikt worden zijn DateTime objecten, waarmee je prima kan rekenen in PHP smile
0
Berichten
8.602
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Stef schreef:
Eerdere citaten tonen
Milan schreef:
Werken met timestamps ipv datums, dan kun je makkelijk rekenen.
Sorry, vergeten te vermelden.
De vier variabelen die gebruikt worden zijn DateTime objecten, waarmee je prima kan rekenen in PHP smile
Ik zou je database structuur veranderen en niet per dag maar per tijdsdeel erin zetten (voor evenementen). Dit geeft je als voordeel dat je als gebruiker je jezelf meerdere keren per dag kan inplannen (bijv. s ochtends en s avonds) en voor jou als developer is het een stuk makkelijker dan datums aan elkaar plakken.

En een evenement kan natuurlijk ook 2 dagen duren.
0
Stef

Lid · Topicstarter

Berichten
10.150
Reputatie
2
Punten
0,00
Lid sinds
Laatst gezien
Milan schreef:
Eerdere citaten tonen
Stef schreef:
Eerdere citaten tonen
Milan schreef:
Werken met timestamps ipv datums, dan kun je makkelijk rekenen.
Sorry, vergeten te vermelden.
De vier variabelen die gebruikt worden zijn DateTime objecten, waarmee je prima kan rekenen in PHP smile
Ik zou je database structuur veranderen en niet per dag maar per tijdsdeel erin zetten (voor evenementen). Dit geeft je als voordeel dat je als gebruiker je jezelf meerdere keren per dag kan inplannen (bijv. s ochtends en s avonds) en voor jou als developer is het een stuk makkelijker dan datums aan elkaar plakken.

En een evenement kan natuurlijk ook 2 dagen duren.
Ohja, slim plan yummieMaar het probleem is dat een gebruiker per dag zijn/haar beschikbaarheid moet inplannen. Dat kan ik niet veranderen omdat de UI zo is.
0
Berichten
8.602
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Stef schreef:
Eerdere citaten tonen
Milan schreef:
Eerdere citaten tonen
Stef schreef:
Eerdere citaten tonen
Milan schreef:
Werken met timestamps ipv datums, dan kun je makkelijk rekenen.
Sorry, vergeten te vermelden.
De vier variabelen die gebruikt worden zijn DateTime objecten, waarmee je prima kan rekenen in PHP smile
Ik zou je database structuur veranderen en niet per dag maar per tijdsdeel erin zetten (voor evenementen). Dit geeft je als voordeel dat je als gebruiker je jezelf meerdere keren per dag kan inplannen (bijv. s ochtends en s avonds) en voor jou als developer is het een stuk makkelijker dan datums aan elkaar plakken.

En een evenement kan natuurlijk ook 2 dagen duren.
Ohja, slim plan yummieMaar het probleem is dat een gebruiker per dag zijn/haar beschikbaarheid moet inplannen. Dat kan ik niet veranderen omdat de UI zo is.
Hmm, das wel jammer dan.
0
Rik

Lid

Berichten
18.393
Reputatie
0
Punten
0,04
Lid sinds
Laatst gezien
Heel pseudocode-ig geschreven, maar ik hoop dat het idee duidelijk is:

[COLOR= #0000BB]<?php[/COLOR] 

use CarbonCarbon[COLOR= #007700];[/COLOR]

[COLOR= #FF8000]// We gaan er even vanuit dat je de datetimes omgezet hebt naar carbon objecten)[/COLOR]
[COLOR= #007700]function[/COLOR] handleMultiDayEvent[COLOR= #007700]([/COLOR][COLOR= #0000BB]$begin[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$eind[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$beginEvent[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$eindEvent[/COLOR][COLOR= #007700])
{[/COLOR]
    [COLOR= #0000BB]$endWithAfbouw[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$eventEnd[/COLOR][COLOR= #007700]->[/COLOR][URL="http://www.php.net/copy"]copy[/URL][COLOR= #007700]()->[/COLOR]addHours[COLOR= #007700]([/COLOR][COLOR= #0000BB]$event[/COLOR][COLOR= #007700]->[/COLOR]afBouwUren[COLOR= #007700]);[/COLOR]
    [COLOR= #FF8000]// Event inclusief afbouwuren is langer dan het einde van de dag[/COLOR]
    [URL="http://www.php.net/if"]if[/URL] [COLOR= #007700]([/COLOR][COLOR= #0000BB]$endWithAfbouw[/COLOR][COLOR= #007700]->[/COLOR]gt[COLOR= #007700]([/COLOR][COLOR= #0000BB]$eventBegin[/COLOR][COLOR= #007700]->[/COLOR][URL="http://www.php.net/copy"]copy[/URL][COLOR= #007700]()->[/COLOR]endOfDay[COLOR= #007700]()) {[/COLOR]
        [COLOR= #FF8000]// Een persoon moet nu beschikbaar zijn voor begin tot einde van dag
        // En persoon moet nu bescikbaar zijn voor begin van volgende dag tot einde event[/COLOR]
        [COLOR= #0000BB]$startOfNewDay[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]$endWithAfbouw[/COLOR][COLOR= #007700]->[/COLOR][URL="http://www.php.net/copy"]copy[/URL][COLOR= #007700]()->[/COLOR]startOfDay[COLOR= #007700]();[/COLOR]
        
        [URL="http://www.php.net/return"]return[/URL] [COLOR= #007700]([/COLOR]
            [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]handleSingleDayEvent[COLOR= #007700]([/COLOR][COLOR= #0000BB]$begin[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$eind[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$beginEvent[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$beginEvent[/COLOR][COLOR= #007700]->[/COLOR][URL="http://www.php.net/copy"]copy[/URL][COLOR= #007700]()->[/COLOR]endOfDay[COLOR= #007700]()) ==[/COLOR] true [COLOR= #007700]&&[/COLOR] 
            [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]handleSingleDayEvent[COLOR= #007700]([/COLOR][COLOR= #0000BB]$begin[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$eind[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$startOfNewDay[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$eindEvent[/COLOR][COLOR= #007700]) ==[/COLOR] true    [COLOR= #FF8000]// dag 2[/COLOR]
        [COLOR= #007700])
    }[/COLOR]    

    [COLOR= #FF8000]// Anders doen we de verwerking op normale manier.[/COLOR]
    [URL="http://www.php.net/return"]return[/URL] [COLOR= #0000BB]$this[/COLOR][COLOR= #007700]->[/COLOR]handleSingleDayEvent[COLOR= #007700]([/COLOR][COLOR= #0000BB]$begin[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$eind[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$beginEvent[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$eindEvent[/COLOR][COLOR= #007700]);
}

function[/COLOR] handleSingleDayEvent[COLOR= #007700]([/COLOR][COLOR= #0000BB]$begin[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$eind[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$beginEvent[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$eindEvent[/COLOR][COLOR= #007700])
{[/COLOR]
    [URL="http://www.php.net/return"]return[/URL] [COLOR= #0000BB]$begin[/COLOR][COLOR= #007700]->[/COLOR]lte[COLOR= #007700]([/COLOR][COLOR= #0000BB]$eventBegin[/COLOR][COLOR= #007700]) &&[/COLOR] [COLOR= #0000BB]$end[/COLOR][COLOR= #007700]->[/COLOR]gte[COLOR= #007700]([/COLOR][COLOR= #0000BB]$eventEnd[/COLOR][COLOR= #007700]);
}[/COLOR]


http://carbon.nesbot.com/docs/

Natuurlijk moet de opzet anders als je het over meer dan 2 dagen wil doen. Maar ook dat kan je dan op een zelfde manier oplossen. Elke keer brokjes langs gaan:
- Van begin van event tot einde dag/einde event
- Als meer dagen dan begin van volgende dag tot einde volgende dag (of einde event)
- Als niet meer extra dagen dan van begin van dag tot einde van event

Uiteraard via een recursieve functie op te lossen, waarbij er true terug gegeven moet worden om volledige availability te hebben biggrin
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren