diff --git a/modules/scadenzario/src/SollecitoTask.php b/modules/scadenzario/src/SollecitoTask.php new file mode 100644 index 000000000..d38ec9aa0 --- /dev/null +++ b/modules/scadenzario/src/SollecitoTask.php @@ -0,0 +1,145 @@ +. + */ + +namespace Modules\Scadenzario; + +use Models\OperationLog; +use Models\User; +use Modules; +use Modules\Emails\Mail; +use Modules\Emails\Template; +use Modules\Scadenzario\Scadenza; +use Prints; +use Tasks\Manager; +use Uploads; + +/** + * Task dedicato alla gestione del backup giornaliero automatico, se abilitato da Impostazioni. + */ +class SollecitoTask extends Manager +{ + public function needsExecution() + { + if (setting('Invio solleciti in automatico')>0) { + $giorni_scadenza = setting("Ritardo in giorni della scadenza della fattura per invio sollecito pagamento"); + + $rs = database()->fetchArray("SELECT co_scadenziario.* FROM co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN zz_segments ON co_documenti.id_segment=zz_segments.id WHERE co_tipidocumento.dir='entrata' AND is_fiscale=1 AND zz_segments.autofatture=0 AND ABS(`co_scadenziario`.`pagato`) < ABS(`co_scadenziario`.`da_pagare`) AND scadenza0){ + return true; + } else { + return false; + } + } else { + return false; + } + } + + public function execute() + { + if(setting('Invio solleciti in automatico')>0){ + $giorni_scadenza = setting("Ritardo in giorni della scadenza della fattura per invio sollecito pagamento"); + $giorni_ultimo_sollecito = setting("Ritardo in giorni dall'ultima email per invio sollecito pagamento"); + $id_template = setting("Template email invio sollecito"); + $id_user = database()->selectOne('zz_users', 'id', ['idgruppo' => 1, 'enabled' => 1])['id']; + $user = User::find($id_user); + + if ($id_template) { + $rs = database()->fetchArray("SELECT co_scadenziario.* FROM co_scadenziario INNER JOIN co_documenti ON co_scadenziario.iddocumento=co_documenti.id INNER JOIN co_tipidocumento ON co_documenti.idtipodocumento=co_tipidocumento.id INNER JOIN zz_segments ON co_documenti.id_segment=zz_segments.id WHERE co_tipidocumento.dir='entrata' AND is_fiscale=1 AND zz_segments.autofatture=0 AND ABS(`co_scadenziario`.`pagato`) < ABS(`co_scadenziario`.`da_pagare`) AND scadenzafetchArray("SELECT * FROM em_emails WHERE id_template=".prepare($id_template)." AND id_record=".prepare($r['id'])." AND sent_at>DATE_SUB(NOW(), INTERVAL ".prepare($giorni_ultimo_sollecito)." DAY)"); + + if (!$has_inviata) { + $template = Template::find($id_template); + $id = $r['id']; + + $scadenza = Scadenza::find($id); + $documento = $scadenza->documento; + + $id_documento = $documento->id; + $id_anagrafica = $documento->idanagrafica; + $id_module = Modules::get('Scadenzario')->id; + + $fattura_allegata = database()->selectOne('zz_files', 'id', ['id_module' => $id_module, 'id_record' => $id, 'original' => 'Fattura di vendita.pdf'])['id']; + + // Allego stampa della fattura se non presente + if (empty($fattura_allegata)) { + $print_predefined = database()->selectOne('zz_prints', '*', ['predefined' => 1, 'id_module' => Modules::get('Fatture di vendita')['id']]); + + $print = Prints::render($print_predefined['id'], $id_documento, null, true); + $name = 'Fattura di vendita'; + $upload = Uploads::upload($print['pdf'], [ + 'name' => $name, + 'original_name' => $name.'.pdf', + 'category' => 'Generale', + 'id_module' => $id_module, + 'id_record' => $id, + ]); + + $fattura_allegata = database()->selectOne('zz_files', 'id', ['id_module' => $id_module, 'id_record' => $id, 'original' => 'Fattura di vendita.pdf'])['id']; + } + + // Selezione destinatari e invio mail + if (!empty($template)) { + $creata_mail = false; + $emails = []; + + // Aggiungo email anagrafica + if (!empty($documento->anagrafica->email)) { + $emails[] = $documento->anagrafica->email; + $mail = Mail::build($user, $template, $id); + $mail->addReceiver($documento->anagrafica->email); + $creata_mail = true; + } + + // Aggiungo email referenti in base alla mansione impostata nel template + $mansioni = database()->select('em_mansioni_template', 'idmansione', ['id_template' => $template->id]); + foreach ($mansioni as $mansione) { + $referenti = database()->table('an_referenti')->where('idmansione', $mansione['idmansione'])->where('idanagrafica', $id_anagrafica)->where('email', '!=', '')->get(); + if (!$referenti->isEmpty() && $creata_mail == false) { + $mail = Mail::build($user, $template, $id); + $creata_mail = true; + } + + foreach ($referenti as $referente) { + if (!in_array($referente->email, $emails)) { + $emails[] = $referente->email; + $mail->addReceiver($referente->email); + } + } + } + if (!empty($emails)) { + if (!empty($fattura_allegata)) { + $mail->addUpload($fattura_allegata); + } + + $mail->save(); + OperationLog::setInfo('id_email', $mail->id); + OperationLog::setInfo('id_module', $id_module); + OperationLog::setInfo('id_record', $id); + OperationLog::build('send-email'); + } + } + } + } + } + } + } +} diff --git a/update/2_4_43.sql b/update/2_4_43.sql index 117c35016..81cfde81e 100644 --- a/update/2_4_43.sql +++ b/update/2_4_43.sql @@ -1 +1,9 @@ -UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(dati.id) AS dato FROM(SELECT id, ((SELECT SUM(co_righe_contratti.qta) FROM co_righe_contratti WHERE co_righe_contratti.um=\'ore\' AND co_righe_contratti.idcontratto=co_contratti.id) - IFNULL( (SELECT SUM(in_interventi_tecnici.ore) FROM in_interventi_tecnici INNER JOIN in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id WHERE in_interventi.id_contratto=co_contratti.id AND in_interventi.idstatointervento IN (SELECT in_statiintervento.idstatointervento FROM in_statiintervento WHERE in_statiintervento.is_completato = 1)), 0) ) AS ore_rimanenti, DATEDIFF(data_conclusione, NOW()) AS giorni_rimanenti, data_conclusione, ore_preavviso_rinnovo, giorni_preavviso_rinnovo, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=co_contratti.idanagrafica) AS ragione_sociale FROM co_contratti WHERE rinnovabile = 1 AND YEAR(data_conclusione) > 1970 AND co_contratti.id NOT IN (SELECT idcontratto_prev FROM co_contratti contratti) HAVING (ore_rimanenti <= ore_preavviso_rinnovo OR DATEDIFF(data_conclusione, NOW()) <= ABS(giorni_preavviso_rinnovo)) ORDER BY giorni_rimanenti ASC, ore_rimanenti ASC) dati' WHERE `zz_widgets`.`name` = 'Contratti in scadenza'; \ No newline at end of file +UPDATE `zz_widgets` SET `query` = 'SELECT COUNT(dati.id) AS dato FROM(SELECT id, ((SELECT SUM(co_righe_contratti.qta) FROM co_righe_contratti WHERE co_righe_contratti.um=\'ore\' AND co_righe_contratti.idcontratto=co_contratti.id) - IFNULL( (SELECT SUM(in_interventi_tecnici.ore) FROM in_interventi_tecnici INNER JOIN in_interventi ON in_interventi_tecnici.idintervento=in_interventi.id WHERE in_interventi.id_contratto=co_contratti.id AND in_interventi.idstatointervento IN (SELECT in_statiintervento.idstatointervento FROM in_statiintervento WHERE in_statiintervento.is_completato = 1)), 0) ) AS ore_rimanenti, DATEDIFF(data_conclusione, NOW()) AS giorni_rimanenti, data_conclusione, ore_preavviso_rinnovo, giorni_preavviso_rinnovo, (SELECT ragione_sociale FROM an_anagrafiche WHERE idanagrafica=co_contratti.idanagrafica) AS ragione_sociale FROM co_contratti WHERE rinnovabile = 1 AND YEAR(data_conclusione) > 1970 AND co_contratti.id NOT IN (SELECT idcontratto_prev FROM co_contratti contratti) HAVING (ore_rimanenti <= ore_preavviso_rinnovo OR DATEDIFF(data_conclusione, NOW()) <= ABS(giorni_preavviso_rinnovo)) ORDER BY giorni_rimanenti ASC, ore_rimanenti ASC) dati' WHERE `zz_widgets`.`name` = 'Contratti in scadenza'; + +-- Invio sollecito automatico +INSERT INTO `zz_tasks` (`name`, `class`, `expression`) VALUES +('Solleciti scadenze', 'Modules\\Scadenzario\\SollecitoTask', '0 8 * * *'); +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, 'Invio solleciti in automatico', '0', 'boolean', '1', 'Scadenzario', '1', 'Invia automaticamente delle mail di sollecito secondo le tempistiche definite nelle impostazioni'); +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, 'Template email invio sollecito', (SELECT `id` FROM `em_templates` WHERE `name`="Sollecito di pagamento"), 'query=SELECT id, name AS descrizione FROM em_templates WHERE deleted_at IS NULL ORDER BY descrizione', '1', 'Scadenzario', '2', NULL); +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, "Ritardo in giorni della scadenza della fattura per invio sollecito pagamento", '10', 'integer', '1', 'Scadenzario', '3', ''); +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES (NULL, "Ritardo in giorni dall'ultima email per invio sollecito pagamento", '10', 'integer', '1', 'Scadenzario', '4', ''); \ No newline at end of file