*/ public array $righe = []; public float $totaleDare = 0.0; public float $totaleAvere = 0.0; public float $saldoFinale = 0.0; public static function canAccess(): bool { $user = Auth::user(); if (! $user instanceof User) { return false; } if ($user->hasAnyRole(['super-admin', 'admin'])) { return true; } return $user->can('contabilita.prima-nota'); } public function mount(int|string $record): void { $user = Auth::user(); if (! $user instanceof User) { abort(403); } $this->conto = PianoConti::query()->findOrFail((int) $record); $stabileId = StabileContext::resolveActiveStabileId($user); if (! $stabileId) { abort(404); } if (! Schema::hasTable('contabilita_movimenti') || ! Schema::hasTable('contabilita_registrazioni')) { return; } $select = [ 'm.id', 'm.registrazione_id', 'm.tipo', 'm.importo', 'm.movement_description', 'r.data_registrazione', ]; if (Schema::hasColumn('contabilita_registrazioni', 'description')) { $select[] = 'r.description'; } if (Schema::hasColumn('contabilita_registrazioni', 'descrizione')) { $select[] = 'r.descrizione'; } $rows = DB::table('contabilita_movimenti as m') ->leftJoin('contabilita_registrazioni as r', 'r.id', '=', 'm.registrazione_id') ->where('m.conto_id', (int) $this->conto->id) ->select($select) ->orderBy('r.data_registrazione') ->orderBy('m.registrazione_id') ->orderBy('m.id') ->get(); $saldo = 0.0; foreach ($rows as $row) { $tipo = (string) ($row->tipo ?? ''); $importo = (float) ($row->importo ?? 0); $dare = $tipo === 'dare' ? $importo : 0.0; $avere = $tipo === 'avere' ? $importo : 0.0; $saldo += $dare - $avere; $this->totaleDare += $dare; $this->totaleAvere += $avere; $descr = trim((string) ($row->movement_description ?? '')); if ($descr === '') { $descr = trim((string) ($row->description ?? '')); } if ($descr === '' && Schema::hasColumn('contabilita_registrazioni', 'descrizione')) { $descr = trim((string) ($row->descrizione ?? '')); } $dataRaw = $row->data_registrazione ?? null; $data = '—'; if (is_string($dataRaw) && $dataRaw !== '') { try { $data = Carbon::parse($dataRaw)->format('d/m/Y'); } catch (\Throwable) { $data = $dataRaw; } } $this->righe[] = [ 'data' => $data, 'descrizione' => $descr !== '' ? $descr : '—', 'dare' => $dare, 'avere' => $avere, 'saldo' => $saldo, 'registrazione_id' => (int) ($row->registrazione_id ?? 0), ]; } $this->saldoFinale = $saldo; } protected function getHeaderActions(): array { return [ Action::make('torna') ->label('Torna alla prima nota') ->icon('heroicon-o-arrow-left') ->url(fn (): string => PrimaNotaArchivio::getUrl(panel: 'admin-filament')), ]; } public function getTitle(): string { $codice = trim((string) ($this->conto->codice ?? '')); $desc = trim((string) ($this->conto->descrizione ?? '')); $label = $codice !== '' ? $codice : ('Conto #' . $this->conto->id); if ($desc !== '') { $label .= ' - ' . $desc; } return 'Mastrino · ' . $label; } }