Compare commits

...

3 Commits

Author SHA1 Message Date
Dasc3er 3dae3ab81f Revisione gestione destinatari per Newsletter e liste relative 2021-08-02 18:27:28 +02:00
Dasc3er f4b96e57fa Aggiunta gestione manuale per stampe personalizzate 2021-08-02 16:04:42 +02:00
Dasc3er 18416674f6 Miglioramento procedura invio email 2021-08-02 15:42:08 +02:00
12 changed files with 435 additions and 112 deletions

View File

@ -33,12 +33,14 @@ class EmailHook extends Manager
public function needsExecution()
{
// Email fallite nelle ultime 4 ore
$diff = date('Y-m-d H:i:s', strtotime('-4 hours'));
$failed = function ($query) use ($diff) {
$query->where('failed_at', '<', $diff)
->orWhereNull('failed_at');
};
// Email da inviare per tutti gli account
$accounts = Account::all();
$remaining = Mail::whereNull('sent_at')
->where($failed)
@ -51,15 +53,23 @@ class EmailHook extends Manager
public function execute()
{
// Email fallite nelle ultime 4 ore
$diff = date('Y-m-d H:i:s', strtotime('-4 hours'));
$failed = function ($query) use ($diff) {
$query->where('failed_at', '<', $diff)
->orWhereNull('failed_at');
};
// Parametri per l'invio
$numero_tentativi = setting('Numero massimo di tentativi');
$numero_email = setting('Numero email da inviare in contemporanea per account');
$numero_email = $numero_email < 1 ? 1 : $numero_email;
// Selezione email per account
$accounts = Account::all();
$list = [];
$lista = [];
foreach ($accounts as $account) {
// Ultima email inviata per l'account
$last_mail = $account->emails()
->whereNotNull('sent_at')
->orderBy('sent_at')
@ -70,31 +80,32 @@ class EmailHook extends Manager
$now = new Carbon();
$diff_milliseconds = $date->diffInMilliseconds($now);
// Timeout per l'uso dell'account email
if (empty($last_mail) || $diff_milliseconds > $account->timeout) {
$mail = Mail::whereNull('sent_at')
$lista_account = Mail::whereNull('sent_at')
->where('id_account', $account->id)
->where($failed)
->where('attempt', '<', setting('Numero massimo di tentativi'))
->where('attempt', '<', $numero_tentativi)
->orderBy('created_at')
->first();
->take($numero_email)
->get();
if (!empty($mail)) {
$list[] = $mail;
if (!empty($lista_account)) {
$lista = array_merge($lista, $lista_account);
}
}
}
foreach ($list as $mail) {
$email = EmailNotification::build($mail);
// Invio effettivo
foreach ($lista as $lista_account) {
try {
// Invio mail
$email = EmailNotification::build($lista_account);
$email->send();
} catch (Exception $e) {
}
}
return $list;
return $lista;
}
public function response()
@ -102,10 +113,13 @@ class EmailHook extends Manager
$yesterday = date('Y-m-d', strtotime('-1 days'));
$user = auth()->getUser();
// Numero di email inviate
$current = Mail::whereDate('sent_at', '>', $yesterday)
->where('attempt', '<', setting('Numero massimo di tentativi'))
->where('created_by', $user->id)
->count();
// Numero totale di email
$total = Mail::where(function ($query) use ($yesterday) {
$query->whereDate('sent_at', '>', $yesterday)
->orWhereNull('sent_at');

View File

@ -17,6 +17,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use Modules\Anagrafiche\Anagrafica;
use Modules\Anagrafiche\Referente;
use Modules\Anagrafiche\Sede;
use Modules\Newsletter\Lista;
include_once __DIR__.'/../../core.php';
@ -53,18 +56,51 @@ switch (filter('op')) {
break;
case 'add_receivers':
$receivers = post('receivers');
$destinatari = [];
$lista->anagrafiche()->syncWithoutDetaching($receivers);
// Selezione manuale
$id_receivers = post('receivers');
foreach ($id_receivers as $id_receiver) {
list($tipo, $id) = explode('_', $id_receiver);
if ($tipo == 'anagrafica') {
$type = Anagrafica::class;
} elseif ($tipo == 'sede') {
$type = Sede::class;
} else {
$type = Referente::class;
}
$destinatari[] = [
'record_type' => $type,
'record_id' => $id,
];
}
// Aggiornamento destinatari
foreach ($destinatari as $destinatario) {
$data = array_merge($destinatario, [
'id_list' => $lista->id,
]);
$registrato = $database->select('em_list_receiver', '*', $data);
if (empty($registrato)) {
$database->insert('em_list_receiver', $data);
}
}
flash()->info(tr('Aggiunti nuovi destinatari alla lista!'));
break;
case 'remove_receiver':
$receiver = post('id');
$receiver_id = post('id');
$receiver_type = post('type');
$lista->anagrafiche()->detach($receiver);
$database->delete('em_list_receiver', [
'record_type' => $receiver_type,
'record_id' => $receiver_id,
'id_list' => $lista->id,
]);
flash()->info(tr('Destinatario rimosso dalla lista!'));

View File

@ -17,6 +17,10 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use Modules\Anagrafiche\Anagrafica;
use Modules\Anagrafiche\Referente;
use Modules\Anagrafiche\Sede;
include_once __DIR__.'/../../core.php';
echo '
@ -46,7 +50,7 @@ echo '
<div class="row">
<div class="col-md-12">
{[ "type": "textarea", "label": "'.tr('Query dinamica').'", "name": "query", "required": 0, "value": "$query$", "help": "'.tr("La query SQL deve restituire gli identificativi delle anagrafiche da inserire nella lista, sotto un campo di nome ''id''").'. '.tr('Per esempio: _SQL_', [
'_SQL_' => 'SELECT idanagrafica AS id FROM an_anagrafiche',
'_SQL_' => 'SELECT idanagrafica AS id, \'anagrafica\' AS tipo FROM an_anagrafiche',
]).'" ]}
</div>
</div>
@ -67,7 +71,7 @@ echo '
<div class="box-body">
<div class="row">
<div class="col-md-12">
{[ "type": "select", "label": "'.tr('Destinatari').'", "name": "receivers[]", "ajax-source": "anagrafiche_newsletter", "multiple": 1, "disabled": '.intval(!empty($lista->query)).' ]}
{[ "type": "select", "label": "'.tr('Destinatari').'", "name": "receivers[]", "ajax-source": "destinatari_newsletter", "multiple": 1, "disabled": '.intval(!empty($lista->query)).' ]}
</div>
</div>
@ -82,7 +86,7 @@ echo '
</div>
</form>';
$anagrafiche = $lista->anagrafiche;
$destinatari = $lista->getDestinatari();
echo '
<!-- Destinatari -->
@ -90,13 +94,13 @@ echo '
<div class="panel-heading">
<h3 class="panel-title">
'.tr('Destinatari').'
<span class="badge">'.$anagrafiche->count().'</span>
<span class="badge">'.$destinatari->count().'</span>
</h3>
</div>
<div class="panel-body">';
if (!$anagrafiche->isEmpty()) {
if (!$destinatari->isEmpty()) {
echo '
<table class="table table-hover table-condensed table-bordered">
<thead>
@ -109,13 +113,22 @@ if (!$anagrafiche->isEmpty()) {
<tbody>';
foreach ($anagrafiche as $anagrafica) {
foreach ($destinatari as $destinatario) {
$anagrafica = $destinatario instanceof Anagrafica ? $destinatario : $destinatario->anagrafica;
$descrizione = $anagrafica->ragione_sociale;
if ($destinatario instanceof Sede) {
$descrizione .= ' ['.$destinatario->nomesede.']';
} elseif ($destinatario instanceof Referente) {
$descrizione .= ' ['.$destinatario->nome.']';
}
echo '
<tr '.(empty($anagrafica->email) ? 'class="bg-danger"' : '').'>
<td>'.Modules::link('Anagrafiche', $anagrafica->id, $anagrafica->ragione_sociale).'</td>
<td class="text-center">'.$anagrafica->email.'</td>
<tr '.(empty($destinatario->email) ? 'class="bg-danger"' : '').'>
<td>'.Modules::link('Anagrafiche', $anagrafica->id, $descrizione).'</td>
<td class="text-center">'.$destinatario->email.'</td>
<td class="text-center">
<a class="btn btn-danger ask btn-sm '.(!empty($lista->query) ? 'disabled' : '').'" data-backto="record-edit" data-op="remove_receiver" data-id="'.$anagrafica->id.'" '.(!empty($lista->query) ? 'disabled' : '').'>
<a class="btn btn-danger ask btn-sm '.(!empty($lista->query) ? 'disabled' : '').'" data-backto="record-edit" data-op="remove_receiver" data-type="'.get_class($destinatario).'" data-id="'.$destinatario->id.'" '.(!empty($lista->query) ? 'disabled' : '').'>
<i class="fa fa-trash"></i>
</a>
</td>
@ -127,7 +140,7 @@ if (!$anagrafiche->isEmpty()) {
</table>';
} else {
echo '
<p>'.tr('Nessuna anagrafica collegata alla lista').'.</p>';
<p>'.tr('Nessun destinatario collegato alla lista').'.</p>';
}
echo '

View File

@ -17,6 +17,10 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use Modules\Anagrafiche\Anagrafica;
use Modules\Anagrafiche\Referente;
use Modules\Anagrafiche\Sede;
use Modules\Emails\Mail;
use Modules\Emails\Template;
use Modules\Newsletter\Lista;
use Modules\Newsletter\Newsletter;
@ -66,7 +70,7 @@ switch (filter('op')) {
continue;
}
$mail = \Modules\Emails\Mail::build($user, $template, $anagrafica->id);
$mail = Mail::build($user, $template, $anagrafica->id);
$mail->addReceiver($anagrafica['email']);
$mail->subject = $newsletter->subject;
@ -109,17 +113,54 @@ switch (filter('op')) {
break;
case 'add_receivers':
$receivers = post('receivers');
$destinatari = [];
// Selezione manuale
$id_receivers = post('receivers');
foreach ($id_receivers as $id_receiver) {
list($tipo, $id) = explode('_', $id_receiver);
if ($tipo == 'anagrafica') {
$type = Anagrafica::class;
} elseif ($tipo == 'sede') {
$type = Sede::class;
} else {
$type = Referente::class;
}
$destinatari[] = [
'record_type' => $type,
'record_id' => $id,
];
}
// Selezione da lista newsletter
$id_list = post('id_list');
if (!empty($id_list)) {
$list = Lista::find($id_list);
$receivers = $list->anagrafiche->pluck('idanagrafica');
$receivers = $list->getDestinatari();
$receivers = $receivers->map(function ($item, $key) {
return [
'record_type' => get_class($item),
'record_id' => $item->id,
];
});
$destinatari = $receivers->toArray();
}
$newsletter->anagrafiche()->syncWithoutDetaching($receivers);
// Aggiornamento destinatari
foreach ($destinatari as $destinatario) {
$data = array_merge($destinatario, [
'id_newsletter' => $newsletter->id,
]);
//Controllo indirizzo e-mail aggiunto
$registrato = $database->select('em_newsletter_receiver', '*', $data);
if (empty($registrato)) {
$database->insert('em_newsletter_receiver', $data);
}
}
// Controllo indirizzo e-mail aggiunto
foreach ($newsletter->anagrafiche as $anagrafica) {
if (!empty($anagrafica['email'])) {
$check = Validate::isValidEmail($anagrafica['email']);
@ -153,22 +194,23 @@ switch (filter('op')) {
break;
case 'remove_receiver':
$receiver = post('id');
$receiver_id = post('id');
$receiver_type = post('type');
$newsletter->anagrafiche()->detach($receiver);
$database->delete('em_newsletter_receiver', [
'record_type' => $receiver_type,
'record_id' => $receiver_id,
'id_newsletter' => $newsletter->id,
]);
flash()->info(tr('Destinatario rimosso dalla newsletter!'));
break;
case 'remove_all_receiver':
//$receiver = post('id');
$anagrafiche = $newsletter->anagrafiche;
foreach ($anagrafiche as $anagrafica) {
$newsletter->anagrafiche()->detach($anagrafica->id);
}
case 'remove_all_receivers':
$database->delete('em_newsletter_receiver', [
'id_newsletter' => $newsletter->id,
]);
flash()->info(tr('Tutti i destinatari sono stati rimossi dalla newsletter!'));

View File

@ -20,53 +20,66 @@
include_once __DIR__.'/../../../core.php';
switch ($resource) {
case 'anagrafiche_newsletter':
$query = "SELECT an_anagrafiche.idanagrafica AS id, CONCAT(ragione_sociale, IF(citta != '' OR provincia != '', CONCAT(' (', citta, IF(provincia != '', provincia, ''), ')'), ''), ' [', email, ']') AS descrizione, `an_tipianagrafiche`.`descrizione` AS optgroup FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica |where| ORDER BY `optgroup` ASC, ragione_sociale ASC";
foreach ($elements as $element) {
$filter[] = 'an_anagrafiche.idanagrafica='.prepare($element);
}
if (empty($filter)) {
$where[] = 'deleted_at IS NULL';
$where[] = 'enable_newsletter = 1';
}
case 'destinatari_newsletter':
// Gestione campi di ricerca
if (!empty($search)) {
$search_fields[] = 'ragione_sociale LIKE '.prepare('%'.$search.'%');
$search_fields[] = '|nome| LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'citta LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'provincia LIKE '.prepare('%'.$search.'%');
$search_fields[] = 'email LIKE '.prepare('%'.$search.'%');
}
// Aggiunta filtri di ricerca
if (!empty($search_fields)) {
$where[] = '('.implode(' OR ', $search_fields).')';
}
$where = empty($search_fields) ? '1=1' : '('.implode(' OR ', $search_fields).')';
if (!empty($filter)) {
$where[] = '('.implode(' OR ', $filter).')';
}
$destinatari = collect();
$query = str_replace('|where|', !empty($where) ? 'WHERE '.implode(' AND ', $where) : '', $query);
// Gestione anagrafiche come destinatari
$query = "SELECT CONCAT('anagrafica_', an_anagrafiche.idanagrafica) AS id,
CONCAT(an_anagrafiche.ragione_sociale, IF(an_anagrafiche.citta != '' OR an_anagrafiche.provincia != '', CONCAT(' (', an_anagrafiche.citta, IF(an_anagrafiche.provincia != '', an_anagrafiche.provincia, ''), ')'), ''), ' [', email, ']') AS text,
`an_tipianagrafiche`.`descrizione` AS optgroup
FROM an_anagrafiche
INNER JOIN an_tipianagrafiche_anagrafiche ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica
INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica
WHERE an_anagrafiche.deleted_at IS NULL AND an_anagrafiche.enable_newsletter = 1 AND 1=1
ORDER BY `optgroup` ASC, ragione_sociale ASC";
$rs = $dbo->fetchArray($query);
foreach ($rs as $r) {
if ($prev != $r['optgroup']) {
$results[] = ['text' => $r['optgroup'], 'children' => []];
$prev = $r['optgroup'];
}
$query = str_replace('1=1', !empty($where) ? replace($where, ['|nome|' => 'ragione_sociale']) : '', $query);
$anagrafiche = $database->fetchArray($query);
$destinatari = $destinatari->concat($anagrafiche);
// Gestione sedi come destinatari
$query = "SELECT CONCAT('sede_', an_sedi.id) AS id,
CONCAT(an_anagrafiche.ragione_sociale, ' (', an_sedi.nomesede, IF(an_sedi.citta != '' OR an_sedi.provincia != '', CONCAT(' :', an_sedi.citta, IF(an_sedi.provincia != '', an_sedi.provincia, ''), ''), ''), ')', ' [', an_sedi.email, ']') AS text,
'Sedi' AS optgroup
FROM an_sedi
INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = an_sedi.idanagrafica
WHERE an_anagrafiche.deleted_at IS NULL AND an_anagrafiche.enable_newsletter = 1 AND 1=1
ORDER BY `optgroup` ASC, ragione_sociale ASC";
$query = str_replace('1=1', !empty($where) ? replace($where, ['|nome|' => 'nomesede LIKE '.prepare('%'.$search.'%').' AND ragione_sociale']) : '', $query);
$sedi = $database->fetchArray($query);
$destinatari = $destinatari->concat($sedi);
// Gestione referenti come destinatari
$query = "SELECT CONCAT('referente_', an_referenti.id) AS id,
CONCAT(an_anagrafiche.ragione_sociale, ' (', an_referenti.nome, ') [', an_referenti.email, ']') AS text,
'Referenti' AS optgroup
FROM an_referenti
INNER JOIN an_anagrafiche ON an_anagrafiche.idanagrafica = an_referenti.idanagrafica
WHERE an_anagrafiche.deleted_at IS NULL AND an_anagrafiche.enable_newsletter = 1 AND 1=1
ORDER BY `optgroup` ASC, ragione_sociale ASC";
$query = str_replace('1=1', !empty($where) ? replace($where, ['|nome|' => 'nomesede LIKE '.prepare('%'.$search.'%').' AND ragione_sociale']) : '', $query);
$referenti = $database->fetchArray($query);
$destinatari = $destinatari->concat($referenti);
$results = $destinatari->toArray();
$results[count($results) - 1]['children'][] = [
'id' => $r['id'],
'text' => $r['descrizione'],
'descrizione' => $r['descrizione'],
];
}
break;
case 'liste_newsletter':
$query = "SELECT id, CONCAT(name, ' (', (SELECT COUNT(*) FROM em_list_anagrafica WHERE em_lists.id = em_list_anagrafica.id_list), ' destinatari)') AS descrizione FROM em_lists |where| ORDER BY `name` ASC";
$query = "SELECT id, CONCAT(name, ' (', (SELECT COUNT(*) FROM em_list_receiver WHERE em_lists.id = em_list_receiver.id_list), ' destinatari)') AS descrizione FROM em_lists |where| ORDER BY `name` ASC";
foreach ($elements as $element) {
$filter[] = 'id='.prepare($element);

View File

@ -17,6 +17,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use Modules\Anagrafiche\Anagrafica;
use Modules\Anagrafiche\Referente;
use Modules\Anagrafiche\Sede;
use Modules\Emails\Mail;
use Modules\Emails\Template;
@ -25,7 +28,7 @@ include_once __DIR__.'/../../core.php';
//Controllo se il template è ancora attivo
if (empty($template)) {
echo '
<div class=" alert alert-danger">'.tr('ATTENZIONE! Questa newsletter risulta collegata ad un template non più presente a sistema').'</div>';
<div class="alert alert-danger">'.tr('ATTENZIONE! Questa newsletter risulta collegata ad un template non più presente a sistema').'</div>';
}
$block_edit = $newsletter->state != 'DEV';
@ -107,7 +110,7 @@ echo '
<div class="box-body">
<div class="row">
<div class="col-md-6">
{[ "type": "select", "label": "'.tr('Destinatari').'", "name": "receivers[]", "ajax-source": "anagrafiche_newsletter", "multiple": 1 ]}
{[ "type": "select", "label": "'.tr('Destinatari').'", "name": "receivers[]", "ajax-source": "destinatari_newsletter", "multiple": 1 ]}
</div>
<div class="col-md-6">
@ -145,7 +148,7 @@ $(document).ready(function() {
})
</script>';
$anagrafiche = $newsletter->anagrafiche;
$destinatari = $newsletter->getDestinatari();
echo '
<!-- Destinatari -->
@ -153,15 +156,16 @@ echo '
<div class="panel-heading">
<h3 class="panel-title">
'.tr('Destinatari').'
<span> ('.$anagrafiche->count().')</span> <div class="pull-right" >
'.(($anagrafiche->where('email', '')->count() > 0) ? ' <span title="'.tr('Indirizzi e-mail mancanti').'" class="tip label label-danger clickable">'.$anagrafiche->where('email', '')->count().'</span>' : '')
.(($anagrafiche->where('enable_newsletter', false)->count() > 0) ? ' <span title="'.tr('Indirizzi e-mail senza consenso per newsletter').'" class="tip label label-warning clickable">'.$anagrafiche->where('enable_newsletter', false)->count().'</span>' : '').'</div>
<span> ('.$destinatari->count().')</span> <div class="pull-right" >
'.(($destinatari->where('email', '')->count() > 0) ? ' <span title="'.tr('Indirizzi e-mail mancanti').'" class="tip label label-danger clickable">'.$destinatari->where('email', '')->count().'</span>' : '')
.'<span title="'.tr('Indirizzi e-mail senza consenso per newsletter').'" class="tip label label-warning clickable" id="numero_consenso_disabilitato"></span></div>
</h3>
</div>
<div class="panel-body" style="max-height:700px;overflow-y:auto;">';
if (!$anagrafiche->isEmpty()) {
$senza_consenso = 0;
if (!$destinatari->isEmpty()) {
echo '
<table class="table table-hover table-condensed table-bordered">
<thead>
@ -178,30 +182,50 @@ if (!$anagrafiche->isEmpty()) {
<tbody>';
foreach ($anagrafiche as $anagrafica) {
$mail_id = $anagrafica->pivot->id_email;
$senza_consenso = 0;
foreach ($destinatari as $destinatario) {
$anagrafica = $destinatario instanceof Anagrafica ? $destinatario : $destinatario->anagrafica;
$descrizione = $anagrafica->ragione_sociale;
if ($destinatario instanceof Sede) {
$descrizione .= ' ['.$destinatario->nomesede.']';
} elseif ($destinatario instanceof Referente) {
$descrizione .= ' ['.$destinatario->nome.']';
}
if (empty($anagrafica->enable_newsletter)){
$senza_consenso ++;
}
$mail_id = $destinatario->pivot->id_email;
$mail = Mail::find($mail_id);
if (!empty($mail) && !empty($mail->sent_at)) {
$data = '<span class="fa fa-paper-plane text-success" > '.timestampFormat($mail->sent_at).'</span>';
$data = '
<span class="text-success">
<i class="fa fa-paper-plane"></i> '.timestampFormat($mail->sent_at).'
</span>';
} else {
$data = '<span class="fa fa-clock-o text-info" >
'.tr('Non ancora inviata').'</span>';
$data = '
<span class="text-info">
<i class="fa fa-clock-o"></i> '.tr('Non ancora inviata').'
</span>';
}
echo '
<tr '.(empty($anagrafica->email) ? 'class="bg-danger"' : (empty($anagrafica->enable_newsletter) ? 'class="bg-warning"' : '')).'>
<td>'.Modules::link('Anagrafiche', $anagrafica->id, $anagrafica->ragione_sociale).'</td>
<tr '.(empty($destinatario->email) ? 'class="bg-danger"' : (empty($anagrafica->enable_newsletter) ? 'class="bg-warning"' : '')).'>
<td>'.Modules::link('Anagrafiche', $anagrafica->id, $descrizione).'</td>
<td class="text-left">'.$database->fetchOne('SELECT GROUP_CONCAT(an_tipianagrafiche.descrizione) AS descrizione FROM an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica = an_tipianagrafiche.idtipoanagrafica WHERE an_tipianagrafiche_anagrafiche.idanagrafica='.prepare($anagrafica->id))['descrizione'].'</td>
<td class="text-left">'.$anagrafica->tipo.'</td>
<td class="text-left">
'.((!empty($anagrafica->email) ? '
{[ "type": "text", "name": "email", "id": "email_'.rand(0, 99999).'", "readonly": "1", "class": "email-mask", "value": "'.$anagrafica->email.'", "validation": "email" ]}' : '<span class="fa fa-close text-danger"> '.tr('Indirizzo e-mail mancante').'</span>')).'</td>
'.((!empty($destinatario->email) ? '
{[ "type": "text", "name": "email", "id": "email_'.rand(0, 99999).'", "readonly": "1", "class": "email-mask", "value": "'.$destinatario->email.'", "validation": "email" ]}' : '<span class="text-danger"><i class="fa fa-close"></i> '.tr('Indirizzo e-mail mancante').'</span>')).'</td>
<td class="text-center">'.$data.'</td>
<td class="text-left">
'.((!empty($anagrafica->enable_newsletter)) ? '<span class="fa fa-check text-success"> '.tr('Abilitato').'</span>' : '<span class="fa fa-exclamation-triangle text-warning"> '.tr('Disabilitato').'</span>').'
'.((!empty($anagrafica->enable_newsletter)) ? '<span class="text-success"><i class="fa fa-check"></i> '.tr('Abilitato').'</span>' : '<span class="text-warning"><i class="fa fa-exclamation-triangle"></i> '.tr('Disabilitato').'</span>').'
</td>
<td class="text-center">
<a class="btn btn-danger ask btn-xs" data-backto="record-edit" data-op="remove_receiver" data-id="'.$anagrafica->id.'">
<a class="btn btn-danger ask btn-xs" data-backto="record-edit" data-op="remove_receiver" data-type="'.get_class($destinatario).'" data-id="'.$destinatario->id.'">
<i class="fa fa-trash"></i>
</a>
</td>
@ -211,14 +235,15 @@ if (!$anagrafiche->isEmpty()) {
echo '
</tbody>
</table>
<a class="btn btn-danger ask pull-right" data-backto="record-edit" data-op="remove_all_receiver">
<i class="fa fa-trash"> Elimina tutti</i>
</a>
';
<a class="btn btn-danger ask pull-right" data-backto="record-edit" data-op="remove_all_receivers">
<i class="fa fa-trash"></i> '.tr('Elimina tutti').'
</a>';
} else {
echo '<div class="alert alert-info fa fa-info-circle"> '.tr('Nessuna anagrafica collegata alla campagna').'.</div>';
echo '
<div class="alert alert-info">
<i class="fa fa-info-circle"></i> '.tr('Nessuna anagrafica collegata alla campagna').'.
</div>';
}
echo '
@ -237,6 +262,23 @@ if ($block_edit) {
$(document).ready(function() {
$("#receivers").parent().hide();
$("#receivers-form .btn").hide();
});
</script>';
}
else {
echo '
<script>
globals.newsletter = {
senza_consenso: "'.$senza_consenso.'",
};
$(document).ready(function() {
const senza_consenso = $("#numero_consenso_disabilitato");
if (globals.newsletter.senza_consenso > 0) {
senza_consenso.text(globals.newsletter.senza_consenso);
} else {
senza_consenso.hide();
}
});
</script>';
}

View File

@ -23,6 +23,8 @@ use Common\SimpleModelTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Modules\Anagrafiche\Anagrafica;
use Modules\Anagrafiche\Referente;
use Modules\Anagrafiche\Sede;
use Traits\RecordTrait;
class Lista extends Model
@ -49,10 +51,48 @@ class Lista extends Model
$query = $this->query;
if (!empty($query)) {
$results = database()->fetchArray($query);
$database = database();
$anagrafiche = array_column($results, 'id');
$this->anagrafiche()->sync($anagrafiche);
// Rimozione record precedenti
$database->delete('em_list_receiver', [
'id_list' => $this->id,
]);
// Ricerca nuovi record
$results = $database->fetchArray($query);
$gruppi = collect($results)
->groupBy('tipo');
// Preparazione al salvataggio
$destinatari = [];
foreach ($gruppi as $tipo => $gruppo) {
if ($tipo == 'anagrafica') {
$type = Anagrafica::class;
} elseif ($tipo == 'sede') {
$type = Sede::class;
} else {
$type = Referente::class;
}
foreach ($gruppo as $record) {
$destinatari[] = [
'record_type' => $type,
'record_id' => $record['id'],
];
}
}
// Aggiornamento destinatari
foreach ($destinatari as $destinatario) {
$data = array_merge($destinatario, [
'id_list' => $this->id,
]);
$registrato = $database->select('em_list_receiver', '*', $data);
if (empty($registrato)) {
$database->insert('em_list_receiver', $data);
}
}
}
return $result;
@ -60,9 +100,33 @@ class Lista extends Model
// Relazione Eloquent
public function getDestinatari()
{
return $this->anagrafiche
->concat($this->sedi)
->concat($this->referenti);
}
public function anagrafiche()
{
return $this->belongsToMany(Anagrafica::class, 'em_list_anagrafica', 'id_list', 'id_anagrafica')->withTrashed();
return $this
->belongsToMany(Anagrafica::class, 'em_list_receiver', 'id_list', 'record_id')
->where('record_type', '=', Anagrafica::class)
->withTrashed();
}
public function sedi()
{
return $this
->belongsToMany(Sede::class, 'em_list_receiver', 'id_list', 'record_id')
->where('record_type', '=', Sede::class);
}
public function referenti()
{
return $this
->belongsToMany(Referente::class, 'em_list_receiver', 'id_list', 'record_id')
->where('record_type', '=', Referente::class);
}
/**

View File

@ -24,6 +24,8 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Models\User;
use Modules\Anagrafiche\Anagrafica;
use Modules\Anagrafiche\Referente;
use Modules\Anagrafiche\Sede;
use Modules\Emails\Account;
use Modules\Emails\Mail;
use Modules\Emails\Template;
@ -84,14 +86,43 @@ class Newsletter extends Model
// Relazione Eloquent
public function getDestinatari()
{
return $this->anagrafiche
->concat($this->sedi)
->concat($this->referenti);
}
public function anagrafiche()
{
return $this->belongsToMany(Anagrafica::class, 'em_newsletter_anagrafica', 'id_newsletter', 'id_anagrafica')->orderByRaw('IF(email=\'\',email,enable_newsletter) ASC')->orderBy('ragione_sociale', 'ASC')->withPivot('id_email')->withTrashed();
return $this
->belongsToMany(Anagrafica::class, 'em_newsletter_receiver', 'id_newsletter', 'record_id')
->where('record_type', '=', Anagrafica::class)
->withPivot('id_email')
->orderByRaw('IF(email=\'\',email,enable_newsletter) ASC')
->orderBy('ragione_sociale', 'ASC')
->withTrashed();
}
public function sedi()
{
return $this
->belongsToMany(Sede::class, 'em_newsletter_receiver', 'id_newsletter', 'record_id')
->where('record_type', '=', Sede::class)
->withPivot('id_email');
}
public function referenti()
{
return $this
->belongsToMany(Referente::class, 'em_newsletter_receiver', 'id_newsletter', 'record_id')
->where('record_type', '=', Referente::class)
->withPivot('id_email');
}
public function emails()
{
return $this->belongsToMany(Mail::class, 'em_newsletter_anagrafica', 'id_newsletter', 'id_email')->withPivot('id_anagrafica');
return $this->belongsToMany(Mail::class, 'em_newsletter_receiver', 'id_newsletter', 'id_email')->withPivot('id_anagrafica');
}
public function account()

View File

@ -17,8 +17,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
use Carbon\Carbon;
use Models\Plugin;
use Plugins\ListinoClienti\DettaglioPrezzo;
use Plugins\ListinoFornitori\DettaglioFornitore;

View File

@ -185,8 +185,10 @@ class Prints
if (self::isOldStandard($print)) {
return self::oldLoader($infos['id'], $id_record, $directory, $return_string);
} else {
} elseif (!self::isCompletelyCustom($print)) {
return self::loader($infos['id'], $id_record, $directory, $return_string);
} else {
return self::customLoader($infos['id'], $id_record, $directory, $return_string);
}
}
@ -327,7 +329,21 @@ class Prints
*/
protected static function isNewStandard($print)
{
return !self::isOldStandard($print);
return !self::isOldStandard($print) && !self::isCompletelyCustom($print);
}
/**
* Controlla se la stampa segue lo standard completamente autonomo.
*
* @param string|int $print
*
* @return bool
*/
protected static function isCompletelyCustom($print)
{
$infos = self::get($print);
return file_exists($infos['full_directory'].'/stampa.php') || file_exists($infos['full_directory'].'/custom/stampa.php');
}
/**
@ -647,4 +663,36 @@ class Prints
return $file;
}
/**
* Gestore per il formato di stampa completamente gestito dalla stampa stessa.
* Rischiede la compilazione della variabile $file, utilizzata coe return.
*
* @param $id_print
* @param $id_record
* @param null $directory
* @param false $return_string
*
* @return array
*/
protected static function customLoader($id_print, $id_record, $directory = null, $return_string = false)
{
$infos = self::get($id_print);
$options = self::readOptions($infos['options']);
$dbo = $database = database();
$user = Auth::user();
$file = null;
// Decido se usare la stampa personalizzata (se esiste) oppure quella standard
// La stampa personalizzata deve gestire tutto manualmente
if (file_exists($infos['full_directory'].'/custom/stampa.php')) {
include $infos['full_directory'].'/custom/stampa.php';
} else {
include $infos['full_directory'].'/stampa.php';
}
return $file;
}
}

View File

@ -1,2 +1,24 @@
-- Aggiornato widget Contratti in scadenza (sostituito fatturabile con pianificabile)
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 idstato IN (SELECT id FROM co_staticontratti WHERE is_pianificabile = 1) AND rinnovabile = 1 AND YEAR(data_conclusione) > 1970 AND (SELECT id FROM co_contratti contratti WHERE contratti.idcontratto_prev = co_contratti.id) IS NULL 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';
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 idstato IN (SELECT id FROM co_staticontratti WHERE is_pianificabile = 1) AND rinnovabile = 1 AND YEAR(data_conclusione) > 1970 AND (SELECT id FROM co_contratti contratti WHERE contratti.idcontratto_prev = co_contratti.id) IS NULL 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';
-- Aggiunto numero di email da inviare in contemporanea
INSERT INTO `zz_settings` (`id`, `nome`, `valore`, `tipo`, `editable`, `sezione`, `order`, `help`) VALUES
(NULL, 'Numero email da inviare in contemporanea per account', '10', 'integer', 1, 'Newsletter', 2, 'Numero di email della Coda di invio da inviare in contemporanea per account email');
-- Aggiornamento gestione destinatari per newsletter e liste relative
ALTER TABLE `em_newsletter_anagrafica` DROP FOREIGN KEY `em_newsletter_anagrafica_ibfk_2`;
ALTER TABLE `em_newsletter_anagrafica`
ADD `record_type` VARCHAR(255) NOT NULL BEFORE `id_anagrafica`, CHANGE `id_anagrafica` `record_id` INT(11) NOT NULL;
UPDATE `em_newsletter_anagrafica`
SET `record_type` ='Modules\\Anagrafiche\\Anagrafica';
ALTER TABLE `em_list_anagrafica` DROP FOREIGN KEY `em_list_anagrafica_ibfk_2`;
ALTER TABLE `em_list_anagrafica`
ADD `record_type` VARCHAR(255) NOT NULL BEFORE `id_anagrafica`, CHANGE `id_anagrafica` `record_id` INT(11) NOT NULL;
UPDATE `em_list_anagrafica`
SET `record_type` ='Modules\\Anagrafiche\\Anagrafica';
ALTER TABLE `em_list_anagrafica` RENAME TO `em_list_receiver`;
ALTER TABLE `em_newsletter_anagrafica` RENAME TO `em_newsletter_receiver`;
UPDATE `zz_views` SET `query` = '(SELECT COUNT(*) FROM `em_newsletter_receiver` WHERE `em_newsletter_receiver`.`id_newsletter` = `em_newsletters`.`id`)' WHERE `id_module` = (SELECT `id` FROM `zz_modules` WHERE name='Newsletter') AND `name` = 'Destinatari';

View File

@ -55,12 +55,12 @@ return [
'em_templates',
'em_newsletters',
'em_lists',
'em_list_anagrafica',
'em_list_receiver',
'em_emails',
'em_email_receiver',
'em_email_upload',
'em_email_print',
'em_newsletter_anagrafica',
'em_newsletter_receiver',
'fe_causali_pagamento_ritenuta',
'fe_modalita_pagamento',
'fe_natura',