Aggiunto sistema di notifiche (Interventi)

This commit is contained in:
Thomas Zilio 2018-09-20 11:39:03 +02:00
parent 5f78fbd85d
commit 8e58f81ee0
16 changed files with 511 additions and 119 deletions

View File

@ -83,20 +83,8 @@ if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
$mail->ConfirmReadingTo = $mail->From; $mail->ConfirmReadingTo = $mail->From;
} }
// Reply To // Template
if (!empty($template['reply_to'])) { $mail->setTemplate($template);
$mail->AddReplyTo($template['reply_to']);
}
// CC
if (!empty($template['cc'])) {
$mail->AddCC($template['cc']);
}
// BCC
if (!empty($template['bcc'])) {
$mail->AddBCC($template['bcc']);
}
// Destinatari // Destinatari
$mail->addReceivers(post('destinatari'), post('tipo_destinatari')); $mail->addReceivers(post('destinatari'), post('tipo_destinatari'));

View File

@ -134,7 +134,7 @@ if (!API::isAPIRequest()) {
$debugbar->addCollector(new DebugBar\DataCollector\TimeDataCollector()); $debugbar->addCollector(new DebugBar\DataCollector\TimeDataCollector());
$debugbar->addCollector(new DebugBar\Bridge\MonologCollector($logger)); $debugbar->addCollector(new DebugBar\Bridge\MonologCollector($logger));
$debugbar->addCollector(new Extension\EloquentCollector($dbo->getCapsule())); $debugbar->addCollector(new Extensions\EloquentCollector($dbo->getCapsule()));
} }
} }

View File

@ -188,6 +188,17 @@ switch (post('op')) {
'tipo_sconto_globale' => $tipo_sconto, 'tipo_sconto_globale' => $tipo_sconto,
], ['id' => $id_record]); ], ['id' => $id_record]);
$stato = $dbo->selectOne('in_statiintervento', '*', ['idstatointervento' => post('idstatointervento')]);
// Notifica chiusura intervento
if (!empty($stato['notifica']) && !empty($stato['destinatari'])) {
$n = new Notifications\EmailNotification();
$n->setTemplate('Stato intervento', $id_record);
$n->setReceivers($stato['destinatari']);
$n->send();
}
flash()->info(tr('Informazioni salvate correttamente!')); flash()->info(tr('Informazioni salvate correttamente!'));
break; break;
@ -322,7 +333,6 @@ switch (post('op')) {
// Collegamenti tecnici/interventi // Collegamenti tecnici/interventi
$idtecnici = post('idtecnico'); $idtecnici = post('idtecnico');
foreach ($idtecnici as $idtecnico) { foreach ($idtecnici as $idtecnico) {
add_tecnico($id_record, $idtecnico, post('orario_inizio'), post('orario_fine'), $idcontratto); add_tecnico($id_record, $idtecnico, post('orario_inizio'), post('orario_fine'), $idcontratto);
} }
@ -598,6 +608,17 @@ switch (post('op')) {
} elseif ($dbo->query('UPDATE in_interventi SET firma_file='.prepare($firma_file).', firma_data=NOW(), firma_nome = '.prepare($firma_nome).', idstatointervento = "OK" WHERE id='.prepare($id_record))) { } elseif ($dbo->query('UPDATE in_interventi SET firma_file='.prepare($firma_file).', firma_data=NOW(), firma_nome = '.prepare($firma_nome).', idstatointervento = "OK" WHERE id='.prepare($id_record))) {
flash()->info(tr('Firma salvata correttamente!')); flash()->info(tr('Firma salvata correttamente!'));
flash()->info(tr('Attività completata!')); flash()->info(tr('Attività completata!'));
$stato = $dbo->selectOne('in_statiintervento', '*', ['idstatointervento' => 'OK']);
// Notifica chiusura intervento
if (!empty($stato['notifica']) && !empty($stato['destinatari'])) {
$n = new Notifications\EmailNotification();
$n->setTemplate('Stato intervento', $id_record);
$n->setReceivers($stato['destinatari']);
$n->send();
}
} else { } else {
flash()->error(tr('Errore durante il salvataggio della firma nel database!')); flash()->error(tr('Errore durante il salvataggio della firma nel database!'));
} }

View File

@ -23,12 +23,25 @@ switch (get('op')) {
$fine = date_modify(date_create(date('Y-m-d H:\0\0')), '+'.$ore.' hours')->format('Y-m-d H:\0\0'); $fine = date_modify(date_create(date('Y-m-d H:\0\0')), '+'.$ore.' hours')->format('Y-m-d H:\0\0');
add_tecnico($id_record, $idtecnico, $inizio, $fine, $idcontratto); add_tecnico($id_record, $idtecnico, $inizio, $fine, $idcontratto);
break; break;
// RIMOZIONE SESSIONE DI LAVORO // RIMOZIONE SESSIONE DI LAVORO
case 'del_sessione': case 'del_sessione':
$dbo->query('DELETE FROM in_interventi_tecnici WHERE id='.prepare(get('id'))); $id = get('id');
$tecnico = $dbo->fetchOne('SELECT an_anagrafiche.email FROM an_anagrafiche INNER JOIN in_interventi_tecnici ON in_interventi_tecnici.idtecnico = an_anagrafiche.idanagrafica WHERE in_interventi_tecnici.id = '.prepare($id));
$dbo->query('DELETE FROM in_interventi_tecnici WHERE id='.prepare($id));
// Notifica nuovo intervento al tecnico
if (!empty($tecnico['email'])) {
$n = new Notifications\EmailNotification();
$n->setTemplate('Notifica rimozione intervento', $id_record);
$n->setReceivers($tecnico['email']);
$n->send();
}
break; break;
} }

View File

@ -55,7 +55,7 @@ function add_tecnico($idintervento, $idtecnico, $inizio, $fine, $idcontratto = n
$dbo = Database::getConnection(); $dbo = Database::getConnection();
// Controllo sull'identità del tecnico // Controllo sull'identità del tecnico
$tecnico = $dbo->fetchArray('SELECT an_anagrafiche.idanagrafica FROM an_anagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica INNER JOIN an_tipianagrafiche ON an_tipianagrafiche.idtipoanagrafica=an_tipianagrafiche_anagrafiche.idtipoanagrafica WHERE an_anagrafiche.idanagrafica = '.prepare($idtecnico)." AND an_tipianagrafiche.descrizione = 'Tecnico'"); $tecnico = $dbo->fetchOne('SELECT an_anagrafiche.idanagrafica, an_anagrafiche.email FROM an_anagrafiche INNER JOIN an_tipianagrafiche_anagrafiche ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica INNER JOIN an_tipianagrafiche ON an_tipianagrafiche.idtipoanagrafica=an_tipianagrafiche_anagrafiche.idtipoanagrafica WHERE an_anagrafiche.idanagrafica = '.prepare($idtecnico)." AND an_tipianagrafiche.descrizione = 'Tecnico'");
if (empty($tecnico)) { if (empty($tecnico)) {
return false; return false;
} }
@ -161,6 +161,16 @@ function add_tecnico($idintervento, $idtecnico, $inizio, $fine, $idcontratto = n
'prezzo_dirittochiamata_tecnico' => $costo_dirittochiamata_tecnico, 'prezzo_dirittochiamata_tecnico' => $costo_dirittochiamata_tecnico,
]); ]);
// Notifica nuovo intervento al tecnico
if (!empty($tecnico['email'])) {
$n = new Notifications\EmailNotification();
$n->setTemplate('Notifica intervento', $id_record);
$n->setReceivers($tecnico['email']);
$n->send();
}
return true; return true;
} }
@ -347,7 +357,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$dbo = Database::getConnection(); $dbo = Database::getConnection();
$id_ritenuta_acconto = setting("Percentuale ritenuta d'acconto"); $id_ritenuta_acconto = setting("Percentuale ritenuta d'acconto");
$$id_rivalsa_inps = setting('Percentuale rivalsa INPS'); $id_rivalsa_inps = setting('Percentuale rivalsa INPS');
// Leggo l'anagrafica del cliente // Leggo l'anagrafica del cliente
$rs = $dbo->fetchArray('SELECT idanagrafica, codice, (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE idintervento='.prepare($id_intervento).') AS data FROM `in_interventi` WHERE id='.prepare($id_intervento)); $rs = $dbo->fetchArray('SELECT idanagrafica, codice, (SELECT MIN(orario_inizio) FROM in_interventi_tecnici WHERE idintervento='.prepare($id_intervento).') AS data FROM `in_interventi` WHERE id='.prepare($id_intervento));
@ -378,7 +388,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$desc_iva = $rs[0]['descrizione']; $desc_iva = $rs[0]['descrizione'];
// Calcolo rivalsa inps // Calcolo rivalsa inps
$query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare($$id_rivalsa_inps); $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare($id_rivalsa_inps);
$rs = $dbo->fetchArray($query); $rs = $dbo->fetchArray($query);
$rivalsainps = ($subtot - $sconto) / 100 * $rs[0]['percentuale']; $rivalsainps = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
@ -391,7 +401,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale']; $ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
} }
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', 'ore', ".prepare($ore).', '.prepare($$id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))'; $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($descrizione).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', 'ore', ".prepare($ore).', '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
$dbo->query($query); $dbo->query($query);
} }
} }
@ -412,7 +422,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$desc_iva = $rs[0]['descrizione']; $desc_iva = $rs[0]['descrizione'];
// Calcolo rivalsa inps // Calcolo rivalsa inps
$query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare($$id_rivalsa_inps); $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare($id_rivalsa_inps);
$rs = $dbo->fetchArray($query); $rs = $dbo->fetchArray($query);
$rivalsainps = $rst[$i]['tot_prezzo_dirittochiamata'] / 100 * $rs[0]['percentuale']; $rivalsainps = $rst[$i]['tot_prezzo_dirittochiamata'] / 100 * $rs[0]['percentuale'];
@ -436,7 +446,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
'tipo_sconto' => 'UNT', 'tipo_sconto' => 'UNT',
'um' => '-', 'um' => '-',
'qta' => $rst[$i]['qta'], 'qta' => $rst[$i]['qta'],
'idrivalsainps' => $$id_rivalsa_inps, 'idrivalsainps' => $id_rivalsa_inps,
'rivalsainps' => $rivalsainps, 'rivalsainps' => $rivalsainps,
'idritenutaacconto' => $id_ritenuta_acconto, 'idritenutaacconto' => $id_ritenuta_acconto,
'ritenutaacconto' => $ritenutaacconto, 'ritenutaacconto' => $ritenutaacconto,
@ -469,7 +479,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile']; $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
// Calcolo rivalsa inps // Calcolo rivalsa inps
$query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare($$id_rivalsa_inps); $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare($id_rivalsa_inps);
$rs = $dbo->fetchArray($query); $rs = $dbo->fetchArray($query);
$rivalsainps = ($subtot - $sconto) / 100 * $rs[0]['percentuale']; $rivalsainps = ($subtot - $sconto) / 100 * $rs[0]['percentuale'];
@ -482,7 +492,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale']; $ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $rs[0]['percentuale'];
} }
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($rsr[$i]['descrizione']).', '.prepare($subtot).', '.prepare($rsr[$i]['sconto']).', '.prepare($rsr[$i]['sconto_unitario']).', '.prepare($rsr[$i]['tipo_sconto']).', '.prepare($rsr[$i]['um']).', '.prepare($rsr[$i]['qta']).', '.prepare($$id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))'; $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare($rsr[$i]['descrizione']).', '.prepare($subtot).', '.prepare($rsr[$i]['sconto']).', '.prepare($rsr[$i]['sconto_unitario']).', '.prepare($rsr[$i]['tipo_sconto']).', '.prepare($rsr[$i]['um']).', '.prepare($rsr[$i]['qta']).', '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
$dbo->query($query); $dbo->query($query);
} }
} }
@ -500,7 +510,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$iva_indetraibile = $iva / 100 * $dati[0]['indetraibile']; $iva_indetraibile = $iva / 100 * $dati[0]['indetraibile'];
// Calcolo rivalsa inps // Calcolo rivalsa inps
$query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare($$id_rivalsa_inps); $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare($id_rivalsa_inps);
$dati = $dbo->fetchArray($query); $dati = $dbo->fetchArray($query);
$rivalsainps = ($subtot - $sconto) / 100 * $dati[0]['percentuale']; $rivalsainps = ($subtot - $sconto) / 100 * $dati[0]['percentuale'];
@ -513,7 +523,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $dati[0]['percentuale']; $ritenutaacconto = ($subtot - $sconto + $rivalsainps) / 100 * $dati[0]['percentuale'];
} }
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Trasferta intervento '.$codice.' del '.Translator::dateToLocale($data)).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', '', 1, ".prepare($$id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))'; $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, sconto, sconto_unitario, tipo_sconto, um, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', '.prepare($id_intervento).', '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Trasferta intervento '.$codice.' del '.Translator::dateToLocale($data)).', '.prepare($subtot).', '.prepare($sconto).', '.prepare($sconto).", 'UNT', '', 1, ".prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
$dbo->query($query); $dbo->query($query);
} }
@ -530,7 +540,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile']; $iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
// Calcolo rivalsa inps // Calcolo rivalsa inps
$query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare($$id_rivalsa_inps); $query = 'SELECT * FROM co_rivalsainps WHERE id='.prepare($id_rivalsa_inps);
$rs = $dbo->fetchArray($query); $rs = $dbo->fetchArray($query);
$rivalsainps = ($subtot) / 100 * $rs[0]['percentuale']; $rivalsainps = ($subtot) / 100 * $rs[0]['percentuale'];
@ -543,7 +553,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$ritenutaacconto = ($subtot + $rivalsainps) / 100 * $rs[0]['percentuale']; $ritenutaacconto = ($subtot + $rivalsainps) / 100 * $rs[0]['percentuale'];
} }
$query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', NULL, '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Sconto '.$descrizione).', '.prepare($subtot).', 1, '.prepare($$id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))'; $query = 'INSERT INTO co_righe_documenti(iddocumento, idintervento, idconto, idiva, desc_iva, iva, iva_indetraibile, descrizione, subtotale, qta, idrivalsainps, rivalsainps, idritenutaacconto, ritenutaacconto, calcolo_ritenutaacconto, `order`) VALUES('.prepare($id_fattura).', NULL, '.prepare($id_conto).', '.prepare($id_iva).', '.prepare($desc_iva).', '.prepare($iva).', '.prepare($iva_indetraibile).', '.prepare('Sconto '.$descrizione).', '.prepare($subtot).', 1, '.prepare($id_rivalsa_inps).', '.prepare($rivalsainps).', '.prepare($id_ritenuta_acconto).', '.prepare($ritenutaacconto).', '.prepare(setting("Metodologia calcolo ritenuta d'acconto predefinito")).', (SELECT IFNULL(MAX(`order`) + 1, 0) FROM co_righe_documenti AS t WHERE iddocumento='.prepare($id_fattura).'))';
$dbo->query($query); $dbo->query($query);
} }

View File

@ -2,7 +2,8 @@
$r = $dbo->fetchOne('SELECT *, $r = $dbo->fetchOne('SELECT *,
(SELECT MAX(orario_fine) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS data_fine, (SELECT MAX(orario_fine) FROM in_interventi_tecnici WHERE idintervento=in_interventi.id) AS data_fine,
(SELECT email FROM an_anagrafiche WHERE an_anagrafiche.idanagrafica=in_interventi.idanagrafica) AS email (SELECT email FROM an_anagrafiche WHERE an_anagrafiche.idanagrafica=in_interventi.idanagrafica) AS email,
(SELECT descrizione FROM in_statiintervento WHERE idstatointervento=in_interventi.idstatointervento) AS stato
FROM in_interventi WHERE id='.prepare($id_record)); FROM in_interventi WHERE id='.prepare($id_record));
// Variabili da sostituire // Variabili da sostituire
@ -15,4 +16,5 @@ return [
'data richiesta' => Translator::dateToLocale($r['data_richiesta']), 'data richiesta' => Translator::dateToLocale($r['data_richiesta']),
'data fine intervento' => empty($r['data_fine']) ? Translator::dateToLocale($r['data_richiesta']) : Translator::dateToLocale($r['data_fine']), 'data fine intervento' => empty($r['data_fine']) ? Translator::dateToLocale($r['data_richiesta']) : Translator::dateToLocale($r['data_fine']),
'id_anagrafica' => $r['idanagrafica'], 'id_anagrafica' => $r['idanagrafica'],
'stato' => $r['stato'],
]; ];

View File

@ -4,13 +4,14 @@ include_once __DIR__.'/../../core.php';
switch (post('op')) { switch (post('op')) {
case 'update': case 'update':
$descrizione = post('descrizione'); $dbo->update('in_statiintervento', [
$colore = post('colore'); 'descrizione' => post('descrizione'),
$completato = post('completato'); 'colore' => post('colore'),
'completato' => post('completato'),
// Aggiorna 'notifica' => post('notifica'),
$query = 'UPDATE in_statiintervento SET descrizione='.prepare($descrizione).', colore='.prepare($colore).', completato='.prepare($completato).' WHERE idstatointervento='.prepare($id_record); 'id_email' => post('email'),
$dbo->query($query); 'destinatari' => post('destinatari'),
], ['idstatointervento' => $id_record]);
flash()->info(tr('Informazioni salvate correttamente.')); flash()->info(tr('Informazioni salvate correttamente.'));

View File

@ -30,6 +30,20 @@ if ($record['can_delete']) {
{[ "type": "text", "label": "<?php echo tr('Colore'); ?>", "name": "colore", "required": 1, "class": "colorpicker text-center", "value": "$colore$", "extra": "maxlength='7'", "icon-after": "<div class='img-circle square'></div>" ]} {[ "type": "text", "label": "<?php echo tr('Colore'); ?>", "name": "colore", "required": 1, "class": "colorpicker text-center", "value": "$colore$", "extra": "maxlength='7'", "icon-after": "<div class='img-circle square'></div>" ]}
</div> </div>
</div> </div>
<div class="row">
<div class="col-md-2">
{[ "type": "checkbox", "label": "<?php echo tr('Abilita notifiche'); ?>", "name": "notifica", "value": "$notifica$" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Template email'); ?>", "name": "email", "value": "$id_email$", "values": "query=SELECT id, name AS descrizione FROM zz_emails WHERE id_module = <?php echo Modules::get('Interventi')['id']; ?> AND deleted_at IS NULL" ]}
</div>
<div class="col-md-6">
{[ "type": "text", "label": "<?php echo tr('Destinatari'); ?>", "name": "destinatari", "value": "$destinatari$" ]}
</div>
</div>
</form> </form>
<?php <?php

View File

@ -1,6 +1,6 @@
<?php <?php
namespace Extension; namespace Extensions;
class EloquentCollector extends \DebugBar\DataCollector\PDO\PDOCollector class EloquentCollector extends \DebugBar\DataCollector\PDO\PDOCollector
{ {

View File

@ -1,5 +1,8 @@
<?php <?php
use Models\MailAccount;
use Models\MailTemplate;
/** /**
* Classe per gestire le email in base alle impostazioni, basata sul framework open-source PHPMailer. * Classe per gestire le email in base alle impostazioni, basata sul framework open-source PHPMailer.
* *
@ -25,46 +28,29 @@ class Mail extends PHPMailer\PHPMailer\PHPMailer
*/ */
public static function getAccounts() public static function getAccounts()
{ {
if (empty(self::$accounts)) { return MailAccount::getAll();
$database = Database::getConnection();
$results = $database->fetchArray('SELECT * FROM zz_smtps WHERE deleted_at IS NULL');
$accounts = [];
foreach ($results as $result) {
$accounts[$result['id']] = $result;
$accounts[$result['name']] = $result['id'];
if (!empty($result['main'])) {
$accounts['default'] = $result['id'];
}
}
self::$accounts = $accounts;
}
return self::$accounts;
} }
/** /**
* Restituisce le informazioni relative a un singolo account email specificato. * Restituisce le informazioni relative a un singolo account email specificato.
* *
* @param string|int $template * @param string|int $account
* *
* @return array * @return array
*/ */
public static function get($account = null) public static function get($account = null)
{ {
if (!is_numeric($account) && !empty(self::getAccounts()[$account])) { $accounts = self::getAccounts();
$account = self::getAccounts()[$account];
$result = MailAccount::get($account);
if (empty($return)) {
$result = $accounts->first(function ($item) use ($group) {
return !empty($item->main);
});
} }
if (empty($account)) { return $result;
$account = self::getAccounts()['default'];
}
return self::getAccounts()[$account];
} }
/** /**
@ -204,6 +190,27 @@ class Mail extends PHPMailer\PHPMailer\PHPMailer
$this->WordWrap = 78; $this->WordWrap = 78;
} }
/**
* Testa la connessione al server SMTP.
*
* @return bool
*/
public function testSMTP()
{
if ($this->smtpConnect()) {
$this->smtpClose();
return true;
}
return false;
}
/**
* Invia l'email impostata.
*
* @return bool
*/
public function send() public function send()
{ {
if (empty($this->AltBody)) { if (empty($this->AltBody)) {
@ -223,6 +230,24 @@ class Mail extends PHPMailer\PHPMailer\PHPMailer
return $result; return $result;
} }
public function setTemplate(array $template)
{
// Reply To
if (!empty($template['reply_to'])) {
$this->AddReplyTo($template['reply_to']);
}
// CC
if (!empty($template['cc'])) {
$this->AddCC($template['cc']);
}
// BCC
if (!empty($template['bcc'])) {
$this->AddBCC($template['bcc']);
}
}
/** /**
* Aggiunge gli allegati all'email. * Aggiunge gli allegati all'email.
* *
@ -287,16 +312,15 @@ class Mail extends PHPMailer\PHPMailer\PHPMailer
} }
/** /**
* Aggiunge i detinatari. * Aggiunge i destinatari.
* *
* @param array $receivers * @param array $receivers
* @param array $types * @param array $types
*/ */
public function addReceivers($receivers, $types) public function addReceivers($receivers, $types = [])
{ {
// Destinatari
foreach ($receivers as $key => $destinatario) { foreach ($receivers as $key => $destinatario) {
$type = $types[$key]; $type = $types[$key] ?: 'a';
$pieces = explode('<', $destinatario); $pieces = explode('<', $destinatario);
$count = count($pieces); $count = count($pieces);
@ -320,20 +344,4 @@ class Mail extends PHPMailer\PHPMailer\PHPMailer
} }
} }
} }
/**
* Testa la connessione al server SMTP.
*
* @return bool
*/
public function testSMTP()
{
if ($this->smtpConnect()) {
$this->smtpClose();
return true;
}
return false;
}
} }

View File

@ -0,0 +1,21 @@
<?php
namespace Models;
use Traits\StoreTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class MailAccount extends Model
{
use StoreTrait, SoftDeletes;
protected $table = 'zz_smtps';
/* Relazioni Eloquent */
public function account()
{
return $this->belongsTo(MailTemplate::class, 'id_smtp');
}
}

View File

@ -0,0 +1,26 @@
<?php
namespace Models;
use Traits\StoreTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class MailTemplate extends Model
{
use StoreTrait, SoftDeletes;
protected $table = 'zz_emails';
/* Relazioni Eloquent */
public function module()
{
return $this->belongsTo(Module::class, 'id_module');
}
public function account()
{
return $this->hasOne(MailAccount::class, 'id_smtp');
}
}

View File

@ -109,6 +109,11 @@ class Module extends Model
return $this->hasMany(PrintTemplate::class, 'id_module'); return $this->hasMany(PrintTemplate::class, 'id_module');
} }
public function mailTemplates()
{
return $this->hasMany(MailTemplate::class, 'id_module');
}
public function views() public function views()
{ {
return $this->hasMany(View::class, 'id_module'); return $this->hasMany(View::class, 'id_module');
@ -124,6 +129,8 @@ class Module extends Model
return $this->hasMany(Clause::class, 'idmodule'); return $this->hasMany(Clause::class, 'idmodule');
} }
/* Gerarchia */
public function children() public function children()
{ {
return $this->hasMany(self::class, 'parent')->withoutGlobalScope('enabled') return $this->hasMany(self::class, 'parent')->withoutGlobalScope('enabled')
@ -145,8 +152,6 @@ class Module extends Model
return $this->children()->with('allChildren'); return $this->children()->with('allChildren');
} }
/* Metodi statici */
public static function getHierarchy() public static function getHierarchy()
{ {
return self::with('allChildren') return self::with('allChildren')

View File

@ -0,0 +1,195 @@
<?php
namespace Notifications;
use Mail;
use Prints;
class EmailNotification extends Notification
{
protected $template = null;
protected $account = null;
protected $attachments = null;
protected $subject = null;
/**
* Restituisce l'account email della notifica.
*
* @return array
*/
public function getAccount()
{
return Mail::get($this->account);
}
/**
* Imposta l'account email della notifica.
*
* @param string|int $value
*/
public function setAccount($value)
{
$this->account = $value;
}
/**
* Restituisce il template della notifica.
*
* @return array
*/
public function getTemplate()
{
return Mail::getTemplate($this->template);
}
/**
* Imposta il template della notifica.
*
* @param string|int $value
*/
public function setTemplate($value, $id_record)
{
$this->template = $value;
$template = $this->getTemplate();
$variables = Mail::getTemplateVariables($template['id'], $id_record);
// Sostituzione delle variabili di base
$replaces = [];
foreach ($variables as $key => $value) {
$replaces['{'.$key.'}'] = $value;
}
$body = replace($template['body'], $replaces);
$subject = replace($template['subject'], $replaces);
$this->setContent($body);
$this->setSubject($subject);
$this->setAccount($template['id_smtp']);
}
/**
* Include le stampe selezionate dal template.
*
* @param int $id_record
*/
public function includeTemplatePrints($id_record)
{
$template = $this->getTemplate();
$prints = $dbo->fetchArray('SELECT id_print FROM zz_email_print WHERE id_email = '.prepare($template['id']));
foreach ($prints as $print) {
$this->addPrint($print['id_print'], $id_record);
};
}
/**
* Restituisce gli allegati della notifica.
*
* @return array
*/
public function getAttachments()
{
return $this->attachments;
}
/**
* Imposta gli allegati della notifica.
*
* @param array $values
*/
public function setAttachments(array $values)
{
$this->attachments = [];
foreach ($values as $value) {
$path = is_array($value) ? $value['path'] : $value;
$name = is_array($value) ? $value['name'] : null;
$this->addAttachment($path, $name);
}
}
/**
* Aggiunge un allegato alla notifica.
*
* @param string $value
*/
public function addAttachment($path, $name = null)
{
$this->attachments[] = [
'path' => $path,
'name' => $name ?: basename($path),
];
}
/**
* Aggiunge una stampa alla notifica.
*
* @param string|int $print
* @param int $id_record
* @param string $name
*/
public function addPrint($print, $id_record, $name = null)
{
$print = Prints::get($print);
if (empty($name)) {
$name = $print['title'].'.pdf';
}
// Utilizzo di una cartella particolare per il salvataggio temporaneo degli allegati
$path = DOCROOT.'/files/notifications/'.$print['title'].' - '.$id_record.'.pdf';
Prints::render($print['id'], $id_record, $path);
$this->addAttachment($path, $name);
}
/**
* Restituisce il titolo della notifica.
*
* @return string
*/
public function getSubject()
{
return $this->subject;
}
/**
* Imposta il titolo della notifica.
*
* @param string $value
*/
public function setSubject($value)
{
$this->subject = $value;
}
public function send()
{
$account = $this->getAccount();
$mail = new Mail($account['id']);
// Template
$template = $this->getTemplate();
if (!empty($template)) {
$mail->setTemplate($template);
}
// Destinatari
$mail->addReceivers($this->getReceivers());
// Allegati
$attachments = $this->getAttachments();
foreach ($attachments as $attachment) {
$this->AddAttachment($attachment['path'], $attachment['name']);
}
// Oggetto
$mail->Subject = $this->getSubject();
// Contenuto
$mail->Body = $this->getContent();
return $mail->send();
}
}

View File

@ -0,0 +1,72 @@
<?php
namespace Notifications;
abstract class Notification
{
public $receivers = [];
public $content = null;
public function __construct($receivers = null, $content = null)
{
$this->setReceivers($receivers);
$this->setContent($content);
}
/**
* Restituisce i destinatari della notifica.
*
* @return array
*/
public function getReceivers()
{
return $this->receivers;
}
/**
* Imposta i destinatari della notifica.
*
* @param string|array $value
*/
public function setReceivers($value)
{
$this->receivers = [];
$values = is_array($value) ? $value : explode(';', $value);
foreach ($values as $value) {
$this->addReceiver($value);
}
}
/**
* Aggiunge un destinataro alla notifica.
*
* @param string $value
*/
public function addReceiver($value)
{
$this->receivers[] = $value;
}
/**
* Restituisce i contenuti della notifica.
*
* @return string
*/
public function getContent()
{
return $this->content;
}
/**
* Imposta i contenuti della notifica.
*
* @param string $value
*/
public function setContent($value)
{
$this->content = $value;
}
abstract public function send();
}

View File

@ -300,3 +300,19 @@ DELETE FROM `zz_settings` WHERE `nome` = 'Abilitare orario lavorativo';
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`) VALUES
(NULL, 'Inizio orario lavorativo', '00:00:00', 'time', 1, 'Dashboard', 1), (NULL, 'Inizio orario lavorativo', '00:00:00', 'time', 1, 'Dashboard', 1),
(NULL, 'Fine orario lavorativo', '23:59:00', 'time', 1, 'Dashboard', 2); (NULL, 'Fine orario lavorativo', '23:59:00', 'time', 1, 'Dashboard', 2);
-- Notifiche negli stati interventi
ALTER TABLE `in_statiintervento` ADD `notifica` boolean NOT NULL DEFAULT 0, ADD `id_email` int(11), ADD `destinatari` varchar(255);
ALTER TABLE `in_statiintervento` ADD FOREIGN KEY (`id_email`) REFERENCES `zz_emails`(`id`) ON DELETE CASCADE;
-- Email di notifica
INSERT INTO `zz_emails` (`id`, `id_module`, `id_smtp`, `name`, `icon`, `subject`, `reply_to`, `cc`, `bcc`, `body`, `read_notify`, `main`) VALUES
(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi'), 1, 'Notifica intervento', 'fa fa-envelope', 'Notifica intervento numero {numero} del {data}', '', '', '', '<p>Gentile Tecnico,</p>\r\n<p>un nuovo intervento {numero} in {data} è stato aggiunto.</p>\r\n<p>&nbsp;</p>\r\n<p>Distinti saluti</p>\r\n', '0', '0'),
(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi'), 1, 'Notifica rimozione intervento', 'fa fa-envelope', 'Notifica intervento numero {numero} del {data}', '', '', '', '<p>Gentile Tecnico,</p>\r\n<p>sei stato rimosso dall''intervento {numero} in {data}.</p>\r\n<p>&nbsp;</p>\r\n<p>Distinti saluti</p>\r\n', '0', '0'),
(NULL, (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi'), 1, 'Stato intervento', 'fa fa-envelope', 'Intervento numero {numero} del {data}: {stato}.', '', '', '', '<p>Gentile Utente,</p>\r\n<p>l''intervento {numero} in {data} è stato spostato nello stato {stato}.</p>', '0', '0');
INSERT INTO `zz_email_print` (`id`, `id_email`, `id_print`) VALUES
(NULL, (SELECT `id` FROM `zz_emails` WHERE `name` = 'Stato intervento' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi')), (SELECT `id` FROM `zz_prints` WHERE `name` = 'Intervento'));
UPDATE `zz_emails` SET `main` = 1 WHERE `name` = 'Rapportino intervento' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi');
UPDATE `in_statiintervento` SET `id_email` = (SELECT `id` FROM `zz_emails` WHERE `name` = 'Stato intervento' AND `id_module` = (SELECT `id` FROM `zz_modules` WHERE `name` = 'Interventi'));