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

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Scusate ma non ho inserito il titolo. Chiedo scusa!!!
ecco il titolo da inserire:
Funzione di calcolo prezzo di una camera in un range di date

Ciao a tutti, sto cercando di modificare una funzione di calcolo presa da uno script php realizzato con CodeIgniter che mi dia il risultato del prezzo totale di una camera in relazione ad una data di arrivo ed una di partenza.
Ho due tabelle:
La prima "room" che ha dei prezzi base settimanali ( price_mon,price_tue,price_wed,price_thu,price_fri,price_sat,price_sun )
La seconda "room_custom_price" che ha prezzi personalizzati base alla data ( certain_date, price )
La funzione dovrebbe calcolare primail prezzo base e poi controllare se ci sono prezzi personalizzati per poi fornire il totale.

Questa è la funzione ma non riesco a capire come mai non mi fornisce il totale:

Codice:
function calcProcess($roomId, $startDate, $endDate)    {
$startDate = new DateTime($startDate->date('Y-m-d'));   
$result['totalNight'] = 0;   
$result['totalPrice'] = 0;
$statement = " SELECT           
price_sun AS d0,           
price_mon AS d1,           
price_tue AS d2,           
price_wed AS d3,           
price_thu AS d4,           
price_fri AS d5,           
price_sat AS d6       
FROM           
room       
WHERE           
id = $roomId ";   
$statement->execute(array(                   
':id' => $roomId   
));   
$defaultPrice = $statement->fetchAssociativeArray();   
$statement->close();   
// fine
// calcolo custom price   
$statement = "       
SELECT           
certain_date,           
price       
FROM           
room_custom_price       
WHERE           
room_id = $roomId AND           
(certain_date BETWEEN :startDate AND :endDate)";   
$statement->execute(array(       
':roomId' => $roomId,       
':startDate' => $startDate->date('Y-m-d'),       
':endDate' => $endDate->date('Y-m-d')   
));   
$rows = $statement->fetchAllAssociative();   
$statement->close();   
$customPriceArray = array();   
foreach ($rows as $row) {       
$customPriceArray[$row['certain_date']] = $row['price'];   
}   
// fine
while ($startDate->format('Y-m-d') != $endDate->date('Y-m-d')) {       
$result['totalNight']++;
 if (array_key_exists($startDate->format('Y-m-d'), $customPriceArray)) {           
$result['totalPrice'] += $customPriceArray[$startDate->date('Y-m-d')];       
}      
 else {           
$result['totalPrice'] += $defaultPrice['d'.$startDate->date('w')];       
}
$startDate->modify('+1 day');   
}
return $result;           
}
var_dump($result);

Spero qualcuno possa aiutarmi. Grazie!
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Se utilizzi CI prova questa, non l'ho testata ma dovrebbe andare:
Ho utilizzato la func dell'altra volta "get_diff_Date".... Non commento è abbastanza semplice da seguire.
PHP:
function find_sconto(){
  //da implementare
   $model_return=['sconto'=>0,'type'=>'percentage','skip_zero'=>TRUE];
   return $model_return;
}
function cal_price_($room,$start_date,$end_date){
   $ci=&get_instance();
   $date_diff=get_diff_Date($start_date,$end_date);
   $model_result=
      [
         'operation'=>
            [
               'plus'=>[
                  'custom'=>0,
                  'normal'=>0
               ],
//da implementare le regole di calcolo
               'minus'=>find_sconto()
            ],
         'total'=>0,
         'per_night'=>0
      ];
   $data=$ci->db->where('id',$room)->get('room')->result_object();
   $data_custom=$ci->db->where('room_id',$room)
                       ->where('DATE(certain_date) >=',$start_date,FALSE)
                       ->where('DATE(certain_date) <=',$end_date,FALSE)
                       ->get('room_custom_price')->result_object();
   $map=['price_sun','price_mon','price_tue','price_wed','price_thu','price_fri','price_sat'];
   if(!empty($data_custom)){
      //prezzi personalizzati
      foreach ($data_custom as $k=>$items){
         $model_result['operation']['plus']['custom']+=$items->price;
      }
   }
    foreach ($data as $jey_q=>$value_q){
        foreach ($date_diff as $k=>$v){
         $model_result['operation']['plus']['normal']+=$value_q->$map[$v['day']];
      }
   }
   foreach ($model_result['operation']['plus'] as $k=>$v){
      $model_result['total']+=$v;
   }
   $model_result['per_night']=$model_result['total']/count($date_diff);
   return $model_result;
}
 
Ultima modifica:

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Ciao e grazie mille per l'interesse. Sto provando la funzione ma il risultato è sempre NULL.
Probabilmente hai aggiunto nuovi campi al db relativi agli sconti e per questo non calcola il totale?
Codice:
'sconto'=>0,'type'=>'percentage','skip_zero'=>TRUE
I nuovi campi li hai inseriti nella tabella room_custom_price ?
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Il db non l'ho creato, la funzione "find_sconto" server per avere un modello di calcolo completo...
Probabilmente hai aggiunto nuovi campi al db relativi agli sconti e per questo non calcola il totale?
No, ho lasciato a te l'onere di creare la logica di sconto e valorizzare il model!

Dovrebbe funzionare, se magari mi dai l'output riesco a vedere cosa non va!
 

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
però sistemerei le due query ( clausola where ) per renderle compatibili con "execute", nello script originale
Codice:
 FROM room
 WHERE id = :id
";

$statement->execute(array(':id' => $roomId));



 FROM room_custom_price
 WHERE room_id = :roomId AND (certain_date BETWEEN :startDate AND :endDate)
";
    $statement->execute(array(
        ':roomId'    => $roomId,
        ':startDate' => $startDate->date('Y-m-d'),
        ':endDate'   => $endDate->date('Y-m-d')));
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
a ok. Scusa come ti do l'output? io sto usando
Codice:
var_dump($model_result)
ed ottengo NULL.
Non mi da altri errori php. I campi sembrano giusti e le date sono in formato Y-m-d.
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Allora, un pò di screen così vedi cosa ho fatto.....
Da modificare nella funzione 2 punti in quanto resa generica dai miei helpers....
PHP:
//nei where eliminare il FALSE
$data_custom=$ci->db->where('room_id',$room)
                    ->where('DATE(certain_date) >=',$start_date)
                    ->where('DATE(certain_date) <=',$end_date)
                    ->get('room_custom_price')->result_object();

/******************************/
foreach ($date_diff as $k=>$v){
   foreach ($data as $jey_q=>$value_q){
     //modificare qui il $value_q->$map[$v['day']]; come mostrato
      $day=$map[$v['day']];
      $model_result['operation']['plus']['normal']+=$value_q->$day;
   }
}


/********************************************************************/


//esecuzione del codice
public function test_price(){
   $data=cal_price_(1,'2019-01-19','2019-01-22');
   print_r($data);
}

OUTPUT:
Codice:
Array
(
[operation] => Array
(
[plus] => Array
(
[custom] => 15
[normal] => 20
)

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

)

[total] => 35
[per_night] => 11.666666666667
)
Fammi sapere....
 

Allegati

  • 1_funzione.png
    1_funzione.png
    9,1 KB · Visite: 378
  • 1_result.png
    1_result.png
    11,3 KB · Visite: 388
  • 1_tabella_agg.png
    1_tabella_agg.png
    24,4 KB · Visite: 395
  • 1_tabella_room.png
    1_tabella_room.png
    18,6 KB · Visite: 383

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Nulla mi sa che sto facendo un casino. Potresti postarmi il codice completo con le correzioni?
Poi se richiamo solo la funzione
PHP:
//esecuzione del codice
public function test_price(){
   $data=cal_price_(1,'2019-01-19','2019-01-22');
   print_r($data);
}[/CODE] mi da errore di scrittura. Se invece elimino public [CODE]
function test_price(){
   $data=cal_price_(1,'2019-01-19','2019-01-22');
   print_r($data);
}
non mi segnala l'errore di scrittura.
 
Ultima modifica di un moderatore:

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Spero tu stia utilizzando CI...!
PHP:
function get_diff_Date($dt1,$dt2){
   $data_in=new DateTime($dt1);
   $data_out=new DateTime($dt2);
   $diff=$data_out->diff($data_in);
   $create_date=[];
   for ($i=1;$i<=$diff->days;$i++) {
      $data_in->add(new DateInterval('P1D'));
      $create_date[]=
         [
            'date'=>$data_in->format('d/m/Y'),
            'day'=>$data_in->format('w'),
            'label_day'=>$data_in->format('l')
         ];
   }
   return $create_date;
}

function find_sconto(){
   /*
      'sconto'=>0,
   //percentuale o fisso (fixed)
      'type'=>'percentage',
      'skip_if_0'=>TRUE
   /*/
   $model_return=['sconto'=>0,'type'=>'percentage','ship_0'=>TRUE];
   return $model_return;
}

function cal_price_($room,$start_date,$end_date){
   $ci=&get_instance();
   $date_diff=get_diff_Date($start_date,$end_date);
   $model_result=
      [
         'operation'=>
            [
               'plus'=>[
                  'custom'=>0,
                  'normal'=>0
               ],
               'minus'=>find_sconto()
            ],
         'total'=>0,
         'per_night'=>0
      ];

   $data=$ci->db->where('id',$room)->get('room')->result_object();
   $data_custom=$ci->db->where('room_id',$room)
                       ->where('DATE(certain_date) >=',$start_date)
                       ->where('DATE(certain_date) <=',$end_date)
                       ->get('room_custom_price')->result_object();
   $map=['price_sun','price_mon','price_tue','price_wed','price_thu','price_fri','price_sat'];

   if(!empty($data_custom)){
      //non ci sono prezzi personalizzati
      foreach ($data_custom as $k=>$items){
         $model_result['operation']['plus']['custom']+=$items->price;
      }
   }
   foreach ($date_diff as $k=>$v){
      foreach ($data as $jey_q=>$value_q){
         $day=$map[$v['day']];
         $model_result['operation']['plus']['normal']+=$value_q->$day;
      }
   }
   foreach ($model_result['operation']['plus'] as $k=>$v){
      $model_result['total']+=$v;
   }
   $model_result['per_night']=$model_result['total']/count($date_diff);

   return $model_result;
}
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
function get_diff_Date($dt1,$dt2){
$data_in=new DateTime($dt1);
$data_out=new DateTime($dt2);
$diff=$data_out->diff($data_in);
$create_date=[];
for (
$i=1;$i<=$diff->days;$i++) {
$data_in->add(new DateInterval('P1D'));
$create_date[]=
[
'date'=>$data_in->format('d/m/Y'),
'day'=>$data_in->format('w'),
'label_day'=>$data_in->format('l')
];
}
return
$create_date;
}
Forse l'errore sta in questa funzione le date $data_in e $data_out che sono diverse da tutto il resto delle funzioni?
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
No è l'istanza CodeIgniter..... altrimenti non avrei scritto
PHP:
$ci=&get_instance();

Se utilizzi la un tuo script custom devi cambiare le query... cosa da poco!


qui fai due prove di calcolo: https://perms.madi-solution.it/test_calcolo

Forse l'errore sta in questa funzione le date $data_in e $data_out che sono diverse da tutto il resto delle funzioni?
Quella funzione viene utilizzata per i giorni della settimana e basta quindi no!
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.449
338
83
@maxnegri
Quando posti codice PHP non usare il tag
code.gif
ma sa il tag
php.png

Questa volta te lo ho corretto io
Grazie
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Il problema è proprio quello. Io non utilizzo CodeIgniter ma uno script che sto creando io.
Potresti cortesemente specificarmi dove sostituire le query?
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Ecco il codice completo che ho nella pagina. Ho modificato anche startDate in data_in e endDate in data_out
PHP:
$room=$id;
$datain="2019-08-26"; // data di arrivo
$dataout="2019-08-30"; // data di partenza
$data_in=new DateTime($datain);
$data_out=new DateTime($dataout);
function get_diff_Date($dt1,$dt2){
   $data_in=new DateTime($dt1);
   $data_out=new DateTime($dt2);
   $diff=$data_out->diff($data_in);
   $create_date=[];
   for ($i=1;$i<=$diff->days;$i++) {
      $data_in->add(new DateInterval('P1D'));
      $create_date[]=
         [
            'date'=>$data_in->format('d/m/Y'),
            'day'=>$data_in->format('w'),
            'label_day'=>$data_in->format('l')
         ];
   }
   return $create_date;
}

function find_sconto(){
   /*
      'sconto'=>0,
   //percentuale o fisso (fixed)
      'type'=>'percentage',
      'skip_if_0'=>TRUE
   /*/
   $model_return=['sconto'=>0,'type'=>'percentage','ship_0'=>TRUE];
   return $model_return;
}

function cal_price_($room,$data_in,$data_out){
   $ci=&get_instance();
   $date_diff=get_diff_Date($data_in,$data_out);
   $model_result=
      [
         'operation'=>
            [
               'plus'=>[
                  'custom'=>0,
                  'normal'=>0
               ],
               'minus'=>find_sconto()
            ],
         'total'=>0,
         'per_night'=>0
      ];

   $data=$ci->db->where('id',$room)->get('room')->result_object();
   $data_custom=$ci->db->where('room_id',$room)
                       ->where('DATE(certain_date) >=',$data_in)
                       ->where('DATE(certain_date) <=',$data_out)
                       ->get('room_custom_price')->result_object();
   $map=['price_sun','price_mon','price_tue','price_wed','price_thu','price_fri','price_sat'];

   if(!empty($data_custom)){
      //non ci sono prezzi personalizzati
      foreach ($data_custom as $k=>$items){
         $model_result['operation']['plus']['custom']+=$items->price;
      }
   }
   foreach ($date_diff as $k=>$v){
      foreach ($data as $jey_q=>$value_q){
         $day=$map[$v['day']];
         $model_result['operation']['plus']['normal']+=$value_q->$day;
      }
   }
   foreach ($model_result['operation']['plus'] as $k=>$v){
      $model_result['total']+=$v;
   }
   $model_result['per_night']=$model_result['total']/count($date_diff);

   return $model_result;
}


var_dump($model_result);
function test_price(){
   $data=cal_price_(1,'2019-01-19','2019-01-22');
   print_r($data);
}
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Al posto di queste metti le tue query
PHP:
 $data=$ci->db->where('id',$room)->get('room')->result_object();
   $data_custom=$ci->db->where('room_id',$room)
                       ->where('DATE(certain_date) >=',$data_in)
                       ->where('DATE(certain_date) <=',$data_out)
                       ->get('room_custom_price')->result_object();

PHP:
$statement = " SELECT  * 
FROM           
room       
WHERE           
id = $roomId ";   
$statement->execute(array(                   
':id' => $roomId   
));   
$data= $statement->fetchAll(PDO::FETCH_CLASS, 'room');


$statement = "       
SELECT           
certain_date,           
price       
FROM           
room_custom_price       
WHERE           
room_id = $roomId AND           
(certain_date BETWEEN :startDate AND :endDate)";   
$statement->execute(array(       
':roomId' => $roomId,       
':startDate' => $startDate->date('Y-m-d'),       
':endDate' => $endDate->date('Y-m-d')   
));   
$data_custom=$statement->fetchAll(PDO::FETCH_CLASS, 'custom');
Try this!
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
var_dump($model_result);
function
test_price(){
$data=cal_price_(1,'2019-01-19','2019-01-22');
print_r($data);
}
Qui sbagli l'esecuzione.....
PHP:
test_price();
Non avendo CI come fai ad utilizzare
PHP:
$ci->db->get()
, quindi dovresti modificare la parte CI con la tua conn!
 

maxnegri

Utente Attivo
12 Ott 2004
87
0
6
Ti ringrazio per la pazienza che mi hai concesso ma ancora non sono riuscito ad ottenere risultati.
Non ho una connessione PDO e quindi ho fatto come segue ma senza ottenere risultati. Ottengo ancora NULL
PHP:
$roomId=$id;
$start_date="2019-08-26"; // data di arrivo
$end_date="2019-08-30"; // data di partenza


function find_sconto(){
   /*
      'sconto'=>0,
   //percentuale o fisso (fixed)
      'type'=>'percentage',
      'skip_if_0'=>TRUE
   /*/
   $model_return=['sconto'=>0,'type'=>'percentage','ship_0'=>TRUE];
   return $model_return;
}

function cal_price_($room,$start_date,$end_date){
   $ci=&get_instance();
   $date_diff=get_diff_Date($start_date,$end_date);
   $model_result=
      [
         'operation'=>
            [
               'plus'=>[
                  'custom'=>0,
                  'normal'=>0
               ],
               'minus'=>find_sconto()
            ],
         'total'=>0,
         'per_night'=>0
      ];

$statement1 = " SELECT * FROM room WHERE id = $roomId "; 
$statement1->execute(array(                 
':id' => $roomId 
)); 
$data=mysqli_query($conn,$statement1);
mysqli_fetch_all($data,'room');
//$data= $statement->fetchAll(PDO::FETCH_CLASS, 'room');


$statement2 = "SELECT certain_date,price FROM room_custom_price WHERE room_id = $roomId AND (certain_date BETWEEN :startDate AND :endDate)"; 
$statement2->execute(array(     
':roomId' => $roomId,     
':startDate' => $startDate->date('Y-m-d'),     
':endDate' => $endDate->date('Y-m-d') 
)); 
$data_custom=mysqli_query($conn,$statement2);
mysqli_fetch_all($data_custom,'custom');
//$data_custom=$statement->fetchAll(PDO::FETCH_CLASS, 'custom');


   $map=['price_sun','price_mon','price_tue','price_wed','price_thu','price_fri','price_sat'];

   if(!empty($data_custom)){
      //non ci sono prezzi personalizzati
      foreach ($data_custom as $k=>$items){
         $model_result['operation']['plus']['custom']+=$items->price;
      }
   }
   foreach ($date_diff as $k=>$v){
      foreach ($data as $jey_q=>$value_q){
         $day=$map[$v['day']];
         $model_result['operation']['plus']['normal']+=$value_q->$day;
      }
   }
   foreach ($model_result['operation']['plus'] as $k=>$v){
      $model_result['total']+=$v;
   }
   $model_result['per_night']=$model_result['total']/count($date_diff);

   return $model_result;
}

var_dump($model_result);
 

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
PHP:
$mysqli=new mysqli('host','user','pass','dbname');

//$mysqli->query('SELECT * FROM room WHERE id = :id');
$query=$mysqli->query('SELECT * FROM room WHERE id = '.$room);
$data=json_decode(json_encode($query->fetch_all(MYSQLI_ASSOC)));
print_r($data);


$query=$mysqli->query('SELECT * FROM room_custom_price WHERE (DATE(certain_date) BETWEEN "'.$start_date.'" AND "'.$end_date.'")');
$data_custom=json_decode(json_encode($query->fetch_all(MYSQLI_ASSOC)));
print_r($data_custom);
Le variabili si chiamano come quelle della funzione sopra, quindi basta rimpiazzare il contenuto...
Spero ti vada bene---!
 
Discussioni simili
Autore Titolo Forum Risposte Data
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
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

Discussioni simili