dataAssegnazione = now()->format('Y-m-d'); } private function gruppo(): ?GruppoServizio { return auth()->user()->gruppoSorvegliato(); } private function gruppoOFallisci(): GruppoServizio { $gruppo = $this->gruppo(); abort_unless($gruppo, 403, 'Non sei il sorvegliante di un gruppo di servizio attivo.'); return $gruppo; } private function territorioDelPacchetto(int $id): Territorio { $gruppo = $this->gruppoOFallisci(); $territorio = Territorio::find($id); abort_unless($territorio && $territorio->gruppo_servizio_id === $gruppo->id, 403); return $territorio; } // ─── Assegnare un territorio del pacchetto ────────────────── public function apriAssegnazione(int $territorioId): void { $this->territorioDelPacchetto($territorioId); $this->territorioDaAssegnare = $territorioId; $this->membroId = null; $this->dataAssegnazione = now()->format('Y-m-d'); $this->resetValidation(); } public function annullaAssegnazione(): void { $this->reset(['territorioDaAssegnare', 'membroId']); $this->resetValidation(); } public function assegna(): void { $this->validate([ 'membroId' => 'required|integer', 'dataAssegnazione' => 'required|date|before_or_equal:today', ], [ 'membroId.required' => 'Scegli a chi dare il territorio.', 'dataAssegnazione.before_or_equal' => 'La data non può essere nel futuro.', ]); $gruppo = $this->gruppoOFallisci(); $territorio = $this->territorioDelPacchetto((int) $this->territorioDaAssegnare); $membro = Proclamatore::find($this->membroId); if (! $membro) { $this->addError('membroId', 'Scegli un membro del gruppo.'); return; } try { $assegnazione = app(GruppiServizio::class)->assegna($gruppo, $territorio, $membro, Carbon::parse($this->dataAssegnazione)); } catch (InvalidArgumentException $e) { $this->addError('membroId', $e->getMessage()); return; } $this->reset(['territorioDaAssegnare', 'membroId']); // Come dalla pagina Assegna: si apre l'invio del link. $this->apriInvio($assegnazione->id); } // ─── Rimandare in reparto ─────────────────────────────────── public function rimanda(int $territorioId): void { $territorio = $this->territorioDelPacchetto($territorioId); try { app(GruppiServizio::class)->rimandaInReparto($this->gruppoOFallisci(), $territorio); } catch (InvalidArgumentException $e) { $this->avvisaErrore($e->getMessage()); return; } $this->avvisa("Territorio {$territorio->numero} rimandato in reparto."); } // ─── Link già inviato / condiviso dall'elenco ─────────────── private function assegnazioneDelGruppo(int $id): Assegnazione { $assegnazione = Assegnazione::aperte()->with('territorio')->find($id); abort_unless($assegnazione && $this->puoInviare($assegnazione), 403); return $assegnazione; } public function toggleLinkSent(int $assegnazioneId): void { $assegnazione = $this->assegnazioneDelGruppo($assegnazioneId); $assegnazione->registraInvioLink(! $assegnazione->link_sent, $assegnazione->link_canale); } /** "Condividi" dall'elenco andato a buon fine (elencoCercabile.condividi). */ public function segnaCondiviso(int $assegnazioneId): void { $this->assegnazioneDelGruppo($assegnazioneId)->registraInvioLink(true, 'condividi'); } // ─── Invio del link (trait InviaLink) ─────────────────────── protected function puoInviare(Assegnazione $assegnazione): bool { $gruppo = $this->gruppo(); return $gruppo !== null && ($assegnazione->gruppo_servizio_id === $gruppo->id || $assegnazione->territorio?->gruppo_servizio_id === $gruppo->id); } protected function paginaDopoInvio(): string { return route('mio-gruppo'); } public function render() { $gruppo = $this->gruppo(); $territori = $gruppo ? $gruppo->territori()->with(['zona', 'assegnazioneCorrente.proclamatore'])->get()->sortBy('numero', SORT_NATURAL)->values() : collect(); $membri = $gruppo ? $gruppo->membri()->where('attivo', true)->get()->sortBy(fn ($p) => mb_strtolower($p->cognome . ' ' . $p->nome))->values() : collect(); return view('livewire.gruppi.mio-gruppo', [ 'gruppo' => $gruppo, 'territori' => $territori, 'membri' => $membri, 'opzioniMembri' => Proclamatore::opzioniScelta($membri, conGruppo: false), 'invio' => $this->invioCorrente(), ]); } }