Avatar billede bagerens Nybegynder
14. juli 2010 - 07:58 Der er 23 kommentarer og
2 løsninger

Kun ledige klokkeslet

Hej Alle.
Jeg har lavet en kalender-funktion, hvor man skal kunne booke tider. Men det skal jo selvfølgelig kun være muligt bestille tider der er ledige. Og hvor lang tid det vare er bare en "int" i databasen. Et lille eksempel.

En klipning sidder jeg i databasen til at vare 35min. Og jeg har åben fra 8 til 16. Når man så skal bestille tid, får man en dropdown-menu ca. sådan her

8.00
8.35
9.10
9.45
osv osv

så er der en der bestiller en tid kl. 9.10, det bliver så lagt i databasen, og dropdown-menuen skal derefter være

8.00
8.35
9.45
osv osv

Hvordan gør jeg det nemmest?

vh
bageren
Avatar billede Springform Nybegynder
14. juli 2010 - 10:04 #1
Ked af at sige det men der er ingen let løsning. Der skal en spændende algoritme til for at løse problemet, som man lige skal holde tungen lige i munden for at løse.

Men frisøren skal vel også tilbyde andet end lige klipning fx. farvning, og der er jo også forskel på om det er en dame, mand eller barn der skal klippes.
Avatar billede rax Praktikant
14. juli 2010 - 10:18 #2
Skal det forstås således, at du har nogle faste intervaller dine kunder kan vælge? Det vil nemlig gøre mange ting lettere for dig, da du ikke behøver at lave beregninger på, hvornår der er ledige tider, men istedet kan lave det med "slots", som kan optages.

For at hjælpe dig mere konkret, vil det være en stor hjælp at kunne se din database struktur. Problemet kan nemlig løses meget simpelt, men på bekostning af fleksibilitet, og det kan løses en del mere kompliseret, men dermed også skabe mere fleksibilitet.

Definerer du f.eks. et felt i en tabel for hvert timeslot, vil du kunne indsætte bruger_id for den kunde der har bestilt en klipning i feltet, når kunden bestiller en klipning. Herefter kan du nemt iterere over din daglige kalender, og kun vise de felter (timeslots) i drop down listen, hvor der ikke står et bruger_id.

Som sagt, hvis du kan vise mere om hvordan din database er skruet sammen, kan vi nemmere hjælpe dig på rette vej :)

Mvh.
Kristian
Avatar billede Springform Nybegynder
14. juli 2010 - 10:27 #3
rax

Hvis jeg forstår dig ret vil du altså oprette en felt for hvert enkelt tidspunkt hvor langt frem i tiden? Det slår jo databasen ihjel.
Avatar billede Slettet bruger
14. juli 2010 - 11:40 #4
Bliver det ikke lidt vel rigidt - ALLE klipninger tager præcis 35 minutter.
- og selvom der slet ingen bookinger er for en dag, kan man ikke bestille tid til kl. 09:00 - kun til kl. 09:10...

Jeg ville nok også arbejde med "slots" - men kun á 5 minutter pr styk.
- Hvis en alm. klipning tager 35 minutter - booker man 7 slots.
- mens en .. flet & farvning tager 2½ time = 30 slots.
(Så har du også en "retfærdig" måde at prissætte ydelserne!)

MEN jeg tror dit hovedproblem er idéen om at bookingen starter i en dropdown
- det er alt for ufleksibelt, og giver overhovedet intet overblik.

Du sku' istedet vise "dagen" grafisk (en dag pr. frisør / "stol") hvor man så med musen markerer en stribe slots, som derefter skifter farve (fra grøn (ledig) til rød (booket) + mouseover: kunde + job)
Avatar billede repox Seniormester
14. juli 2010 - 11:46 #5
Idet at intervallerne er kendte, vil det mest naturlige være at identificere intervallerne - for at gøre det fleksibelt gør vi det med tiden selv.

Eksempel:
8.00 = 800
8.35 = 835
9.10 = 910
9.45 = 945
...


I din database kan du så eksempelvis have en tabel der er struktureret således:
+----------------+---------------+--------+
| reservationsId | dato (indeks) | tidsId |
+----------------+---------------+--------+
|              1 | 2010-09-08    |    800 |
|              2 | 2010-09-08    |    835 |
|              3 | 2010-09-08    |    945 |
|              3 | 2010-09-08    |  1200 |
|              3 | 2010-09-09    |    800 |
|              3 | 2010-09-09    |    910 |
|              3 | 2010-09-09    |  1125 |
|              3 | 2010-09-09    |  1235 |
|              3 | 2010-09-09    |  1445 |
|              3 | 2010-09-10    |    800 |
+----------------+---------------+--------+

Du kan jo passende udvide tabellen til at gemme navn, type af klipning eller hvad du nu har brug for.

Hent tiderne ud for en specifik dato (pseudo):
<?php

    /* Reserverede tider findes */
    $dag = date("Y-m-d");
    $sql = "SELECT reservationsId, tidsId FROM tider WHERE dato = '".$dag."' ORDER BY tidsId ASC";
    $query = mysql_query($sql);
    $reserverede_tider = array();
    while( $obj = mysql_fetch(object) )
        $reserverede_tider[] = $obj->tidsId;   

    /* Find ledige tider */

    $dag_start = mktime(8, 0, 0);
    $dag_slut = mktime(16, 0, 0);   
    $klippetid = 60*35; // 60 sekunder gange 35 minutter

    $ledige_tider = array();
    for( $i = $dag_start; $i <= $dag_slut; $i = $i + $klippetid)
    {
        if( !in_array(date("Hi", $i), $reserverede_tider) )
            $ledige_tider[date("Hi", $i)] = date("H:i", $i);
    }
?>

    <select name="tidsId">
    <?php foreach($ledige_tider as $tidsId => $tid): ?>
        <option value="<?php echo (int)$tidsId; ?>"><?php echo $tid; ?></option>
    <?php endforeach; ?>
    </select>
Avatar billede Springform Nybegynder
14. juli 2010 - 11:50 #6
Slots mener jeg også er den rigtige løsning, den frisør jeg lavede mit script for ønskede blokke af 15min, det skal tages højde for at telefonen kan ringe, kunden kommer for sent, kæmpe tykt hår osv. der er altså mange faktore der spiller ind hvilket gør det svært lige på minutten at sige hvor lang tid det tager
Avatar billede Springform Nybegynder
14. juli 2010 - 12:00 #7
repox, nu bliver det lige som rax løsning, hvilket jo sådan set vil sige at vi får uendeligt mange data i tabellen, vi kan jo ikke vide om frisøren vil bruge systemet de næste 2år eller 3000år. altså får du 17½ millioner rækker, hvor af måske kun 90% af tiderne er blevet booket, så kunne du altså have sparet knap 2millioner, jeg ved godt det måske er lidt ekstreme tal, men det er mere tanken.

I stedet skal man først smide dataen ind når tiden bliver booket, gør det også i sidste ende nemmere end at først skulle lave en funktion der fylder data ind i tabellen på forhånd.

så mit forslag er at du laver en for loop hvor du så udelader de tider som så er booket. vælger du så en tid lægger du den i databasen og bum den næste der så kommer vil ikke få denne tid vist
Avatar billede Springform Nybegynder
14. juli 2010 - 12:02 #8
damn der var jeg vist for hurtig på aftrækkeren og fik ikke læst det hele, sorry
Avatar billede rax Praktikant
14. juli 2010 - 12:26 #9
hehe, nu er det jo ikke meningen du skal oprette felterne for hver dag.. du opretter dem for én dag i en tabel, og så genbruger du den tabel. Der er jo et et-til-mange forhold mellem dag og timeslots, så det skal selvfølgelig anvendes..
Avatar billede bagerens Nybegynder
14. juli 2010 - 17:03 #10
Hejsa,
Og tusind tak for alle svarene.. Ja problemet ligger også i at tiderne er forskellige. Nemlig pga. det med at man også skal kunne få farvet hår etc.
Men havde ikke lige tænkt på den løsning med slots´ne. Og så bare laver slots af 5min. Problemet med at man f.eks. ikke skal kunne vælge tidspunkt 100% selv, er det at hvis de vælger 8.30, og det tager 30min, og en anden booker kl.9.10, er der 10min der ikke er booket.

Hvordan griber man det lige an, hvis der f.eks. er 5 frisører. Er det så bare at lave "det samme" 5 gange. en for hver frisør, og så kunden kan vælge frisør, eller en der hedder ligemeget, hvor den så selv finder en.
Avatar billede repox Seniormester
14. juli 2010 - 17:57 #11
#10
Hvis du bruger mit eksempel som udgangspunkt kan du udvide tabellen med et 'frisørId', og så udvide loopet, så det blev lidt mere specifikt. Jeg ville antage at man først skulle vælge hvilken frisør man vil booke ved inden man vælger tiden?
Så kan du gøre noget ala:
<?php

    /* Reserverede tider findes for den enkelte frisør */
    $frisorId = 1;
    $dag = date("Y-m-d");
    $sql = "SELECT reservationsId, tidsId FROM tider WHERE dato = '".$dag."' AND frisorId = ".$frisorId." ORDER BY tidsId ASC";
    $query = mysql_query($sql);
    $reserverede_tider = array();
    while( $obj = mysql_fetch(object) )
        $reserverede_tider[] = $obj->tidsId;   

    /* Find ledige tider */

    $dag_start = mktime(8, 0, 0);
    $dag_slut = mktime(16, 0, 0);   
    $klippetid = 60*35; // 60 sekunder gange 35 minutter

    $ledige_tider = array();
    for( $i = $dag_start; $i <= $dag_slut; $i = $i + $klippetid)
    {
        if( !in_array(date("Hi", $i), $reserverede_tider) )
            $ledige_tider[date("Hi", $i)] = date("H:i", $i);
    }
?>

    <select name="tidsId">
    <?php foreach($ledige_tider as $tidsId => $tid): ?>
        <option value="<?php echo (int)$tidsId; ?>"><?php echo $tid; ?></option>
    <?php endforeach; ?>
    </select>
Avatar billede Slettet bruger
14. juli 2010 - 19:26 #12
Det kan selvfølgelig aldrig blive helt perfekt, men med et godt overblik over "belægningen" kan den person som tager imod (booker) forsøge at mingelere kunderne hen i retning af fuldt hus...

Eller havde du tænkt dig at kunderne selv skulle kunne booke online ?!?
- noget mere udfordrende system, så. Men også en god service at kunne tilbyde sine kunder...

De må selvfølgelig ikke kunne se HVEM de andre kunder er (forbudt!), men hvis de blot kunne se hvornår deres favorit-frisør(er) har tid, vil de automatisk selv deltage i "optimeringen"...
Avatar billede bagerens Nybegynder
14. juli 2010 - 19:36 #13
det er netop meningen at folk skal kunne booke online
Avatar billede Slettet bruger
14. juli 2010 - 19:56 #14
Cool - ligger ret tæt op af det system jeg "pønser på" for tiden...

Hvormange frisører/stole er der, og hvordan ser åbningstiden ud - i grove træk?
- har de enkelte frisører separate "vagtplaner" - halvdags eller fri hveranden mandag f.eks. ?

Er der andre ting som skal bookes - særligt udstyr som kun kan bruges på én kunde af gangen ?
Avatar billede bagerens Nybegynder
14. juli 2010 - 20:03 #15
åbningstider er bare 10-16, med 5 frisører der arbejder fast 37 timer
Avatar billede Slettet bruger
14. juli 2010 - 20:41 #16
OK, det er jo næsten for let : )

Med 5 minutters slots på 10x10 pixels, er der rigelig plads på én skærmside til at vise en hel dag for samtlige frisører og/eller en hel uge for en enkelt frisør.

Men har du overvejet hvordan du forhindrer misbrug - folk som booker tid, men aldrig dukker op.
- Eller ondsindende konkurenter... ?
Avatar billede bagerens Nybegynder
14. juli 2010 - 21:16 #17
har tænkt over det, og tror sgu ikke svindel kan undgåes hvis folk vil.. uanset om man skal oprette sig eller sådan, kan der stadig snydes.. Det må blive noget med at man første gang ringer kunden op for at høre om de har booket tid.. Noget i den stil..
Avatar billede bagerens Nybegynder
14. juli 2010 - 21:34 #18
hvordan giver jeg lige point ;)
Avatar billede Slettet bruger
14. juli 2010 - 22:33 #19
Trust-modellen - Du har nok ret.

Det skal jo heller blive sådan, at en ellers god kunde, som én gang har misset en aftale, ikke længere "tør" komme tilbage af frygt for repressalier..

Pointsystem:
Du beder dem, som du synes har givet dig noget du ku' bruge, om at "lægge et svar".
- så kigger du ind igen i morgen, og fordeler dem - det er let.
Avatar billede bagerens Nybegynder
14. juli 2010 - 22:37 #20
ok, dem der synes, ligger et svar :)

Men ja, det kan nemt blive et kompliceret system, hvis man netop også tager højde for apparater de kun har én af osv. også at kunden jo så skal skrive præcis hvad de ønsker, da man skal booke "maskinen" der kun er én af
Avatar billede repox Seniormester
14. juli 2010 - 22:41 #21
#20
Lægger du, som spørger, virkelig op til at, os der svarer dig, selv skal vurdere hvilke(t) svar, der for dig er brugbar(e)?
Avatar billede bagerens Nybegynder
14. juli 2010 - 22:48 #22
repox og T4NK3R kan ligge et svar.. Har bare svært ved det herinde, fordi mange siger de ikke vil have point, men man selv skal svare og give sigselv.. derfor lagde jeg lidt op til det ja..
Avatar billede repox Seniormester
14. juli 2010 - 22:56 #23
Selvom det oftest er meget kompetente og dygtige mennesker med både brugbare og korrekte svar på de spørgsmål der stilles, som ofte siger 'nej tak' til point, så er jeg af den overbevisning at det underminerer det generelle formål med eksperten.dk samt den enkeltes opfattelse af etikken og moralen der bør være ved pointafgivelse. Selvom hensigten er god, giver det - som i dette tilfælde - nogle meningsløse situationer som kunne undgås ved at at mon blot fulgte konceptet; svar rigtigt, modtag point.
Avatar billede Slettet bruger
14. juli 2010 - 22:57 #24
Pas på, "can of worms" : )
Avatar billede rax Praktikant
15. juli 2010 - 09:06 #25
glad for du kunne bruge feedbacken :) har du yderligere spørgsmål, så skriver du bare.
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