This commit is contained in:
MatteoPistorello 2021-09-23 13:03:05 +02:00
commit 87516087d9
10 changed files with 170 additions and 59 deletions

View File

@ -40,7 +40,6 @@ $idtipodocumento = $dbo->selectOne('co_tipidocumento', ['id'], [
'dir' => 'entrata', 'dir' => 'entrata',
])['id']; ])['id'];
switch (post('op')) { switch (post('op')) {
case 'crea_fattura': case 'crea_fattura':
$documenti = collect(); $documenti = collect();

View File

@ -95,9 +95,9 @@ class EmailHook extends Manager
} }
// Invio effettivo // Invio effettivo
foreach ($lista as $lista_account) { foreach ($lista as $mail) {
try { try {
$email = EmailNotification::build($lista_account); $email = EmailNotification::build($mail);
$email->send(); $email->send();
} catch (Exception $e) { } catch (Exception $e) {
} }

View File

@ -214,37 +214,37 @@ switch (post('op')) {
'id_tecnico' => $tecnici_assegnati, 'id_tecnico' => $tecnici_assegnati,
]); ]);
if(!empty(post('ricorsiva'))){ if (!empty(post('ricorsiva'))) {
$periodicita = post('periodicita'); $periodicita = post('periodicita');
$data = post('data_inizio_ricorrenza'); $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')); $stato = Stato::find(post('idstatoricorrenze'));
// Estraggo le date delle ricorrenze // Estraggo le date delle ricorrenze
if (post('metodo_ricorrenza')=='data') { if (post('metodo_ricorrenza') == 'data') {
$data_fine = post('data_fine_ricorrenza'); $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))); $data = date('Y-m-d', strtotime('+'.$periodicita.' '.$interval.'', strtotime($data)));
$w = date('w', strtotime($data)); $w = date('w', strtotime($data));
//Escludo sabato e domenica //Escludo sabato e domenica
if($w=='6'){ if ($w == '6') {
$data = date('Y-m-d', strtotime('+2 day', strtotime($data))); $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))); $data = date('Y-m-d', strtotime('+1 day', strtotime($data)));
} }
if ($data<=$data_fine) { if ($data <= $data_fine) {
$date_ricorrenze[] = $data; $date_ricorrenze[] = $data;
} }
} }
} else { } else {
$ricorrenze = post('numero_ricorrenze'); $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))); $data = date('Y-m-d', strtotime('+'.$periodicita.' '.$interval.'', strtotime($data)));
$w = date('w', strtotime($data)); $w = date('w', strtotime($data));
//Escludo sabato e domenica //Escludo sabato e domenica
if($w=='6'){ if ($w == '6') {
$data = date('Y-m-d', strtotime('+2 day', strtotime($data))); $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))); $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); $intervento = Intervento::find($id_record);
$new = $intervento->replicate(); $new = $intervento->replicate();
// Calcolo il nuovo codice // Calcolo il nuovo codice
@ -274,16 +274,16 @@ switch (post('op')) {
$diff = strtotime($sessione->orario_inizio) - strtotime($inizio_old); $diff = strtotime($sessione->orario_inizio) - strtotime($inizio_old);
$orario_inizio = date('Y-m-d H:i:s', (strtotime($sessione->orario_inizio) + $diff)); $orario_inizio = date('Y-m-d H:i:s', (strtotime($sessione->orario_inizio) + $diff));
} }
$diff_fine = strtotime($sessione->orario_fine) - strtotime($sessione->orario_inizio); $diff_fine = strtotime($sessione->orario_fine) - strtotime($sessione->orario_inizio);
$orario_fine = date('Y-m-d H:i:s', (strtotime($orario_inizio) + $diff_fine)); $orario_fine = date('Y-m-d H:i:s', (strtotime($orario_inizio) + $diff_fine));
$new_sessione = $sessione->replicate(); $new_sessione = $sessione->replicate();
$new_sessione->idintervento = $new->id; $new_sessione->idintervento = $new->id;
$new_sessione->orario_inizio = $orario_inizio; $new_sessione->orario_inizio = $orario_inizio;
$new_sessione->orario_fine = $orario_fine; $new_sessione->orario_fine = $orario_fine;
$new_sessione->save(); $new_sessione->save();
++$numero_sessione; ++$numero_sessione;
$inizio_old = $sessione->orario_inizio; $inizio_old = $sessione->orario_inizio;
} }
@ -297,11 +297,11 @@ switch (post('op')) {
'id_tecnico' => $tecnici_assegnati, 'id_tecnico' => $tecnici_assegnati,
]); ]);
$n_ricorrenze++; ++$n_ricorrenze;
} }
flash()->info(tr('Aggiunte _NUM_ nuove ricorrenze!', [ flash()->info(tr('Aggiunte _NUM_ nuove ricorrenze!', [
'_NUM_' => $n_ricorrenze, '_NUM_' => $n_ricorrenze,
])); ]));
} }

View File

@ -143,7 +143,6 @@ function aggiungi_intervento_in_fattura($id_intervento, $id_fattura, $descrizion
$fattura = Fattura::find($id_fattura); $fattura = Fattura::find($id_fattura);
$intervento = Intervento::find($id_intervento); $intervento = Intervento::find($id_intervento);
$data = $intervento->fine; $data = $intervento->fine;
$codice = $intervento->codice; $codice = $intervento->codice;

View File

@ -24,7 +24,8 @@ use Modules\Emails\Mail;
use Modules\Emails\Template; use Modules\Emails\Template;
use Modules\ListeNewsletter\Lista; use Modules\ListeNewsletter\Lista;
use Modules\Newsletter\Newsletter; use Modules\Newsletter\Newsletter;
use Respect\Validation\Validator as v; use Notifications\EmailNotification;
use PHPMailer\PHPMailer\Exception;
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
@ -61,42 +62,19 @@ switch (filter('op')) {
break; break;
case 'send': case 'send':
$template = $newsletter->template; $newsletter = Newsletter::find($id_record);
$uploads = $newsletter->uploads()->pluck('id');
$destinatari = $newsletter->destinatari(); $destinatari = $newsletter->destinatari();
$count = $destinatari->count(); $count = $destinatari->count();
for ($i = 0; $i < $count; ++$i) { for ($i = 0; $i < $count; ++$i) {
$destinatario = $destinatari->skip($i)->first(); $destinatario = $destinatari->skip($i)->first();
$origine = $destinatario->getOrigine(); $mail = $newsletter->inviaDestinatario($destinatario);
$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();
// Aggiornamento riferimento per la newsletter // Aggiornamento riferimento per la newsletter
$destinatario->id_email = $mail->id; if (!empty($mail)) {
$destinatario->save(); $destinatario->id_email = $mail->id;
$destinatario->save();
}
} }
// Aggiornamento stato newsletter // Aggiornamento stato newsletter
@ -107,6 +85,38 @@ switch (filter('op')) {
break; 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': case 'block':
$mails = $newsletter->emails; $mails = $newsletter->emails;

View File

@ -119,7 +119,10 @@ foreach ($destinatari_filtrati as $destinatario) {
'<span class="text-warning"><i class="fa fa-exclamation-triangle"></i> '.tr('Disabilitato').'</span>' '<span class="text-warning"><i class="fa fa-exclamation-triangle"></i> '.tr('Disabilitato').'</span>'
).' ).'
</div>', </div>',
'<div class="text-center"> '<div class="text-center">'.(empty($lista) && !empty($origine->email) && !empty($anagrafica->enable_newsletter) ? '
<a class="btn btn-warning btn-xs" data-type="'.get_class($origine).'" data-id="'.$origine->id.'" data-email="'.$origine->email.'" onclick="testInvio(this)">
<i class="fa fa-paper-plane "></i>
</a>' : '').'
<a class="btn btn-danger ask btn-xs" data-backto="record-edit" data-op="remove_receiver" data-type="'.get_class($origine).'" data-id="'.$origine->id.'"> <a class="btn btn-danger ask btn-xs" data-backto="record-edit" data-op="remove_receiver" data-type="'.get_class($origine).'" data-id="'.$origine->id.'">
<i class="fa fa-trash"></i> <i class="fa fa-trash"></i>
</a> </a>

View File

@ -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");
}
});
});
}
</script>'; </script>';

View File

@ -29,6 +29,7 @@ use Modules\Anagrafiche\Sede;
use Modules\Emails\Account; use Modules\Emails\Account;
use Modules\Emails\Mail; use Modules\Emails\Mail;
use Modules\Emails\Template; use Modules\Emails\Template;
use Respect\Validation\Validator as v;
use Traits\RecordTrait; use Traits\RecordTrait;
class Newsletter extends Model class Newsletter extends Model
@ -132,6 +133,45 @@ class Newsletter extends Model
->where('record_type', '=', $tipo); ->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 // Relazione Eloquent
public function destinatari() public function destinatari()

View File

@ -44,7 +44,7 @@ switch (post('op')) {
case 'crea_fattura': case 'crea_fattura':
$documenti = collect(); $documenti = collect();
$numero_totale = 0; $numero_totale = 0;
$tipo_documento = Tipo::where('id', post('idtipodocumento'))->first(); $tipo_documento = Tipo::where('id', post('idtipodocumento'))->first();
$stato_documenti_accodabili = Stato::where('descrizione', 'Bozza')->first(); $stato_documenti_accodabili = Stato::where('descrizione', 'Bozza')->first();

View File

@ -18,19 +18,36 @@
*/ */
use Carbon\CarbonInterval; use Carbon\CarbonInterval;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Modules\Anagrafiche\Anagrafica; use Modules\Anagrafiche\Anagrafica;
use Modules\Banche\Banca;
use Modules\Pagamenti\Pagamento;
include_once __DIR__.'/../../core.php'; include_once __DIR__.'/../../core.php';
$anagrafica = Anagrafica::find($documento['idanagrafica']); $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 $pagamento = Pagamento::find($documento['idpagamento']);
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)); // Banca dell'Azienda corrente impostata come predefinita per il Cliente
} elseif (!empty($pagamento['idconto_vendite'])) { $banca_azienda = Banca::where('id_anagrafica', '=', $anagrafica_azienda->id)
// Altrimenti prendo quella associata la metodo di pagamento selezionato ->where('id_pianodeiconti3', '=', $pagamento['idconto_vendite'] ?: 0);
$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'); try {
$banca = (clone $banca_azienda)
->findOrFail($anagrafica->idbanca_vendite);
} catch (ModelNotFoundException $e) {
// Ricerca prima banca dell'Azienda con Conto corrispondente
$banca = (clone $banca_azienda)
->orderBy('predefined', 'DESC')
->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 // Righe documento