[ danield @ 12.11.2013. 14:19 ] @
Postovani,

Potrebno mi je samo da postavim ispravne uslove ukoliko je neki termin popunjen.

Imam radno vreme i usluge koje mogu da traju jednokratno ili dvokratno (trajanje usluge, trajanje pauze - za vreme pauze moze da se ubaci druga usluga ukoliko je njeno trajanje isto ili krace kao vreme pauze i imam vreme nastavka trajanja usluge).
Radno vreme izlistavam kroz while petlju. Sve sam uspeo napraviti, osim ovih uslova.

Da li je neko imao iskustva sa time?

Ja sam zakomplikovao jako, ali imam osecaj da to sve moze mnogo jednostavnije.

Unapred hvala!
[ deZio @ 12.11.2013. 14:33 ] @
Nije mi jasno kako možeš ubaciti neku uslugu za vreme pauze? Zar pauza nije pauza, tj. ne radi se u toku pauze? :D

Da li imaš već definisane mysql tabele ili na koji način sačuvavaš podatke?
[ danield @ 12.11.2013. 14:41 ] @
U pitanju je frizerski salon, npr satiranje rade pola sata, onda pola sata stoji farba ili ne znam ni ja sta, a dok stoji farba on moze drugoga da radi i posle pola sata nastavlja sa istim.

Imam, evo kod, ali ne znam koliko ce biti jasan:

Code:
<?php 
                        $usluznik=$_POST['usluznik'];
                        $datum=$_POST['datum'];
                        $imeiprezime=$_POST['imeiprezime'];
                        $telefon=$_POST['telefon'];
                         $sql="SELECT a.*, b.*, c.* FROM `cenovnik` AS a 
                INNER JOIN `usluge` AS b ON a.`idUsluge`=b.`idUsluge`
                INNER JOIN `usluznik` AS c ON a.`idUsluznika`=c.`idUsluznika` WHERE a.`idUsluge`='".$idUsluge."' AND a.`idUsluznika`='".$usluznik."'";
                $query=mysql_query($sql);
                $num=mysql_num_rows($query);
                $row=mysql_fetch_array($query);
                    $datumAr=explode("-",$datum);
                    $dan=$datumAr[2];
                    $mesec=$datumAr[1];
                    $godina=$datumAr[0];
                    $ukupnoTrajanje=$row['trajanjeUsluge']+$row['trajanjePauze']+$row['trajanjeNastavka'];
                        ?>
<form action="<?php echo $_SERVER['SCRIPT_URI']."?korak=3&idUsluge=".$idUsluge; ?>" method="post" enctype="multipart/form-data" name="zakazivanje3" id="zakazivanje3">
<?php 
    $tempDate = $godina."-".$mesec."-".$dan;
    $danUNedelji=date('N', strtotime( $tempDate));
    switch($danUNedelji){
        case 1:
            $danUnedeljiPrevedeno="ponedeljak";
            $danUnedeljiPrevedeno2="ponedeljom";
        break;
        case 2:
            $danUnedeljiPrevedeno="utorak";
            $danUnedeljiPrevedeno2="utorkom";
        break;
        case 3:
            $danUnedeljiPrevedeno="sreda";
            $danUnedeljiPrevedeno2="sredom";
        break;
        case 4:
            $danUnedeljiPrevedeno="četvrtak";
            $danUnedeljiPrevedeno2="četvrtkom";
        break;
        case 5:
            $danUnedeljiPrevedeno="petak";
            $danUnedeljiPrevedeno2="petkom";
        break;
        case 6:
            $danUnedeljiPrevedeno="subota";
            $danUnedeljiPrevedeno2="subotom";
        break;
        }
    echo "<p>Izabrali ste <strong>".$row['nazivUsluge']."</strong> kod <strong>".$row['imeUsluznika']." ".$row['prezimeUsluznika']."</strong> čiji je telefon <strong>".$row['telefonUsluznika']."</strong>, a cena usluge je <strong>".$row['cena']." dinara</strong>. Ukoliko želite da promenite neki od parametara, idite <a href=\"javascript:history.back();\">korak nazad</a>. Molimo izaberite željeno vreme kada želite da iskoristite uslugu dana <strong>".$dan.".".$mesec.".".$godina.".</strong> (".$danUnedeljiPrevedeno."). Usluga traje <strong>".$ukupnoTrajanje." minuta</strong>.</p>";
?>
<h3>Izaberite radno vreme</h3>
<p><?php echo $row['imeUsluznika']." ".$row['prezimeUsluznika']." ".$danUnedeljiPrevedeno2;?> radi:
<?php $sqlRadnoVreme="SELECT a.*, b.* FROM `radnoVreme` AS a 
                INNER JOIN `rasponiRadnogVremena` AS b ON a.`idrasponaRadnogVremena`=b.`idrasponaRadnogVremena`
                WHERE a.`idUsluznika`='".$row['idUsluznika']."' AND a.`danUnedelji`='".$danUNedelji."'";
                $queryRadnoVreme=mysql_query($sqlRadnoVreme);
                $rowRadnoVreme=mysql_fetch_array($queryRadnoVreme);
                    echo " <strong>".$rowRadnoVreme['nazivrasponaRadnogVremena']."</strong> od <strong>".sprintf("%02d",$rowRadnoVreme['pocetniRasponSat']).":".sprintf("%02d",$rowRadnoVreme['pocetniRasponMin'])."h</strong> do <strong>".sprintf("%02d",$rowRadnoVreme['krajnjiRasponSat']).":".sprintf("%02d",$rowRadnoVreme['krajnjiRasponMin'])."h</strong>.";?>
</p><?php 
                $sat=$rowRadnoVreme['pocetniRasponSat'];
                $ukupnoRadnoVreme=($rowRadnoVreme['krajnjiRasponSat']*60+$rowRadnoVreme['krajnjiRasponMin'])-($rowRadnoVreme['pocetniRasponSat']*60+$rowRadnoVreme['pocetniRasponMin']);
                if($ukupnoTrajanje>59){
                    $satTrajanja=1;
                    $minutTrajanja=$ukupnoTrajanje-60;
                    }
                    while($sat<$rowRadnoVreme['krajnjiRasponSat']){
                        $min=0;
                        while($min<60){
                            $prethodnoRadnoVreme=($sat*60+$min)-($rowRadnoVreme['pocetniRasponSat']*60+$rowRadnoVreme['pocetniRasponMin']);
                
                //provera da li je zauzeto
                $sqlProveri="SELECT a.*, b.* FROM `zakazivanje` AS a
                INNER JOIN `usluge` AS b ON a.`idUsluge`=b.`idUsluge`
                 WHERE a.`datum`='".$datum."' AND a.`usluznik`='".$usluznik."'";
                $queryProveri=mysql_query($sqlProveri);
                $numProveri=mysql_num_rows($queryProveri);
                //provera da li je zauzeto
                            if(($ukupnoRadnoVreme-$prethodnoRadnoVreme-$ukupnoTrajanje)>=0){
                                if($numProveri==0){$prikazi=1;}
                                if($numProveri>0){
                                    $prikazi=0;
                                while($rowProveri=mysql_fetch_array($queryProveri)){
                                    $vremeZaka=explode(":",$rowProveri['vremeZakazivanja']);
                                    $vremeZakazivanja=$vremeZaka[0]*60+$vremeZaka[1];
                                    $trenutakZakazivanja=$vremeZakazivanja-($rowRadnoVreme['pocetniRasponSat']*60+$rowRadnoVreme['pocetniRasponMin']);
                                if(($trenutakZakazivanja>($sat*60+$min)-($rowRadnoVreme['pocetniRasponSat']*60+$rowRadnoVreme['pocetniRasponMin']-$row['trajanjeUsluge'])) && ($trenutakZakazivanja+$rowProveri['trajanjeUsluge'])>(($sat*60+$min)-($rowRadnoVreme['pocetniRasponSat']*60+$rowRadnoVreme['pocetniRasponMin']))){
                                    $prikazi=1;
                                    }
                                    if($trenutakZakazivanja+$rowProveri['trajanjeUsluge']>(($sat*60+$min)-($rowRadnoVreme['pocetniRasponSat']*60+$rowRadnoVreme['pocetniRasponMin']))){
                                        $prikazi=1;
                                        }
                                }}
                                if($prikazi==1){
                            echo "<label><input name=\"vremeZakazivanja\" id=\"vremeZakazivanja\" value=\"".sprintf("%02d",$sat).":".sprintf("%02d",$min)."\" type=\"radio\"/> <span>".sprintf("%02d",$sat).":".sprintf("%02d",$min)."h </span></label>";}
                            }
                            $min=$min+15;
                            }
                        $sat++;
                        }
                ?>
                <input name="imeiprezime" type="hidden" value="<?php echo $imeiprezime; ?>" />
                <input name="telefon" type="hidden" value="<?php echo $telefon; ?>" />
                <input name="usluznik" type="hidden" value="<?php echo $usluznik; ?>" />
                <input name="datum" type="hidden" value="<?php echo $datum; ?>" />
<p class="dugmici"><a href="javascript:history.back();" class="button">Prethodni korak</a>
                <input type="submit" name="potvrdi" value="Potvrdi" class="button" /></p>
    
</form>


Problem se konkretno nalazi ovde:
Code:

                $sat=$rowRadnoVreme['pocetniRasponSat'];
                $ukupnoRadnoVreme=($rowRadnoVreme['krajnjiRasponSat']*60+$rowRadnoVreme['krajnjiRasponMin'])-($rowRadnoVreme['pocetniRasponSat']*60+$rowRadnoVreme['pocetniRasponMin']);
                if($ukupnoTrajanje>59){
                    $satTrajanja=1;
                    $minutTrajanja=$ukupnoTrajanje-60;
                    }
                    while($sat<$rowRadnoVreme['krajnjiRasponSat']){
                        $min=0;
                        while($min<60){
                            $prethodnoRadnoVreme=($sat*60+$min)-($rowRadnoVreme['pocetniRasponSat']*60+$rowRadnoVreme['pocetniRasponMin']);
                
                //provera da li je zauzeto
                $sqlProveri="SELECT a.*, b.* FROM `zakazivanje` AS a
                INNER JOIN `usluge` AS b ON a.`idUsluge`=b.`idUsluge`
                 WHERE a.`datum`='".$datum."' AND a.`usluznik`='".$usluznik."'";
                $queryProveri=mysql_query($sqlProveri);
                $numProveri=mysql_num_rows($queryProveri);
                //provera da li je zauzeto
                            if(($ukupnoRadnoVreme-$prethodnoRadnoVreme-$ukupnoTrajanje)>=0){
                                if($numProveri==0){$prikazi=1;}
                                if($numProveri>0){
                                    $prikazi=0;
                                while($rowProveri=mysql_fetch_array($queryProveri)){
                                    $vremeZaka=explode(":",$rowProveri['vremeZakazivanja']);
                                    $vremeZakazivanja=$vremeZaka[0]*60+$vremeZaka[1];
                                    $trenutakZakazivanja=$vremeZakazivanja-($rowRadnoVreme['pocetniRasponSat']*60+$rowRadnoVreme['pocetniRasponMin']);
                                if(($trenutakZakazivanja>($sat*60+$min)-($rowRadnoVreme['pocetniRasponSat']*60+$rowRadnoVreme['pocetniRasponMin']-$row['trajanjeUsluge'])) && ($trenutakZakazivanja+$rowProveri['trajanjeUsluge'])>(($sat*60+$min)-($rowRadnoVreme['pocetniRasponSat']*60+$rowRadnoVreme['pocetniRasponMin']))){
                                    $prikazi=1;
                                    }
                                    if($trenutakZakazivanja+$rowProveri['trajanjeUsluge']>(($sat*60+$min)-($rowRadnoVreme['pocetniRasponSat']*60+$rowRadnoVreme['pocetniRasponMin']))){
                                        $prikazi=1;
                                        }
                                }}
                                if($prikazi==1){
                            echo "<label><input name=\"vremeZakazivanja\" id=\"vremeZakazivanja\" value=\"".sprintf("%02d",$sat).":".sprintf("%02d",$min)."\" type=\"radio\"/> <span>".sprintf("%02d",$sat).":".sprintf("%02d",$min)."h </span></label>";}
                            }
                            $min=$min+15;
                            }
                        $sat++;
                        }
[ dusans @ 12.11.2013. 14:46 ] @
Posmatraj jednu zakazanu dvokratnu uslugu kao dve zakazane jednokratne usluge.
To rešava celu zbrku.

Ako je algoritam ispravan i radi kako treba za jednokratne usluge,
Onda, na primer, u ovom SQL Proveri vrati 2 rekorda OD-DO za dvokratne usluge ili tako nešto.
[ danield @ 12.11.2013. 14:53 ] @
Hvala :) mada mislim da mi nije samo to problem, pokusacu jos nesto :)
[ Tpojka @ 12.11.2013. 14:58 ] @
Citat:
dusans: Posmatraj jednu zakazanu dvokratnu uslugu kao dve zakazane jednokratne usluge.
To rešava celu zbrku.


Plus, treba postaviti prioritet usluge sa default-nom vrijednosti, tako da završetak dvokratnog tretmana uvijek ima prednost od novog.
[ VladaSu @ 13.11.2013. 12:44 ] @
Nema potrebe za prioritetima jer ne moze istovremeno da radi dve usluge ako jednu ne pauzira, a nije mu cilj da jednu uslugu odlaze zakazivanjem druge pa da jedna od te dve ima prioritet.
Vidim Daniele da smo iz iste ulice :)
Zbog fleksibilnosti mozda bi trebao da kod vremena izvrsenja usluge imas i vremensku toleranciju od do minuta kako bi recimo ako farba na kosi treba da odstoji 20-30 minuta.
Ako striktno stavis 20 minuta onda ne mozes ubaciti uslugu od 25 minuta. Ako stavis striktno 30 minuta onda mozda ti zafali u narednom zakzivanje vremenski interval koji je duzi za
5 minuta pa bi ti odgovarao da je ovo prvo zakazivanje 25 minuta umesto 30.
[ Tpojka @ 13.11.2013. 13:23 ] @
Ovo moje vrijedi za slučaj kad ima više radnika.
Pa tek zbog toga flag koji napominje šta neminovno sljedeće da se radi ukoliko slobodan radnik treba da preuzme dio posla (recimo pranje kose poslije farbanja).
Može da vrijedi i za za situacije kad postoje pripravnici/šegrti koji obavljaju samo određene zadatke u salonu.
A može i pojednostavljeno, zavisi kako je organizovan posao.