Newsgroup: it.lavoro.professioni.webmaster
Titolo: SQL, date, booking on line....

Qual'e' secondo voi il miglior sistema per gestire prenotazioni on
line di stanze di albergo e per monitorare che la prenotazione non
ecceda la disponibilita'?
Non ho lavorato spessissimo con SQL e le date ma un mio collega m'ha
fatto venire un sacco di dubbi (non ho ancora cominciato a fare prove
su strada)
Consigli, links?
Grazie
Claudio

 wrote

se lavori con le date un consiglio che ti dò è di gestirle in formato ISO
yyyymmgg
se però ci dici che dubbi hai è meglio, perchè francamente... non ho capito
il problema :-D
--
Fabio Angela (aka Red Angel)
cerchi consigli per un hosting? 
http://hosting.redangel.it
http://www.redangel.it
 - il portale sulla programmazione


Secondo un mio collega non posso fare controlli basati su due campi
data (inizio e fine prenotazione). E' vero che tutti gli esempi che ho
trovato si basavano solo su un campo data ma non credo che non possa
verificare se, in un intervallo compreso tra le due date, esistono
delle prenotazioni e che il loro numero non superi il totale di camere
a disposizione per un dato periodo e per un dato albergo.
Sono in fase preparatoria del lavoro e, visto che mi ha fatto nascere
dubbi, prima di cominciare a lavorare sul serio voglio capire se devo
cambiare approccio al problema
Cla'

 cambiare approccio al problema
la prima cosa che mi viene in mente č creare una tabella prenotazioni con i
campi
stanza, datainizio, datafine
(oltre ad eventuali altri campi)
Per la verifica dell'eccesso di prenotazioni dovrebbe essere sufficiente una
query di questo tipo
select count(*) from prenotazioni where datainizio>=giorno and
datafine<=giorno
dove giorno č la data che vuoi verificare. In questo modo puoi anche usare
il group by per fornire delle statistiche piů dettagliate (ad esempio per
piano, per tipologia, per numero di letti, etc)
comunque penso sia tutto facilmente risolvibile.

 cambiare approccio al problema
che DB usi?
io do per scontato MS SQL
comunque il modo migliore per vederlo è provarlo, non ci vuole niente, ti
crei una tabella stupida con due campi data, ci spari dentro qualche valore
e provi le query
ad ogni modo non vedo controindicazioni nel metodo


 datafine<=giorno
stessa cosa del BETWEEN, anche se io preferisco quest'ultimo perchè è più
leggibile :-)



anch'io .... ma pensavo fosse più didattico il primo sistema.


Domani ti dico anche io che cosa e' successo :-)
Claudio

 Domani ti dico anche io che cosa e' successo :-)
credo di sapere il risultato :-P
Ad ogni modo se non considerasse gli estremi lasci stare BETWEEN e usi
direttamente >= e <= come ti ha detto Alberto, ma sono quasi certo che
BETWEEN serva allo scopo



Denghiu... ti ragguaglio :-)
Claudio

 ecceda la disponibilita'?
Con il mio applicativo :PPP
-- 
Questo messaggio potrebbe non risultare leggibile ad utenti con
disabilità visive. Nel caso risultino problemi di lettura, inviate un
post in questo newsgroup in risposta al messaggio originale indicando
come testo del messaggio: NON ACCESSIBILE.


si ma poi mi tocca regionalizzarlo, dal veneziano all'italiano
:-D

 ha scritto nel messaggio
news:bjp79g$lrvlp$1...@ID-182846.news.uni-berlin.de...

E' disponibile in 5 lingue... sto aspettando pure il cinese :)
Gią integrato pure con Banca Sella in modo che se l'utente paga la prima
notte (es: per le offerte speciali) blocca le camere prenotate.
L'albergatore gestisce tutto da backoffice con messaggi preimpostati,
calcola le statistiche, ecc. ecc. :)
E tra poco esce pure la versione VoiceXML anche di questo, come
annunciato qualche giorno fa :)
http://www.fullpress.it/articolo.asp?ID=5941
-- 
Questo messaggio potrebbe non risultare leggibile ad utenti con
disabilitą visive. Nel caso risultino problemi di lettura, inviate un


 >
Non funge cosi'. Non mi considera le prenotazioni iniziate prima e che si
protraggono dopo l'intervallo specificato e cioe' che comunque sono
interessate dal periodo (nemmeno ricorrendo a <> invece che between)
Claudio


Per quanto mi riguarda, dopo diverse strade percorse ho una tabella delle
date con un campo per ogni tipologia di stanza (singola, doppia,tripla) con
la disponibilità.
Questo mi consente di visdualizzare anche, prima della prenotazione un
calendario con le disponibilità.
Rainbow

 E' disponibile in 5 lingue... sto aspettando pure il cinese :)
Dopo quale livello di partecipazione all'ng è possibile postare messaggi
pubblicitari?
Rainbow

 ha scritto nel messaggio
news:bjpccd$6f8$1...@lacerta.tiscalinet.it...

scrivendo -promo: nell'oggetto, chiunque può farlo.
-- 
Questo messaggio potrebbe non risultare leggibile ad utenti con
disabilità visive. Nel caso risultino problemi di lettura, inviate un



Buono a sapersi, vedrò di approfittarne.
Rainbow

 
Da FAQ, una volta ogni due mesi (se non ricordo male).
Cla
-- 
www.spaghettibrain.com
 - PHPNUke Italian Mirror
www.spaghettilearning.com
 - Piattaforma open Source per l'E-Learning
!!>> Il mondo non è ancora pronto per il Funky <<!!


Moderatore di it.comp.www.asp - Microsoft .NET MVP
http://www.aspitalia.com/
 Enjoy the .NET community!
http://www.dev2dev.it/
 La rete ha connesso nuove particelle!
http://www.extensible.it/
 XML and beyond

 cavallo delle due date.
ed ha ragione :))
per fare una cosa fatta bene dovresti partire dal giorno prima alle ore
23:59:59  e finire il giorno dopo alle ore 00:00:01
in questo modo includi esattamente i giorni che ti servono... :) in realta'
ti basta togliere un secondo alla prima data e aggiungere un secondo alla
seconda per avere l'intervallo giusto!
purtroppo ieri non c'ero ero a milano... quindi non ho seguito atetntamente
questo thread...
-- 
Lino Mari [mod - it.economia.e-commerce]
http://www.ebow.it
 - e-business on web!
http://www.dev2dev.it
 - La rete ha connesso nuove particelle - d2D004
Il risultato č che i mercati stanno diventando piů intelligenti, piů
informati, piů organizzati. Partecipare a un mercato in rete cambia
profondamente le persone.


Colgo l'occasione della tua risposta per replicare a tutti spiegando cosa ho
fatto.
Non mi sono posto il problema della data effettiva al secondo e forse me ne
pentiro' (adesso che mi ci fai pensare)
per tenere sott'occhio tutte le combinazioni, confronto i valori data_inizio
e data_fine controllando le prenotazioni che:
- cominciano prima o nella data_inizio e che terminano prima di data_fine
- cominciano dopo la data_inizio e che terminano dopo data_fine
- cominciano dopo data_inizio e terminano prima di data_fine
- cominciano prima di data_inizio e terminano dopo data_fine
In questo modo i test che ho condotto mi evidenziano esattamente il numero
di stanze occupate e se posso quindi accettare la prenotazione o meno e
risparmio i soldi di quell'ingordo di Scano :-))
Se c'e' un modo piu' elegante per ottenere lo stesso risultato... non mi
offendo :-)
Vi ringrazio a tutti per i consigli
Claudio

 Cla
Da Manifesto :)


Uno dei miei obiettivi e', verificato che la prenotazione proposta dal
cliente non e' accettabile, visualizzargli il calendario con la situazione
delle stanze. Magari modificando la prenotazione puo' sistemarsi lo stesso
Devo ragionare sulla disponibilita' del calendario con la situazione prima
della prenotazione.
Costringi il cliente a sfogliare il calendario fino a raggiungere il periodo
desiderato per poi magari fargli vedere che le stanze non ci sono (cioe' un
lavoro inutile o quasi). Ci ragiono comunque
Grazie anche a te
Claudio

 delle stanze. Magari modificando la prenotazione puo' sistemarsi lo
stesso
Devi mostrare disponibile - non disponibile, non il numero di camere
disponibili mi raccomando :)



Riesco a farlo con due condizioni ma ne devo aggiungere per forza una per
considerare anche le prenotazioni che cominciano nella stessa data di
data_fine
Considera che sto facendo sto lavoro con un trapano che da due ore sta
crivellando la parete alla mia destra (mo' faccio una strage!)
Claudio


Puttanata :-)
due condizioni :-)
Claudio

 >
Un esempio "in lavorazione"
http://www.starfishdirect.com/book/book.asp?hh=18&mm=9&yy=2003
Rainbow

 
http://www.starfishdirect.com/book/book.asp?hh=18&mm=9&yy=2003
Vabbè rilancio :)
https://www.hotelmeridiana.com/website/book.asp?lang=uk
https://www.hotelmeridiana.com/website/book.asp?lang=it
https://www.hotelmeridiana.com/website/book.asp?lang=fr



Umpf... quando avro' fatto il mio con 
asp.net
 vi richiamo eh :-)
Claudio
P.s.: bravi tutti e due

 P.s.: bravi tutti e due
P.S. poi appena metto online su WebGaleon la demo anche della versione
multialbergo ti chiamo come beta-tester :)


 Consigli, links?
L'anno scorso ho realizzato un sistema di prenotazione online di stanze 
di albergo in php e mysql.
Controllare la disponibilità non semplice come può apparentemente a 
prima vista, alla fine decisi di calcolare la disponibilità considerando 
il totale delle stanze prenotate giorno per giorno e controllando che 
non fosse mai nullo o minore di zero (e che il prodotto fosse 
disponibile nel periodo considerato). 
Ecco un po' di codice per far capire meglio:
class Prodotto extends Persistent {
...
    function calcolaDisponibilitaReale($dtInizio, $dtFine)
    {
		global $Database;
		$disponibilita_reale = array();
		// Cerca le disponibilità
		$disp_applicabili = $this->disponibilita_applicabili
($dtInizio,$dtFine);
        // Cerca le prenotazioni nel periodo specificato
        $sqlWhere = $Database->quoteDate($dtInizio) . ' <= data_fine'
            . ' AND data_inizio <= ' . $Database->quoteDate($dtFine)
            . ' AND (stato in ('.PRN_SOSPESA.', '.PRN_PAGATA.'))';           
        $prenotazioni = $Database->sqlCollection('Prenotazione',
                                                 $sqlWhere);
		for($d = $dtInizio; $d <= $dtFine; $d += UN_GIORNO)
		{
			// Calcola la disponibilità nominale
			$disp_applicata = null;
			foreach($disp_applicabili as $disp)
			{
				if($disp->applicabile($d))
				{
					if(($disp_applicata == null)
					|| ($disp_applicata->NumDisponibili > 
$disp->NumDisponibili))
					{
						$disp_applicata = $disp;
					}
				}
			}
			if($disp_applicata == null) {
				$disponibilita_reale[$d] = false;
				return $disponibilita_reale;
			}
 
			$num = $disp_applicata->NumDisponibili;
 
			// Toglie i posti già prenotati
			foreach($prenotazioni as $p)
			{
				if($p->applicabile($d))
				{
					$num -= $p->NumOrdinati($this->
ProdottoID);
				}
			}
 
			$disponibilita_reale[$d] = $num;
		}
 
	// Ordina per data
        ksort($disponibilita_reale);
        return $disponibilita_reale;
    }
...
}
PS: Se ti può interessare, posso contattare il mio vecchio cliente e 
chiedergli se è disposto a cedere il sorgente.
Il programma è multi-lingua (italiano ed inglese), multi-struttura 
(qualunque numero di alberghi) e gestisce disponibilita', offerte 
speciali (sconto % e minimum stay) e le conferme delle prenotazioni 
tramite carta di credito. Per le pagine di frontend utilizza un sistema 
di template simile al TAL di Zope. Esempio:
<table>
  <tbody pt:list="Prodotti">
  <tr>
    <td pt:value="Nome">Camera singola</td>
    <td pt:value="Descrizione">Camera singola con bagno e TV</td>
    <td pt:if="OfferteSpeciali($DataInizio,$DataFine)">
      Offerte speciali:
      <ul pt:list="OfferteSpeciali($DataInizio,$DataFine)">
        <li>
          dal <span pt:value="DataInizio">1/6/2003</span>
          al <span pt:value="DataFine">1/9/2003</span>
          - sconto <span pt:value="ScontoPercentuale">15%</span>
          - <span pt:value="Descrizione">Fiera del Tartufo</span>
        </li>
      </ul>
    <td>
  </tr>
  </tbody>
</table>
-- 
Roberto Lupi

 sussiste ma se ha ragione lui mi soffoco di query :-)
BETWEEN controlla se un elemento è in un dato intervallo, per 
controllare le prenotazioni serve però un sistema per controllare se due 
intervalli di sovrappongano.
La query che devi fare è del tipo:
SELECT *
FROM   prenotazioni
WHERE  data_inizio < :data_fine
AND     :data_inizio < data_fine
dove data_inizio e data_fine sono i campi di prenotazioni e :data_inizio 
e :data_fine sono i parametri dell'intervallo (i.e. i primi appartengono 
ad una prenotazione, i secondi ad un'altra).
Per arrivare a formularla, considera questi tre casi:
-------XXXXXX-------
----------XXXXX-----
--XXXXXX------------
---------XXXXXXXXX--
----XXXXXXXXXX------
------XXXXX---------
-- 
Roberto Lupi

 ha scritto nel messaggio
news:MPG.19cbc234...@powernews.libero.it...
dove data_inizio e data_fine sono i campi di prenotazioni e :data_inizio
e :data_fine sono i parametri dell'intervallo (i.e. i primi appartengono
ad una prenotazione, i secondi ad un'altra).
Per arrivare a formularla, considera questi tre casi:
-------XXXXXX-------
----------XXXXX-----
--XXXXXX------------
---------XXXXXXXXX--
----XXXXXXXXXX------
------XXXXX---------
Ho fatto esattamente cosi'
:-))
Claudio