diff --git a/actions.php b/actions.php index 6ee1fe49d..cb36d730f 100644 --- a/actions.php +++ b/actions.php @@ -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')); diff --git a/core.php b/core.php index 70138ad59..5143461dc 100644 --- a/core.php +++ b/core.php @@ -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())); } } diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index 46f29369c..cc4f5abc3 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -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!')); } diff --git a/modules/interventi/ajax_tecnici.php b/modules/interventi/ajax_tecnici.php index 83b5c220a..23514810f 100644 --- a/modules/interventi/ajax_tecnici.php +++ b/modules/interventi/ajax_tecnici.php @@ -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; } diff --git a/modules/interventi/modutil.php b/modules/interventi/modutil.php index 4d343bc14..f52547767 100644 --- a/modules/interventi/modutil.php +++ b/modules/interventi/modutil.php @@ -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); } diff --git a/modules/interventi/variables.php b/modules/interventi/variables.php index b54420806..c05c5d745 100644 --- a/modules/interventi/variables.php +++ b/modules/interventi/variables.php @@ -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'], ]; diff --git a/modules/stati_intervento/actions.php b/modules/stati_intervento/actions.php index 3448f2682..8422810b6 100644 --- a/modules/stati_intervento/actions.php +++ b/modules/stati_intervento/actions.php @@ -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.')); diff --git a/modules/stati_intervento/edit.php b/modules/stati_intervento/edit.php index 39a837307..750a77504 100644 --- a/modules/stati_intervento/edit.php +++ b/modules/stati_intervento/edit.php @@ -22,14 +22,28 @@ if ($record['can_delete']) { {[ "type": "text", "label": "", "name": "descrizione", "required": 1, "value": "$descrizione$" ]} -
- {[ "type": "checkbox", "label": "", "name": "completato", "value": "$completato$", "help": "", "placeholder": "", "extra": "" ]} +
+ {[ "type": "checkbox", "label": "", "name": "completato", "value": "$completato$", "help": "", "placeholder": "", "extra": "" ]}
{[ "type": "text", "label": "", "name": "colore", "required": 1, "class": "colorpicker text-center", "value": "$colore$", "extra": "maxlength='7'", "icon-after": "
" ]}
+ +
+
+ {[ "type": "checkbox", "label": "", "name": "notifica", "value": "$notifica$" ]} +
+ +
+ {[ "type": "select", "label": "", "name": "email", "value": "$id_email$", "values": "query=SELECT id, name AS descrizione FROM zz_emails WHERE id_module = AND deleted_at IS NULL" ]} +
+ +
+ {[ "type": "text", "label": "", "name": "destinatari", "value": "$destinatari$" ]} +
+
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; - } } diff --git a/src/Models/MailAccount.php b/src/Models/MailAccount.php new file mode 100644 index 000000000..492aff1ff --- /dev/null +++ b/src/Models/MailAccount.php @@ -0,0 +1,21 @@ +belongsTo(MailTemplate::class, 'id_smtp'); + } +} diff --git a/src/Models/MailTemplate.php b/src/Models/MailTemplate.php new file mode 100644 index 000000000..15e7e550f --- /dev/null +++ b/src/Models/MailTemplate.php @@ -0,0 +1,26 @@ +belongsTo(Module::class, 'id_module'); + } + + public function account() + { + return $this->hasOne(MailAccount::class, 'id_smtp'); + } +} diff --git a/src/Models/Module.php b/src/Models/Module.php index a533c0e12..2edf57388 100644 --- a/src/Models/Module.php +++ b/src/Models/Module.php @@ -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') diff --git a/src/Notifications/EmailNotification.php b/src/Notifications/EmailNotification.php new file mode 100644 index 000000000..dfb43d8e9 --- /dev/null +++ b/src/Notifications/EmailNotification.php @@ -0,0 +1,195 @@ +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(); + } +} diff --git a/src/Notifications/Notification.php b/src/Notifications/Notification.php new file mode 100644 index 000000000..39f979468 --- /dev/null +++ b/src/Notifications/Notification.php @@ -0,0 +1,72 @@ +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(); +} diff --git a/update/2_4_2.sql b/update/2_4_2.sql index 40adf3233..8c4925db0 100644 --- a/update/2_4_2.sql +++ b/update/2_4_2.sql @@ -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}', '', '', '', '

Gentile Tecnico,

\r\n

un nuovo intervento {numero} in {data} è stato aggiunto.

\r\n

 

\r\n

Distinti saluti

\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}', '', '', '', '

Gentile Tecnico,

\r\n

sei stato rimosso dall''intervento {numero} in {data}.

\r\n

 

\r\n

Distinti saluti

\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}.', '', '', '', '

Gentile Utente,

\r\n

l''intervento {numero} in {data} è stato spostato nello stato {stato}.

', '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'));