Avatar billede Asger Carlsen Nybegynder
03. oktober 2011 - 12:37 Der er 16 kommentarer og
2 løsninger

Booking system - Gode ideér/råd

Jeg er igang med at lave et lille booking system til byggeplads, hvor der kun er en aflæsningsplads. Det skal så være muligt at reservere pladsen i et givent tidsrum. Jeg har fået lavet den del hvor man reservere pladsen. Man angiver et ankomst- og afgangstidspunkt, samt lidt andet info. Tiden er styre i tidsintervaller af 15 min.

Nu er jeg så igang med at lave en lille oversigt, hvor man se hvornår pladsen er ledig. Hertil ville jeg høre om der var nogen der havde et kvikt indspark til hvordan det kunne laves smart.

Jeg havde tænkt mig den skulle løbe fra dags dato, og så en uge frem, hvor man så selvfølgelig skulle kunne gå længere frem i tiden. Jeg overvejer at lave det som en tabel, med celler for hvert kvarter. Der så undersøger om den pågældende celle ligger inden for en booking periode. Umiddelbart syntes jeg bare det lyder som en frygtelig masse tabel opslag. Muligvis det kunne gøres på smartere måde?
03. oktober 2011 - 13:07 #1
Du kommer nok til at fortælle lidt mere om dit bookingsystem.  Hvordan angiver folk ankomst og afgangstidspunkt o.s.v.?  Er det på en hjemmeside med en html formular?  Hvordan opbevarer du så de modtagne oplysninger?  Er det i en mysql tabel?  Hvis ja, hvilke felter har du i tabellen?  Hvis nej, hvordan så?
Avatar billede Asger Carlsen Nybegynder
03. oktober 2011 - 14:49 #2
Lidt mere info om systemet

Det er lavet som en hjemmeside. Hvor man booker via en html-formular. Afgang- og ankomsttidspunkter vælges via rullemenuer (<option>) med faste talværdier. De 2 tidspunkter samles så til et tidspunkt af typen: '0000-00-00 00:00:00' Der indsættes i en MySQL-tabel hvor tidspunkter er af typen: 'timestamp'
03. oktober 2011 - 17:26 #3
Du vil lave en oversigt over de data du har om reserveringer af aflæsningspladsen, så du kan se, hvornår den er ledig.  Men det er stadig ikke tydeligt hvad det er for data.  Det oplagte ville vel være hvis din mysql tabel havde, mindst, felter for id, firma, startstidspunkt, og sluttidspunkt.  For eksempel

Aflæsningsplads
id firma start slut
1  firma1  2011-09-21 10:00:00 2011-09-21 11:15:00
2  firma2  2011-09-23 12:45:00 2011-09-23 13:15:00

Hvis det er sådan du bevarer dataerne, hvordan ved du så, at tidsrummene ikke overlapper?  Er der en validering der afviser en reservation hvis starttidspunktet eller sluttidspunktet ligger mellem start og slut tidspunkterne for en anden reservering?

Men nu siger du, at tidspunkternd der indføres i html formularen samles til et tidspunkt.  Vil det sige, at du kun bevarer starttidspunktet i tabellen og så giver folk et fast tidsrum, måske et kvarter?  Således, at hvis et job tager længere, så må der reserveres to eller tre tidsrum, for eksempel:

Aflæsningsplads
id firma start slut
1  firma1  2011-09-21 10:00:00 2011-09-21 10:15:00
2  firma1  2011-09-21 10:15:00 2011-09-21 10:30:00
2  firma2  2011-09-21 11:15:00 2011-09-21 11:30:00

Det er (formodenligt) ikke så svært, ved hjælp af nogle løkker, at lave en php kode der laver et skema over dagene i en uge med felter for hvert kvarter og hvert felt enten udfyldt med den pågældende reservation eller tomt.  Men for at kunne lave det, er det helt nødvendigt at forstå hvilke data der er at arbejde med.

Hvis det er mig der er for tumpet og alle andre har forstået, så glem mig og vent på hjælp fra anden side.  Ellers må du fortælle mig mere om dine reservations dataer.
Avatar billede Asger Carlsen Nybegynder
03. oktober 2011 - 18:50 #4
Beklager jeg er lidt sløj med informationerne, nu burde det hele være med, eller må jeg fiske noget mere frem. Har lige præcis de data som du foreslår som minimum. Min MySQL-tabel ser sådan ud:

http://www.crx-web.dk/db.gif

Jeg giver hver booking et start tidspunkt, og et sluttidspunkt.

Måden jeg har sørget for, eller i hvert fald forsøgt, er ved at tjekke start- og sluttidspunkt for den nye reservation ikke ligger inden for en anden bookingperiode. En lykke der for hver eksisterende booking, sikrer at det nye starttidspunkter ligger før eksisterende starttidspunkt og efter det tilhørende sluttidspunkt. Hvis det giver mening. Umiddelbar har jeg fået det til at virke. Jeg har i hvert fald testet det på alle de måder jeg kunne komme i tanke om, og det giver det ønskede resultat.

Jeg havde også tænkt noget i stil med det du beskriver. At lave en tabel med en felter der har hver deres tidskode. Opdelt i intervaller på 15 min. 2011-09-21 10:00:00 -  2011-09-21 10:15:00 -  2011-09-21 10:30:00 - osv..

Så skulle hver felt holdes op mod databasen, for at se om det enkelte felt lå inden for en tidsperiode. Hvis det gjorde skulle feltet blive rødt, hvis ikke skulle det blive grønt. Fra tanke og så til at lave det er der så et stykke vej. Så ville lige prøve at forehøre mig om jeg var på rette vej, og få et lille råd eller to med på vejen.
Avatar billede showsource Seniormester
03. oktober 2011 - 18:50 #5
Jeg har lavet noget vagtplan halløj, hvor man med Js og php får vist tider og bruger, ugevis frem.

Her valgte jeg at først definere aktuel uge, startende mandag, og med mulighed for at vælge 4 uger frem.

Hver bruger kan så klikke på en og tilføje start og slut tid og med mulighed for flere tider samme dag.
Hvis det er i dag eller frem, kan man klikke på dagen.

Alle tider som er gemt i db lægges i et array, ligeså brugere, og ud fra disse to opbygges en tabel.

Dagene for aktuel samt den viste uge finder jeg med:


$weeksec = 604800;
$nextmonday = strtotime("next Monday");
$firstmonday = ($nextmonday-$weeksec);
$thirdmonday = ($nextmonday+$weeksec);
$fourthmonday = ($nextmonday+($weeksec*2));

$allweeks = array(date("W", $firstmonday) => $firstmonday,
                  date("W", $nextmonday) => $nextmonday,
                  date("W", $thirdmonday) => $thirdmonday,
                  date("W", $fourthmonday) => $fourthmonday);


$vistuge = (isset($_GET["uge"], $allweeks[$_GET["uge"]]) ? $_GET["uge"] : date("W"));
Avatar billede showsource Seniormester
03. oktober 2011 - 19:00 #6
klikke på en =>  klikke på en dag i ugen
Avatar billede Asger Carlsen Nybegynder
03. oktober 2011 - 19:08 #7
#5 Skal lige være sikker på jeg har forstået det korrekt. Du hentede så alle de vagter der fantes inden for en given uge, og gemte dem i et array. Så du kun sammenlignede med de enkelte vager, og ikke hele databasen? Lyder smart.

Hvordan opbyggede du så din tabel til at vise vagterne? og hvordan sammenlignede du med dine data gemt i array?
04. oktober 2011 - 08:05 #8
coder_carl, ja i #4 giver du så nogle relevante oplysninger, således at jeg kan forholde mig til det stillede spørgsmål.  Nu siger du, at din oversigt kun skal være med røde og grønne felter.  Hvis du skal igang for alvor ville jeg have troet, at det var mere nyttigt i hvert felt at skrive oplysninger om reservationen, for eksempel

tidspunkt mandag tirsdag
0800  Asger-beton  Hans-søm
0815  Asger-beton
0830
0845
0900  Jorn -vinduer

Og det kan sikkert programmeres.  Uheldigvis viste det sig, at min formodning var forkert, at det ikke ville være så svært at lave.  Jeg har nu brugt en del tid på det, men jeg må stoppe.  Jeg indser, at det bliver for komplekst og tidsrøvende til at gøre som hobby for at svare på et spørgsmål.

Men jeg har arbejdet med php funktionerne date() og mktime().  Jeg definerede $dage = 7 (antal dage du vil kikke fremad) og $s = mktime(7,0,0) (hvis læssepladsen åbner klokken 7 om morgenen) og $perioder = 32 (hvis arbejdsdagen er 32 kvarter = 8 timer lang), og så lavede jeg en løkke:

for($i = 0; $i < $perioder; $i++)
{
  $starttid = date("Y-m-d H:i:s", $s);
  echo date("H:i", $s) . " - ";
  $reserved = mysql_query("SELECT navn, formål FROM bookings WHERE '$starttid' >= start AND '$starttid' < slut");
  echo mysql_result($reserved, 0, 0);
  echo ", ";
  echo mysql_result($reserved, 0, 1);
  echo "<br>";
  $s = $s + 15*60;
}

og det gav dette (baseret på en test tabel jeg havde lavet):

08:00 - ,
08:15 - ,
08:30 - Asger, Beton
08:45 - Asger, Beton
09:00 - Asger, Beton
09:15 - ,
09:30 - Asger, Affald
09:45 - ,
10:00 - ,
10:15 - ,
10:30 - Asger, Træ
10:45 - Asger, Træ
11:00 - ,
11:15 - ,
11:30 - Jorn, Mursten
11:45 - Jorn, Mursten

Så skal det placeres i en tabel og udvides til de syv dage, men så langt kom jeg ikke.

Jeg håber du får det løst, enten ved hjælp fra andre medlemmer, ved selv at pusle med det, eller ved at betale en for at gøre det.
Avatar billede Asger Carlsen Nybegynder
04. oktober 2011 - 09:57 #9
#8: Jeg havde bestemt heller ikke forventet et færdigt system, der var lige til at smide ind på min side. Skulle have et lille skub i den rigtige retning.

Kan se på det du har lavet, det ikke virker helt håbløst hvad jeg havde tænkt mig. Var godt klar over det ville blive lidt komplekst, så skulle lige sikre mig jeg ikke var på vej ned af et sidespor inden jeg kom alt for langt.

Du skal have mange tak for hjælpen. Nu har jeg noget at gå udfra, så må jeg se om jeg ikke kan få resten stykket sammen. Læg et svar, så du kan få del i point. Det ender nok med en deler.
04. oktober 2011 - 10:50 #10
Svar fra mig.
Avatar billede showsource Seniormester
05. oktober 2011 - 09:32 #11
Jeg har tabellerne, tjenere og vagter
tjenere => id, navn
vagter => id, dato, start, slut, godkendt, brugerid
dato er DATE felt
start og slut er TIME felt
godkendt er int, er vagten endeligt aftalt? 0 eller 1
brugerid er id fra tjener tabel


$weeksec = 604800;
$nextmonday = strtotime("next Monday");
$firstmonday = ($nextmonday-$weeksec);
$thirdmonday = ($nextmonday+$weeksec);
$fourthmonday = ($nextmonday+($weeksec*2));

$allweeks = array(date("W", $firstmonday) => $firstmonday,
                  date("W", $nextmonday) => $nextmonday,
                  date("W", $thirdmonday) => $thirdmonday,
                  date("W", $fourthmonday) => $fourthmonday);


$vistuge = (isset($_GET["uge"], $allweeks[$_GET["uge"]]) ? $_GET["uge"] : date("W"));


$lastday = ($allweeks[$vistuge]+$weeksec)-1;

$ugevagt_sql = "SELECT * FROM vagter WHERE dato BETWEEN '".date("Y-m-d", $allweeks[$vistuge])."' AND '".date("Y-m-d", $lastday)."' ORDER BY dato, start ASC";

$weekrows = mysql_query($ugevagt_sql) or die (mysql_error());
$ugevagter = array();

    if(mysql_num_rows($weekrows) > 0) {
        while($d = mysql_fetch_object($weekrows)) {
        $ugevagter[$d->dato][$d->bruger][] = array(substr($d->start,0,5),substr($d->slut,0,5),$d->godkendt,$d->id);
        }
    }

mysql_free_result($weekrows);

$usql = "SELECT * FROM tjenere ORDER BY navn ASC";
$waiters = mysql_query($usql) or die (mysql_error());
$tjenere = array();

if(mysql_num_rows($waiters) > 0) {

    while($u = mysql_fetch_object($waiters)) {

    $tjenere[$u->id] = $u->navn;

    }

}

mysql_free_result($waiters);

Jeg kunne godt lave et kald til mysql, og nøjes med et array, men fandt det nemmere med to.

Det gi'r f.eks:

$allweeks:
Array
(
    [40] => 1317592800
    [41] => 1318197600
    [42] => 1318802400
    [43] => 1319407200
)

$tjenere:
Array
(
    [27] => Farid
    [25] => Gabriella
    [1] => Helena
    [5] => Kiowa
    [3] => Klink
    [23] => Mie
    [16] => Sara
    [26] => Sax
    [2] => Steff
    [24] => Stine
    [9] => Suz/Mar
    [17] => Toke
)

$ugevagter:
Array
(
    [2011-10-03] => Array
        (
            [3] => Array
                (
                    [0] => Array
                        (
                            [0] => 11:00
                            [1] => 19:00
                            [2] => 1
                            [3] => 17
                        )

                )

            [2] => Array
                (
                    [0] => Array
                        (
                            [0] => 19:00
                            [1] => 02:00
                            [2] => 1
                            [3] => 18
                        )

                )

        )

    [2011-10-05] => Array
        (
            [2] => Array
                (
                    [0] => Array
                        (
                            [0] => 11:00
                            [1] => 19:00
                            [2] => 1
                            [3] => 19
                        )

                )

            [3] => Array
                (
                    [0] => Array
                        (
                            [0] => 19:00
                            [1] => 02:00
                            [2] => 1
                            [3] => 20
                        )

                )

        )

    [2011-10-06] => Array
        (
            [1] => Array
                (
                    [0] => Array
                        (
                            [0] => 21:00
                            [1] => 02:00
                            [2] => 0
                            [3] => 25
                        )

                )

        )

    [2011-10-07] => Array
        (
            [2] => Array
                (
                    [0] => Array
                        (
                            [0] => 11:00
                            [1] => 16:30
                            [2] => 1
                            [3] => 22
                        )

                    [1] => Array
                        (
                            [0] => 20:00
                            [1] => 03:00
                            [2] => 0
                            [3] => 31
                        )

                )

            [24] => Array
                (
                    [0] => Array
                        (
                            [0] => 18:30
                            [1] => 03:00
                            [2] => 0
                            [3] => 30
                        )

                )

        )

)

bruger så en forløkke til at opbygge en tabel
Avatar billede showsource Seniormester
05. oktober 2011 - 09:38 #12
En forløkke til at lave første row med ugedag og dato
en forløkke til at vise hver tjener på hvert row, og inde i den igen en forløkke til at lave en celle for hver dag, og her tjekker jeg om tjener har en eller flere vagter pågældende dag.
Avatar billede showsource Seniormester
05. oktober 2011 - 10:08 #13
Et screendump af resultat:
http://showsource.dk/exp/vagter.jpg
Avatar billede Asger Carlsen Nybegynder
05. oktober 2011 - 12:38 #14
showsource /> Det var en smart måde at gøre det på. Du har så bare en enkelt vagt pr. celle, hvor jeg skal have det bredt lidt ud. Det burde dog være til at kunne klare. Nu du har givet mig din kode, må jeg så "låne" dele af den, til at strikke mit eget sammen?

Princippet er jo det samme, jeg kunne bare godt tænke mig det lidt mere detaljeret omkring tiden, eftersom jeg kun har en plads.
Avatar billede showsource Seniormester
05. oktober 2011 - 13:18 #15
Du bruger selvf. løs af kode hvis du vil!
På screenshot kan du se et + ved første tid. Det bruges til at tilføje endnu en tid samme dag. ( Javascript og hidden div med formular )
Og ved "steff" Fre. d. 7 er der netop to tider

Det jeg har lavet, kan alle og enhver umiddelbart rette i.
Avatar billede Asger Carlsen Nybegynder
05. oktober 2011 - 18:16 #16
Jeg kan se på det hele der er noget ide i at begrænse de enkelte bookinger på til en dag, det vil lette gevaldigt på kompleksiteten af koden. Skal man bruge mere end 1 hel dag, må man så lave en booking mere.

Jeg siger mange tak for hjælpen, har rigeligt at gå videre med.

#Showsource /> Læg et svar så må du dele med Christian. 50/50 er vel fair?
Avatar billede showsource Seniormester
05. oktober 2011 - 18:55 #17
Ok, og go' "nørd lyst" :O)
Avatar billede showsource Seniormester
14. oktober 2011 - 12:19 #18
Med min måde at hente fremtidige uge numre, tages der ikke højde for sommmertids skift!

I dag, d. 14-10, ender man med en time for lidt for fjerde uge.
Det løses ved at bruge strtotime() hele vejen, i stedet for at lægge ugesekunder til.

<?php

$weeksec = 604800;
$nextmonday = strtotime("next Monday");
echo date("d-m-Y H:i:s", $nextmonday)."<br>";

$firstmonday = ($nextmonday-$weeksec);
echo date("d-m-Y H:i:s", $firstmonday)."<br>";

$thirdmonday = ($nextmonday+$weeksec);
echo date("d-m-Y H:i:s", $thirdmonday)."<br>";

$fourthmonday = ($nextmonday+($weeksec*2));
echo date("d-m-Y H:i:s", $fourthmonday)."<p>";

// Løsning:
// http://dk.php.net/manual/en/function.strtotime.php#105344

$thisweek = strtotime(date("o-\\WW"));

$thismonday = date("Y-m-d H:i:s", $thisweek);
echo "<br>Uge ".date("W", $thisweek)." ".$thismonday;

$nextmonday = strtotime($thismonday." +1 week");
echo "<br>Uge ".date("W Y-m-d H:i:s", $nextmonday);

$thirdmonday = strtotime($thismonday." +2 week");
echo "<br>Uge ".date("W Y-m-d H:i:s", $thirdmonday);

$fourthmonday = strtotime($thismonday." +3 week");
echo "<br>Uge ".date("W Y-m-d H:i:s", $fourthmonday);

?>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester