MRW.it Forum
  • Home
  • Forum
  • Fare Web
  • PHP

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

  • Creatore Discussione Creatore Discussione maxnegri
  • Data di inizio Data di inizio 19 Gen 2019
  • Tag Tag
    calcolo funzione prezzo
Prec.
  • 1
  • 2
  • 3
  • 4
Succ.
Primo Prec. 3 di 4 Succ. Ultimo
maxnegri

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
  • 22 Gen 2019
  • #41
macus_adi ha scritto:
Manca questo nel get_diff_Date
Clicca per allargare...
No manca ho preso l'intero codice aggiornato dal tuo link .

il risultato total è
PHP:
 ["total"]=> float(450)

mentre dovrebbe essere 310
 
Ad
maxnegri

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
  • 22 Gen 2019
  • #42
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

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
  • 22 Gen 2019
  • #43
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
  • 22 Gen 2019
  • #44
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.
macus_adi ha scritto:
Ti posto l'output, che altro non fa presa una collection di dati calcola i prezzi e li ordina per il più basso....
Clicca per allargare...

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.
maxnegri ha scritto:
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
Clicca per allargare...

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: 22 Gen 2019

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
  • 22 Gen 2019
  • #45
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
  • 22 Gen 2019
  • #46
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.343
91
48
IT/SW
  • 22 Gen 2019
  • #47
maxnegri ha scritto:
il fatto che abbia messo in discussione da neofita il risultato è che non avevo compreso l'esistenza della funzione che calcola i due price.
Clicca per allargare...
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
  • 22 Gen 2019
  • #48
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.205
207
63
Lombardia
  • 22 Gen 2019
  • #49
se poi volessi staccarti da una logica di "programmazione" per una più attinente logica "operativa"





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: 22 Gen 2019

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
  • 22 Gen 2019
  • #50
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.343
91
48
IT/SW
  • 22 Gen 2019
  • #51
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: 22 Gen 2019

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
  • 22 Gen 2019
  • #52
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.343
91
48
IT/SW
  • 22 Gen 2019
  • #53
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: 23 Gen 2019

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
  • 22 Gen 2019
  • #54
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
  • 22 Gen 2019
  • #55
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: 22 Gen 2019

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
  • 22 Gen 2019
  • #56
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
  • 22 Gen 2019
  • #57
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.205
207
63
Lombardia
  • 23 Gen 2019
  • #58
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.205
207
63
Lombardia
  • 23 Gen 2019
  • #59
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
  • 23 Gen 2019
  • #60
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: 23 Gen 2019
Prec.
  • 1
  • 2
  • 3
  • 4
Succ.
Primo Prec. 3 di 4 Succ. Ultimo
Devi accedere o registrarti per poter rispondere.

Discussioni simili

[Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress
  • Lino80
  • 9 Gen 2023
  • Offerte e Richieste di Lavoro e/o Collaborazione
Risposte
0
Visite
3K
Offerte e Richieste di Lavoro e/o Collaborazione 9 Gen 2023
Lino80
P
Funzione jQuery Ajax invio file a php
  • Peterrey76
  • 9 Mar 2021
  • jQuery
Risposte
1
Visite
3K
jQuery 9 Mar 2021
Max 1
M
Utilizzare la funzione mysql_num_rows() in PHP 5
  • miagy
  • 16 Ago 2020
  • PHP
Risposte
3
Visite
1K
PHP 17 Ago 2020
Hormus
H
D
Come usare funzione php
  • dilaila
  • 21 Lug 2020
  • PHP
Risposte
6
Visite
1K
PHP 22 Lug 2020
dilaila
D
Modificare funzione php
  • Shyson
  • 2 Apr 2020
  • PHP
Risposte
15
Visite
2K
PHP 3 Apr 2020
marino51
Visualizzazione dati in php da mysql con funzione matematica in javascript
  • pjtertdj
  • 31 Lug 2019
  • PHP
Risposte
1
Visite
1K
PHP 31 Lug 2019
Max 1
L
Problema funzione mail() PHP
  • lorenzocanal24
  • 8 Mag 2019
  • PHP
Risposte
3
Visite
2K
PHP 10 Mag 2019
marino51
L
[PHP] problema count messo in una funzione.
  • luigi777
  • 17 Dic 2018
  • PHP
Risposte
1
Visite
1K
PHP 18 Dic 2018
macus_adi
funzione php si ripete due volte
  • Monital
  • 24 Nov 2018
  • PHP
Risposte
6
Visite
2K
PHP 25 Nov 2018
Monital
[PHP] [HTML] Disabilitare un link in funzione della piattaforma
  • GiErre
  • 21 Nov 2018
  • PHP
Risposte
7
Visite
2K
PHP 20 Dic 2018
macus_adi
Funzione php e campo database come variabile
  • Monital
  • 13 Nov 2018
  • PHP
Risposte
6
Visite
1K
PHP 16 Nov 2018
Monital
M
PHP - Funzione non e scrive il risultato
  • mendia
  • 28 Ott 2018
  • PHP
Risposte
3
Visite
2K
PHP 3 Nov 2018
mendia
M
F
[PHP] La funzione setcookie
  • francesco1976
  • 1 Ott 2018
  • PHP
Risposte
0
Visite
2K
PHP 1 Ott 2018
francesco1976
F
C
  • Bloccata
[RISOLTO][PHP] Funzione ONclick
  • Coby
  • 18 Ago 2018
  • PHP
Risposte
14
Visite
3K
PHP 23 Ago 2018
Max 1
A
[PHP] Problema invio mail con funzione mail()
  • Alex@1983
  • 17 Ago 2018
  • PHP
Risposte
3
Visite
5K
PHP 24 Ago 2018
borgo italia
C
richiamare una funzione in un altro script php
  • cosmo98
  • 1 Giu 2018
  • PHP
Risposte
1
Visite
5K
PHP 4 Giu 2018
bubino8
S
[PHP] errore funzione sleep
  • steve97
  • 26 Mar 2018
  • PHP
Risposte
5
Visite
1K
PHP 27 Mar 2018
borgo italia
[PHP] Verifica dell'input utente tramite funzione generica.
  • MarcoGrazia
  • 21 Set 2017
  • PHP
Risposte
0
Visite
2K
PHP 21 Set 2017
MarcoGrazia
B
[PHP]la pagina php non si carica se aggiungo funzione while
  • blablabla
  • 5 Apr 2017
  • PHP
Risposte
10
Visite
2K
PHP 5 Apr 2017
marino51
A
Chiamata funzione PHP con onclick
  • Andrea Crocco
  • 27 Feb 2017
  • PHP
Risposte
8
Visite
7K
PHP 28 Feb 2017
otto9due
Condividi:
Facebook X (Twitter) LinkedIn WhatsApp e-mail Condividi Link
  • Home
  • Forum
  • Fare Web
  • PHP
  • Italiano
  • Termini e condizioni d'uso del sito
  • Policy Privacy
  • Aiuto
  • Home
Community platform by XenForo® © 2010-2024 XenForo Ltd. | Traduzione a cura di XenForo Italia
Menu
Accedi

Registrati

  • Home
  • Forum
    • Nuovi Messaggi
    • Cerca...
  • Novità
    • Featured content
    • Nuovi Messaggi
    • Ultime Attività
X

Privacy & Transparency

We use cookies and similar technologies for the following purposes:

  • Personalized ads and content
  • Content measurement and audience insights

Do you accept cookies and these technologies?

X

Privacy & Transparency

We use cookies and similar technologies for the following purposes:

  • Personalized ads and content
  • Content measurement and audience insights

Do you accept cookies and these technologies?