[PHP]Funzione di calcolo prezzo di una camera in un range di date

forse l'errore è qui:
PHP:
or ($i=1;$i<$diff->days;$i++)
ho eliminato = da
PHP:
<=$diff
ed il totale adesso lo da corretto. Pensi sia giusto?
 
Scusami.... ma vedi in debug come processano i dati... cmq il risultato esce corrette con le date che mi hai dato e il codice che ho postato...
Ripeto forse dovresti capire cosa fa il codice, e magari riesci a fare quello che chiedi....
Cmq qui "ignorando la room (in quanto mi sembra di aver capito che esistono più room e più strutture)" ci sta il codice funzionante, con il risultato.... Ti posto l'output, che altro non fa presa una collection di dati calcola i prezzi e li ordina per il più basso....
Naturalmente per ovviare sovrascritture nell'array ti ritroverai:
array[totale]=[array_room_x,array_rom_y];


Codice:
Array
(
[calcolo] => Array
(
[13] => Array
(
[0] => stdClass Object
(
[id] => 2
[struttura] => 1
[room_id] => 2
[price_sun] => 8
[price_mon] => 8
[price_tue] => 5
[price_wed] => 10
[price_thu] => 6
[price_fri] => 5
[price_sat] => 22
[price] => Array
(
[operation] => Array
(
[plus] => Array
(
[custom] => 0
[normal] => 13
)

[minus] => Array
(
[sconto] => 0
[type] => percentage
[ship_0] => 1
)

)

[total] => 13
[per_night] => 6.5
)

[custom] => Array
(
)

[date] => Array
(
[in] => 2019-01-28
[out] => 2019-01-29
)

)

)

[15] => Array
(
[0] => stdClass Object
(
[id] => 3
[struttura] => 2
[room_id] => 3
[price_sun] => 5
[price_mon] => 10
[price_tue] => 5
[price_wed] => 5
[price_thu] => 4
[price_fri] => 1
[price_sat] => 11
[price] => Array
(
[operation] => Array
(
[plus] => Array
(
[custom] => 0
[normal] => 15
)

[minus] => Array
(
[sconto] => 0
[type] => percentage
[ship_0] => 1
)

)

[total] => 15
[per_night] => 7.5
)

[custom] => Array
(
)

[date] => Array
(
[in] => 2019-01-28
[out] => 2019-01-29
)

)

)

[100] => Array
(
[0] => stdClass Object
(
[id] => 4
[struttura] => 3
[room_id] => 1
[price_sun] => 50
[price_mon] => 50
[price_tue] => 50
[price_wed] => 50
[price_thu] => 50
[price_fri] => 50
[price_sat] => 55
[price] => Array
(
[operation] => Array
(
[plus] => Array
(
[custom] => 0
[normal] => 100
)

[minus] => Array
(
[sconto] => 0
[type] => percentage
[ship_0] => 1
)

)

[total] => 100
[per_night] => 50
)

[custom] => Array
(
)

[date] => Array
(
[in] => 2019-01-28
[out] => 2019-01-29
)

)

)

[120] => Array
(
[0] => stdClass Object
(
[id] => 6
[struttura] => 2
[room_id] => 4
[price_sun] => 60
[price_mon] => 60
[price_tue] => 60
[price_wed] => 60
[price_thu] => 60
[price_fri] => 60
[price_sat] => 60
[price] => Array
(
[operation] => Array
(
[plus] => Array
(
[custom] => 0
[normal] => 120
)

[minus] => Array
(
[sconto] => 0
[type] => percentage
[ship_0] => 1
)

)

[total] => 120
[per_night] => 60
)

[custom] => Array
(
)

[date] => Array
(
[in] => 2019-01-28
[out] => 2019-01-29
)

)

)

[170] => Array
(
[0] => stdClass Object
(
[id] => 7
[struttura] => 4
[room_id] => 1
[price_sun] => 25
[price_mon] => 25
[price_tue] => 25
[price_wed] => 25
[price_thu] => 25
[price_fri] => 25
[price_sat] => 25
[price] => Array
(
[operation] => Array
(
[plus] => Array
(
[custom] => 120
[normal] => 50
)

[minus] => Array
(
[sconto] => 0
[type] => percentage
[ship_0] => 1
)

)

[total] => 170
[per_night] => 85
)

[custom] => Array
(
[0] => stdClass Object
(
[id] => 10
[ref_room] => 7
[room_id] => 1
[certain_date] => 2019-01-28
[price] => 60
)

[1] => stdClass Object
(
[id] => 11
[ref_room] => 7
[room_id] => 1
[certain_date] => 2019-01-29
[price] => 60
)

)

[date] => Array
(
[in] => 2019-01-28
[out] => 2019-01-29
)

)

)

[254] => Array
(
[0] => stdClass Object
(
[id] => 5
[struttura] => 2
[room_id] => 2
[price_sun] => 58
[price_mon] => 59
[price_tue] => 55
[price_wed] => 65
[price_thu] => 66
[price_fri] => 20
[price_sat] => 25
[price] => Array
(
[operation] => Array
(
[plus] => Array
(
[custom] => 140
[normal] => 114
)

[minus] => Array
(
[sconto] => 0
[type] => percentage
[ship_0] => 1
)

)

[total] => 254
[per_night] => 127
)

[custom] => Array
(
[0] => stdClass Object
(
[id] => 6
[ref_room] => 5
[room_id] => 2
[certain_date] => 2019-01-28
[price] => 70
)

[1] => stdClass Object
(
[id] => 7
[ref_room] => 5
[room_id] => 2
[certain_date] => 2019-01-29
[price] => 70
)

)

[date] => Array
(
[in] => 2019-01-28
[out] => 2019-01-29
)

)

)

[310] => Array
(
[0] => stdClass Object
(
[id] => 1
[struttura] => 1
[room_id] => 1
[price_sun] => 70
[price_mon] => 70
[price_tue] => 70
[price_wed] => 70
[price_thu] => 70
[price_fri] => 70
[price_sat] => 70
[price] => Array
(
[operation] => Array
(
[plus] => Array
(
[custom] => 170
[normal] => 140
)

[minus] => Array
(
[sconto] => 0
[type] => percentage
[ship_0] => 1
)

)

[total] => 310
[per_night] => 155
)

[custom] => Array
(
[0] => stdClass Object
(
[id] => 1
[ref_room] => 1
[room_id] => 1
[certain_date] => 2019-01-28
[price] => 80
)

[1] => stdClass Object
(
[id] => 2
[ref_room] => 1
[room_id] => 1
[certain_date] => 2019-01-29
[price] => 90
)

)

[date] => Array
(
[in] => 2019-01-28
[out] => 2019-01-29
)

)

)

)

[room] => Array
(
[0] => stdClass Object
(
[id] => 1
[struttura] => 1
[room_id] => 1
[price_sun] => 70
[price_mon] => 70
[price_tue] => 70
[price_wed] => 70
[price_thu] => 70
[price_fri] => 70
[price_sat] => 70
)

[1] => stdClass Object
(
[id] => 2
[struttura] => 1
[room_id] => 2
[price_sun] => 8
[price_mon] => 8
[price_tue] => 5
[price_wed] => 10
[price_thu] => 6
[price_fri] => 5
[price_sat] => 22
)

[2] => stdClass Object
(
[id] => 3
[struttura] => 2
[room_id] => 3
[price_sun] => 5
[price_mon] => 10
[price_tue] => 5
[price_wed] => 5
[price_thu] => 4
[price_fri] => 1
[price_sat] => 11
)

[3] => stdClass Object
(
[id] => 4
[struttura] => 3
[room_id] => 1
[price_sun] => 50
[price_mon] => 50
[price_tue] => 50
[price_wed] => 50
[price_thu] => 50
[price_fri] => 50
[price_sat] => 55
)

[4] => stdClass Object
(
[id] => 5
[struttura] => 2
[room_id] => 2
[price_sun] => 58
[price_mon] => 59
[price_tue] => 55
[price_wed] => 65
[price_thu] => 66
[price_fri] => 20
[price_sat] => 25
)

[5] => stdClass Object
(
[id] => 6
[struttura] => 2
[room_id] => 4
[price_sun] => 60
[price_mon] => 60
[price_tue] => 60
[price_wed] => 60
[price_thu] => 60
[price_fri] => 60
[price_sat] => 60
)

[6] => stdClass Object
(
[id] => 7
[struttura] => 4
[room_id] => 1
[price_sun] => 25
[price_mon] => 25
[price_tue] => 25
[price_wed] => 25
[price_thu] => 25
[price_fri] => 25
[price_sat] => 25
)

)

[options] => Array
(
[0] => stdClass Object
(
[id] => 1
[ref_room] => 1
[room_id] => 1
[certain_date] => 2019-01-28
[price] => 80
)

[1] => stdClass Object
(
[id] => 2
[ref_room] => 1
[room_id] => 1
[certain_date] => 2019-01-29
[price] => 90
)

[2] => stdClass Object
(
[id] => 3
[ref_room] => 2
[room_id] => 2
[certain_date] => 2019-01-14
[price] => 35
)

[3] => stdClass Object
(
[id] => 4
[ref_room] => 3
[room_id] => 3
[certain_date] => 2019-01-23
[price] => 22
)

[4] => stdClass Object
(
[id] => 5
[ref_room] => 4
[room_id] => 1
[certain_date] => 2019-01-22
[price] => 50
)

[5] => stdClass Object
(
[id] => 6
[ref_room] => 5
[room_id] => 2
[certain_date] => 2019-01-28
[price] => 70
)

[6] => stdClass Object
(
[id] => 7
[ref_room] => 5
[room_id] => 2
[certain_date] => 2019-01-29
[price] => 70
)

[7] => stdClass Object
(
[id] => 8
[ref_room] => 5
[room_id] => 2
[certain_date] => 2019-01-30
[price] => 50
)

[8] => stdClass Object
(
[id] => 9
[ref_room] => 7
[room_id] => 1
[certain_date] => 2019-01-27
[price] => 50
)

[9] => stdClass Object
(
[id] => 10
[ref_room] => 7
[room_id] => 1
[certain_date] => 2019-01-28
[price] => 60
)

[10] => stdClass Object
(
[id] => 11
[ref_room] => 7
[room_id] => 1
[certain_date] => 2019-01-29
[price] => 60
)

)

[data_post] => Array
(
[room] => 1
[start_date] => 2019-01-28
[end_date] => 2019-01-29
)

)
 
Allora sicuramente sono io che non mi sono spiegato bene.
La funzione non calcola correttamente il totale del prezzo perchè quando prende i prezzi custom comunque li va a sommare a quelli di default e così non dovrebbe essere.
Ti posto l'output, che altro non fa presa una collection di dati calcola i prezzi e li ordina per il più basso....

Sicuramente li ordina per il più basso ma quando richiedi il totale complessivo in relazione alle date selezionate, se ci sono prezzi custom li somma a quelli di default ed il risultato è errato.
Es. in room il prezzo per tutti i giorni della settimana è di 70 euro.
In room_custom_price per il giorno 2019-08-27 ed il giorno 2019-08-28 ho impostato rispettivamente i prezzi di 80euro e 90euro.
Quindi il calcolo dovrebbe essere :
1 notte a 70
2 notte a 70
3 notte a 80
4 notte a 90
Totale 310 Euro mentre la funzione mi calcola un totale di 450 Euro

Tutta la funzione è stata creata per ottenere come obbiettivo finale il totale complessivo dei prezzi data e custom con la condizione di escludere i prezzi data nei giorni in cui sono presenti prezzi custom e la funzione che mi hai linkato questo non lo fa.
 
Ultima modifica:
Forse non mi sono spiegato io, o forse non leggi il codice.....
QUI : https://perms.madi-solution.it/test_calcolo ho aggiunto una funzioncina per stampare i dati.... controlla!
PARAMETRI IN INGRESSO:
Codice:
[date] => Array
(
[in] => 2019-01-28
[out] => 2019-01-29
)

DATI DELLA ROOM
Codice:
[id] => 1
[struttura] => 1
[room_id] => 1
[price_sun] => 70
[price_mon] => 70
[price_tue] => 70
[price_wed] => 70
[price_thu] => 70
[price_fri] => 70
[price_sat] => 70

Se avessi approfondito ciò che ho scritto, ti saresti sicuramente accorto che nella chiave "price" ci sono 2 valori:
Codice:
[price] => Array
(
[operation] => Array
(
[plus] => Array
(
[custom] => 170
[normal] => 140
)

[minus] => Array
(
[sconto] => 0
[type] => percentage
[ship_0] => 1
)

)

[total] => 310
[per_night] => 155
)
Il custom non è altro che la somma delle date prese in esame e filtrate dalla query:
Codice:
[custom] => Array
(
[0] => stdClass Object
(
[id] => 1
[ref_room] => 1
[room_id] => 1
[certain_date] => 2019-01-28
[price] => 80
)

[1] => stdClass Object
(
[id] => 2
[ref_room] => 1
[room_id] => 1
[certain_date] => 2019-01-29
[price] => 90
)

)
Facendo la somma
PHP:
//valore 140                                  valore 170              = 310
$data->price['custom']+$data->price['normale'] = X
 
il fatto che abbia messo in discussione da neofita il risultato è che non avevo compreso l'esistenza della funzione che calcola i due price. Il tuo codice lo leggo e come ( questa notte ho fatto le 3 :) ) solo che mi ci vuole un tantino in più per comprenderlo e mi scuso se ti sono sembrato invasivo. In ogni caso mi leggo di nuovo tutto e ti aggiorno. Grazie mille!
 
il fatto che abbia messo in discussione da neofita il risultato è che non avevo compreso l'esistenza della funzione che calcola i due price.
No anzi hai sollevato un fattore che non avevo considerato, quindi assolutamente ben venute le osservazioni...
Qui di codice tuo non se ne vede, quindi l'aiuto è relativo alla tua capacità di elaborare le informazioni che ti vengono passate...
Ti ho chiesto anche in privato se era possibile vedere "l'applicazione/funzione" per verificare eventuali bug, il tutto senza aver risposta alcuna...
Cmq sul link per semplificare ho messo le tabelle, naturalmente ho aggiunto anche l'informazione struttura che prima era stata omessa.
 
Si hai ragione ma il messaggio che mi hai inviato l'ho letto solo adesso. Adesso testo il tutto e ti invio anche il link ;)
 
se poi volessi staccarti da una logica di "programmazione" per una più attinente logica "operativa"
upload_2019-1-22_14-45-43.png
upload_2019-1-22_14-50-42.png

upload_2019-1-22_14-46-19.png
upload_2019-1-22_14-47-14.png
upload_2019-1-22_14-47-54.png


upload_2019-1-22_14-48-37.png
upload_2019-1-22_14-49-20.png
upload_2019-1-22_14-50-5.png


qui trovi il codice
PHP:
<?php
require_once 'myUtils/show_vars.php';

/* ---------------------------------------- */

$room       = "1";

$start_date = "2019-08-26"; // data di arrivo
$end_date   = "2019-08-30"; // data di partenza

roomPriceCalc($room, $start_date, $end_date);

echo "<h3>TOTAL PRICE : ".$totPrice."</h3>";


/* ---------------------------------------- */

function roomPriceCalc($room, $start_date, $end_date)
{
    global $totPrice, $roomPrices;

    $date_in  = new DateTime($start_date);     // data arrivo
    $date_out = new DateTime($end_date);       // data partenza

    $nights     = $date_out->diff($date_in);   // numero di pernottamenti
    $nights     = $nights->d;

    echo "<br />data di arrivo : "  .$start_date
       . "<br />data di partenza : ".$end_date
       . "<br />pernottamenti : "   .$nights
       . "<br /><br />";

/* ---------------------------------------- connessione al db */

    $hostname = "localhost";
    $pass     = "PASSWORD";
    $muser    = "USER";
    $db       = "DB";

    //$mysqli = new mysqli($hostname, $muser, $pass, $db);
    //if (mysqli_connect_errno()) { die("Failed to connect to MySQL: " . mysqli_connect_error() ); }


/* ---------------------------------------- legge il prezzo standard della camera */

    $query = "SELECT price_sun, price_mon, price_tue, price_wed, price_thu, price_fri, price_sat"    
           . "  FROM room"
           . " WHERE id = ".$room;

    //$stdPrices = $mysqli->query($query)->fetch_all(MYSQLI_NUM); // prezzi elencati da domenica = 0 a sabato = 6
    $stdPrices = array(90, 10, 20, 30, 40, 50, 60);
    echo "<h3>Room standard prices</h3>".show_var( $stdPrices )."<br />";


/* ---------------------------------------- legge lo sconto standard della camera */

    $query = "SELECT rebate_sun, rebate_mon, rebate_tue, rebate_wed, rebate_thu, rebate_fri, rebate_sat"    
           . "  FROM room"
           . " WHERE id = ".$room;

    //$stdRebates = $mysqli->query($query)->fetch_all(MYSQLI_NUM); // sconti elencati da domenica = 0 a sabato = 6
    $stdRebates = array(9, 0, 0, 0, 4, 5, 6);
    echo "<h3>Room standard rebates</h3>".show_var( $stdRebates )."<br />";


/* ---------------------------------------- crea la tabella dei prezzi e sconti per periodo */

    $dtAdd = 0;
    $roomPrices = array();
    for ($dt=0; $dt<$nights; $dt++)
    {
        $day = $date_in->modify("+".$dtAdd." day");
        $df  = $day->format("Y-m-d");
        $num = $day->format('w');

        $roomPrices[$df]["date"]       = $df;                    // giorno esaminato

        $roomPrices[$df]["label"]      = $day->format('l');      // giorno

        $roomPrices[$df]["wDay"]       = $num;                   // numero del giorno, da domenica = 0 a sabato = 6

        $roomPrices[$df]["stdPrice"]   = $stdPrices[$num];       // prezzo standard dalla tabella "room"

        $roomPrices[$df]["stdRebate"]  = $stdRebates[$num];      // sconto standard dalla tabella "room"

        $roomPrices[$df]["cusPrice"]   = 0;                      // prezzo custom dalla tabella "room_custom_price"

        $roomPrices[$df]["cusRebate"]  = 0;                      // sconto custom dalla tabella "room_custom_price"

        $dtAdd = 1;
    }
    echo "<h3>Room prices - step 1</h3>".show_var( $roomPrices )."<br />";


/* ---------------------------------------- legge il prezzo e lo sconto custom del periodo per la camera */

    $query = "SELECT certain_date, price, rebate"
           . "  FROM room_custom_price"
           . " WHERE room_id = ".$room
           . "   AND (certain_date BETWEEN '".$start_date."' AND '".$end_date."')"
           . " ORDER BY certain_date ASC";

    //$cusPrices = $mysqli->query($query)->fetch_all(MYSQLI_ASSOC); // prezzi custom elencati per data
    $cusPrices = array(
        0 => array( "certain_date" => "2019-08-28", "price" => 111 , "rebate" => 0 ),
        1 => array( "certain_date" => "2019-08-29", "price" => 222 , "rebate" => 5 ),
        2 => array( "certain_date" => "2019-08-30", "price" => 333 , "rebate" => 8 ) );
    echo "<h3>Custom prices</h3>".show_var( $cusPrices )."<br />";


/* ---------------------------------------- aggiorna la tabella con il prezzo e lo sconto custom */

    foreach ($cusPrices as $k=>$items)
    {
        $df = $items["certain_date"];                           // riprende la data per aggiornare la tabella

        if ( !empty( $roomPrices[$df] ) )
        {
            $roomPrices[$df]["cusPrice"]  = $items["price"];    // prezzo custom dalla tabella "room_custom_price"

            $roomPrices[$df]["cusRebate"] = $items["rebate"];   // sconto custom dalla tabella "room_custom_price"
        }
    }
    echo "<h3>Room prices - step 2</h3>".show_var( $roomPrices )."<br />";


/* ---------------------------------------- calcola il prezzo finale */

    $totPrice = 0;

    foreach ($roomPrices as $df=>$items)
    {
        $Rebate = $Rebate = $items["stdRebate"];                             // sceglie lo sconto da applicare
        if ( !empty( $items["cusRebate"] ) ) $Rebate = $items["cusRebate"];  // prevale lo sconto custom

        if ( empty( $Rebate ) ) { $roomPrices[$df]["stdFinal"] = $items["stdPrice"]; }
        else                    { $roomPrices[$df]["stdFinal"] = round( $items["stdPrice"] * (1 - $Rebate / 100), 2 ); }


        $Rebate = 0;
        if ( !empty( $items["cusRebate"] ) ) $Rebate = $items["cusRebate"];  // applica lo sconto custom sul prezzo custom

        if ( empty( $Rebate ) ) { $roomPrices[$df]["cusFinal"] = $items["cusPrice"]; }
        else                    { $roomPrices[$df]["cusFinal"] = round( $items["cusPrice"] * (1 - $Rebate / 100), 2 ); }


        $roomPrices[$df]["totFinal"] = $roomPrices[$df]["stdFinal"];         // sceglie il prezzp da applicare, prevale custom
        if ( !empty( $roomPrices[$df]["cusFinal"] ) ) { $roomPrices[$df]["totFinal"] = $roomPrices[$df]["cusFinal"]; }


        $totPrice += $roomPrices[$df]["totFinal"];
    }
    echo "<h3>Room prices - step 3</h3>".show_var( $roomPrices )."<br />";

    return;
}
?>

qui trovi lo script "show_vars.php" da includere
https://forum.mrw.it/threads/show_var-e-log_var.50370/
 
Ultima modifica:
Fantastico! Prima però vorrei procedere per gradi. Già sto impazzendo su come tirare fuori tutti gli Array della funzione di calcolo con un ciclo while. Appena terminato mi dedico anche a questa tua nuova funzione che sicuramente è piu articolata da quel che vedo ma più completa. Appena rientro mi salvo i file. Grazie!
 
Se si decidesse di "sommare" uno o più sconti e/o gestire uno o più custom price con stesse date il "modello" rappresentato risulta incompleto...

HP:
stanza 1 dal 28/01/2019 al 29/01/2019 prezzo "da asserzione precedente = 70€*2 = 140 prezzo normale";
"aggiunta 1" - custom price del 28/01/2019 + 80
"aggiunta 2" -custom price del 29/01/2019 + 90
_______________________________________
=310 il "modello" funziona....
Con l'aggiunta di un nuovo custom price rientrante sulle stesse date
es:
"aggiunta 3" -custom price del 28/01/2019 + 1 (magari riferita ad un servizio valido solo per quel giorno)
__________________________
QUI il "modello" si ferma....

(vedi anche sconti....)
.....Forse mi sbaglio...
 
Ultima modifica:
Help my :( ho provato a leggere un po in giro su come estrarre i parametri degli array creati dalla funzione cal_price.
Ho provato e riprovato con un ciclo while cambiando anche le query ma nulla.
Potresti indicarmi la strada per estrarre i valori?
Es anche
PHP:
$nomecamera=array( ...
e prezzi normal e custom.
Poi successivamente passerò a provare con l'altra funzione altrimenti non ci capisco più nulla. Grazie!
 
PHP:
foreach ($result as $prezzo=>$strutture){
   foreach ($strutture as $chiave=>$valore){
      echo $prezzo .' '.$valore['struttura'].' '.$valore['room_id'].' '.$valore['price']['total'].' '.$valore['price']['operation']['plus']['normal'].' '.$valore['price']['operation']['plus']['custom'].'<br>';
   }
}

Per compliance aggiungo la mia funzione per la stampa dell'array...
generare una funzione dal nome "random_string()", per CI effettuare il load di string_helper (funzione inclusa nel file)
PHP:
function print_($my_array,$class='table-info',$primary_class='container-fluid'){
   echo '<script>function toggle_this(data){var element = document.getElementsByClassName(data);for(var i in element){element[i].classList.toggle(\'d-none\');}}</script>';
   echo '<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css" type="text/css" rel="stylesheet" />';
   echo '<div class="'.$primary_class.'"><div class="row"><div class="col-md-12"> ';
   my_print_r($my_array,$class);
   echo '</div></div></div>';
}
function my_print_r($my_array,$class="table-primary") {
   if(is_object($my_array))$my_array=get_object_vars($my_array);
   if (is_array($my_array)) {
      echo "<table class='table ".$class." table-bordered' width=100%>";
      $id_collapsemaster=random_string('alnum',24);
      echo '<tr><td colspan=2 ><b style="cursor: pointer;" onclick="toggle_this(\''.$id_collapsemaster.'\')">ARRAY</b></td></tr>';
      foreach ($my_array as $k => $v) {
         echo '<tr class="'.$id_collapsemaster.' d-none">
            <td valign="top" style="width:40px;">';
         $id_collapse=random_string('alnum',24);
         echo '<b style="cursor: pointer;" onclick="toggle_this(\''.$id_collapse.'\')">' . $k . '</strong></td><td class="'.$id_collapse.'">';
         my_print_r($v,$class);
         echo "</td></tr>";
      }
      echo "</table>";
      return;
   }
   echo $my_array;
}

//prima iterazione -> carica css e funzione js
print_(['foo'=>'bar','foo1'=>['bar','uno']]);

//seconda iterazione
my_print_r(['foo'=>'bar','foo1'=>['bar','uno']]);
I container sono tutti chiusi.... cliccare sull'item desiderato per visualizzare il contenuto.
 
Ultima modifica:
Ok Marcus, grazie per la dritta. Il mio problema è principalmente familiarizzare con le funzioni e gli array.
Fino ad oggi ho sempre scritto codice da autodidatta con semplici query select, update e condizioni if.
Vedo che la costruzione delle funzioni rende il tutto molto più semplice e versatile.
Mi metto a lavoro. Grazie!
 
ma il result
PHP:
foreach ($result as $prezzo=>$strutture){
lo prendo da un ciclo ?
PHP:
while($row = $result->fetch_assoc()) {
Su quale query poi ? perchè c'è ne sono due. Una per price normal e l'altra per custom.

Inoltre io non ho integrato la tabella strutture e quindi non so se la funzione da errori a priori.
Io comunque sto lavorando ancora su https://perms.madi-solution.it/_a/test/index.php ma senza tabella strutture.
 
Ultima modifica:
Allora riguardando i post ho deciso di lavorare sull'ultimo script che hai postato con gli sconti.
ho aggiornato le tabelle e modificato i valori degli array relativi alla prima select price room con select e ciclo while.

Questo il tuo codice:
PHP:
    $query = "SELECT price_sun, price_mon, price_tue, price_wed, price_thu, price_fri, price_sat"   
           . "  FROM room"
           . " WHERE id = ".$room;

    //$stdPrices = $mysqli->query($query)->fetch_all(MYSQLI_NUM); // prezzi elencati da domenica = 0 a sabato = 6
    $stdPrices = array(90, 10, 20, 30, 40, 50, 60);
    echo "<h3>Room standard prices</h3>".show_var( $stdPrices )."<br />";

Questo il mio codice e funziona. Finalmente inizio a scrivere anch'io un pò di codice :)
PHP:
$query = "SELECT price_sun, price_mon, price_tue, price_wed, price_thu, price_fri, price_sat"   
           . "  FROM room"
           . " WHERE id = ".$room;
        $result = $mysqli->query($query);// prezzi elencati da domenica = 0 a sabato = 6
 while($row = $result->fetch_assoc()) {
    extract($row);
    $stdPrices = array($row["price_sun"],$row["price_mon"],$row["price_tue"],$row["price_wed"],$row["price_thu"],$row["price_fri"],$row["price_sat"]);
}

Continuo e ti aggiorno!
 
Eccola e funzionante. Credi vada bene in questo modo?
PHP:
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
require_once 'test2.php';

/* ---------------------------------------- */

$room       = "1";

$start_date = "2019-08-26"; // data di arrivo
$end_date   = "2019-08-30"; // data di partenza

roomPriceCalc($room, $start_date, $end_date);

echo "<h3>TOTAL PRICE : ".$totPrice."</h3>";


/* ---------------------------------------- */

function roomPriceCalc($room, $start_date, $end_date)
{
    global $totPrice, $roomPrices;

    $date_in  = new DateTime($start_date);     // data arrivo
    $date_out = new DateTime($end_date);       // data partenza

    $nights     = $date_out->diff($date_in);   // numero di pernottamenti
    $nights     = $nights->d;

    echo "<br />data di arrivo : "  .$start_date
       . "<br />data di partenza : ".$end_date
       . "<br />pernottamenti : "   .$nights
       . "<br /><br />";

/* ---------------------------------------- connessione al db */

  $hostname = "HOST";
    $pass     = "PASSWORD";
    $muser    = "USERDB";
    $db       = "DB";
   $mysqli = new mysqli($hostname, $muser, $pass, $db);
  if (mysqli_connect_errno()) { die("Failed to connect to MySQL: " . mysqli_connect_error() ); }


/* ---------------------------------------- legge il prezzo standard della camera */

    $query = "SELECT price_sun, price_mon, price_tue, price_wed, price_thu, price_fri, price_sat"   
           . "  FROM room"
           . " WHERE id = ".$room;
        $result = $mysqli->query($query);// prezzi elencati da domenica = 0 a sabato = 6
 while($row = $result->fetch_assoc()) {
    extract($row);
    $stdPrices = array($row["price_sun"],$row["price_mon"],$row["price_tue"],$row["price_wed"],$row["price_thu"],$row["price_fri"],$row["price_sat"]);
}

  
  
    echo "<h3>Room standard prices</h3>".show_var( $stdPrices )."<br />";

/* ---------------------------------------- legge lo sconto standard della camera */
    $query2 = "SELECT rebate_sun, rebate_mon, rebate_tue, rebate_wed, rebate_thu, rebate_fri, rebate_sat FROM room WHERE id =$room";
    
        $result2 = $mysqli->query($query2);// prezzi elencati da domenica = 0 a sabato = 6
 while($row2 = $result2->fetch_assoc()) {
    extract($row2);
    $stdRebates = array($row2["rebate_sun"],$row2["rebate_mon"],$row2["rebate_tue"],$row2["rebate_wed"],$row2["rebate_thu"],$row2["rebate_fri"],$row2["rebate_sat"]);
}

    //$stdRebates = array(9, 0, 0, 0, 4, 5, 6);
    echo "<h3>Room standard rebates</h3>".show_var( $stdRebates )."<br />";


/* ---------------------------------------- crea la tabella dei prezzi e sconti per periodo */

    $dtAdd = 0;
    $roomPrices = array();
    for ($dt=0; $dt<$nights; $dt++)
    {
        $day = $date_in->modify("+".$dtAdd." day");
        $df  = $day->format("Y-m-d");
        $num = $day->format('w');

        $roomPrices[$df]["date"]       = $df;                    // giorno esaminato

        $roomPrices[$df]["label"]      = $day->format('l');      // giorno

        $roomPrices[$df]["wDay"]       = $num;                   // numero del giorno, da domenica = 0 a sabato = 6

        $roomPrices[$df]["stdPrice"]   = $stdPrices[$num];       // prezzo standard dalla tabella "room"

        $roomPrices[$df]["stdRebate"]  = $stdRebates[$num];      // sconto standard dalla tabella "room"

        $roomPrices[$df]["cusPrice"]   = 0;                      // prezzo custom dalla tabella "room_custom_price"

        $roomPrices[$df]["cusRebate"]  = 0;                      // sconto custom dalla tabella "room_custom_price"

        $dtAdd = 1;
    }
    echo "<h3>Room prices - step 1</h3>".show_var( $roomPrices )."<br />";


/* ---------------------------------------- legge il prezzo e lo sconto custom del periodo per la camera */

    $query3 = "SELECT certain_date, price, rebate"
           . "  FROM room_custom_price"
           . " WHERE room_id = ".$room
           . "   AND (certain_date BETWEEN '".$start_date."' AND '".$end_date."')"
           . " ORDER BY certain_date ASC";

              $result3 = $mysqli->query($query3);// prezzi elencati da domenica = 0 a sabato = 6
 while($row3 = $result3->fetch_assoc()) {
    extract($row3);
    $cusPrices[] = array("certain_date" => $row3["certain_date"],"price" => $row3["price"] ,"rebate" => $row3["rebate"]);
}
    echo "<h3>Custom prices</h3>".show_var( $cusPrices )."<br />";

/* ---------------------------------------- aggiorna la tabella con il prezzo e lo sconto custom */

    foreach ($cusPrices as $k=>$items)
    {
        $df = $items["certain_date"];                           // riprende la data per aggiornare la tabella

        if ( !empty( $roomPrices[$df] ) )
        {
            $roomPrices[$df]["cusPrice"]  = $items["price"];    // prezzo custom dalla tabella "room_custom_price"

            $roomPrices[$df]["cusRebate"] = $items["rebate"];   // sconto custom dalla tabella "room_custom_price"
        }
    }
    echo "<h3>Room prices - step 2</h3>".show_var( $roomPrices )."<br />";


/* ---------------------------------------- calcola il prezzo finale */

    $totPrice = 0;

    foreach ($roomPrices as $df=>$items)
    {
        $Rebate = $Rebate = $items["stdRebate"];                             // sceglie lo sconto da applicare
        if ( !empty( $items["cusRebate"] ) ) $Rebate = $items["cusRebate"];  // prevale lo sconto custom

        if ( empty( $Rebate ) ) { $roomPrices[$df]["stdFinal"] = $items["stdPrice"]; }
        else                    { $roomPrices[$df]["stdFinal"] = round( $items["stdPrice"] * (1 - $Rebate / 100), 2 ); }


        $Rebate = 0;
        if ( !empty( $items["cusRebate"] ) ) $Rebate = $items["cusRebate"];  // applica lo sconto custom sul prezzo custom

        if ( empty( $Rebate ) ) { $roomPrices[$df]["cusFinal"] = $items["cusPrice"]; }
        else                    { $roomPrices[$df]["cusFinal"] = round( $items["cusPrice"] * (1 - $Rebate / 100), 2 ); }


        $roomPrices[$df]["totFinal"] = $roomPrices[$df]["stdFinal"];         // sceglie il prezzp da applicare, prevale custom
        if ( !empty( $roomPrices[$df]["cusFinal"] ) ) { $roomPrices[$df]["totFinal"] = $roomPrices[$df]["cusFinal"]; }


        $totPrice += $roomPrices[$df]["totFinal"];
    }
    echo "<h3>Room prices - step 3</h3>".show_var( $roomPrices )."<br />";

    return;
}
?>
 
si, va bene, controlla la parte finale dove viene calcolato il costo applicando gli sconti,
le regole presenti le ho decise sulla base del "buon senso" ma potrebbero differire da chi le usa realmente

in ogni caso hai tutti i passaggi visualizzati con la funzione "show_var" quindi puoi controllare bene tutti i risultati

quest'ultima funzione tienitela come standard tra i tools da utilizzare, perché ti fa vedere come sono impostate le array e ti aiuta a "leggerle" é molto semplice da richiamare, vedi gli "echo"

se hai bisogno ancora, fatti vivo
 
solo una variazione intravista ora, c'é un doppio uguale ..
PHP:
    $totPrice = 0;

    foreach ($roomPrices as $df=>$items)
    {
        $Rebate = $Rebate = $items["stdRebate"];                             // sceglie lo sconto da applicare

modifica con  

        $Rebate = $items["stdRebate"];                             // sceglie lo sconto da applicare
 
Ok ho modificato la riga. Thx!
Quando cambiavo il room id e il room id non aveva prezzi custom ricevevo questi errori :
PHP:
Notice: Undefined variable: cusPrices in /home/bedcom/public_html/test.php on line 121
Warning: Invalid argument supplied for foreach() in /home/bedcom/public_html/test2.php on line 8
Notice: Undefined variable: cusPrices in /home/bedcom/public_html/test.php on line 127
Warning: Invalid argument supplied for foreach() in /home/bedcom/public_html/test.php on line 127
Per risolvere ho inserito la condizione if result prima di eseguire il ciclo while e il foreach .
PHP:
/* ---------------------------------------- legge il prezzo e lo sconto custom del periodo per la camera */

    $query3 = "SELECT certain_date, price, rebate"
           . "  FROM room_custom_price"
           . " WHERE room_id = ".$room
           . "   AND (certain_date BETWEEN '".$start_date."' AND '".$end_date."')"
           . " ORDER BY certain_date ASC";

              $result3 = $mysqli->query($query3);// prezzi elencati da domenica = 0 a sabato = 6
              if ($result3->num_rows > 0) {
 while($row3 = $result3->fetch_assoc()) {
    extract($row3);
    $cusPrices[] = array("certain_date" => $row3["certain_date"],"price" => $row3["price"] ,"rebate" => $row3["rebate"]);
}
    echo "<h3>Custom prices</h3>".show_var( $cusPrices )."<br />";



/* ---------------------------------------- aggiorna la tabella con il prezzo e lo sconto custom */

    foreach ($cusPrices as $k=>$items)
    {
        $df = $items["certain_date"];                           // riprende la data per aggiornare la tabella

        if ( !empty( $roomPrices[$df] ) )
        {
            $roomPrices[$df]["cusPrice"]  = $items["price"];    // prezzo custom dalla tabella "room_custom_price"

            $roomPrices[$df]["cusRebate"] = $items["rebate"];   // sconto custom dalla tabella "room_custom_price"
        }
    }
    echo "<h3>Room prices - step 2</h3>".show_var( $roomPrices )."<br />";
}

/* ---------------------------------------- calcola il prezzo finale */
Che pensi sia giusto così oppure c'è un'altra soluzione?
 
Ultima modifica:

Discussioni simili