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

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
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?
 

macus_adi

Utente Attivo
5 Dic 2017
1.320
88
48
IT/SW
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
)

)
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
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:

macus_adi

Utente Attivo
5 Dic 2017
1.320
88
48
IT/SW
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
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
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!
 

macus_adi

Utente Attivo
5 Dic 2017
1.320
88
48
IT/SW
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.
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
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 ;)
 

marino51

Utente Attivo
28 Feb 2013
3.001
173
63
Lombardia
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:

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
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!
 

macus_adi

Utente Attivo
5 Dic 2017
1.320
88
48
IT/SW
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:

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
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!
 

macus_adi

Utente Attivo
5 Dic 2017
1.320
88
48
IT/SW
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:

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
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!
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
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:

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
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!
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
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;
}
?>
 

marino51

Utente Attivo
28 Feb 2013
3.001
173
63
Lombardia
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
 

marino51

Utente Attivo
28 Feb 2013
3.001
173
63
Lombardia
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
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
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
Autore Titolo Forum Risposte Data
P Funzione jQuery Ajax invio file a php jQuery 1
M Utilizzare la funzione mysql_num_rows() in PHP 5 PHP 3
D Come usare funzione php PHP 6
Shyson Modificare funzione php PHP 15
pjtertdj Visualizzazione dati in php da mysql con funzione matematica in javascript PHP 1
L Problema funzione mail() PHP PHP 3
L [PHP] problema count messo in una funzione. PHP 1
Monital funzione php si ripete due volte PHP 6
GiErre [PHP] [HTML] Disabilitare un link in funzione della piattaforma PHP 7
Monital Funzione php e campo database come variabile PHP 6
M PHP - Funzione non e scrive il risultato PHP 3
F [PHP] La funzione setcookie PHP 0
C [RISOLTO][PHP] Funzione ONclick PHP 14
A [PHP] Problema invio mail con funzione mail() PHP 3
C richiamare una funzione in un altro script php PHP 1
S [PHP] errore funzione sleep PHP 5
MarcoGrazia [PHP] Verifica dell'input utente tramite funzione generica. PHP 0
B [PHP]la pagina php non si carica se aggiungo funzione while PHP 10
A Chiamata funzione PHP con onclick PHP 8
alexbrasile PHP convertire la funzione fsockopen in curl PHP 0
Gaetano1991h [PHP] Chi mi sa spiegare la funzione di questo codice? PHP 1
M [PHP] Errore nell' assegnazione della variabile $this->id su una funzione PHP 1
trattorino [PHP] funzione per visualizzare solo carattere PHP 2
S PHP: inviare via email contenuto di una funzione PHP 4
A Chiamare una specifica funzione in una pagina php PHP 1
G Problema php relativo a funzione di un pulsante PHP 8
D PHP:funzione che opera una query su argomento PHP 8
JackIlPazzo Chiamare una funzione specifica di php da una richiesta ajax? PHP 2
M Far partire una funzione/codice php con javascript Javascript 1
JackIlPazzo Eseguire funzione php senza ricaricare pagina? PHP 3
neo996sps [PHP e funzioni con PDO] Funzione per generare corpo tabella PHP 1
V Chiamata funzione php da javascript Ajax 3
X Conversione funzione php PHP 0
M Disabilitare alcune funzione php da scipt PHP 3
gandalf1959 funzione mail() e variabili su un link nel body in formato xxx.php?$a=$codicecontrollo PHP 2
C Limiti funzione mail() di php PHP 1
P Passare un valore, o arriare una funzione da pagina2.php in pagina1.php Javascript 2
M Applicare funzione php ad ogni elemto html Ajax 3
B AIUTO: come passare una variabile php ad una funzione javascript Javascript 2
F funzione javascript all'interno di un codice php PHP 38
G funzione include di php e paramentri variabili PHP 4
X NOW() funzione mysql eseguita da php PHP 6
I Richiamare funzione jquery all'invio del form php Javascript 6
S php problemi di funzione header usando la fuzione di jquery post PHP 4
S problema con funzione php PHP 3
A Funzione exec di php, errore 127 PHP 0
M PhP Problema funzione mssql PHP 5
H Funzione php non viene richiamata! PHP 41
C Funzione PHP non ottiene nomi da puntatori PHP 1
andre9004 richiamare funzione js da php PHP 2

Discussioni simili