authorizeRead('mailing'); $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(); $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')); } public function create() { $this->authorizeWrite('mailing'); $tags = Tag::orderBy('name')->get(); return view('mailing-liste.create', compact('tags')); } 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', 'tags' => 'nullable|array', 'tags.*' => 'exists:tags,id', ]); $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'], ]); if ($request->has('tags')) { $lista->tags()->sync($request->tags); } if (!empty($data['contatti_json'])) { $contatti = json_decode($data['contatti_json'], true); if (is_array($contatti)) { foreach ($contatti as $contatto) { if (!empty($contatto['individuo_id'])) { $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'); $mailingList = MailingList::with(['contatti.individuo.contatti', 'tags'])->findOrFail($mailing_liste); return view('mailing-liste.show', compact('mailingList')); } public function edit($mailingList) { $this->authorizeWrite('mailing'); $mailingList = MailingList::with(['contatti.individuo.contatti', 'tags'])->findOrFail($mailingList); $tags = Tag::orderBy('name')->get(); $selectedTags = $mailingList->tags->pluck('id')->toArray(); return view('mailing-liste.edit', compact('mailingList', 'tags', 'selectedTags')); } 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', 'tags' => 'nullable|array', 'tags.*' => 'exists:tags,id', ]); $data['attiva'] = $data['attiva'] ?? false; $mailingList->update([ 'nome' => $data['nome'], 'descrizione' => $data['descrizione'] ?? null, 'attiva' => $data['attiva'], ]); if ($request->has('tags')) { $mailingList->tags()->sync($request->tags); } else { $mailingList->tags()->detach(); } 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) { if (in_array($contatto['individuo_id'], $toAdd)) { $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.'); } 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]); } }