GlisWeb framework
_mailing.generazione.php
Vai alla documentazione di questo file.
1 <?php
2 
32  // inclusione del framework
33  if( defined( 'CRON_RUNNING' ) ) {
34 
35  // log
36  logWrite( 'generazione mail per mailing job #' . $job['id'] . ' in corso', 'job', LOG_INFO );
37 
38  // inizializzo l'array del risultato
39  $status = $wksp = array();
40 
41  // #1 ACQUISIZIONE DEL LOCK
42  // lock delle tabelle della coda
43  $lock = mysqlQuery( $cf['mysql']['connection'],
44  'LOCK TABLES job WRITE, mail WRITE, mailing_mail WRITE, mailing WRITE, mail_liste_mailing WRITE, tipologie_anagrafica WRITE, '.
45  'liste_mailing WRITE, mailing_liste WRITE, anagrafica WRITE, contenuti WRITE, mail_out WRITE, file WRITE, metadati WRITE' );
46 
47  // #2 LETTURA DEL WORKSPACE
48  // lettura del workspace
49  if( ! empty( $job['workspace'] ) ) {
50 
51  // #3 LETTURA DEI DATI DEL WORKSPACE
52  // prelevo i dati dal workspace
53  $wksp = unserialize( $job['workspace'] );
54 
55  // #4 CONTROLLO DEL LOCK
56  // se il lock è andato a buon fine
57  if( $lock === true ) {
58 
59  // #5 CONTROLLO DEI DATI CHIAVE
60  // se è presente il dato chiave
61  if( isset( $wksp['id_mailing'] ) ) {
62 
63  // inizializzo i contatori
64  $limite = $totale = false;
65 
66  // #6 ACQUISIZIONE DEL DATASET
67  $data = mysqlQuery(
68  $cf['mysql']['connection'],
69  'SELECT mail.*, IF( mailing_liste.id IS NOT NULL, 1, 0 ) AS se_generata FROM mail '.
70  'INNER JOIN mail_liste_mailing ON mail_liste_mailing.id_mail = mail.id '.
71  'INNER JOIN mailing_liste ON mailing_liste.id_lista = mail_liste_mailing.id_lista '.
72  'LEFT JOIN mailing_mail ON ( mailing_mail.id_mail = mail.id AND mailing_mail.id_mailing = mailing_liste.id_mailing ) '.
73  'WHERE mailing_liste.id_mailing = ? ',
74  array(
75  array( 's' => $wksp['id_mailing'] )
76  )
77  );
78 
79  // #6b DATI AGGIUNTIVI
80  $todo = mysqlQuery(
81  $cf['mysql']['connection'],
82  'SELECT mail.*, anagrafica.nome, anagrafica.cognome, anagrafica.denominazione, anagrafica.sesso, '.
83  'tipologie_anagrafica.nome AS tipologia, '.
84  'coalesce( anagrafica.soprannome, anagrafica.denominazione , concat( tipologie_anagrafica.nome, " ", anagrafica.cognome, " ", anagrafica.nome ), "" ) AS destinatario, '.
85  'contenuti.cappello, contenuti.testo, contenuti.mittente_nome, contenuti.mittente_mail, '.
86  'mailing_liste.id_mailing, '.
87  'IF( mailing_mail.id IS NOT NULL, 1, 0 ) AS se_generata '.
88  'FROM mail '.
89  'INNER JOIN anagrafica ON anagrafica.id = mail.id_anagrafica '.
90  'INNER JOIN mail_liste_mailing ON mail_liste_mailing.id_mail = mail.id '.
91  'INNER JOIN mailing_liste ON mailing_liste.id_lista = mail_liste_mailing.id_lista '.
92  'INNER JOIN contenuti ON ( contenuti.id_mailing = mailing_liste.id_mailing AND contenuti.id_lingua = 1 ) '.
93  'LEFT JOIN tipologie_anagrafica ON tipologie_anagrafica.id = anagrafica.id_tipologia '.
94  'LEFT JOIN mailing_mail ON ( mailing_mail.id_mail = mail.id AND mailing_mail.id_mailing = mailing_liste.id_mailing ) '.
95  'WHERE mailing_liste.id_mailing = ? HAVING se_generata = 0 ',
96  array(
97  array( 's' => $wksp['id_mailing'] )
98  )
99  );
100 
101  // log
102  logWrite( 'trovate ' . count( $data ) . ' mail per mailing #' . $wksp['id_mailing'] . ' (da fare ' . count( $todo ) . ')', 'job', LOG_INFO );
103 
104  // #7 VERIFICA DEL DATASET
105  // controllo se sono presenti dati
106  if( is_array( $data ) && count( $data ) ) {
107 
108  // #8a DEFINIZIONE DI TOTALE, CORRENTE E LIMITE
109  // valori di riferimento
110  $totale = count( $data );
111  $corrente = $totale - count( $todo );
112 
113  // #8b DEFINIZIONE DEL LIMITE COME MINORE FRA CORREBNTE + ITERAZIONI E TOTALE
114  $limite = min( array( $corrente + $job['iterazioni'], $totale ) );
115 
116  // log
117  logWrite( 'trovate ' . $totale . ' righe (' . count( $todo ) . ' da fare) per generazione mailing job #' . $job['id'] . ' mailing #' . $wksp['id_mailing'], 'job', LOG_NOTICE );
118 
119  // #9 SCRITTURA DEL TOTALE SUL JOB
120  // scrivo il totale delle righe da elaborare
121  mysqlQuery( $cf['mysql']['connection'], 'UPDATE job SET totale = ? WHERE id = ?', array( array( 's' => $totale ), array( 's' => $job['id'] ) ) );
122 
123  // #10 CICLI DI LAVORO
124  // elaborazione di n step
125  for( $i = $corrente; $i < $limite; $i++ ) {
126 
127  // assegno le etichette alla riga
128  $row = array_shift( $todo );
129 
130  // trasformazioni standard della row
131  if( ! isset( $row['gender']['suffix'] ) ) { $row['gender']['suffix'] = ( ( $row['sesso'] == 'F' ) ? 'a' : 'o' ); }
132 
133  // log
134  logWrite( print_r( $row, true ), 'job', LOG_DEBUG );
135 
136 # // inserisco il redirect di questa riga
137 # $id = mysqlQuery(
138 # $cf['mysql']['connection'],
139 # 'INSERT INTO redirect ( codice, sorgente, destinazione ) VALUES ( ?, ?, ? ) '.
140 # 'ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID( id ), '.
141 # 'codice = VALUES( codice ), sorgente = VALUES( sorgente ), destinazione = VALUES( destinazione ) ',
142 # array(
143 # array( 's' => $row['codice'] ),
144 # array( 's' => $row['sorgente'] ),
145 # array( 's' => $row['destinazione'] )
146 # )
147 # );
148 
149  // template per la mail
150  $template = array(
151  'type' => 'twig',
152  'it-IT' => array(
153  'from' => array( $row['mittente_nome'] => $row['mittente_mail'] ),
154  'oggetto' => $row['cappello'],
155  'testo' => $row['testo']
156  )
157  );
158 
159  // allegati
160  $attach = mysqlSelectColumn(
161  'path',
162  $cf['mysql']['connection'],
163  'SELECT path FROM file WHERE id_mailing = ? AND id_lingua = 1',
164  array(
165  array( 's' => $wksp['id_mailing'] )
166  )
167  );
168 
169  // metadati
170  $m = array();
171  $mts = mysqlQuery(
172  $cf['mysql']['connection'],
173  'SELECT * FROM metadati WHERE id_mailing = ? AND ( id_lingua = 1 OR id_lingua IS NULL )',
174  array(
175  array( 's' => $wksp['id_mailing'] )
176  )
177  );
178 
179  // preparazione metadati
180  foreach( $mts as &$mt ) {
181  $m[ $mt['nome'] ] = $mt['testo'];
182  }
183 
184  // log
185  // logWrite( print_r( $m, true ), 'job', LOG_ERR );
186 
187  // istanzio il template
188  $twig = new Twig_Environment( new Twig_Loader_Array( $template[ $cf['localization']['language']['ietf'] ] ) );
189 
190  // accodo la mail
191  queueMail(
192  $cf['mysql']['connection'],
193  $wksp['timestamp_invio'],
194  $template[ $cf['localization']['language']['ietf'] ]['from'],
195  array( $row['destinatario'] => $row['indirizzo'] ),
196  $twig->render( 'oggetto', array( 'd' => $row ) ),
197  $twig->render( 'testo', array( 'd' => $row, 'm' => $m ) ),
198  array(),
199  array(),
200  $attach
201  );
202 
203  // log
204  logWrite( 'inserisco in mailing_mail la mail #' . $row['id'] .' indirizzo '.$row['indirizzo']. ' per il mailing #' . $wksp['id_mailing'], 'job', LOG_DEBUG );
205 
206  // scrivo l'associazione
207  mysqlQuery(
208  $cf['mysql']['connection'],
209  'REPLACE INTO mailing_mail ( id_mailing, id_mail ) VALUES ( ?, ? ) ',
210  array( array( 's' => $wksp['id_mailing'] ), array( 's' => $row['id'] ) )
211  );
212 
213  // #11 AGGIORNAMENTO DEL VALORE CORRENTE E DEL TEMPO DI ESECUZIONE SUL JOB
214  // aggiorno il valore corrente
215  mysqlQuery(
216  $cf['mysql']['connection'],
217  'UPDATE job SET corrente = ?, timestamp_esecuzione = ? WHERE id = ?',
218  array( array( 's' => ( $i + 1 ) ), array( 's' => time() ), array( 's' => $job['id'] ) )
219  );
220 
221  }
222 
223  // #12a STATUS OK (LAVORO IN CORSO)
224  // status
225  $wksp['status'] = 'OK';
226 
227  } else {
228 
229  // #12b IMPOSSIBILE ACQUISIRE IL DATASET
230  // status
231  $wksp['status'] = 'impossibile leggere dati dal file';
232 
233  // log
234  logWrite( 'dataset vuoto per il mailing #' . $wksp['id_mailing'], 'job', LOG_ERR );
235 
236  }
237 
238  } else {
239 
240  // #12c MANCANZA DI DATI ESSENZIALI
241  // status
242  $wksp['status'] = 'document non impostato';
243 
244  // log
245  logWrite( 'id_mailing non presente nel workspace per il job #' . $job['id'], 'job', LOG_ERR );
246 
247  }
248 
249  // #13 CONCLUSIONE DEL JOB
250  // conclusione del job
251  if( $limite == $totale ) {
252  logWrite( 'fine job (elaborate ' . $limite . ' righe su ' . $totale . ')', 'job', LOG_DEBUG );
253  mysqlQuery( $cf['mysql']['connection'], 'UPDATE job SET timestamp_completamento = ? WHERE id = ?', array( array( 's' => time() ), array( 's' => $job['id'] ) ) );
254  }
255 
256  // unlock delle tabelle
257  mysqlQuery( $cf['mysql']['connection'], 'UNLOCK TABLES' );
258 
259  } else {
260 
261  // #12d ERRORE NELL'ACQUISIZIONE DEL LOCK
262  // status
263  $wksp['status'] = 'impossibile acquisire il lock';
264 
265  // log
266  logWrite( 'impossibile effettuare il lock delle tabelle per generazione mailing #' . $job['id'], 'job', LOG_ERR );
267 
268  }
269 
270  // #14 AGGIORNAMENTO DEL WORKSPACE
271  // aggiornamento job
272  mysqlQuery( $cf['mysql']['connection'], 'UPDATE job SET workspace = ? WHERE id = ?', array( array( 's' => serialize( $wksp ) ), array( 's' => $job['id'] ) ) );
273 
274  } else {
275 
276  // log
277  logWrite( 'workspace vuoto per il job #' . $job['id'], 'job', LOG_ERR );
278 
279  }
280 
281  // log
282  logWrite( 'fine script per generazione mailing #' . $job['id'], 'job', LOG_DEBUG );
283 
284  }
285 
286 ?>
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
queueMail( $c, $timestamp_invio, $mittente, $destinatari, $oggetto, $corpo, $destinatari_cc=array(), $destinatari_bcc=array(), $allegati=array(), $headers=array(), $server=NULL)
accoda una mail
$wksp['log']
mysqlSelectColumn( $f, $c, $q, $p=false, &$e=array())
$template
Definition: _template01.php:10