'required|string|max:255', 'message' => 'required|string', 'selectedRecipients' => 'required|array|min:1', 'scheduledDateTime' => 'required_if:sendNow,false|date|after:now', ]; protected $messages = [ 'subject.required' => 'L\'oggetto è obbligatorio', 'message.required' => 'Il messaggio è obbligatorio', 'selectedRecipients.required' => 'Seleziona almeno un gruppo di destinatari', 'scheduledDateTime.required_if' => 'La data di programmazione è obbligatoria', 'scheduledDateTime.after' => 'La data di programmazione deve essere futura', ]; public $sortField = 'name'; public $sortAsc = true; public function boot() { app(TenantMiddleware::class)->setupTenantConnection(); } public function sortBy($field) { if($this->sortField === $field) { $this->sortAsc = ! $this->sortAsc; } else { $this->sortAsc = true; } $this->sortField = $field; } public function resetFields() { $this->subject = ''; $this->message = ''; $this->selectedRecipients = []; $this->sendNow = true; $this->scheduledDateTime = now()->addHour()->format('Y-m-d\TH:i'); $this->emit('load-data-table'); } public function mount() { if(Auth::user()->level != env('LEVEL_ADMIN', 0)) return redirect()->to('/dashboard'); $this->users = Member::select('id', 'last_name', 'email')->get(); $this->scheduledDateTime = now()->addHour()->format('Y-m-d\TH:i'); } public function render() { $this->records = EmailTemplate::orderBy($this->sortField, $this->sortAsc ? 'asc' : 'desc')->get(); return view('livewire.email_comunications'); } public function add() { $this->resetFields(); $this->add = true; $this->update = false; } public function store() { $this->validate(); try { $template = EmailTemplate::create([ 'name' => $this->subject, 'content' => $this->message, 'created_by' => Auth::id(), ]); $recipients = User::whereIn('id', $this->selectedRecipients)->get(); if ($this->sendNow) { $this->sendEmailNow($template, $recipients); session()->flash('success', 'Template creato e Email inviate a ' . $recipients->count() . ' destinatari!'); } else { $this->scheduleEmail($template, $recipients); $scheduledDate = Carbon::parse($this->scheduledDateTime)->format('d/m/Y H:i'); session()->flash('success', 'Template creato e Email programmate per ' . $scheduledDate); } $this->resetFields(); $this->add = false; } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function edit($id) { try { $template = EmailTemplate::findOrFail($id); if (!$template) { session()->flash('error', 'Template Email non trovato'); } else { $this->subject = $template->name; $this->message = $template->content; $this->dataId = $template->id; $this->update = true; $this->add = false; } } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function update() { $this->validate([ 'subject' => 'required|string|max:255', 'message' => 'required|string', ]); try { EmailTemplate::whereId($this->dataId)->update([ 'name' => $this->subject, 'content' => $this->message, ]); session()->flash('success', 'Template Email aggiornato'); $this->resetFields(); $this->update = false; } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } public function cancel() { $this->add = false; $this->update = false; $this->resetFields(); } public function sendTemplate($id) { try { $template = EmailTemplate::findOrFail($id); $this->subject = $template->name; $this->message = $template->content; $this->add = true; $this->update = false; } catch (\Exception $ex) { session()->flash('error', 'Errore (' . $ex->getMessage() . ')'); } } private function sendEmailNow($template, $recipients) { foreach ($recipients as $recipient) { if ($recipient->email) { try { Log::info("Email sent to {$recipient->name} ({$recipient->email}): Subject: {$template->name}"); } catch (\Exception $e) { Log::error("Failed to send email to {$recipient->email}: " . $e->getMessage()); } } else { Log::warning("User {$recipient->id} has no email address"); } } } private function scheduleEmail($template, $recipients) { $scheduled = EmailScheduled::create([ 'template_id' => $template->id, 'subject' => $template->name, 'content' => $template->content, 'scheduled_at' => Carbon::parse($this->scheduledDateTime), 'status' => 'scheduled', 'created_by' => Auth::id(), ]); $scheduled->recipients()->attach($recipients->pluck('id')); Log::info("Email scheduled for {$this->scheduledDateTime} to {$recipients->count()} recipients: {$template->name}"); } }