GlisWeb framework
_immobili.incroci.php
Vai alla documentazione di questo file.
1 <?php
2 
22  // inclusione del framework
23  if( ! defined( 'CRON_RUNNING' ) ) {
24  require '../../../../../_src/_config.php';
25  }
26 
27  // inizializzo l'array del risultato
28  $status = array();
29 
30  // inizializzo la variabile per l'invio
31  $out = NULL;
32 
33  // inizializzo le variabili di query
34  $check = $where = $group = NULL;
35 
36  // log
37  logWrite( 'richiesta di elaborazione degli incroci', 'immobili', LOG_DEBUG );
38 
39  // lock delle tabelle della coda
40  $lock = mysqlQuery( $cf['mysql']['connection'],
41  'LOCK TABLES incarichi_immobili WRITE, richieste_immobili WRITE, '.
42  'immobili WRITE, indirizzi WRITE, richieste_immobili_tipologie_incarichi WRITE, '.
43  'vani_immobili WRITE, '.
44  'tipologie_vani WRITE, '.
45  'richieste_immobili_tipologie WRITE, richieste_immobili_tipologie AS t0 WRITE, richieste_immobili_tipologie AS t1 WRITE, '.
46  'richieste_immobili_zone WRITE, richieste_immobili_zone AS z0 WRITE, richieste_immobili_zone AS z1 WRITE, '.
47  'incroci_immobili WRITE '
48  );
49 
50  // se il lock è andato a buon fine
51  if( $lock === true ) {
52 
53  // TODO seleziono l'incarico o la richiesta non archiviati che non vengono incrociati da più tempo (o non lo sono mai stati)
54  // relativamente a immobili che hanno nella tipologia_pubblicazione se_incroci
55  if( isset( $_REQUEST['tipo'] ) && isset( $_REQUEST['id'] ) ) {
56  if( $_REQUEST['tipo'] == 'richiesta' ) {
57  $where = 'WHERE richieste_immobili.id = ? ';
58  $group = 'GROUP BY incarichi_immobili.id ';
59  $check = 'SELECT * FROM incroci_immobili WHERE id_richiesta = ?';
60  } else {
61  $where = 'WHERE incarichi_immobili.id = ? ';
62  $group = 'GROUP BY richieste_immobili.id ';
63  $check = 'SELECT * FROM incroci_immobili WHERE id_incarico = ?';
64  }
65  $params = array( array( 's' => $_REQUEST['id'] ) );
66  }
67 
68  // TODO
69  // qui sbrigare le faccende che richiedono il lock (individuazione oggetto da lavorare, aggiornamento timestamp_incrocio, ecc.)
70 
71  // unlock delle tabelle
72  mysqlQuery( $cf['mysql']['connection'], 'UNLOCK TABLES' );
73 
74  } else {
75 
76  // log
77  logWrite( 'impossibile acquisire il lock sulle tabelle degli incroci', 'immobili', LOG_ERR );
78 
79  }
80 
81  // se c'è un oggetto da lavorare
82  if( ! empty( $check ) ) {
83 
84  // imposto la query
85  $q = 'SELECT incarichi_immobili.id AS id_incarico, '.
86  'richieste_immobili.id AS id_richiesta, '.
87  'concat( '.
88  '"camere: ", immobili_camere_count( immobili.id ), " ", '.
89  '"cucine: ", immobili_cucine_count( immobili.id ), " ", '.
90  '"bagni: ", immobili_bagni_count( immobili.id ), " ", '.
91  '"caratteristiche: OK ", richieste_immobili_caratteristiche_check( richieste_immobili.id, immobili.id, 0 ), " KO ", richieste_immobili_caratteristiche_check( richieste_immobili.id, immobili.id, 1 ) '.
92  ') AS note_incrocio, '.
93  'unix_timestamp() AS timestamp_inserimento '.
94  'FROM richieste_immobili ';
95 
96  // ...hanno l'id_tipologia dell'incarico in richieste_immobili_tipologie_incarichi.id_tipologia
97  $q .= 'INNER JOIN richieste_immobili_tipologie_incarichi ON richieste_immobili_tipologie_incarichi.id_richiesta = richieste_immobili.id ';
98  $q .= 'INNER JOIN incarichi_immobili ON (
99  incarichi_immobili.id_tipologia = richieste_immobili_tipologie_incarichi.id_tipologia
100  AND ( incarichi_immobili.prezzo_richiesto >= richieste_immobili_tipologie_incarichi.prezzo_min )
101  AND ( incarichi_immobili.prezzo_richiesto <= richieste_immobili_tipologie_incarichi.prezzo_max )
102  ) ';
103 
104  // includo gli immobili e le relative sotto tabelle sulla base degli incarichi
105  $q .= 'INNER JOIN immobili ON immobili.id = incarichi_immobili.id_immobile ';
106  $q .= 'INNER JOIN indirizzi ON indirizzi.id = immobili.id_indirizzo ';
107 
108  // ...hanno l'id_tipologia dell'immobile in richieste_immobili_tipologie.id_tipologia
109  // TODO aggiungere t2 per le tipologie indesiderate
110 #1 $q .= 'LEFT JOIN richieste_immobili_tipologie AS t0 ON (
111 #1 t0.id_richiesta = richieste_immobili.id
112 #1 ) ';
113 
114 #1 $q .= 'LEFT JOIN richieste_immobili_tipologie AS t1 ON (
115 #1 t1.id_richiesta = t0.id_richiesta
116 #1 AND
117 #1 t1.id_tipologia = immobili.id_tipologia
118 #1 ) ';
119 
120 #1 $where .= 'AND ( t0.id IS NULL OR ( t0.id IS NOT NULL AND t1.id IS NOT NULL ) ) ';
121 
122  // ...hanno l'id_zona dell'indirizzo dell'immobile in richieste_immobili_zone.id_zona
123  // TODO aggiungere z2 per le zone indesiderate
124 #1 $q .= 'LEFT JOIN richieste_immobili_zone AS z0 ON (
125 #1 z0.id_richiesta = richieste_immobili.id
126 #1 ) ';
127 
128 #1 $q .= 'LEFT JOIN richieste_immobili_zone AS z1 ON (
129 #1 z1.id_richiesta = z0.id_richiesta
130 #1 AND
131 #1 z1.id_zona = indirizzi.id_zona
132 #1 ) ';
133 
134 #1 $where .= 'AND ( z0.id IS NULL OR ( z0.id IS NOT NULL AND z1.id IS NOT NULL ) ) ';
135 
136  // ...hanno l'id_tipologia_edificio dell'indirizzo dell'immobile in richieste_immobili_tipologie_edifici.id_tipologia
137 
138  // ...hanno l'id_condizione dell'immobile in richieste_immobili_condizioni.id_condizione
139  // NOTA le condizioni sono nella valutazione
140 
141  // ...hanno l'id_disponibilita dell'immobile in richieste_immobili_disponibilita.id_disponibilita
142  // NOTA la disponibilità è un'informazione relativa all'incarico
143 
144  // ...hanno l'id_classe_energetica dell'immobile in richieste_immobili_classi_energetiche.id_classe
145 
146  // aggiungo la clausola WHERE principale
147  $q .= $where;
148 
149  // aggiungo il controllo per le richieste in corso di validità
150  $q .= 'AND richieste_immobili.timestamp_archiviazione IS NULL ';
151 
152  // aggiungo il controllo per gli incarichi in corso di validità
153  $q .= 'AND (
154  ( incarichi_immobili.data_inizio <= date( now() ) AND incarichi_immobili.data_inizio IS NOT NULL )
155  AND
156  ( incarichi_immobili.data_fine >= date( now() ) OR incarichi_immobili.data_fine IS NULL )
157  ) ';
158 
159  // ...hanno le spese annue comprese fra richieste_immobili.spese_min e richieste_immobili.spese_max
160  // NOTA le spese annue adesso sono nella valutazione
161 /* $q .= 'AND (
162  immobili.spese_annue IS NULL
163  OR (
164  ( immobili.spese_annue >= richieste_immobili.spese_min OR richieste_immobili.spese_min IS NULL )
165  AND
166  ( immobili.spese_annue <= richieste_immobili.spese_max OR richieste_immobili.spese_max IS NULL )
167  )
168  ) ';
169 */
170 
171  // ...hanno i consumi annui compresi fra richieste_immobili.consumi_min e richieste_immobili.consumi_max
172  // NOTA i consumi annui adesso sono nella valutazione
173 
174  // ...hanno il count dei vani_immobili dell'immobile se_bagno compreso fra richieste_immobili.bagni_min e richieste_immobili.bagni_max
175 #1 $q .= 'AND (
176 #1 ( immobili_bagni_count( immobili.id ) >= richieste_immobili.bagni_min OR richieste_immobili.bagni_min IS NULL )
177 #1 AND
178 #1 ( immobili_bagni_count( immobili.id ) <= richieste_immobili.bagni_max OR richieste_immobili.bagni_max IS NULL )
179 #1 ) ';
180 
181  // ...hanno il count dei vani_immobili dell'immobile se_cucina compreso fra richieste_immobili.cucine_min e richieste_immobili.cucine_max
182 #1 $q .= 'AND (
183 #1 ( immobili_cucine_count( immobili.id ) >= richieste_immobili.cucine_min OR richieste_immobili.cucine_min IS NULL )
184 #1 AND
185 #1 ( immobili_cucine_count( immobili.id ) <= richieste_immobili.cucine_max OR richieste_immobili.cucine_max IS NULL )
186 #1 ) ';
187 
188  // ...hanno il count dei vani_immobili dell'immobile se_camera compreso fra richieste_immobili.camere_min e richieste_immobili.camere_max
189 #1 $q .= 'AND (
190 #1 ( immobili_camere_count( immobili.id ) >= richieste_immobili.camere_min OR richieste_immobili.camere_min IS NULL )
191 #1 AND
192 #1 ( immobili_camere_count( immobili.id ) <= richieste_immobili.camere_max OR richieste_immobili.camere_max IS NULL )
193 #1 ) ';
194 
195  // ...hanno la somma dei mq commerciali dei vani_immobili dell'immobile compresa fra richieste_immobili.mq_min richieste_immobili.mq_max
196 #1 $q .= 'AND (
197 #1 ( immobili.mq_commerciali >= richieste_immobili.mq_min OR richieste_immobili.mq_min IS NULL )
198 #1 AND
199 #1 ( immobili.mq_commerciali <= richieste_immobili.mq_max OR richieste_immobili.mq_max IS NULL )
200 #1 ) ';
201 
202  // ...hanno il piano dell'immobile maggiore o uguale a richieste_immobili.piano_min
203  // TODO ...hanno il piano dell'immobile più i ( livelli - 1 ) dell'immobile minore o uguale a richieste_immobili.piano_max
204 #1 $q .= 'AND (
205 #1 ( immobili.piano >= richieste_immobili.piano_min OR richieste_immobili.piano_min IS NULL )
206 #1 AND
207 #1 ( immobili.piano <= richieste_immobili.piano_max OR richieste_immobili.piano_max IS NULL )
208 #1 ) ';
209 
210  // ...hanno almeno il 50% di immobili_caratteristiche.id_caratteristica in richieste_immobili_caratteristiche.id_caratteristica non se_non_desiderata
211 #1 $q .= 'AND richieste_immobili_caratteristiche_check( richieste_immobili.id, immobili.id, 0 ) >= 50.00 ';
212 
213  // ...hanno meno del 25% di immobili_caratteristiche.id_caratteristica in richieste_immobili_caratteristiche.id_caratteristica se_non_desiderata
214 #1 $q .= 'AND richieste_immobili_caratteristiche_check( richieste_immobili.id, immobili.id, 1 ) <= 25.00 ';
215 
216  // NOTA bisogna vedere come gestire le richieste relative ai piani "speciali" tipo:
217  // - voglio (o non voglio) assolutamente l'ultimo piano
218  // - voglio (o non voglio) assolutamente il primo piano
219  // - voglio (o non voglio) assolutamente il piano terreno
220 
221  // aggiungo la clausola GROUP BY
222 #1 $q .= $group;
223 
224  // TODO per ogni incrocio trovato scrivo una riga sulla tabella incroci_immobili
225  mysqlQuery( $cf['mysql']['connection'],
226  'INSERT INTO incroci_immobili ( id_incarico, id_richiesta, note_incrocio, timestamp_inserimento ) '
227  .$q
228  .'ON DUPLICATE KEY UPDATE note_incrocio = VALUES( note_incrocio ), timestamp_aggiornamento = unix_timestamp() ',
229  $params
230  );
231 
232  // output
233  $status['query'] = preg_replace('/(\v|\s)+/', ' ', $q );
234  $status['incroci'] = mysqlQuery( $cf['mysql']['connection'], $check, array( array( 's' => $_REQUEST['id'] ) ) );
235 
236  }
237 
238  // output
239  if( ! defined( 'CRON_RUNNING' ) ) {
240  buildJson( $status );
241  }
242 
243 ?>
logWrite( $m, $f='site', $l=LOG_NOTICE, $d=DIRECTORY_LOG, $t=CURRENT_LOG_LEVEL, $s=SITE_STATUS)
scrive un messaggio nei log del sito
Definition: _log.utils.php:48
mysqlQuery( $c, $q, $p=false, &$e=array())
$cf['ricerca']['template']
Definition: _030.common.php:7
buildJson( $content, $encoding=ENCODING_UTF8, $headers=array())
if(! defined( 'CRON_RUNNING')) $status
$_REQUEST['__view__'][ $ct['view']['id']]['__restrict__']['id_progetto']['EQ']