• User Newbie

    Turni Rotativi con PHP

    Buongiorno a tutti, mi rivolgo a voi più esperti di me in PHP. Avrei da sviluppare una piccola web application che permette di creare un maniera automatica una serie di turni rotativi.
    mi spiego meglio:
    ho 3 carrelli i quali sono assegnati in 3 posti precisi. ho 40 persone che sono assegnate ai tre carrelli. la applicazione deve assegnare in maneira automatica queste 40 persone ai tre carrelli senza ripetersi e senza tralasciare nessuno prima di rimettere uno stesso nome.
    Non so se sono riuscito a spiegarmi bene. Spero di si 🙂
    come posso fare? mi date una dritta?
    grazie in ogni caso e a presto!
    Guido


  • Moderatore

    Ciao atahualpa, benvenuto nel Forum GT. 🙂

    • Le persone possono essere assegnate a uno qualsiasi dei carrelli o ci sono vincoli?
    • Le persone devono essere assegnate a tutti i carrelli o a qualunque carrello? (Cioè, dopo essere state assegnate al carrello A devono essere assegnate anche a B e/o C oppure a uno quasiasi dei 3?)
    • Esistono vincoli di tempo o di altro tipo ovvero i singoli carrelli (le risorse) hanno uno stato libero/occupato/... ? (Cioè, per assegnare una persona a un carrello occorre che questo si liberi?)
      A seconda della risposta all'ultima domanda potrebbero servire altre informazioni. (Es. lo stato dei 3 carreli varia contemporanemente o sono 3 risorse separate, ciascuno con il proprio stato?)

  • User Newbie

    Innanzitutto grazie per il benvenuto e per la risposta. allora passo a spiegare meglio:

    • Le persone possono essere assegnate a uno qualsiasi dei carrelli o ci sono vincoli?
      qualsiasi carrello
    • Le persone devono essere assegnate a tutti i carrelli o a qualunque carrello? (Cioè, dopo essere state assegnate al carrello A devono essere assegnate anche a B e/o C oppure a uno quasiasi dei 3?)
      qualsiasi dei tre, ma prima di essere assegnati allo stesso o ad un altro devo passare prima tutti gli altri 39.
    • Esistono vincoli di tempo o di altro tipo ovvero i singoli carrelli (le risorse) hanno uno stato libero/occupato/... ? (Cioè, per assegnare una persona a un carrello occorre che questo si liberi?)
      si, ad ogni carrello vanno due persone, e se ci sono loro non si possono assegnare altri. es. carrello 1 ha assegnate risorsa 1 e risorsa2, e quindi la risorsa 3 non può essere assegnata in quello stesso momento a quel carrello passerebbe al carrello 2.

    Spero di esseremi spiegato bene, altrimenti chiedimi che ti rispondo. io non so proprio come fare. ed un aiuto mi darebbe un grande contributo.
    ciao dall'Ecuador.


  • Moderatore

    Innazitutto saluti all'Ecuador. :smile5:
    Ho alcune domande:

    1. Quando si libera un carrello?
      Es. Carrello 1 ha Persona1 e Persona2. In attesa ci sono Persona3 e Persona4 che potrebbero essere assegnate a Carrello 1. Tralasciando gli altri carrelli e le altre persone, quando si libera Carrello1? Chiedo cioè se c'è un evento o comunque da cosa è governato il cambio di stato occupato/libero.

    2. Il cambio di stato per i 3 carrelli avviene contemporaneamente oppure l'evoluzione dello stato è indipendente per i 3 carrelli?

    3. Sempre sul cambio di stato come da domanda 1), il valore della variabile di stato per il carrello (libero/occupato) è un input dall'esterno oppure è determinata all'interno del tuo programma?

    4. Alla fine qual è l'output che vuoi ottenere? Es. ad ogni step info sui carrelli e le persone assegnate a ciascun carrello...


  • User Newbie

    muchas gracias por los saludos! 😉
    allora ogni carrello ha un orario fisso, ti faccio un esempio piu concreto
    Carrello 1: orario 7.30-10.30 lunedi nel luogo A - presenti risorsa 1 e risorsa 2, eventualmente risorsa 3 come jolly
    Carrello 2: orario 7.30-10.30 lunedi nel luogo B- presenti risorsa 4 e risorsa 5, eventualmente risorsa 6 come jolly
    Carrello 3: orario 7.30-10.30 lunedi nel luogo C- presenti risorsa 7 e risorsa 8, eventualmente risorsa 9 come jolly

    Carrello 1: orario 7.30-10.30 martedi nel luogo A - presenti risorsa 10 e risorsa 11, eventualmente risorsa 12 come jolly
    Carrello 2: orario 7.30-10.30 martedi nel luogo B- presenti risorsa 13 e risorsa 14, eventualmente risorsa 15 come jolly
    Carrello 3: orario 7.30-10.30 martedi nel luogo C- presenti risorsa 16 e risorsa 17, eventualmente risorsa 18 come jolly

    e cosi via, finite le 40 risorse si reinizia con la prima. non importando in che carrello va. esempio:
    Carrello 1: orario 7.30-10.30 martedi nel luogo A - presenti risorsa 37 e risorsa 38, eventualmente risorsa 39 come jolly
    Carrello 2: orario 7.30-10.30 martedi nel luogo B- presenti risorsa 40 e risorsa 1, eventualmente risorsa 2 come jolly
    Carrello 3: orario 7.30-10.30 martedi nel luogo C- presenti risorsa 3 e risorsa 4, eventualmente risorsa 5 come jolly

    in modo che nessuna risorsa si ripete fino a che non è finito il giro completo.

    1. lo stato del carrello dipende dal fatto che abbia le risorse assegnate, se le ha è occupato.
    2. i dati di output dovrebbero essere:
      lunedi:
      Carrello 1 con risorsa 1 risorsa 2 e jolly risorsa 3
      Carrello 2 con risorsa 4 risorsa 5 e jolly risorsa 6
      Carrello 3 con risorsa 7 risorsa 8 e jolly risorsa 9
      e cosi via per gli altri giorni.

    il problema per me è l'assegnazione dei turni delle risorse in maniera automatica e senza ripetere le risorse prima della fine del ciclo turni.


  • Moderatore

    Il jolly vale come assegnazione?
    Es. martedì risorsa 3 non deve essere assegnata perché ha fatto da jolly lunedì oppure ci deve essere?


  • User Newbie

    buona domanda... no penso che il jolly non valga come assegnazione dato che come supplente non deve partecipare a tutti i costi.


  • Moderatore

    Ok, grazie.


  • User Newbie

    grazie a te e per l'aiuto che mi puoi dare.


  • Moderatore

    Hai previsto un db per conservare queste info? nel caso mysql va bene?


  • User Newbie

    si pensavo mysql. con php è l'ideale.


  • Moderatore

    Copia e incolla in una pagina vuota, denomina il file come vuoi (es. turni.php) e lancia da locale o remoto.
    La pagina stampa la coda (serve solo come esempio) e l'array con i turni.

    Puoi cambiare i parametri:

    • numRisorse, ora impostato a 40;
    • numServenti, ora impostato a 3;
    • numRisorseServente, ora impostato a 2;
    • numeJollyServente, ora impostato a 1.

    Teoricamente potresti cambiare anche *puntatore *per fare iniziare la rotazione da una risorsa diversa dalla prima (ricorda che deve essere minore o uguale a numRisorse-1):

    • puntatore, ora impostato a 0.

    Ho dato per scontato che la coda contenesse tutte le risorse, ma di solito non è così (per evidenziare questa cosa ho impostato *numQueue *uguale a numRisorse).

    
    <!doctype html>
    <html>
        <head>
            <meta charset="utf-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
            <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
            <title>Turni rotativi con PHP</title>
            <meta name="description" content="">
            <meta name="robots" content="noindex, nofollow" />
        </head>
        <body>
            <header>
                    <h1>Turni rotativi con PHP</h1>
            </header>
            <div>
                <h2>Array della Coda</h2>
                <?php
                //Inizializza la coda con le risorse e stampa l'array $queue
                $numRisorse = 40;
                $numQueue = $numRisorse;
                for ($i=0; $i<=$numQueue-1; $i++) {
                    $queue* = 'R' . ($i+1);
                }
                ?>
                <pre>
                <?php print_r($queue); ?>
                </pre>
                
                <h2>Array dei turni</h2>
                <?php
                //Crea i turni e stampa l'array $turni
                $numServenti = 3;
                $numRisorseServente = 2;
                $numJollyServente = 1;
                $numTurni = 3;
                $puntatore = 0;
                for ($t=0; $t<=$numTurni-1; $t++) {
                    $idTurno = 'T' . ($t+1);
                    $turni = array('idTurno' => $idTurno);
                    for ($i=0; $i<=$numServenti-1; $i++) {
                        $idServente = 'S' . ($i+1);
                        $turni* = array('idServente' => $idServente);
                        for ($k=0; $k<=$numRisorseServente-1; $k++) {
                            $idRisorsaServente = $queue[$puntatore];
                            $turni*[$k] = array ('idRisorsaServente' => $idRisorsaServente, 'statoRisorsaServente' => '1');
                            $puntatore += 1;
                        }
                        for ($k=0; $k<=$numJollyServente-1; $k++) {
                            $z = $numRisorseServente + $k;
                            $idJollyServente = $queue[$puntatore + ($numServenti-$i-1)*($numRisorseServente)+$i*$numJollyServente + $k];
                            $turni*[$z] = array ('idJollyServente' => $idJollyServente, 'statoJollyServente' => '1');
                        }
                    }
                }
                ?>
                <pre>
                <?php print_r($turni); ?>
                </pre>
            </div>
        </body>
    </html>
    
    

    Fammi sapere come va. 🙂
    Poi se ho tempo ti faccio la versione con mysql.


  • User Newbie

    ma sei un mito!! non so come ringraziarti davvero. oggi lo provo. per mysql provo io a fare le connessioni, altrimenti ti farò toc toc un'altra volta. se potessi fare qualcosa io per te...


  • Moderatore

    Ho tolto qualche riga inutile dal PHP.

    
    <!doctype html>
    <html>
        <head>
            <meta charset="utf-8" />
            <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
            <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport" />
            <title>Turni rotativi con PHP</title>
            <meta name="description" content="" />
            <meta name="robots" content="noindex, nofollow" />
        </head>
        <body>
            <header>
                <h1>Turni rotativi con PHP</h1>
            </header>
            <div>
                <h2>Array della coda</h2>
                <?php
                $numRisorse = 40;
                $numQueue = $numRisorse;
                for ($i=0; $i<=$numQueue-1; $i++) {
                    $queue* = 'R' . ($i+1);
                }
                ?>
                <pre>
                <?php print_r($queue); ?>
                </pre>
                
                <h2>Array dei turni</h2>
                <?php
                $numServenti = 3;
                $numRisorseServente = 2;
                $numJollyServente = 1;
                $numTurni = 3;
                $puntatore = 0;
                for ($t=0; $t<=$numTurni-1; $t++) {
                    for ($i=0; $i<=$numServenti-1; $i++) {
                        for ($k=0; $k<=$numRisorseServente-1; $k++) {
                            $idRisorsaServente = $queue[$puntatore];
                            $turni*[$k] = array ('idRisorsaServente' => $idRisorsaServente, 'statoRisorsaServente' => '1');
                            $puntatore += 1;
                        }
                        for ($k=0; $k<=$numJollyServente-1; $k++) {
                            $z = $numRisorseServente + $k;
                            $idJollyServente = $queue[$puntatore + ($numServenti-$i-1)*($numRisorseServente)+$i*$numJollyServente + $k];
                            $turni*[$z] = array ('idJollyServente' => $idJollyServente, 'statoJollyServente' => '1');
                        }
                    }
                }
                ?>
                <pre>
                <?php print_r($turni); ?>
                </pre>
            </div>
        </body>
    </html>