Files
glastree/app/Http/Controllers/MailingListController.php
T

286 lines
10 KiB
PHP
Raw Normal View History

2026-05-26 08:14:29 +02:00
<?php
namespace App\Http\Controllers;
use App\Models\MailingList;
2026-06-23 08:05:51 +02:00
use App\Models\SenderAccount;
2026-06-09 11:02:01 +02:00
use App\Models\Tag;
2026-05-26 08:14:29 +02:00
use Illuminate\Http\Request;
class MailingListController extends Controller
{
2026-06-09 11:02:01 +02:00
public function index(Request $request)
2026-05-26 08:14:29 +02:00
{
$this->authorizeRead('mailing');
2026-06-09 11:02:01 +02:00
$query = MailingList::with(['user', 'contatti', 'tags']);
if ($request->filled('tag')) {
$tagSlugs = (array) $request->input('tag');
$query->withAnyTags($tagSlugs);
}
$mailingLists = $query->orderBy('nome')->get();
$allTags = Tag::orderBy('name')->get();
2026-06-10 14:03:43 +02:00
$vista = \App\Models\VistaReport::where('user_id', auth()->id())
->where('tipo', 'mailing-liste')
->where('is_default', true)
->first();
$userVistas = \App\Models\VistaReport::where('user_id', auth()->id())
->where('tipo', 'mailing-liste')
->orderBy('is_default', 'desc')
->orderBy('nome')
->get();
$allColumnDefs = [
['key' => 'nome', 'label' => 'Nome'],
['key' => 'descrizione', 'label' => 'Descrizione'],
['key' => 'contatti_count', 'label' => 'Contatti'],
['key' => 'tag', 'label' => 'Tag'],
['key' => 'attiva', 'label' => 'Stato'],
['key' => 'created_at', 'label' => 'Creata il'],
];
$defaultVisible = ['nome', 'descrizione', 'contatti_count', 'tag', 'attiva', 'created_at'];
$visibleColumns = $vista && !empty($vista->colonne_visibili)
? $vista->colonne_visibili
: $defaultVisible;
$tableColumns = array_map(fn($col) => [
'key' => $col['key'],
'label' => $col['label'],
'visible' => in_array($col['key'], $visibleColumns),
], $allColumnDefs);
$entityType = 'mailing-liste';
$columnWidths = $vista && $vista->colonne_larghezze ? $vista->colonne_larghezze : [];
return view('mailing-liste.index', compact('mailingLists', 'allTags', 'vista', 'visibleColumns', 'tableColumns', 'entityType', 'columnWidths', 'userVistas'));
2026-05-26 08:14:29 +02:00
}
public function create()
{
$this->authorizeWrite('mailing');
2026-06-09 11:02:01 +02:00
$tags = Tag::orderBy('name')->get();
2026-06-23 08:05:51 +02:00
$settings = \App\Models\EmailSetting::getActive();
$firme = $settings?->firme ?? collect();
$senderAccounts = SenderAccount::active()->get();
return view('mailing-liste.create', compact('tags', 'firme', 'senderAccounts'));
2026-05-26 08:14:29 +02:00
}
public function store(Request $request)
{
$this->authorizeWrite('mailing');
$data = $request->validate([
'nome' => 'required|string|max:255',
'descrizione' => 'nullable|string',
'attiva' => 'boolean',
'contatti_json' => 'nullable|string',
2026-06-09 11:02:01 +02:00
'tags' => 'nullable|array',
'tags.*' => 'exists:tags,id',
2026-06-23 08:05:51 +02:00
'firma_id' => 'nullable|integer|exists:firme,id',
'sender_account_id' => 'nullable|integer|exists:sender_accounts,id',
2026-05-26 08:14:29 +02:00
]);
$data['user_id'] = auth()->id();
$data['attiva'] = $data['attiva'] ?? true;
$lista = MailingList::create([
'nome' => $data['nome'],
'descrizione' => $data['descrizione'] ?? null,
'attiva' => $data['attiva'],
'user_id' => $data['user_id'],
2026-06-23 08:05:51 +02:00
'firma_id' => $data['firma_id'] ?? null,
'sender_account_id' => $data['sender_account_id'] ?? null,
2026-05-26 08:14:29 +02:00
]);
2026-06-09 11:02:01 +02:00
if ($request->has('tags')) {
$lista->tags()->sync($request->tags);
}
2026-05-26 08:14:29 +02:00
if (!empty($data['contatti_json'])) {
$contatti = json_decode($data['contatti_json'], true);
if (is_array($contatti)) {
foreach ($contatti as $contatto) {
2026-06-09 11:02:01 +02:00
if (!empty($contatto['individuo_id'])) {
2026-05-26 08:14:29 +02:00
$lista->contatti()->create([
'individuo_id' => $contatto['individuo_id'],
'opt_in' => true,
'opt_in_data' => now(),
]);
}
}
}
}
return redirect()->route('mailing-liste.index')->with('success', 'Lista creata con ' . $lista->contatti()->count() . ' contatti.');
}
public function show($mailing_liste)
{
$this->authorizeRead('mailing');
2026-06-09 11:02:01 +02:00
$mailingList = MailingList::with(['contatti.individuo.contatti', 'tags'])->findOrFail($mailing_liste);
2026-05-26 08:14:29 +02:00
return view('mailing-liste.show', compact('mailingList'));
}
public function edit($mailingList)
{
$this->authorizeWrite('mailing');
2026-06-23 08:05:51 +02:00
$mailingList = MailingList::with(['contatti.individuo.contatti', 'tags', 'firma', 'senderAccount'])->findOrFail($mailingList);
2026-06-09 11:02:01 +02:00
$tags = Tag::orderBy('name')->get();
$selectedTags = $mailingList->tags->pluck('id')->toArray();
2026-06-23 08:05:51 +02:00
$settings = \App\Models\EmailSetting::getActive();
$firme = $settings?->firme ?? collect();
$senderAccounts = SenderAccount::active()->get();
return view('mailing-liste.edit', compact('mailingList', 'tags', 'selectedTags', 'firme', 'senderAccounts'));
2026-05-26 08:14:29 +02:00
}
public function update(Request $request, $mailingList)
{
$this->authorizeWrite('mailing');
$mailingList = MailingList::findOrFail($mailingList);
$data = $request->validate([
'nome' => 'required|string|max:255',
'descrizione' => 'nullable|string',
'attiva' => 'boolean',
'contatti_json' => 'nullable|string',
2026-06-09 11:02:01 +02:00
'tags' => 'nullable|array',
'tags.*' => 'exists:tags,id',
2026-06-23 08:05:51 +02:00
'firma_id' => 'nullable|integer|exists:firme,id',
'sender_account_id' => 'nullable|integer|exists:sender_accounts,id',
2026-05-26 08:14:29 +02:00
]);
$data['attiva'] = $data['attiva'] ?? false;
$mailingList->update([
'nome' => $data['nome'],
'descrizione' => $data['descrizione'] ?? null,
'attiva' => $data['attiva'],
2026-06-23 08:05:51 +02:00
'firma_id' => $data['firma_id'] ?? null,
'sender_account_id' => $data['sender_account_id'] ?? null,
2026-05-26 08:14:29 +02:00
]);
2026-06-09 11:02:01 +02:00
if ($request->has('tags')) {
$mailingList->tags()->sync($request->tags);
} else {
$mailingList->tags()->detach();
}
2026-05-26 08:14:29 +02:00
if (!empty($data['contatti_json'])) {
$newContatti = json_decode($data['contatti_json'], true);
if (is_array($newContatti)) {
$existingIds = $mailingList->contatti()->pluck('individuo_id')->toArray();
$newIds = array_column($newContatti, 'individuo_id');
$toRemove = array_diff($existingIds, $newIds);
if (!empty($toRemove)) {
$mailingList->contatti()->whereIn('individuo_id', $toRemove)->delete();
}
$toAdd = array_diff($newIds, $existingIds);
foreach ($newContatti as $contatto) {
2026-06-09 11:02:01 +02:00
if (in_array($contatto['individuo_id'], $toAdd)) {
2026-05-26 08:14:29 +02:00
$mailingList->contatti()->create([
'individuo_id' => $contatto['individuo_id'],
'opt_in' => true,
'opt_in_data' => now(),
]);
}
}
}
}
return redirect()->route('mailing-liste.show', $mailingList->id)->with('success', 'Lista aggiornata.');
}
public function destroy($mailingList)
{
$this->authorizeDelete('mailing');
$mailingList = MailingList::findOrFail($mailingList);
$mailingList->delete();
return redirect()->route('mailing-liste.index')->with('success', 'Lista eliminata.');
}
2026-06-18 07:43:33 +02:00
public function massTag(Request $request)
{
$this->authorizeWrite('mailing');
$idsInput = $request->input('ids', '');
$ids = is_array($idsInput) ? $idsInput : (is_string($idsInput) ? explode(',', $idsInput) : []);
if (empty($ids)) {
return back()->with('error', 'Nessuna mailing list selezionata.');
}
$data = $request->validate([
'tags' => 'required|array',
'tags.*' => 'exists:tags,id',
'mode' => 'required|in:assign,remove',
]);
$tagIds = $data['tags'];
$mode = $data['mode'];
$count = 0;
MailingList::whereIn('id', $ids)->chunk(100, function ($lists) use ($tagIds, $mode, &$count) {
foreach ($lists as $list) {
if ($mode === 'assign') {
$list->tags()->syncWithoutDetaching($tagIds);
} else {
$list->tags()->detach($tagIds);
}
$count++;
}
});
$actionLabel = $mode === 'assign' ? 'assegnati' : 'rimossi';
return back()->with('success', "Tag $actionLabel per $count mailing list.");
}
2026-05-26 08:14:29 +02:00
public function massElimina(Request $request)
{
$this->authorizeDelete('mailing');
$ids = $request->input('ids', []);
if (!is_array($ids) || empty($ids)) {
return redirect()->route('mailing-liste.index')->with('error', 'Nessuna mailing list selezionata.');
}
$liste = MailingList::whereIn('id', $ids)->get();
foreach ($liste as $lista) {
$lista->contatti()->delete();
$lista->delete();
}
return redirect()->route('mailing-liste.index')->with('success', count($liste) . ' mailing list eliminate con successo.');
}
public function createFromIndividui(Request $request)
{
$this->authorizeWrite('mailing');
$data = $request->validate([
'nome' => 'required|string|max:255',
'descrizione' => 'nullable|string',
'contatti' => 'required|array',
'contatti.*.individuo_id' => 'required|exists:individui,id',
'contatti.*.email' => 'required|email',
]);
$lista = MailingList::create([
'nome' => $data['nome'],
'descrizione' => $data['descrizione'] ?? null,
'attiva' => true,
'user_id' => auth()->id(),
]);
foreach ($data['contatti'] as $contatto) {
$lista->contatti()->create([
'individuo_id' => $contatto['individuo_id'],
'opt_in' => true,
'opt_in_data' => now(),
]);
}
return response()->json(['success' => true, 'lista_id' => $lista->id]);
}
}