From 9ab649ff72efd0ec4e45c4f6f30f8e6c9c8b0c73 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Wed, 22 Sep 2021 17:17:03 +0200 Subject: [PATCH 1/3] Correzione #988 --- templates/preventivi/body.php | 37 ++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/templates/preventivi/body.php b/templates/preventivi/body.php index 45105f16d..dd09759fd 100755 --- a/templates/preventivi/body.php +++ b/templates/preventivi/body.php @@ -18,19 +18,42 @@ */ use Carbon\CarbonInterval; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Modules\Anagrafiche\Anagrafica; +use Modules\Banche\Banca; +use Modules\Pagamenti\Pagamento; include_once __DIR__.'/../../core.php'; $anagrafica = Anagrafica::find($documento['idanagrafica']); -$pagamento = $dbo->fetchOne('SELECT * FROM co_pagamenti WHERE id = '.prepare($documento['idpagamento'])); +$anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita')); -// Verifico se c'è una banca predefinita per il mio cliente -if (!empty($anagrafica->idbanca_vendite)) { - $banca = $dbo->fetchOne('SELECT co_banche.nome, co_banche.iban, co_banche.bic FROM co_banche WHERE co_banche.id_pianodeiconti3 = '.prepare($pagamento['idconto_vendite']).' AND co_banche.id_anagrafica = '.prepare($anagrafica->id).' AND co_banche.id ='.prepare($anagrafica->idbanca_vendite)); -} elseif (!empty($pagamento['idconto_vendite'])) { - // Altrimenti prendo quella associata la metodo di pagamento selezionato - $banca = $dbo->fetchOne('SELECT co_banche.nome, co_banche.iban, co_banche.bic FROM co_banche WHERE co_banche.id_pianodeiconti3 = '.prepare($pagamento['idconto_vendite']).' AND co_banche.id_anagrafica = '.prepare($anagrafica->id).' AND co_banche.deleted_at IS NULL'); +$pagamento = Pagamento::find($documento['idpagamento']); + +// Banca dell'Azienda corrente impostata come predefinita per il Cliente +$banca_azienda = Banca::where('id_anagrafica', '=', $anagrafica_azienda->id); +try { + $banca = (clone $banca_azienda) + ->findOrFail($anagrafica->idbanca_vendite); +} catch (ModelNotFoundException $e) { + // Ricerca prima banca dell'Azienda con Conto corrispondente + $banca = (clone $banca_azienda) + ->where('id_pianodeiconti3', '=', $pagamento['idconto_vendite']) + ->first(); + + // Ricerca prima banca dell'Azienda con Conto corrispondente + if (empty($banca)) { + $banca = (clone $banca_azienda) + ->where('id_pianodeiconti3', '=', 0) + ->first(); + } +} + +// Ri.Ba: Banca predefinita *del Cliente* piuttosto che dell'Azienda +if ($pagamento->isRiBa()) { + $banca = Banca::where('id_anagrafica', $anagrafica->id) + ->where('predefined', 1) + ->first(); } // Righe documento From 66bd810f24d5fb587362b2270066a32ecae771b4 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Wed, 22 Sep 2021 17:24:13 +0200 Subject: [PATCH 2/3] Miglioramento individuazione banca per Preventivi --- templates/preventivi/body.php | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/templates/preventivi/body.php b/templates/preventivi/body.php index dd09759fd..8c9828726 100755 --- a/templates/preventivi/body.php +++ b/templates/preventivi/body.php @@ -31,22 +31,16 @@ $anagrafica_azienda = Anagrafica::find(setting('Azienda predefinita')); $pagamento = Pagamento::find($documento['idpagamento']); // Banca dell'Azienda corrente impostata come predefinita per il Cliente -$banca_azienda = Banca::where('id_anagrafica', '=', $anagrafica_azienda->id); +$banca_azienda = Banca::where('id_anagrafica', '=', $anagrafica_azienda->id) + ->where('id_pianodeiconti3', '=', $pagamento['idconto_vendite'] ?: 0); try { $banca = (clone $banca_azienda) ->findOrFail($anagrafica->idbanca_vendite); } catch (ModelNotFoundException $e) { // Ricerca prima banca dell'Azienda con Conto corrispondente $banca = (clone $banca_azienda) - ->where('id_pianodeiconti3', '=', $pagamento['idconto_vendite']) + ->orderBy('predefined', 'DESC') ->first(); - - // Ricerca prima banca dell'Azienda con Conto corrispondente - if (empty($banca)) { - $banca = (clone $banca_azienda) - ->where('id_pianodeiconti3', '=', 0) - ->first(); - } } // Ri.Ba: Banca predefinita *del Cliente* piuttosto che dell'Azienda From ae82b8b1c168b2d5debf894c3664ca58eabb845f Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Thu, 23 Sep 2021 10:04:44 +0200 Subject: [PATCH 3/3] Aggiunto test invio email per Newsletter --- modules/contratti/bulk.php | 1 - modules/emails/src/EmailHook.php | 4 +- modules/interventi/actions.php | 32 ++++++------ modules/interventi/modutil.php | 1 - modules/newsletter/actions.php | 70 +++++++++++++++------------ modules/newsletter/ajax/table.php | 5 +- modules/newsletter/edit.php | 43 ++++++++++++++++ modules/newsletter/src/Newsletter.php | 40 +++++++++++++++ modules/ordini/bulk.php | 2 +- 9 files changed, 146 insertions(+), 52 deletions(-) diff --git a/modules/contratti/bulk.php b/modules/contratti/bulk.php index a6fc65a76..e9354570f 100755 --- a/modules/contratti/bulk.php +++ b/modules/contratti/bulk.php @@ -40,7 +40,6 @@ $idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [ 'dir' => 'entrata', ])['id']; - switch (post('op')) { case 'crea_fattura': $documenti = collect(); diff --git a/modules/emails/src/EmailHook.php b/modules/emails/src/EmailHook.php index f46fbd426..b6abc997a 100755 --- a/modules/emails/src/EmailHook.php +++ b/modules/emails/src/EmailHook.php @@ -95,9 +95,9 @@ class EmailHook extends Manager } // Invio effettivo - foreach ($lista as $lista_account) { + foreach ($lista as $mail) { try { - $email = EmailNotification::build($lista_account); + $email = EmailNotification::build($mail); $email->send(); } catch (Exception $e) { } diff --git a/modules/interventi/actions.php b/modules/interventi/actions.php index d10de4933..e71332322 100644 --- a/modules/interventi/actions.php +++ b/modules/interventi/actions.php @@ -214,37 +214,37 @@ switch (post('op')) { 'id_tecnico' => $tecnici_assegnati, ]); - if(!empty(post('ricorsiva'))){ + if (!empty(post('ricorsiva'))) { $periodicita = post('periodicita'); $data = post('data_inizio_ricorrenza'); - $interval = post('tipo_periodicita')!='manual' ? post('tipo_periodicita') : 'days'; + $interval = post('tipo_periodicita') != 'manual' ? post('tipo_periodicita') : 'days'; $stato = Stato::find(post('idstatoricorrenze')); // Estraggo le date delle ricorrenze - if (post('metodo_ricorrenza')=='data') { + if (post('metodo_ricorrenza') == 'data') { $data_fine = post('data_fine_ricorrenza'); - while(strtotime($data)<=strtotime($data_fine)){ + while (strtotime($data) <= strtotime($data_fine)) { $data = date('Y-m-d', strtotime('+'.$periodicita.' '.$interval.'', strtotime($data))); $w = date('w', strtotime($data)); //Escludo sabato e domenica - if($w=='6'){ + if ($w == '6') { $data = date('Y-m-d', strtotime('+2 day', strtotime($data))); - }else if($w=='0'){ + } elseif ($w == '0') { $data = date('Y-m-d', strtotime('+1 day', strtotime($data))); } - if ($data<=$data_fine) { + if ($data <= $data_fine) { $date_ricorrenze[] = $data; } } } else { $ricorrenze = post('numero_ricorrenze'); - for($i=0; $i<$ricorrenze; $i++){ + for ($i = 0; $i < $ricorrenze; ++$i) { $data = date('Y-m-d', strtotime('+'.$periodicita.' '.$interval.'', strtotime($data))); $w = date('w', strtotime($data)); //Escludo sabato e domenica - if($w=='6'){ + if ($w == '6') { $data = date('Y-m-d', strtotime('+2 day', strtotime($data))); - }else if($w=='0'){ + } elseif ($w == '0') { $data = date('Y-m-d', strtotime('+1 day', strtotime($data))); } @@ -252,7 +252,7 @@ switch (post('op')) { } } - foreach($date_ricorrenze as $data_ricorrenza){ + foreach ($date_ricorrenze as $data_ricorrenza) { $intervento = Intervento::find($id_record); $new = $intervento->replicate(); // Calcolo il nuovo codice @@ -274,16 +274,16 @@ switch (post('op')) { $diff = strtotime($sessione->orario_inizio) - strtotime($inizio_old); $orario_inizio = date('Y-m-d H:i:s', (strtotime($sessione->orario_inizio) + $diff)); } - + $diff_fine = strtotime($sessione->orario_fine) - strtotime($sessione->orario_inizio); $orario_fine = date('Y-m-d H:i:s', (strtotime($orario_inizio) + $diff_fine)); - + $new_sessione = $sessione->replicate(); $new_sessione->idintervento = $new->id; $new_sessione->orario_inizio = $orario_inizio; $new_sessione->orario_fine = $orario_fine; $new_sessione->save(); - + ++$numero_sessione; $inizio_old = $sessione->orario_inizio; } @@ -297,11 +297,11 @@ switch (post('op')) { 'id_tecnico' => $tecnici_assegnati, ]); - $n_ricorrenze++; + ++$n_ricorrenze; } flash()->info(tr('Aggiunte _NUM_ nuove ricorrenze!', [ - '_NUM_' => $n_ricorrenze, + '_NUM_' => $n_ricorrenze, ])); } diff --git a/modules/interventi/modutil.php b/modules/interventi/modutil.php index d74abd0c9..7aaf4c0bf 100755 --- a/modules/interventi/modutil.php +++ b/modules/interventi/modutil.php @@ -143,7 +143,6 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion $fattura = Fattura::find($id_fattura); $intervento = Intervento::find($id_intervento); - $data = $intervento->fine; $codice = $intervento->codice; diff --git a/modules/newsletter/actions.php b/modules/newsletter/actions.php index 5c085652e..f0d4ba719 100755 --- a/modules/newsletter/actions.php +++ b/modules/newsletter/actions.php @@ -24,7 +24,8 @@ use Modules\Emails\Mail; use Modules\Emails\Template; use Modules\ListeNewsletter\Lista; use Modules\Newsletter\Newsletter; -use Respect\Validation\Validator as v; +use Notifications\EmailNotification; +use PHPMailer\PHPMailer\Exception; include_once __DIR__.'/../../core.php'; @@ -61,42 +62,19 @@ switch (filter('op')) { break; case 'send': - $template = $newsletter->template; - $uploads = $newsletter->uploads()->pluck('id'); + $newsletter = Newsletter::find($id_record); $destinatari = $newsletter->destinatari(); $count = $destinatari->count(); for ($i = 0; $i < $count; ++$i) { $destinatario = $destinatari->skip($i)->first(); - $origine = $destinatario->getOrigine(); - - $anagrafica = $origine instanceof Anagrafica ? $origine : $origine->anagrafica; - - $abilita_newsletter = $anagrafica->enable_newsletter; - $email = $destinatario->email; - if (empty($email) || empty($abilita_newsletter) || !v::email()->validate($email)) { - continue; - } - - // Inizializzazione email - $mail = Mail::build($user, $template, $anagrafica->id); - - // Completamento informazioni - $mail->addReceiver($email); - $mail->subject = $newsletter->subject; - $mail->content = $newsletter->content; - $mail->id_newsletter = $newsletter->id; - - // Registrazione allegati - foreach ($uploads as $upload) { - $mail->addUpload($upload); - } - - $mail->save(); + $mail = $newsletter->inviaDestinatario($destinatario); // Aggiornamento riferimento per la newsletter - $destinatario->id_email = $mail->id; - $destinatario->save(); + if (!empty($mail)) { + $destinatario->id_email = $mail->id; + $destinatario->save(); + } } // Aggiornamento stato newsletter @@ -107,6 +85,38 @@ switch (filter('op')) { break; + case 'test': + $receiver_id = post('id'); + $receiver_type = post('type'); + + // Individuazione destinatario interessato + $newsletter = Newsletter::find($id_record); + $destinatario = $newsletter->destinatari() + ->where('record_type', '=', $receiver_type) + ->where('record_id', '=', $receiver_id) + ->first(); + + // Generazione email e tentativo di invio + $inviata = false; + if (!empty($destinatario)) { + $mail = $newsletter->inviaDestinatario($destinatario, true); + + try { + $email = EmailNotification::build($mail, true); + $email->send(); + + $inviata = true; + } catch (Exception $e) { + // $mail->delete(); + } + } + + echo json_encode([ + 'result' => $inviata, + ]); + + break; + case 'block': $mails = $newsletter->emails; diff --git a/modules/newsletter/ajax/table.php b/modules/newsletter/ajax/table.php index 34099113f..ed4f15f23 100644 --- a/modules/newsletter/ajax/table.php +++ b/modules/newsletter/ajax/table.php @@ -119,7 +119,10 @@ foreach ($destinatari_filtrati as $destinatario) { ' '.tr('Disabilitato').'' ).' ', - '
+ '
'.(empty($lista) && !empty($origine->email) && !empty($anagrafica->enable_newsletter) ? ' + + + ' : '').' diff --git a/modules/newsletter/edit.php b/modules/newsletter/edit.php index 9b1c63d7c..4c1e65b56 100755 --- a/modules/newsletter/edit.php +++ b/modules/newsletter/edit.php @@ -240,4 +240,47 @@ $(document).ready(function() { } }); }); + +function testInvio(button) { + const destinatario_id = $(button).data("id"); + const destinatario_type = $(button).data("type"); + const email = $(button).data("email"); + + swal({ + title: "'.tr('Invio di test?').'", + html: `'.tr("Vuoi effettuare un invio di test all'indirizzo _EMAIL_?", ['_EMAIL_' => '${email}']).' '.tr("L'email non sarà registrata come inviata, e l'invio della newsletter non escluderà questo indirizzo").'.`, + type: "warning", + showCancelButton: true, + confirmButtonText: "'.tr('Invia').'", + confirmButtonClass: "btn btn-lg btn-success", + }).then(function() { + const restore = buttonLoading(button); + $.ajax({ + url: globals.rootdir + "/actions.php", + type: "POST", + dataType: "JSON", + data: { + id_module: globals.id_module, + id_record: globals.id_record, + op: "test", + id: destinatario_id, + type: destinatario_type, + }, + success: function (response) { + buttonRestore(button, restore); + + if (response.result) { + swal("'.tr('Invio completato').'", "", "success"); + } else { + swal("'.tr('Invio fallito').'", "", "error"); + } + }, + error: function() { + buttonRestore(button, restore); + + swal("'.tr('Errore').'", "'.tr("Errore durante l'invio dell'email").'", "error"); + } + }); + }); +} '; diff --git a/modules/newsletter/src/Newsletter.php b/modules/newsletter/src/Newsletter.php index 335ffa4fa..ed02d46bc 100755 --- a/modules/newsletter/src/Newsletter.php +++ b/modules/newsletter/src/Newsletter.php @@ -29,6 +29,7 @@ use Modules\Anagrafiche\Sede; use Modules\Emails\Account; use Modules\Emails\Mail; use Modules\Emails\Template; +use Respect\Validation\Validator as v; use Traits\RecordTrait; class Newsletter extends Model @@ -132,6 +133,45 @@ class Newsletter extends Model ->where('record_type', '=', $tipo); } + /** + * Metodo per inviare l'email della newsletter a uno specifico destinatario. + * + * @return Mail|null + */ + public function inviaDestinatario(Destinatario $destinatario, $test = false) + { + $template = $this->template; + $uploads = $this->uploads()->pluck('id'); + + $origine = $destinatario->getOrigine(); + + $anagrafica = $origine instanceof Anagrafica ? $origine : $origine->anagrafica; + + $abilita_newsletter = $anagrafica->enable_newsletter; + $email = $destinatario->email; + if (empty($email) || empty($abilita_newsletter) || !v::email()->validate($email)) { + return null; + } + + // Inizializzazione email + $mail = Mail::build(auth()->getUser(), $template, $anagrafica->id); + + // Completamento informazioni + $mail->addReceiver($email); + $mail->subject = ($test ? '[Test] ' : '').$this->subject; + $mail->content = $this->content; + $mail->id_newsletter = $this->id; + + // Registrazione allegati + foreach ($uploads as $upload) { + $mail->addUpload($upload); + } + + $mail->save(); + + return $mail; + } + // Relazione Eloquent public function destinatari() diff --git a/modules/ordini/bulk.php b/modules/ordini/bulk.php index 5f5125749..45897cc5c 100644 --- a/modules/ordini/bulk.php +++ b/modules/ordini/bulk.php @@ -44,7 +44,7 @@ switch (post('op')) { case 'crea_fattura': $documenti = collect(); $numero_totale = 0; - + $tipo_documento = Tipo::where('id', post('idtipodocumento'))->first(); $stato_documenti_accodabili = Stato::where('descrizione', 'Bozza')->first();