Fix acqua views and expose millesimi ordering
This commit is contained in:
parent
91bf6713fd
commit
2639c0a0e3
|
|
@ -600,7 +600,7 @@ public function table(Table $table): Table
|
|||
TextInput::make('rilevatore_nome')->label('Nominativo rilevatore')->maxLength(191),
|
||||
Textarea::make('motivo')->label('Nota riassegnazione')->rows(3)->maxLength(1000),
|
||||
])
|
||||
->fillForm(fn(StabileServizioLettura $record): array => [
|
||||
->fillForm(fn(StabileServizioLettura $record): array=> [
|
||||
'unita_immobiliare_id' => $record->unita_immobiliare_id,
|
||||
'rilevatore_tipo' => (string) ($record->rilevatore_tipo ?? ''),
|
||||
'rilevatore_nome' => (string) ($record->rilevatore_nome ?? ''),
|
||||
|
|
@ -659,7 +659,7 @@ public function table(Table $table): Table
|
|||
TextInput::make('rilevatore_nome')->label('Nominativo rilevatore')->maxLength(191),
|
||||
Textarea::make('motivo')->label('Motivo spostamento')->rows(3)->maxLength(1000),
|
||||
])
|
||||
->fillForm(fn(StabileServizioLettura $record): array => [
|
||||
->fillForm(fn(StabileServizioLettura $record): array=> [
|
||||
'stabile_servizio_id' => $record->stabile_servizio_id,
|
||||
'rilevatore_tipo' => (string) ($record->rilevatore_tipo ?? ''),
|
||||
'rilevatore_nome' => (string) ($record->rilevatore_nome ?? ''),
|
||||
|
|
@ -684,7 +684,7 @@ public function table(Table $table): Table
|
|||
$movements[] = [
|
||||
'from_stabile_servizio_id' => (int) ($record->getOriginal('stabile_servizio_id') ?? 0) ?: null,
|
||||
'to_stabile_servizio_id' => (int) $targetService->id,
|
||||
'from_unita_immobiliare_id'=> (int) ($record->getOriginal('unita_immobiliare_id') ?? 0) ?: null,
|
||||
'from_unita_immobiliare_id' => (int) ($record->getOriginal('unita_immobiliare_id') ?? 0) ?: null,
|
||||
'to_unita_immobiliare_id' => null,
|
||||
'note' => trim((string) ($data['motivo'] ?? '')),
|
||||
'changed_by' => Auth::id(),
|
||||
|
|
|
|||
|
|
@ -645,7 +645,7 @@ private function getCommonAssetScopeOptions(): array
|
|||
'accesso' => 'Portone / accesso',
|
||||
'servizio' => 'Servizio comune',
|
||||
'sicurezza' => 'Sicurezza / antincendio',
|
||||
'amministrativo'=> 'Privacy / assicurazione / studio',
|
||||
'amministrativo' => 'Privacy / assicurazione / studio',
|
||||
'altro' => 'Altro',
|
||||
];
|
||||
}
|
||||
|
|
@ -659,7 +659,7 @@ private function getAllocationScopeOptions(): array
|
|||
'tutti_millesimi' => 'Tutti per millesimi',
|
||||
'condomini_utilizzatori' => 'Condomini utilizzatori',
|
||||
'inquilini_utilizzatori' => 'Inquilini utilizzatori',
|
||||
'condomini_inquilini_utilizzatori'=> 'Condomini + inquilini utilizzatori',
|
||||
'condomini_inquilini_utilizzatori' => 'Condomini + inquilini utilizzatori',
|
||||
'rimborso_spese' => 'Rimborso spese uso bene comune',
|
||||
'gestione_studio' => 'Gestione studio / amministrazione',
|
||||
'altro' => 'Altro criterio',
|
||||
|
|
|
|||
|
|
@ -177,9 +177,9 @@ protected function getTableQuery(): Builder
|
|||
return TabellaMillesimale::query()->whereRaw('1 = 0');
|
||||
}
|
||||
|
||||
$orderColumn = Schema::hasColumn('tabelle_millesimali', 'ordine_visualizzazione')
|
||||
? 'ordine_visualizzazione'
|
||||
: (Schema::hasColumn('tabelle_millesimali', 'nord') ? 'nord' : (Schema::hasColumn('tabelle_millesimali', 'ordinamento') ? 'ordinamento' : 'id'));
|
||||
$orderColumn = Schema::hasColumn('tabelle_millesimali', 'nord')
|
||||
? 'nord'
|
||||
: (Schema::hasColumn('tabelle_millesimali', 'ordine_visualizzazione') ? 'ordine_visualizzazione' : (Schema::hasColumn('tabelle_millesimali', 'ordinamento') ? 'ordinamento' : 'id'));
|
||||
|
||||
return TabellaMillesimale::query()
|
||||
->where('stabile_id', $activeStabileId)
|
||||
|
|
@ -326,13 +326,13 @@ public function table(Table $table): Table
|
|||
])
|
||||
->columns([
|
||||
TextColumn::make(
|
||||
Schema::hasColumn('tabelle_millesimali', 'ordine_visualizzazione')
|
||||
? 'ordine_visualizzazione'
|
||||
: 'ordinamento'
|
||||
Schema::hasColumn('tabelle_millesimali', 'nord')
|
||||
? 'nord'
|
||||
: (Schema::hasColumn('tabelle_millesimali', 'ordine_visualizzazione') ? 'ordine_visualizzazione' : 'ordinamento')
|
||||
)
|
||||
->label('Ord.')
|
||||
->label('Nord')
|
||||
->sortable()
|
||||
->toggleable(isToggledHiddenByDefault: true),
|
||||
->toggleable(),
|
||||
|
||||
TextColumn::make('codice_tabella')
|
||||
->label('Codice')
|
||||
|
|
@ -614,7 +614,7 @@ protected function loadTabelle(): void
|
|||
->ordinato();
|
||||
|
||||
$this->tabelle = $q
|
||||
->get(['id', 'codice_tabella', 'nome_tabella', 'denominazione', 'tipo_tabella', 'tipo_calcolo', 'totale_millesimi', 'ordinamento', 'meta_legacy'])
|
||||
->get(['id', 'codice_tabella', 'nome_tabella', 'denominazione', 'tipo_tabella', 'tipo_calcolo', 'totale_millesimi', 'ordinamento', 'ordine_visualizzazione', 'nord', 'meta_legacy'])
|
||||
->map(function (TabellaMillesimale $t) {
|
||||
$codice = $t->codice_tabella ?: ($t->nome_tabella ?: ('TAB ' . $t->id));
|
||||
$nome = $t->denominazione ?: ($t->nome_tabella_millesimale ?: ($t->nome_tabella ?: 'Tabella'));
|
||||
|
|
@ -634,11 +634,12 @@ protected function loadTabelle(): void
|
|||
'id' => (int) $t->id,
|
||||
'codice' => $codice,
|
||||
'nome' => $nome,
|
||||
'nord' => $this->resolveNordValue($t),
|
||||
'tipo' => $tipoLabel,
|
||||
'calcolo' => $calcoloLabel,
|
||||
'is_consumo' => $isConsumo,
|
||||
'totale' => is_numeric($t->totale_millesimi) ? (float) $t->totale_millesimi : null,
|
||||
'ordinamento' => (int) ($t->ordinamento ?? 999999),
|
||||
'ordinamento' => $this->resolveNordValue($t) ?? (int) ($t->ordine_visualizzazione ?? $t->ordinamento ?? 999999),
|
||||
'is_bilanciata' => (bool) ($t->is_bilanciata ?? false),
|
||||
'preventivo' => is_numeric($prev) ? (float) $prev : null,
|
||||
'consuntivo' => is_numeric($cons) ? (float) $cons : null,
|
||||
|
|
@ -646,6 +647,23 @@ protected function loadTabelle(): void
|
|||
})
|
||||
->values()
|
||||
->all();
|
||||
|
||||
usort($this->tabelle, static function (array $left, array $right): int {
|
||||
$leftNord = is_numeric($left['ordinamento'] ?? null) ? (int) $left['ordinamento'] : 999999;
|
||||
$rightNord = is_numeric($right['ordinamento'] ?? null) ? (int) $right['ordinamento'] : 999999;
|
||||
|
||||
if ($leftNord !== $rightNord) {
|
||||
return $leftNord <=> $rightNord;
|
||||
}
|
||||
|
||||
$leftTipo = (string) ($left['tipo'] ?? '');
|
||||
$rightTipo = (string) ($right['tipo'] ?? '');
|
||||
if ($leftTipo !== $rightTipo) {
|
||||
return strnatcasecmp($leftTipo, $rightTipo);
|
||||
}
|
||||
|
||||
return strnatcasecmp((string) ($left['codice'] ?? ''), (string) ($right['codice'] ?? ''));
|
||||
});
|
||||
}
|
||||
|
||||
protected function pickTabellaId(?int $candidate): ?int
|
||||
|
|
@ -1075,7 +1093,6 @@ private function formatCodiceUnita(?string $codice): ?string
|
|||
return null;
|
||||
}
|
||||
|
||||
$prefix = is_string($this->codiceStabile) ? trim($this->codiceStabile) : '';
|
||||
if ($prefix !== '') {
|
||||
$pattern = '/^' . preg_quote($prefix, '/') . '[\s\-\/]+/';
|
||||
$codice = preg_replace($pattern, '', $codice) ?? $codice;
|
||||
|
|
@ -1338,4 +1355,16 @@ private function isConsumoCalcolo(?string $calcolo): bool
|
|||
$c = strtolower(trim((string) ($calcolo ?? '')));
|
||||
return in_array($c, ['acqua', 'a', 'consumo', 'c', 'a_consumo'], true);
|
||||
}
|
||||
|
||||
private function resolveNordValue(TabellaMillesimale $t): ?int
|
||||
{
|
||||
foreach (['nord', 'ordine_visualizzazione', 'ordinamento'] as $field) {
|
||||
$value = $t->{$field} ?? null;
|
||||
if (is_numeric($value)) {
|
||||
return (int) $value;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,7 +51,6 @@ public function panel(Panel $panel): Panel
|
|||
->renderHook(PanelsRenderHook::HEAD_END, fn() => view('filament.components.legacy-admin-assets'))
|
||||
->renderHook(PanelsRenderHook::TOPBAR_LOGO_AFTER, fn() => view('filament.components.topbar-context'))
|
||||
->renderHook(PanelsRenderHook::USER_MENU_BEFORE, fn() => view('filament.components.topbar-icons'))
|
||||
->renderHook(PanelsRenderHook::FOOTER, fn() => view('filament.components.footer'))
|
||||
->navigationItems([
|
||||
NavigationItem::make('Rubrica Unica')
|
||||
->group('NetGescon')
|
||||
|
|
@ -133,7 +132,7 @@ public function panel(Panel $panel): Panel
|
|||
]);
|
||||
}
|
||||
|
||||
private function resolveSupplierCatalogUrl(): string
|
||||
protected function resolveSupplierCatalogUrl(): string
|
||||
{
|
||||
$user = Auth::user();
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
<?php
|
||||
|
||||
namespace App\Services\Consumi;
|
||||
|
||||
use App\Models\CategoriaTicket;
|
||||
|
|
|
|||
|
|
@ -1,3 +1,73 @@
|
|||
# SESSION HANDOFF - 2026-04-13 / 2026-04-14
|
||||
|
||||
## Stato operativo reale alla chiusura sessione
|
||||
|
||||
- Repository: `/home/michele/netgescon/netgescon-day0`
|
||||
- Focus stabile utente: `0021`, con attenzione anche allo shell tecnico FE `FE221005` (`stabili.id=29`)
|
||||
- Obiettivo operativo chiuso in questa sessione:
|
||||
- rendere esplicito e sicuro il CF soggetto nello scarico FE
|
||||
- semplificare il flusso `ticket-acqua-light`
|
||||
- rimuovere il footer Filament invasivo su mobile
|
||||
- riallineare pagina `tabelle-millesimali` a `nord`, `tipo`, `calcolo`
|
||||
- eliminare i blocchi Blade fragili nelle viste `ticket-acqua` e `ticket-acqua-generale`
|
||||
|
||||
## Verifiche fatte e confermate
|
||||
|
||||
- `php artisan view:clear && php artisan view:cache` eseguito con esito OK dopo gli ultimi fix.
|
||||
- `php artisan route:list` carica `755` route.
|
||||
- Il service FE usa il CF dello stabile, non il CF studio dell'amministratore:
|
||||
- `stabili.id=25 / codice_stabile=0021 / CF=97487690584`
|
||||
- `stabili.id=29 / codice_stabile=FE221005 / CF=10055221005`
|
||||
- Il problema operativo dello scarico FE nasceva dal contesto dello stabile attivo in topbar/sessione, non dalla chiamata HTTP finale.
|
||||
- Nella pagina FE è stato aggiunto un riepilogo esplicito del `Codice fiscale soggetto usato per lo scarico`.
|
||||
- Le due Blade acqua sono state semplificate spostando il rendering metadati foto in partial condivisa, per evitare parse error residui in staging dovuti a blocchi Blade annidati.
|
||||
|
||||
## File toccati in questa fase
|
||||
|
||||
- `app/Providers/Filament/AdminFilamentPanelProvider.php`
|
||||
- chain Filament riparata
|
||||
- footer hook rimosso dal panel
|
||||
- `app/Filament/Pages/Condomini/TabelleMillesimaliArchivio.php`
|
||||
- preferenza a `tabelle_millesimali.nord` per ordinamento archivio
|
||||
- `nord` portato nel payload usato dalla Blade
|
||||
- lista tabelle ordinata per `nord`, poi `tipo`, poi codice
|
||||
- `resources/views/filament/pages/condomini/tabelle-millesimali.blade.php`
|
||||
- badge visivo `Ord. {nord}`
|
||||
- `tipo` e `calcolo` mantenuti visibili nelle liste `prospetto` e `voci`
|
||||
- `resources/views/filament/pages/supporto/ticket-acqua.blade.php`
|
||||
- `resources/views/filament/pages/supporto/ticket-acqua-generale.blade.php`
|
||||
- blocchi metadati foto sostituiti con partial condivisa
|
||||
- `resources/views/filament/pages/supporto/partials/photo-metadata.blade.php`
|
||||
- nuova partial minima in PHP/HTML, senza direttive Blade annidate
|
||||
|
||||
## Comandi rapidi per ripartenza domani
|
||||
|
||||
```bash
|
||||
cd /home/michele/netgescon/netgescon-day0
|
||||
git status --short
|
||||
php artisan view:clear
|
||||
php artisan view:cache
|
||||
php artisan route:list | tail -n 2
|
||||
php artisan netgescon:qa-millesimi-spese --stabile=0021 --show-missing=20
|
||||
tail -n 120 storage/logs/laravel.log
|
||||
```
|
||||
|
||||
## Punti ancora aperti da riprendere
|
||||
|
||||
1. QA millesimi/voci da rendere piu accurato per le gestioni straordinarie legate all'anno/esercizio.
|
||||
2. Validazione staging reale dopo `git push` + update staging:
|
||||
- `/admin-filament/condomini/tabelle-millesimali`
|
||||
- `/admin-filament/supporto/ticket-acqua`
|
||||
- `/admin-filament/supporto/ticket-acqua-generale`
|
||||
3. Controllo del bug `fornitore Livewire root` ancora aperto nel tracker.
|
||||
4. Diagnosi separata dei nominativi rumorosi per `0023`.
|
||||
|
||||
## Prompt consigliato per un altro agent
|
||||
|
||||
"Riparti da `docs/ai/SESSION_HANDOFF.md`. Prima verifica `git status`, poi esegui `php artisan view:clear && php artisan view:cache`. Controlla staging su `tabelle-millesimali`, `ticket-acqua` e `ticket-acqua-generale`. Se il deploy e allineato, passa al raffinamento del QA millesimi/voci per gestioni straordinarie con anno/esercizio, senza fare bonifiche contabili distruttive."
|
||||
|
||||
---
|
||||
|
||||
# SESSION HANDOFF - 2026-04-08
|
||||
|
||||
## Contesto operativo attuale
|
||||
|
|
|
|||
|
|
@ -70,9 +70,14 @@ class="block rounded-xl border p-3 transition
|
|||
>
|
||||
<div class="flex items-start justify-between gap-3">
|
||||
<div>
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<div class="text-sm font-semibold {{ $selected ? 'text-primary-700' : 'text-gray-900' }}">
|
||||
{{ $t['codice'] }}
|
||||
</div>
|
||||
@if(isset($t['nord']) && $t['nord'] !== null)
|
||||
<span class="inline-flex items-center rounded-full bg-slate-100 px-2 py-0.5 text-[10px] font-semibold text-slate-700">Ord. {{ $t['nord'] }}</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="text-xs text-gray-600">{{ $t['nome'] }}</div>
|
||||
@if(!empty($t['tipo']) || !empty($t['calcolo']))
|
||||
<div class="mt-1 text-xs text-gray-500">
|
||||
|
|
@ -241,9 +246,14 @@ class="block rounded-xl border p-3 transition
|
|||
>
|
||||
<div class="flex items-start justify-between gap-3">
|
||||
<div>
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<div class="text-sm font-semibold {{ $selected ? 'text-primary-700' : 'text-gray-900' }}">
|
||||
{{ $t['codice'] }}
|
||||
</div>
|
||||
@if(isset($t['nord']) && $t['nord'] !== null)
|
||||
<span class="inline-flex items-center rounded-full bg-slate-100 px-2 py-0.5 text-[10px] font-semibold text-slate-700">Ord. {{ $t['nord'] }}</span>
|
||||
@endif
|
||||
</div>
|
||||
<div class="text-xs text-gray-600">{{ $t['nome'] }}</div>
|
||||
@if(!empty($t['tipo']) || !empty($t['calcolo']))
|
||||
<div class="mt-1 text-xs text-gray-500">
|
||||
|
|
|
|||
|
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
$badgeRows = is_array($badgeRows ?? null) ? $badgeRows : [];
|
||||
$detailRows = is_array($detailRows ?? null) ? $detailRows : [];
|
||||
?>
|
||||
|
||||
<?php if ($badgeRows !== []): ?>
|
||||
<div class="mt-2 flex flex-wrap gap-1">
|
||||
<?php foreach ($badgeRows as $badge): ?>
|
||||
<span class="inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-semibold <?= e((string) ($badge['class'] ?? '')) ?>"><?= e((string) ($badge['label'] ?? '')) ?></span>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($detailRows !== []): ?>
|
||||
<div class="mt-2 rounded-lg border border-slate-200 bg-white p-2 text-[11px] text-slate-700">
|
||||
<?php foreach ($detailRows as $detail): ?>
|
||||
<div><span class="font-medium"><?= e((string) ($detail['label'] ?? '')) ?>:</span> <?= e((string) ($detail['value'] ?? '')) ?></div>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
|
@ -63,7 +63,9 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
@php($service = $this->selectedServiceSnapshot)
|
||||
@php
|
||||
$service = $this->selectedServiceSnapshot;
|
||||
@endphp
|
||||
@if($service)
|
||||
<div class="rounded-2xl border border-emerald-200 bg-emerald-50 p-4 shadow-sm">
|
||||
<div class="text-sm font-semibold text-emerald-900">Riferimenti contratto selezionato</div>
|
||||
|
|
@ -332,13 +334,7 @@
|
|||
];
|
||||
}
|
||||
@endphp
|
||||
@if($detailRows !== [])
|
||||
<div class="mt-2 rounded-lg border border-slate-200 bg-white p-2 text-[11px] text-slate-700">
|
||||
@foreach($detailRows as $detail)
|
||||
<div><span class="font-medium">{{ $detail['label'] }}:</span> {{ $detail['value'] }}</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
@include('filament.pages.supporto.partials.photo-metadata', ['badgeRows' => [], 'detailRows' => $detailRows])
|
||||
<label class="mt-2 block">
|
||||
<span class="mb-1 block text-[11px] font-medium">Nota foto</span>
|
||||
<input type="text" wire:model.defer="generalWaterPhotoDescriptions.{{ $upload['index'] }}" class="w-full rounded-lg border-gray-300" placeholder="Es. display principale, targhetta matricola, quadro contatori" />
|
||||
|
|
|
|||
|
|
@ -244,7 +244,9 @@
|
|||
<div wire:loading wire:target="pendingWaterPhotos" class="mt-2 text-xs font-medium text-amber-700">Caricamento foto in corso: preparo la coda della lettura acqua.</div>
|
||||
|
||||
@if(count($this->selectedWaterUploads) > 0)
|
||||
@php($focusUpload = $this->selectedWaterUploads[0] ?? null)
|
||||
@php
|
||||
$focusUpload = $this->selectedWaterUploads[0] ?? null;
|
||||
@endphp
|
||||
@if($focusUpload)
|
||||
<div class="mt-4 rounded-2xl border border-sky-200 bg-sky-50 p-3">
|
||||
<div class="mb-2 text-xs font-semibold text-sky-900">Chicca lettura rapida</div>
|
||||
|
|
@ -318,22 +320,7 @@
|
|||
];
|
||||
}
|
||||
@endphp
|
||||
@if($badgeRows !== [] || $detailRows !== [])
|
||||
@if($badgeRows !== [])
|
||||
<div class="mt-2 flex flex-wrap gap-1">
|
||||
@foreach($badgeRows as $badge)
|
||||
<span class="inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-semibold {{ $badge['class'] }}">{{ $badge['label'] }}</span>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
@if($detailRows !== [])
|
||||
<div class="mt-2 rounded-lg border border-slate-200 bg-white p-2 text-[11px] text-slate-700">
|
||||
@foreach($detailRows as $detail)
|
||||
<div><span class="font-medium">{{ $detail['label'] }}:</span> {{ $detail['value'] }}</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
@endif
|
||||
@include('filament.pages.supporto.partials.photo-metadata', ['badgeRows' => $badgeRows, 'detailRows' => $detailRows])
|
||||
<label class="mt-2 block">
|
||||
<span class="mb-1 block text-[11px] font-medium">Nota sotto la foto</span>
|
||||
<input type="text" wire:model.defer="waterPhotoDescriptions.{{ $upload['index'] }}" class="w-full rounded-lg border-gray-300" placeholder="Es. contatore cucina, cifra poco leggibile" />
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user