1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2024-12-22 21:28:08 +01:00

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;
}
// Reply To
if (!empty($template['reply_to'])) {
$mail->AddReplyTo($template['reply_to']);
}
// CC
if (!empty($template['cc'])) {
$mail->AddCC($template['cc']);
}
// BCC
if (!empty($template['bcc'])) {
$mail->AddBCC($template['bcc']);
}
// Template
$mail->setTemplate($template);
// 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\Bridge\MonologCollector($logger));
$debugbar->addCollector(new Extension\EloquentCollector($dbo->getCapsule()));
$debugbar->addCollector(new Extensions\EloquentCollector($dbo->getCapsule()));
}
}

View File

@ -123,45 +123,45 @@ switch (post('op')) {
$sconto_unitario = post('sconto')[$idriga];
$tipo_sconto = post('tipo_sconto')[$idriga];
$sconto = calcola_sconto([
'sconto' => $sconto_unitario,
'prezzo' => $prezzo_ore_consuntivo,
'tipo' => $tipo_sconto,
]);
'sconto' => $sconto_unitario,
'prezzo' => $prezzo_ore_consuntivo,
'tipo' => $tipo_sconto,
]);
$scontokm_unitario = post('scontokm')[$idriga];
$tipo_scontokm = post('tipo_scontokm')[$idriga];
$scontokm = ($tipo_scontokm == 'PRC') ? ($prezzo_km_consuntivo * $scontokm_unitario) / 100 : $scontokm_unitario;
$dbo->update('in_interventi_tecnici', [
'idintervento' => $id_record,
'idtipointervento' => $idtipointervento_tecnico,
'idtecnico' => post('idtecnico')[$idriga],
'idintervento' => $id_record,
'idtipointervento' => $idtipointervento_tecnico,
'idtecnico' => post('idtecnico')[$idriga],
'orario_inizio' => $orario_inizio,
'orario_fine' => $orario_fine,
'ore' => $ore,
'km' => $km,
'orario_inizio' => $orario_inizio,
'orario_fine' => $orario_fine,
'ore' => $ore,
'km' => $km,
'prezzo_ore_unitario' => $prezzo_ore_unitario,
'prezzo_km_unitario' => $prezzo_km_unitario,
'prezzo_dirittochiamata' => $prezzo_dirittochiamata,
'prezzo_ore_unitario_tecnico' => $prezzo_ore_unitario_tecnico,
'prezzo_km_unitario_tecnico' => $prezzo_km_unitario_tecnico,
'prezzo_dirittochiamata_tecnico' => $prezzo_dirittochiamata_tecnico,
'prezzo_ore_unitario' => $prezzo_ore_unitario,
'prezzo_km_unitario' => $prezzo_km_unitario,
'prezzo_dirittochiamata' => $prezzo_dirittochiamata,
'prezzo_ore_unitario_tecnico' => $prezzo_ore_unitario_tecnico,
'prezzo_km_unitario_tecnico' => $prezzo_km_unitario_tecnico,
'prezzo_dirittochiamata_tecnico' => $prezzo_dirittochiamata_tecnico,
'prezzo_ore_consuntivo' => $prezzo_ore_consuntivo,
'prezzo_km_consuntivo' => $prezzo_km_consuntivo,
'prezzo_ore_consuntivo_tecnico' => $prezzo_ore_consuntivo_tecnico,
'prezzo_km_consuntivo_tecnico' => $prezzo_km_consuntivo_tecnico,
'prezzo_ore_consuntivo' => $prezzo_ore_consuntivo,
'prezzo_km_consuntivo' => $prezzo_km_consuntivo,
'prezzo_ore_consuntivo_tecnico' => $prezzo_ore_consuntivo_tecnico,
'prezzo_km_consuntivo_tecnico' => $prezzo_km_consuntivo_tecnico,
'sconto' => $sconto,
'sconto_unitario' => $sconto_unitario,
'tipo_sconto' => $tipo_sconto,
'sconto' => $sconto,
'sconto_unitario' => $sconto_unitario,
'tipo_sconto' => $tipo_sconto,
'scontokm' => $scontokm,
'scontokm_unitario' => $scontokm_unitario,
'tipo_scontokm' => $tipo_scontokm,
], ['id' => $idriga]);
'scontokm' => $scontokm,
'scontokm_unitario' => $scontokm_unitario,
'tipo_scontokm' => $tipo_scontokm,
], ['id' => $idriga]);
}
$tipo_sconto = post('tipo_sconto_globale');
@ -188,6 +188,17 @@ switch (post('op')) {
'tipo_sconto_globale' => $tipo_sconto,
], ['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!'));
break;
@ -322,7 +333,6 @@ switch (post('op')) {
// Collegamenti tecnici/interventi
$idtecnici = post('idtecnico');
foreach ($idtecnici as $idtecnico) {
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))) {
flash()->info(tr('Firma salvata correttamente!'));
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 {
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');
add_tecnico($id_record, $idtecnico, $inizio, $fine, $idcontratto);
break;
// RIMOZIONE SESSIONE DI LAVORO
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;
}

View File

@ -55,7 +55,7 @@ function add_tecnico($idintervento, $idtecnico, $inizio, $fine, $idcontratto = n
$dbo = Database::getConnection();
// 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)) {
return false;
}
@ -161,6 +161,16 @@ function add_tecnico($idintervento, $idtecnico, $inizio, $fine, $idcontratto = n
'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;
}
@ -347,7 +357,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$dbo = Database::getConnection();
$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
$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'];
// 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);
$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'];
}
$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);
}
}
@ -412,7 +422,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$desc_iva = $rs[0]['descrizione'];
// 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);
$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',
'um' => '-',
'qta' => $rst[$i]['qta'],
'idrivalsainps' => $$id_rivalsa_inps,
'idrivalsainps' => $id_rivalsa_inps,
'rivalsainps' => $rivalsainps,
'idritenutaacconto' => $id_ritenuta_acconto,
'ritenutaacconto' => $ritenutaacconto,
@ -469,7 +479,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
// 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);
$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'];
}
$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);
}
}
@ -500,7 +510,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$iva_indetraibile = $iva / 100 * $dati[0]['indetraibile'];
// 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);
$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'];
}
$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);
}
@ -530,7 +540,7 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$iva_indetraibile = $iva / 100 * $rs[0]['indetraibile'];
// 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);
$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'];
}
$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);
}

View File

@ -2,7 +2,8 @@
$r = $dbo->fetchOne('SELECT *,
(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));
// Variabili da sostituire
@ -15,4 +16,5 @@ return [
'data richiesta' => Translator::dateToLocale($r['data_richiesta']),
'data fine intervento' => empty($r['data_fine']) ? Translator::dateToLocale($r['data_richiesta']) : Translator::dateToLocale($r['data_fine']),
'id_anagrafica' => $r['idanagrafica'],
'stato' => $r['stato'],
];

View File

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

View File

@ -22,14 +22,28 @@ if ($record['can_delete']) {
{[ "type": "text", "label": "<?php echo tr('Descrizione'); ?>", "name": "descrizione", "required": 1, "value": "$descrizione$" ]}
</div>
<div class="col-md-2">
{[ "type": "checkbox", "label": "<?php echo tr('Questo è uno stato completato'); ?>", "name": "completato", "value": "$completato$", "help": "<?php echo tr('Gli interventi che si trovano in questo stato verranno considerati come completati'); ?>", "placeholder": "<?php echo tr('Completato'); ?>", "extra": "<?php echo $attr; ?>" ]}
<div class="col-md-2">
{[ "type": "checkbox", "label": "<?php echo tr('Questo è uno stato completato'); ?>", "name": "completato", "value": "$completato$", "help": "<?php echo tr('Gli interventi che si trovano in questo stato verranno considerati come completati'); ?>", "placeholder": "<?php echo tr('Completato'); ?>", "extra": "<?php echo $attr; ?>" ]}
</div>
<div class="col-md-2">
{[ "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 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>
<?php

View File

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

View File

@ -1,5 +1,8 @@
<?php
use Models\MailAccount;
use Models\MailTemplate;
/**
* 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()
{
if (empty(self::$accounts)) {
$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;
return MailAccount::getAll();
}
/**
* Restituisce le informazioni relative a un singolo account email specificato.
*
* @param string|int $template
* @param string|int $account
*
* @return array
*/
public static function get($account = null)
{
if (!is_numeric($account) && !empty(self::getAccounts()[$account])) {
$account = self::getAccounts()[$account];
$accounts = self::getAccounts();
$result = MailAccount::get($account);
if (empty($return)) {
$result = $accounts->first(function ($item) use ($group) {
return !empty($item->main);
});
}
if (empty($account)) {
$account = self::getAccounts()['default'];
}
return self::getAccounts()[$account];
return $result;
}
/**
@ -204,6 +190,27 @@ class Mail extends PHPMailer\PHPMailer\PHPMailer
$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()
{
if (empty($this->AltBody)) {
@ -223,6 +230,24 @@ class Mail extends PHPMailer\PHPMailer\PHPMailer
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.
*
@ -287,16 +312,15 @@ class Mail extends PHPMailer\PHPMailer\PHPMailer
}
/**
* Aggiunge i detinatari.
* Aggiunge i destinatari.
*
* @param array $receivers
* @param array $types
*/
public function addReceivers($receivers, $types)
public function addReceivers($receivers, $types = [])
{
// Destinatari
foreach ($receivers as $key => $destinatario) {
$type = $types[$key];
$type = $types[$key] ?: 'a';
$pieces = explode('<', $destinatario);
$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');
}
public function mailTemplates()
{
return $this->hasMany(MailTemplate::class, 'id_module');
}
public function views()
{
return $this->hasMany(View::class, 'id_module');
@ -124,6 +129,8 @@ class Module extends Model
return $this->hasMany(Clause::class, 'idmodule');
}
/* Gerarchia */
public function children()
{
return $this->hasMany(self::class, 'parent')->withoutGlobalScope('enabled')
@ -145,8 +152,6 @@ class Module extends Model
return $this->children()->with('allChildren');
}
/* Metodi statici */
public static function getHierarchy()
{
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
(NULL, 'Inizio orario lavorativo', '00:00:00', 'time', 1, 'Dashboard', 1),
(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'));