From 53eb6446219c65a22625994beb3568f80dfa516e Mon Sep 17 00:00:00 2001 From: MatteoPistorello Date: Tue, 25 Jun 2024 11:50:52 +0200 Subject: [PATCH] Migliorie solleciti automatici --- modules/scadenzario/src/SollecitoTask.php | 133 +++++++++++++--------- update/2_5_3.sql | 25 ++++ 2 files changed, 106 insertions(+), 52 deletions(-) diff --git a/modules/scadenzario/src/SollecitoTask.php b/modules/scadenzario/src/SollecitoTask.php index a60386052..c839c0020 100644 --- a/modules/scadenzario/src/SollecitoTask.php +++ b/modules/scadenzario/src/SollecitoTask.php @@ -35,15 +35,7 @@ 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 `scadenza` 0) { - return true; - } else { - return false; - } + return true; } else { return false; } @@ -53,51 +45,87 @@ class SollecitoTask extends Manager { 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'); + $giorni_prossimo_sollecito = setting("Ritardo in giorni dall'ultima email per invio sollecito pagamento"); + $template_1 = setting('Template email primo sollecito'); + $template_2 = setting('Template email secondo sollecito'); + $template_3 = setting('Template email terzo sollecito'); + $template_notifica = setting('Template email mancato pagamento dopo i solleciti'); $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 `scadenza`fetchArray('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)'); + $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 `scadenza` < DATE_SUB(NOW(), INTERVAL ".prepare($giorni_scadenza).' DAY)'); + foreach ($rs as $r) { + $da_inviare = false; + $destinatario = ''; + $has_inviata = database()->fetchOne('SELECT * FROM em_emails WHERE sent_at IS NOT NULL AND id_template='.prepare($template_1).' AND id_record='.prepare($r['id'])); + $data_sollecito_1 = $has_inviata['sent_at']; + $id_template = $template_1; + if (!$has_inviata) { + $da_inviare = date('Y-m-d', strtotime($r['scadenza'].' + '.($giorni_scadenza).' days')) < date('Y-m-d') ? true : false; + } else { + $has_inviata = database()->fetchOne('SELECT * FROM em_emails WHERE sent_at IS NOT NULL AND id_template='.prepare($template_2).' AND id_record='.prepare($r['id'])); + $data_sollecito_2 = $has_inviata['sent_at']; + $id_template = $template_2; if (!$has_inviata) { - $template = Template::find($id_template); - $id = $r['id']; + $da_inviare = date('Y-m-d', strtotime($data_sollecito_1.' + '.$giorni_prossimo_sollecito.' days')) < date('Y-m-d') ? true : false; + } else { + $has_inviata = database()->fetchOne('SELECT * FROM em_emails WHERE sent_at IS NOT NULL AND id_template='.prepare($template_3).' AND id_record='.prepare($r['id'])); + $data_sollecito_3 = $has_inviata['sent_at']; + $id_template = $template_3; + if (!$has_inviata) { + $da_inviare = date('Y-m-d', strtotime($data_sollecito_2.' + '.$giorni_prossimo_sollecito.' days')) < date('Y-m-d') ? true : false; + } else { + $has_inviata = database()->fetchOne('SELECT * FROM em_emails WHERE sent_at IS NOT NULL AND id_template='.prepare($template_notifica).' AND id_record='.prepare($r['id'])); + $id_template = $template_notifica; + if (!$has_inviata) { + $destinatario = setting('Indirizzo email mancato pagamento dopo i solleciti'); + $da_inviare = date('Y-m-d', strtotime($data_sollecito_3.' + '.$giorni_prossimo_sollecito.' days')) < date('Y-m-d') && !empty($destinatario) ? true : false; + } + } + } + } - $scadenza = Scadenza::find($id); - $documento = $scadenza->documento; + if ($da_inviare && $id_template) { + $template = Template::find($id_template); + $id = $r['id']; - $id_documento = $documento->id; - $id_anagrafica = $documento->idanagrafica; - $id_module = Module::where('name', 'Scadenzario')->first()->id; + $scadenza = Scadenza::find($id); + $documento = $scadenza->documento; + + $id_documento = $documento->id; + $id_anagrafica = $documento->idanagrafica; + $id_module = Module::where('name', 'Scadenzario')->first()->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 = PrintTemplate::where('predefined', 1)->where('id_module', Module::where('name', 'Fatture di vendita')->first()->id)->first(); + $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']; + } - // Allego stampa della fattura se non presente - if (empty($fattura_allegata)) { - $print_predefined = PrintTemplate::where('predefined', 1)->where('id_module', Module::where('name', 'Fatture di vendita')->first()->id)->first(); - $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 = []; + // Selezione destinatari e invio mail + if (!empty($template)) { + $creata_mail = false; + $emails = []; + if ($destinatario) { + $emails[] = $destinatario; + $mail = Mail::build($user, $template, $id); + $mail->addReceiver($destinatario); + $creata_mail = true; + } else { // Aggiungo email anagrafica if (!empty($documento->anagrafica->email)) { $emails[] = $documento->anagrafica->email; @@ -122,17 +150,18 @@ class SollecitoTask extends Manager } } } - 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'); + 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_5_3.sql b/update/2_5_3.sql index fe6644978..490a8e9be 100644 --- a/update/2_5_3.sql +++ b/update/2_5_3.sql @@ -41,3 +41,28 @@ UPDATE `zz_plugins` SET `options` = '{ \"main_query\": [ { \"type\": \"table\", -- Fix vista sottocategorie in Articoli UPDATE `zz_views` INNER JOIN `zz_modules` ON `zz_views`.`id_module` = `zz_modules`.`id` SET `zz_views`.`query` = '`sottocategorie_lang`.`title`' WHERE `zz_modules`.`name` = 'Articoli' AND `zz_views`.`name` = 'Sottocategoria'; + +-- Gestione solleciti automatici +INSERT INTO `em_templates` (`id`, `id_module`, `name`, `icon`, `tipo_reply_to`, `reply_to`, `cc`, `bcc`, `read_notify`, `predefined`, `note_aggiuntive`, `deleted_at`, `id_account`, `created_at`) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name`='Scadenzario'), 'Secondo sollecito di pagamento', 'fa fa-envelope', '', '', '', '', '0', '1', '', NULL, '1', NULL); +INSERT INTO `em_templates_lang` (`id`, `id_lang`, `id_record`, `title`, `subject`, `body`, `created_at`) VALUES (NULL, (SELECT `valore` FROM `zz_settings` WHERE `nome` = 'Lingua'), (SELECT `id` FROM `em_templates` WHERE `name`='Secondo sollecito di pagamento'), 'Secondo sollecito di pagamento', 'Sollecito di pagamento fattura {numero}', '', NULL); + +INSERT INTO `em_templates` (`id`, `id_module`, `name`, `icon`, `tipo_reply_to`, `reply_to`, `cc`, `bcc`, `read_notify`, `predefined`, `note_aggiuntive`, `deleted_at`, `id_account`, `created_at`) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name`='Scadenzario'), 'Terzo sollecito di pagamento', 'fa fa-envelope', '', '', '', '', '0', '1', '', NULL, '1', NULL); +INSERT INTO `em_templates_lang` (`id`, `id_lang`, `id_record`, `title`, `subject`, `body`, `created_at`) VALUES (NULL, (SELECT `valore` FROM `zz_settings` WHERE `nome` = 'Lingua'), (SELECT `id` FROM `em_templates` WHERE `name`='Terzo sollecito di pagamento'), 'Terzo sollecito di pagamento', 'Sollecito di pagamento fattura {numero}', '', NULL); + +INSERT INTO `em_templates` (`id`, `id_module`, `name`, `icon`, `tipo_reply_to`, `reply_to`, `cc`, `bcc`, `read_notify`, `predefined`, `note_aggiuntive`, `deleted_at`, `id_account`, `created_at`) VALUES (NULL, (SELECT `id` FROM `zz_modules` WHERE `name`='Scadenzario'), 'Notifica interna sollecito di pagamento', 'fa fa-envelope', '', '', '', '', '0', '1', '', NULL, '1', NULL); +INSERT INTO `em_templates_lang` (`id`, `id_lang`, `id_record`, `title`, `subject`, `body`, `created_at`) VALUES (NULL, (SELECT `valore` FROM `zz_settings` WHERE `nome` = 'Lingua'), (SELECT `id` FROM `em_templates` WHERE `name`='Notifica interna sollecito di pagamento'), 'Notifica interna sollecito di pagamento', 'Notifica interna sollecito di pagamento fattura {numero}', '', NULL); + +UPDATE `zz_settings` SET `nome` = 'Template email primo sollecito' WHERE `zz_settings`.`nome` = 'Template email invio sollecito'; +UPDATE `zz_settings_lang` SET `title` = 'Template email primo sollecito' WHERE `zz_settings_lang`.`id_record` = (SELECT `id` FROM `zz_settings` WHERE `nome`='Template email primo sollecito'); + +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `created_at`, `order`) VALUES (NULL, 'Template email secondo sollecito', (SELECT `id` FROM `em_templates` WHERE `name`='Secondo sollecito di pagamento'), 'query=SELECT `em_templates`.`id`, `name` AS descrizione FROM `em_templates` LEFT JOIN `em_templates_lang` ON (`em_templates_lang`.`id_record` = `em_templates`.`id` AND `em_templates_lang`.`id_lang` = (SELECT `valore` FROM `zz_settings` WHERE `nome` = \"Lingua\"))', '1', 'Scadenzario', NULL, '3'); +INSERT INTO `zz_settings_lang` (`id`, `id_lang`, `id_record`, `title`, `help`, `created_at`) VALUES (NULL, (SELECT `valore` FROM `zz_settings` WHERE `nome` = 'Lingua'), (SELECT `id` FROM `zz_settings` WHERE `nome`='Template email secondo sollecito'), 'Template email secondo sollecito', '', NULL); + +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `created_at`, `order`) VALUES (NULL, 'Template email terzo sollecito', (SELECT `id` FROM `em_templates` WHERE `name`='Terzo sollecito di pagamento'), 'query=SELECT `em_templates`.`id`, `name` AS descrizione FROM `em_templates` LEFT JOIN `em_templates_lang` ON (`em_templates_lang`.`id_record` = `em_templates`.`id` AND `em_templates_lang`.`id_lang` = (SELECT `valore` FROM `zz_settings` WHERE `nome` = \"Lingua\"))', '1', 'Scadenzario', NULL, '4'); +INSERT INTO `zz_settings_lang` (`id`, `id_lang`, `id_record`, `title`, `help`, `created_at`) VALUES (NULL, (SELECT `valore` FROM `zz_settings` WHERE `nome` = 'Lingua'), (SELECT `id` FROM `zz_settings` WHERE `nome`='Template email terzo sollecito'), 'Template email terzo sollecito', '', NULL); + +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `created_at`, `order`) VALUES (NULL, 'Template email mancato pagamento dopo i solleciti', (SELECT `id` FROM `em_templates` WHERE `name`='Notifica interna sollecito di pagamento'), 'query=SELECT `em_templates`.`id`, `name` AS descrizione FROM `em_templates` LEFT JOIN `em_templates_lang` ON (`em_templates_lang`.`id_record` = `em_templates`.`id` AND `em_templates_lang`.`id_lang` = (SELECT `valore` FROM `zz_settings` WHERE `nome` = \"Lingua\"))', '1', 'Scadenzario', NULL, '4'); +INSERT INTO `zz_settings_lang` (`id`, `id_lang`, `id_record`, `title`, `help`, `created_at`) VALUES (NULL, (SELECT `valore` FROM `zz_settings` WHERE `nome` = 'Lingua'), (SELECT `id` FROM `zz_settings` WHERE `nome`='Template email mancato pagamento dopo i solleciti'), 'Template email mancato pagamento dopo i solleciti', '', NULL); + +INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `created_at`, `order`) VALUES (NULL, 'Indirizzo email mancato pagamento dopo i solleciti', '', 'string', '1', 'Scadenzario', NULL, '4'); +INSERT INTO `zz_settings_lang` (`id`, `id_lang`, `id_record`, `title`, `help`, `created_at`) VALUES (NULL, (SELECT `valore` FROM `zz_settings` WHERE `nome` = 'Lingua'), (SELECT `id` FROM `zz_settings` WHERE `nome`='Indirizzo email mancato pagamento dopo i solleciti'), 'Indirizzo email mancato pagamento dopo i solleciti', '', NULL);