netgescon-master/netgescon-laravel/resources/views/admin/stabili/_form-bootstrap.blade.php

2084 lines
100 KiB
PHP

<!-- Form Header per AJAX -->
<div class="d-flex align-items-center justify-content-between mb-3">
<div>
<h4 class="text-primary mb-1">
<i class="fas fa-plus-circle me-2"></i>Nuovo Stabile
</h4>
<p class="text-muted mb-0 small">Compila tutti i campi per aggiungere un nuovo condominio al sistema</p>
</div>
</div>
<!-- Layout a tab per la form stabili con Bootstrap -->
<div class="card">
<!-- Tab Navigation -->
<div class="card-header border-bottom">
<ul class="nav nav-tabs card-header-tabs" id="stabiliTabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="generale-tab" data-bs-toggle="tab" data-bs-target="#tab-generale"
type="button" role="tab" aria-controls="tab-generale" aria-selected="true">
<i class="fas fa-info-circle me-2"></i>Dati Generali
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="indirizzo-tab" data-bs-toggle="tab" data-bs-target="#tab-indirizzo"
type="button" role="tab" aria-controls="tab-indirizzo" aria-selected="false">
<i class="fas fa-map-marker-alt me-2"></i>Indirizzo
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="palazzine-tab" data-bs-toggle="tab" data-bs-target="#tab-palazzine"
type="button" role="tab" aria-controls="tab-palazzine" aria-selected="false">
<i class="fas fa-building me-2"></i>Palazzine
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="catastali-tab" data-bs-toggle="tab" data-bs-target="#tab-catastali"
type="button" role="tab" aria-controls="tab-catastali" aria-selected="false">
<i class="fas fa-file-alt me-2"></i>Dati Catastali
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="bancari-tab" data-bs-toggle="tab" data-bs-target="#tab-bancari"
type="button" role="tab" aria-controls="tab-bancari" aria-selected="false">
<i class="fas fa-university me-2"></i>Dati Bancari
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="amministratore-tab" data-bs-toggle="tab" data-bs-target="#tab-amministratore"
type="button" role="tab" aria-controls="tab-amministratore" aria-selected="false">
<i class="fas fa-user-tie me-2"></i>Amministratore
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="esercizi-tab" data-bs-toggle="tab" data-bs-target="#tab-esercizi"
type="button" role="tab" aria-controls="tab-esercizi" aria-selected="false">
<i class="fas fa-calendar-alt me-2"></i>Esercizi Contabili
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="locali-tab" data-bs-toggle="tab" data-bs-target="#tab-locali"
type="button" role="tab" aria-controls="tab-locali" aria-selected="false">
<i class="fas fa-warehouse me-2"></i>Locali di Servizio
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="documenti-tab" data-bs-toggle="tab" data-bs-target="#tab-documenti"
type="button" role="tab" aria-controls="tab-documenti" aria-selected="false">
<i class="fas fa-file-pdf me-2"></i>Documenti & Contratti
</button>
</li>
</ul>
</div>
<!-- Tab Content -->
<div class="card-body">
<div class="tab-content" id="stabiliTabsContent">
<!-- Tab 1: Dati Generali -->
<div class="tab-pane fade show active" id="tab-generale" role="tabpanel" aria-labelledby="generale-tab">
{{-- Sezione Informazioni Base --}}
<div class="row mb-4">
<div class="col-12">
<h6 class="text-primary border-bottom pb-2">
<i class="fas fa-building me-2"></i>Informazioni Base
</h6>
</div>
</div>
<div class="row g-3 mb-4">
<div class="col-md-6">
<label for="denominazione" class="form-label">
<i class="fas fa-building me-2"></i>Denominazione Stabile *
</label>
<input type="text" name="denominazione" id="denominazione" required
value="{{ old('denominazione', $stabile->denominazione ?? '') }}"
class="form-control"
placeholder="Nome del condominio">
@error('denominazione')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="codice_stabile" class="form-label">
<i class="fas fa-hashtag me-2"></i>Codice Stabile *
</label>
<input type="text" name="codice_stabile" id="codice_stabile" required
value="{{ old('codice_stabile', $stabile->codice_stabile ?? '') }}"
class="form-control"
placeholder="Codice identificativo univoco">
@error('codice_stabile')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="tipo_stabile" class="form-label">
<i class="fas fa-home me-2"></i>Tipo Stabile
</label>
<select name="tipo_stabile" id="tipo_stabile" class="form-select">
<option value="">Seleziona tipo</option>
<option value="condominio" {{ old('tipo_stabile', $stabile->tipo_stabile ?? '') == 'condominio' ? 'selected' : '' }}>Condominio</option>
<option value="palazzo" {{ old('tipo_stabile', $stabile->tipo_stabile ?? '') == 'palazzo' ? 'selected' : '' }}>Palazzo</option>
<option value="villetta" {{ old('tipo_stabile', $stabile->tipo_stabile ?? '') == 'villetta' ? 'selected' : '' }}>Villetta</option>
<option value="complesso" {{ old('tipo_stabile', $stabile->tipo_stabile ?? '') == 'complesso' ? 'selected' : '' }}>Complesso Residenziale</option>
</select>
@error('tipo_stabile')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="data_costruzione" class="form-label">
<i class="fas fa-calendar me-2"></i>Data Costruzione
</label>
<input type="date" name="data_costruzione" id="data_costruzione"
value="{{ old('data_costruzione', $stabile->data_costruzione ?? '') }}"
class="form-control">
@error('data_costruzione')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
</div>
{{-- Sezione Indirizzo --}}
<div class="row mb-4">
<div class="col-12">
<h6 class="text-primary border-bottom pb-2">
<i class="fas fa-map-marker-alt me-2"></i>Indirizzo e Localizzazione
</h6>
</div>
</div>
<div class="row g-3 mb-4">
<div class="col-12">
<label for="indirizzo" class="form-label">
<i class="fas fa-road me-2"></i>Indirizzo *
</label>
<div class="input-group">
<input type="text" name="indirizzo" id="indirizzo" required
value="{{ old('indirizzo', $stabile->indirizzo ?? '') }}"
class="form-control"
placeholder="Via/Corso/Piazza e numero civico">
<button class="btn btn-outline-secondary" type="button" onclick="validateAddress()">
<i class="fas fa-search"></i>
</button>
</div>
@error('indirizzo')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="citta" class="form-label">
<i class="fas fa-city me-2"></i>Città *
</label>
<div class="input-group">
<input type="text" name="citta" id="citta" required
value="{{ old('citta', $stabile->citta ?? '') }}"
class="form-control">
<button class="btn btn-outline-info" type="button" onclick="searchComune()">
<i class="fas fa-search"></i>
</button>
</div>
@error('citta')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-3">
<label for="cap" class="form-label">
<i class="fas fa-mail-bulk me-2"></i>CAP *
</label>
<input type="text" name="cap" id="cap" required
value="{{ old('cap', $stabile->cap ?? '') }}"
class="form-control">
@error('cap')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-3">
<label for="provincia" class="form-label">
<i class="fas fa-flag me-2"></i>Provincia
</label>
<input type="text" name="provincia" id="provincia" maxlength="2"
value="{{ old('provincia', $stabile->provincia ?? '') }}"
class="form-control"
placeholder="Es. MI">
@error('provincia')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
</div>
{{-- Sezione Dati Catastali --}}
<div class="row mb-4">
<div class="col-12">
<h6 class="text-primary border-bottom pb-2">
<i class="fas fa-file-alt me-2"></i>Dati Catastali
<small class="text-muted">- Collegamenti:
<a href="#" onclick="viewCatastoDocs()" class="text-decoration-none">
<i class="fas fa-link me-1"></i>Mappe e Planimetrie
</a>
</small>
</h6>
</div>
</div>
<div class="row g-3 mb-4">
<div class="col-md-3">
<label for="foglio" class="form-label">
<i class="fas fa-file me-2"></i>Foglio
</label>
<input type="text" name="foglio" id="foglio"
value="{{ old('foglio', $stabile->foglio ?? '') }}"
class="form-control">
@error('foglio')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-3">
<label for="mappale" class="form-label">
<i class="fas fa-map me-2"></i>Mappale
</label>
<input type="text" name="mappale" id="mappale"
value="{{ old('mappale', $stabile->mappale ?? '') }}"
class="form-control">
@error('mappale')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-3">
<label for="subalterno" class="form-label">
<i class="fas fa-hashtag me-2"></i>Subalterno
</label>
<input type="text" name="subalterno" id="subalterno"
value="{{ old('subalterno', $stabile->subalterno ?? '') }}"
class="form-control">
@error('subalterno')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-3">
<label for="categoria" class="form-label">
<i class="fas fa-tag me-2"></i>Categoria
</label>
<input type="text" name="categoria" id="categoria"
value="{{ old('categoria', $stabile->categoria ?? '') }}"
class="form-control"
placeholder="Es. A/2">
@error('categoria')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="rendita_catastale" class="form-label">
<i class="fas fa-euro-sign me-2"></i>Rendita Catastale ()
</label>
<input type="number" name="rendita_catastale" id="rendita_catastale" step="0.01"
value="{{ old('rendita_catastale', $stabile->rendita_catastale ?? '') }}"
class="form-control">
@error('rendita_catastale')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="superficie_catastale" class="form-label">
<i class="fas fa-ruler-combined me-2"></i>Superficie Catastale (mq)
</label>
<input type="number" name="superficie_catastale" id="superficie_catastale" step="0.01"
value="{{ old('superficie_catastale', $stabile->superficie_catastale ?? '') }}"
class="form-control">
@error('superficie_catastale')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
</div>
{{-- Sezione Amministratore --}}
<div class="row mb-4">
<div class="col-12">
<h6 class="text-primary border-bottom pb-2">
<i class="fas fa-user-tie me-2"></i>Amministratore di Condominio
<small class="text-muted">- Collegamenti:
<a href="#" onclick="viewAmministratoreDocs()" class="text-decoration-none">
<i class="fas fa-link me-1"></i>Verbale Nomina
</a> |
<a href="#" onclick="viewAssembleaNomina()" class="text-decoration-none">
<i class="fas fa-users me-1"></i>Assemblea Nomina
</a>
</small>
</h6>
</div>
</div>
<div class="row g-3 mb-4">
<div class="col-md-6">
<label for="amministratore_nome" class="form-label">
<i class="fas fa-user me-2"></i>Nome e Cognome
</label>
<input type="text" name="amministratore_nome" id="amministratore_nome"
value="{{ old('amministratore_nome', $stabile->amministratore_nome ?? auth()->user()->name ?? '') }}"
class="form-control">
@error('amministratore_nome')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="amministratore_email" class="form-label">
<i class="fas fa-envelope me-2"></i>Email
</label>
<input type="email" name="amministratore_email" id="amministratore_email"
value="{{ old('amministratore_email', $stabile->amministratore_email ?? auth()->user()->email ?? '') }}"
class="form-control">
@error('amministratore_email')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="data_nomina" class="form-label">
<i class="fas fa-calendar-check me-2"></i>Data Nomina
</label>
<input type="date" name="data_nomina" id="data_nomina"
value="{{ old('data_nomina', $stabile->data_nomina ?? '') }}"
class="form-control">
@error('data_nomina')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="scadenza_mandato" class="form-label">
<i class="fas fa-calendar-times me-2"></i>Scadenza Mandato
</label>
<input type="date" name="scadenza_mandato" id="scadenza_mandato"
value="{{ old('scadenza_mandato', $stabile->scadenza_mandato ?? '') }}"
class="form-control">
@error('scadenza_mandato')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
</div>
{{-- Sezione Dati Catastali --}}
<div class="row mb-4">
<div class="col-12">
<h6 class="text-primary border-bottom pb-2">
<i class="fas fa-file-alt me-2"></i>Dati Catastali
<a href="#" class="btn btn-sm btn-outline-info ms-2" title="Collegamento al catasto" onclick="linkToCatasto()">
<i class="fas fa-external-link-alt"></i>
</a>
</h6>
</div>
</div>
<div class="row g-3 mb-4">
<div class="col-md-3">
<label for="foglio" class="form-label">
<i class="fas fa-map me-2"></i>Foglio
</label>
<input type="text" name="foglio" id="foglio"
value="{{ old('foglio', $stabile->foglio ?? '') }}"
class="form-control"
placeholder="Numero foglio">
@error('foglio')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-3">
<label for="mappale" class="form-label">
<i class="fas fa-map-marked me-2"></i>Mappale
</label>
<input type="text" name="mappale" id="mappale"
value="{{ old('mappale', $stabile->mappale ?? '') }}"
class="form-control"
placeholder="Numero mappale">
@error('mappale')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-3">
<label for="subalterno" class="form-label">
<i class="fas fa-layer-group me-2"></i>Subalterno
</label>
<input type="text" name="subalterno" id="subalterno"
value="{{ old('subalterno', $stabile->subalterno ?? '') }}"
class="form-control"
placeholder="Sub">
@error('subalterno')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-3">
<label for="categoria" class="form-label">
<i class="fas fa-tag me-2"></i>Categoria
</label>
<input type="text" name="categoria" id="categoria"
value="{{ old('categoria', $stabile->categoria ?? '') }}"
class="form-control"
placeholder="A/2, C/1, etc">
@error('categoria')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="rendita_catastale" class="form-label">
<i class="fas fa-euro-sign me-2"></i>Rendita Catastale
</label>
<div class="input-group">
<span class="input-group-text"></span>
<input type="number" step="0.01" name="rendita_catastale" id="rendita_catastale"
value="{{ old('rendita_catastale', $stabile->rendita_catastale ?? '') }}"
class="form-control"
placeholder="0,00">
</div>
@error('rendita_catastale')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="superficie_catastale" class="form-label">
<i class="fas fa-ruler-combined me-2"></i>Superficie Catastale
</label>
<div class="input-group">
<input type="number" step="0.01" name="superficie_catastale" id="superficie_catastale"
value="{{ old('superficie_catastale', $stabile->superficie_catastale ?? '') }}"
class="form-control"
placeholder="0,00">
<span class="input-group-text">mq</span>
</div>
@error('superficie_catastale')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
</div>
{{-- Sezione Amministratore Completa --}}
<div class="row mb-4">
<div class="col-12">
<h6 class="text-primary border-bottom pb-2">
<i class="fas fa-user-tie me-2"></i>Amministratore
<div class="btn-group ms-2" role="group">
<button type="button" class="btn btn-sm btn-outline-success" title="Visualizza verbale nomina" onclick="viewNominaVerbale()">
<i class="fas fa-file-contract"></i> Verbale
</button>
<button type="button" class="btn btn-sm btn-outline-info" title="Visualizza assemblea nomina" onclick="viewAssembleaNomina()">
<i class="fas fa-users"></i> Assemblea
</button>
<button type="button" class="btn btn-sm btn-outline-warning" title="Ticket/Delibere collegati" onclick="viewTicketsCollegati()">
<i class="fas fa-ticket-alt"></i> Ticket
</button>
</div>
</h6>
</div>
</div>
<div class="row g-3 mb-4">
<div class="col-md-6">
<label for="amministratore_nome" class="form-label">
<i class="fas fa-user me-2"></i>Nome Amministratore
</label>
<input type="text" name="amministratore_nome" id="amministratore_nome"
value="{{ old('amministratore_nome', $stabile->amministratore_nome ?? auth()->user()->name) }}"
class="form-control"
placeholder="Nome e cognome">
@error('amministratore_nome')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="amministratore_email" class="form-label">
<i class="fas fa-envelope me-2"></i>Email Amministratore
</label>
<input type="email" name="amministratore_email" id="amministratore_email"
value="{{ old('amministratore_email', $stabile->amministratore_email ?? auth()->user()->email) }}"
class="form-control"
placeholder="email@dominio.com">
@error('amministratore_email')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="data_nomina" class="form-label">
<i class="fas fa-calendar-check me-2"></i>Data Nomina
</label>
<input type="date" name="data_nomina" id="data_nomina"
value="{{ old('data_nomina', $stabile->data_nomina ?? '') }}"
class="form-control">
@error('data_nomina')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="scadenza_mandato" class="form-label">
<i class="fas fa-calendar-times me-2"></i>Scadenza Mandato
</label>
<input type="date" name="scadenza_mandato" id="scadenza_mandato"
value="{{ old('scadenza_mandato', $stabile->scadenza_mandato ?? '') }}"
class="form-control">
@error('scadenza_mandato')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-12">
<div class="card bg-light">
<div class="card-body">
<h6 class="card-title">
<i class="fas fa-link me-2"></i>Collegamenti Documentali
</h6>
<div class="row">
<div class="col-md-4">
<button type="button" class="btn btn-outline-primary btn-sm w-100 mb-2" onclick="linkToDocumenti()">
<i class="fas fa-folder-open me-2"></i>Documenti Stabile
</button>
</div>
<div class="col-md-4">
<button type="button" class="btn btn-outline-success btn-sm w-100 mb-2" onclick="linkToContratti()">
<i class="fas fa-handshake me-2"></i>Contratti Fornitori
</button>
</div>
<div class="col-md-4">
<button type="button" class="btn btn-outline-warning btn-sm w-100 mb-2" onclick="linkToPagamenti()">
<i class="fas fa-credit-card me-2"></i>Pagamenti/Fatture
</button>
</div>
</div>
</div>
</div>
</div>
</div>
{{-- Sezione Note Generali --}}
<div class="row">
<div class="col-12">
<h6 class="text-primary border-bottom pb-2">
<i class="fas fa-sticky-note me-2"></i>Note e Osservazioni
</h6>
</div>
</div>
<div class="row g-3">
<div class="col-12">
<label for="note" class="form-label">
<i class="fas fa-comment me-2"></i>Note Generali
</label>
<textarea name="note" id="note" rows="4" class="form-control"
placeholder="Inserisci note, osservazioni o informazioni aggiuntive sul condominio. Include qui eventuali delibere assembleari, lavori programmati, particolarità amministrative, ecc.">{{ old('note', $stabile->note ?? '') }}</textarea>
@error('note')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
</div>
</div>
<!-- Tab 2: Indirizzo -->
<div class="tab-pane fade" id="tab-indirizzo" role="tabpanel" aria-labelledby="indirizzo-tab">
<div class="row g-3">
<div class="col-12">
<label for="indirizzo" class="form-label">
<i class="fas fa-road me-2"></i>Indirizzo *
</label>
<input type="text" name="indirizzo" id="indirizzo" required
value="{{ old('indirizzo', $stabile->indirizzo ?? '') }}"
class="form-control">
@error('indirizzo')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="citta" class="form-label">
<i class="fas fa-city me-2"></i>Città *
</label>
<input type="text" name="citta" id="citta" required
value="{{ old('citta', $stabile->citta ?? '') }}"
class="form-control">
@error('citta')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-3">
<label for="cap" class="form-label">
<i class="fas fa-mail-bulk me-2"></i>CAP *
</label>
<input type="text" name="cap" id="cap" required
value="{{ old('cap', $stabile->cap ?? '') }}"
class="form-control">
@error('cap')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-3">
<label for="provincia" class="form-label">
<i class="fas fa-flag me-2"></i>Provincia
</label>
<input type="text" name="provincia" id="provincia" maxlength="2"
value="{{ old('provincia', $stabile->provincia ?? '') }}"
class="form-control"
placeholder="Es. MI">
@error('provincia')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="regione" class="form-label">
<i class="fas fa-map me-2"></i>Regione
</label>
<input type="text" name="regione" id="regione"
value="{{ old('regione', $stabile->regione ?? '') }}"
class="form-control">
@error('regione')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
</div>
</div>
<!-- Tab 3: Palazzine -->
<div class="tab-pane fade" id="tab-palazzine" role="tabpanel" aria-labelledby="palazzine-tab">
<div class="mb-3">
<h5 class="card-title">
<i class="fas fa-building me-2"></i>Gestione Multi-Palazzine
</h5>
<p class="text-muted small">
Aggiungi le palazzine che compongono il complesso condominiale
</p>
</div>
<div class="mb-3">
<button type="button" id="add-palazzina" class="btn btn-success">
<i class="fas fa-plus me-2"></i>Aggiungi Palazzina
</button>
</div>
<div class="table-responsive">
<table class="table table-bordered" id="palazzine-table">
<thead class="table-light">
<tr>
<th>Denominazione Palazzina</th>
<th>Codice</th>
<th>Piani</th>
<th>Unità per Piano</th>
<th>Azioni</th>
</tr>
</thead>
<tbody id="palazzine-tbody">
<!-- Le righe delle palazzine verranno aggiunte dinamicamente -->
</tbody>
</table>
</div>
<input type="hidden" name="palazzine" id="palazzine-data"
value="{{ old('palazzine', isset($stabile) ? json_encode($stabile->palazzine ?? []) : '[]') }}">
</div>
<!-- Tab 4: Dati Catastali -->
<div class="tab-pane fade" id="tab-catastali" role="tabpanel" aria-labelledby="catastali-tab">
<div class="alert alert-warning mb-4">
<h5 class="alert-heading">
<i class="fas fa-file-alt me-2"></i>Dati Catastali - Informazioni Chiave
</h5>
<p class="mb-0 small">
Questi dati sono fondamentali per l'identificazione catastale del condominio
</p>
</div>
<div class="row g-3">
<div class="col-md-4">
<label for="sezione_catastale" class="form-label">
<i class="fas fa-layer-group me-2"></i>Sezione Catastale
</label>
<input type="text" name="sezione_catastale" id="sezione_catastale"
value="{{ old('sezione_catastale', $stabile->sezione_catastale ?? '') }}"
class="form-control">
@error('sezione_catastale')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-4">
<label for="foglio" class="form-label">
<i class="fas fa-file me-2"></i>Foglio
</label>
<input type="text" name="foglio" id="foglio"
value="{{ old('foglio', $stabile->foglio ?? '') }}"
class="form-control">
@error('foglio')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-4">
<label for="particella" class="form-label">
<i class="fas fa-map-pin me-2"></i>Particella
</label>
<input type="text" name="particella" id="particella"
value="{{ old('particella', $stabile->particella ?? '') }}"
class="form-control">
@error('particella')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-4">
<label for="subalterno" class="form-label">
<i class="fas fa-hashtag me-2"></i>Subalterno
</label>
<input type="text" name="subalterno" id="subalterno"
value="{{ old('subalterno', $stabile->subalterno ?? '') }}"
class="form-control">
@error('subalterno')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-4">
<label for="zona_censuaria" class="form-label">
<i class="fas fa-globe me-2"></i>Zona Censuaria
</label>
<input type="text" name="zona_censuaria" id="zona_censuaria"
value="{{ old('zona_censuaria', $stabile->zona_censuaria ?? '') }}"
class="form-control">
@error('zona_censuaria')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-4">
<label for="categoria_catastale" class="form-label">
<i class="fas fa-tags me-2"></i>Categoria Catastale
</label>
<input type="text" name="categoria_catastale" id="categoria_catastale"
value="{{ old('categoria_catastale', $stabile->categoria_catastale ?? '') }}"
class="form-control">
@error('categoria_catastale')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
</div>
</div>
<!-- Tab 5: Dati Bancari -->
<div class="tab-pane fade" id="tab-bancari" role="tabpanel" aria-labelledby="bancari-tab">
<div class="d-flex justify-content-between align-items-center mb-3">
<h6 class="mb-0">
<i class="fas fa-university me-2"></i>Gestione Conti Bancari
</h6>
<button type="button" class="btn btn-primary btn-sm" onclick="addBanca()">
<i class="fas fa-plus me-2"></i>Aggiungi Banca
</button>
</div>
<div id="banche-container">
<div class="banca-row border rounded p-3 mb-3" data-index="0">
<div class="d-flex justify-content-between align-items-center mb-3">
<h6 class="mb-0 text-primary">
<i class="fas fa-university me-2"></i>Banca #1
</h6>
<button type="button" class="btn btn-outline-danger btn-sm" onclick="removeBanca(0)" style="display: none;">
<i class="fas fa-trash"></i>
</button>
</div>
<div class="row g-3">
<div class="col-md-6">
<label class="form-label">
<i class="fas fa-university me-2"></i>Denominazione Banca
</label>
<input type="text" name="banche[0][denominazione]"
class="form-control" placeholder="Nome della banca">
</div>
<div class="col-md-6">
<label class="form-label">
<i class="fas fa-credit-card me-2"></i>IBAN
</label>
<input type="text" name="banche[0][iban]"
class="form-control" placeholder="IT00 0000 0000 0000 0000 0000 000">
</div>
<div class="col-md-6">
<label class="form-label">
<i class="fas fa-signature me-2"></i>Intestazione Conto
</label>
<input type="text" name="banche[0][intestazione]"
class="form-control" placeholder="Intestatario del conto">
</div>
<div class="col-md-6">
<label class="form-label">
<i class="fas fa-code me-2"></i>Codice SWIFT/BIC
</label>
<input type="text" name="banche[0][swift]"
class="form-control" placeholder="Codice SWIFT">
</div>
<div class="col-md-6">
<label class="form-label">
<i class="fas fa-tag me-2"></i>Tipo Conto
</label>
<select name="banche[0][tipo]" class="form-select">
<option value="">Seleziona tipo</option>
<option value="ordinario">Conto Ordinario</option>
<option value="deposito">Conto Deposito</option>
<option value="risparmio">Conto Risparmio</option>
<option value="corrente">Conto Corrente</option>
</select>
</div>
<div class="col-md-4">
<label class="form-label">
<i class="fas fa-euro-sign me-2"></i>Saldo Iniziale
</label>
<input type="number" name="banche[0][saldo_iniziale]"
class="form-control" step="0.01" placeholder="0.00">
</div>
<div class="col-md-4">
<label class="form-label">
<i class="fas fa-calendar me-2"></i>Data Saldo
</label>
<input type="date" name="banche[0][data_saldo]"
class="form-control" value="{{ date('Y-01-01') }}">
</div>
<div class="col-md-4">
<label class="form-label">
<i class="fas fa-check-circle me-2"></i>Saldo Verificato
</label>
<select name="banche[0][saldo_verificato]" class="form-select">
<option value="1">Sì, Verificato</option>
<option value="0">No, Da Verificare</option>
</select>
</div>
<div class="col-md-12">
<label class="form-label">
<i class="fas fa-sticky-note me-2"></i>Note
</label>
<textarea name="banche[0][note]" class="form-control" rows="2"
placeholder="Note aggiuntive per questo conto bancario"></textarea>
</div>
</div>
</div>
</div>
</div>
<!-- Tab 6: Amministratore -->
<div class="tab-pane fade" id="tab-amministratore" role="tabpanel" aria-labelledby="amministratore-tab">
<div class="row g-3">
<div class="col-md-6">
<label for="amministratore_nome" class="form-label">
<i class="fas fa-user me-2"></i>Nome Amministratore
</label>
<input type="text" name="amministratore_nome" id="amministratore_nome"
value="{{ old('amministratore_nome', $stabile->amministratore_nome ?? '') }}"
class="form-control">
@error('amministratore_nome')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="amministratore_email" class="form-label">
<i class="fas fa-envelope me-2"></i>Email Amministratore
</label>
<input type="email" name="amministratore_email" id="amministratore_email"
value="{{ old('amministratore_email', $stabile->amministratore_email ?? '') }}"
class="form-control">
@error('amministratore_email')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="amministratore_telefono" class="form-label">
<i class="fas fa-phone me-2"></i>Telefono Amministratore
</label>
<input type="text" name="amministratore_telefono" id="amministratore_telefono"
value="{{ old('amministratore_telefono', $stabile->amministratore_telefono ?? '') }}"
class="form-control">
@error('amministratore_telefono')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
<div class="col-md-6">
<label for="amministratore_codice_fiscale" class="form-label">
<i class="fas fa-id-card me-2"></i>Codice Fiscale Amministratore
</label>
<input type="text" name="amministratore_codice_fiscale" id="amministratore_codice_fiscale"
value="{{ old('amministratore_codice_fiscale', $stabile->amministratore_codice_fiscale ?? '') }}"
class="form-control">
@error('amministratore_codice_fiscale')
<div class="text-danger small mt-1">{{ $message }}</div>
@enderror
</div>
</div>
</div>
<!-- Tab 7: Esercizi Contabili -->
<div class="tab-pane fade" id="tab-esercizi" role="tabpanel" aria-labelledby="esercizi-tab">
<div class="mb-3">
<h5 class="card-title">
<i class="fas fa-calendar-alt me-2"></i>Gestione Esercizi Contabili
</h5>
<p class="text-muted small">
Configura gli esercizi contabili per le diverse tipologie di gestione: Ordinarie, Riscaldamento e Straordinarie
</p>
</div>
<!-- Sezione Ordinarie -->
<div class="card mb-4">
<div class="card-header bg-primary text-white">
<div class="d-flex justify-content-between align-items-center">
<h6 class="mb-0">
<i class="fas fa-calendar-alt me-2"></i>Gestioni Ordinarie
</h6>
<button type="button" class="btn btn-light btn-sm" onclick="addEsercizio('ordinaria')">
<i class="fas fa-plus me-1"></i>Nuovo
</button>
</div>
</div>
<div class="card-body">
<div id="esercizi-ordinarie-container">
<div class="alert alert-info">
<i class="fas fa-info-circle me-2"></i>
Le gestioni ordinarie devono essere sequenziali. L'anno 2024 deve venire dopo il 2023 e prima del 2025.
</div>
<!-- Gli esercizi ordinari verranno caricati qui -->
</div>
</div>
</div>
<!-- Sezione Riscaldamento -->
<div class="card mb-4">
<div class="card-header bg-warning text-dark">
<div class="d-flex justify-content-between align-items-center">
<h6 class="mb-0">
<i class="fas fa-fire me-2"></i>Gestioni Riscaldamento
</h6>
<button type="button" class="btn btn-dark btn-sm" onclick="addEsercizio('riscaldamento')">
<i class="fas fa-plus me-1"></i>Nuovo
</button>
</div>
</div>
<div class="card-body">
<div id="esercizi-riscaldamento-container">
<div class="alert alert-warning">
<i class="fas fa-fire me-2"></i>
Le gestioni riscaldamento sono tipicamente stagionali (es. Ottobre-Marzo).
</div>
<!-- Gli esercizi riscaldamento verranno caricati qui -->
</div>
</div>
</div>
<!-- Sezione Straordinarie -->
<div class="card mb-4">
<div class="card-header bg-danger text-white">
<div class="d-flex justify-content-between align-items-center">
<h6 class="mb-0">
<i class="fas fa-exclamation-triangle me-2"></i>Gestioni Straordinarie
</h6>
<button type="button" class="btn btn-light btn-sm" onclick="addEsercizio('straordinaria')">
<i class="fas fa-plus me-1"></i>Nuovo
</button>
</div>
</div>
<div class="card-body">
<div id="esercizi-straordinarie-container">
<div class="alert alert-danger">
<i class="fas fa-exclamation-triangle me-2"></i>
Le gestioni straordinarie richiedono una descrizione dettagliata del progetto o intervento.
</div>
<!-- Gli esercizi straordinari verranno caricati qui -->
</div>
</div>
</div>
<!-- Hidden input per i dati degli esercizi -->
<input type="hidden" name="esercizi_contabili" id="esercizi-data"
value="{{ old('esercizi_contabili', isset($stabile) ? json_encode($stabile->eserciziContabili ?? []) : '[]') }}">
</div>
<!-- Tab 8: Locali di Servizio -->
<div class="tab-pane fade" id="tab-locali" role="tabpanel" aria-labelledby="locali-tab">
<div class="mb-3">
<h5 class="card-title">
<i class="fas fa-warehouse me-2"></i>Locali di Servizio e Comuni
</h5>
<p class="text-muted small">
Aggiungi i locali comuni e di servizio del condominio
</p>
</div>
<div class="mb-3">
<button type="button" id="add-locale" class="btn btn-success">
<i class="fas fa-plus me-2"></i>Aggiungi Locale
</button>
</div>
<div class="table-responsive">
<table class="table table-bordered" id="locali-table">
<thead class="table-light">
<tr>
<th>Tipo Locale</th>
<th>Descrizione</th>
<th>Piano</th>
<th>Superficie (mq)</th>
<th>Azioni</th>
</tr>
</thead>
<tbody id="locali-tbody">
<!-- Le righe dei locali verranno aggiunte dinamicamente -->
</tbody>
</table>
</div>
<input type="hidden" name="locali_servizio" id="locali-data"
value="{{ old('locali_servizio', isset($stabile) ? json_encode($stabile->locali_servizio ?? []) : '[]') }}">
</div>
<!-- Tab 9: Documenti & Contratti -->
<div class="tab-pane fade" id="tab-documenti" role="tabpanel" aria-labelledby="documenti-tab">
<div class="row">
<div class="col-12">
<div class="alert alert-info">
<i class="fas fa-info-circle me-2"></i>
<strong>Gestione Documenti dello Stabile</strong><br>
Carica e gestisci tutti i documenti e contratti relativi allo stabile.
Supporta PDF, DOC, DOCX, XLS, XLSX e immagini.
</div>
</div>
</div>
<!-- Upload Documenti -->
<div class="row mb-4">
<div class="col-md-8">
<label for="upload_documenti" class="form-label">
<i class="fas fa-cloud-upload-alt me-2"></i>Carica Nuovi Documenti
</label>
<input type="file" class="form-control" id="upload_documenti"
name="documenti[]" multiple
accept=".pdf,.doc,.docx,.xls,.xlsx,.jpg,.jpeg,.png,.gif">
<div class="form-text">
File supportati: PDF, DOC, DOCX, XLS, XLSX, JPG, PNG. Max 10MB per file.
</div>
</div>
<div class="col-md-4">
<label for="categoria_documento" class="form-label">Categoria</label>
<select class="form-select" id="categoria_documento" name="categoria_documento">
<option value="">Seleziona categoria...</option>
<option value="contratti">Contratti</option>
<option value="amministrativi">Documenti Amministrativi</option>
<option value="tecnici">Documenti Tecnici</option>
<option value="catastali">Documenti Catastali</option>
<option value="bancari">Documenti Bancari</option>
<option value="legali">Documenti Legali</option>
<option value="assemblee">Verbali Assemblee</option>
<option value="altri">Altri</option>
</select>
</div>
</div>
<!-- Registro Amministratori (Legge 220/2012 Art.10 c.7) -->
<div class="card mb-4">
<div class="card-header">
<h6 class="mb-0">
<i class="fas fa-user-shield me-2"></i>
Registro Amministratori <small class="text-muted">(Legge 220/2012 Art.10 c.7)</small>
</h6>
</div>
<div class="card-body">
<div class="row g-3">
<div class="col-md-6">
<label for="registro_data_nomina" class="form-label">Data Nomina Attuale</label>
<input type="date" class="form-control" id="registro_data_nomina"
name="registro_data_nomina"
value="{{ old('registro_data_nomina', $stabile->registro_data_nomina ?? '') }}">
</div>
<div class="col-md-6">
<label for="registro_scadenza" class="form-label">Data Scadenza Mandato</label>
<input type="date" class="form-control" id="registro_scadenza"
name="registro_scadenza"
value="{{ old('registro_scadenza', $stabile->registro_scadenza ?? '') }}">
</div>
<div class="col-md-12">
<label for="registro_delibera" class="form-label">Numero Delibera Nomina</label>
<input type="text" class="form-control" id="registro_delibera"
name="registro_delibera" placeholder="es. Del. n. 5 del 15/03/2023"
value="{{ old('registro_delibera', $stabile->registro_delibera ?? '') }}">
</div>
<div class="col-md-12">
<label for="registro_note" class="form-label">Note Registro</label>
<textarea class="form-control" id="registro_note" name="registro_note"
rows="2" placeholder="Note aggiuntive sul mandato amministrativo">{{ old('registro_note', $stabile->registro_note ?? '') }}</textarea>
</div>
</div>
</div>
</div>
<!-- Elenco Documenti Esistenti -->
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h6 class="mb-0">
<i class="fas fa-folder-open me-2"></i>Documenti Caricati
</h6>
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-outline-primary" onclick="refreshDocumenti()">
<i class="fas fa-sync-alt me-1"></i>Aggiorna
</button>
<button type="button" class="btn btn-outline-success" onclick="printDocumentiList()">
<i class="fas fa-print me-1"></i>Stampa Elenco
</button>
</div>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover" id="documenti-table">
<thead class="table-light">
<tr>
<th width="5%">
<input type="checkbox" id="select-all-docs" class="form-check-input">
</th>
<th width="30%">Nome File</th>
<th width="15%">Categoria</th>
<th width="10%">Dimensione</th>
<th width="15%">Data Caricamento</th>
<th width="25%">Azioni</th>
</tr>
</thead>
<tbody id="documenti-tbody">
<!-- I documenti esistenti verranno caricati dinamicamente -->
<tr class="text-center text-muted">
<td colspan="6">
<i class="fas fa-folder-open fa-2x mb-2"></i><br>
Nessun documento caricato
</td>
</tr>
</tbody>
</table>
</div>
<!-- Template per riga documento -->
<template id="documento-row-template">
<tr data-documento-id="">
<td>
<input type="checkbox" class="form-check-input documento-checkbox">
</td>
<td>
<div class="d-flex align-items-center">
<i class="fas fa-file me-2 document-icon"></i>
<span class="document-name"></span>
</div>
</td>
<td><span class="badge document-category"></span></td>
<td class="document-size"></td>
<td class="document-date"></td>
<td>
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-outline-primary" onclick="downloadDocument(this)" title="Scarica">
<i class="fas fa-download"></i>
</button>
<button type="button" class="btn btn-outline-info" onclick="viewDocument(this)" title="Visualizza">
<i class="fas fa-eye"></i>
</button>
<button type="button" class="btn btn-outline-danger" onclick="deleteDocument(this)" title="Elimina">
<i class="fas fa-trash"></i>
</button>
</div>
</td>
</tr>
</template>
<!-- Azioni Massali -->
<div class="mt-3" id="azioni-massali" style="display: none;">
<div class="alert alert-light">
<div class="d-flex justify-content-between align-items-center">
<span id="selected-count">0 documenti selezionati</span>
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-outline-primary" onclick="downloadSelected()">
<i class="fas fa-download me-1"></i>Scarica Selezionati
</button>
<button type="button" class="btn btn-outline-danger" onclick="deleteSelected()">
<i class="fas fa-trash me-1"></i>Elimina Selezionati
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Footer con pulsanti di azione -->
<div class="card-footer bg-light">
<div class="d-flex justify-content-between align-items-center">
<div>
<small class="text-muted">
<i class="fas fa-info-circle me-1"></i>
Tutti i campi contrassegnati con * sono obbligatori
</small>
</div>
<div class="btn-group">
<button type="button" class="btn btn-outline-secondary" onclick="window.showDashboard()">
<i class="fas fa-times me-2"></i>Annulla
</button>
<button type="button" class="btn btn-outline-primary" onclick="saveDraft()">
<i class="fas fa-save me-2"></i>Salva Bozza
</button>
<button type="submit" class="btn btn-primary">
<i class="fas fa-check me-2"></i>Salva Stabile
</button>
</div>
</div>
</div>
</div>
<!-- JavaScript per gestione tab e funzionalità dinamiche -->
<script>
document.addEventListener('DOMContentLoaded', function() {
let bancheIndex = 1;
// Gestione banche multiple
window.addBanca = function() {
const container = document.getElementById('banche-container');
const newRow = document.createElement('div');
newRow.className = 'banca-row border rounded p-3 mb-3';
newRow.setAttribute('data-index', bancheIndex);
newRow.innerHTML = `
<div class="d-flex justify-content-between align-items-center mb-3">
<h6 class="mb-0 text-primary">
<i class="fas fa-university me-2"></i>Banca #${bancheIndex + 1}
</h6>
<button type="button" class="btn btn-outline-danger btn-sm" onclick="removeBanca(${bancheIndex})">
<i class="fas fa-trash"></i>
</button>
</div>
<div class="row g-3">
<div class="col-md-6">
<label class="form-label">
<i class="fas fa-university me-2"></i>Denominazione Banca
</label>
<input type="text" name="banche[${bancheIndex}][denominazione]"
class="form-control" placeholder="Nome della banca">
</div>
<div class="col-md-6">
<label class="form-label">
<i class="fas fa-credit-card me-2"></i>IBAN
</label>
<input type="text" name="banche[${bancheIndex}][iban]"
class="form-control" placeholder="IT00 0000 0000 0000 0000 0000 000">
</div>
<div class="col-md-6">
<label class="form-label">
<i class="fas fa-signature me-2"></i>Intestazione Conto
</label>
<input type="text" name="banche[${bancheIndex}][intestazione]"
class="form-control" placeholder="Intestatario del conto">
</div>
<div class="col-md-6">
<label class="form-label">
<i class="fas fa-code me-2"></i>Codice SWIFT/BIC
</label>
<input type="text" name="banche[${bancheIndex}][swift]"
class="form-control" placeholder="Codice SWIFT">
</div>
<div class="col-md-6">
<label class="form-label">
<i class="fas fa-tag me-2"></i>Tipo Conto
</label>
<select name="banche[${bancheIndex}][tipo]" class="form-select">
<option value="">Seleziona tipo</option>
<option value="ordinario">Conto Ordinario</option>
<option value="deposito">Conto Deposito</option>
<option value="risparmio">Conto Risparmio</option>
<option value="corrente">Conto Corrente</option>
</select>
</div>
<div class="col-md-4">
<label class="form-label">
<i class="fas fa-euro-sign me-2"></i>Saldo Iniziale
</label>
<input type="number" name="banche[${bancheIndex}][saldo_iniziale]"
class="form-control" step="0.01" placeholder="0.00">
</div>
<div class="col-md-4">
<label class="form-label">
<i class="fas fa-calendar me-2"></i>Data Saldo
</label>
<input type="date" name="banche[${bancheIndex}][data_saldo]"
class="form-control" value="{{ date('Y-01-01') }}">
</div>
<div class="col-md-4">
<label class="form-label">
<i class="fas fa-check-circle me-2"></i>Saldo Verificato
</label>
<select name="banche[${bancheIndex}][saldo_verificato]" class="form-select">
<option value="1">Sì, Verificato</option>
<option value="0">No, Da Verificare</option>
</select>
</div>
<div class="col-md-12">
<label class="form-label">
<i class="fas fa-sticky-note me-2"></i>Note
</label>
<textarea name="banche[${bancheIndex}][note]" class="form-control" rows="2"
placeholder="Note aggiuntive per questo conto bancario"></textarea>
</div>
</div>
`;
container.appendChild(newRow);
bancheIndex++;
// Mostra pulsante rimozione per la prima banca se ora ci sono più banche
updateBancheRemoveButtons();
};
window.removeBanca = function(index) {
const row = document.querySelector(`[data-index="${index}"]`);
if (row) {
row.remove();
updateBancheRemoveButtons();
}
};
function updateBancheRemoveButtons() {
const banche = document.querySelectorAll('.banca-row');
banche.forEach((banca, index) => {
const removeBtn = banca.querySelector('.btn-outline-danger');
if (removeBtn) {
removeBtn.style.display = banche.length > 1 ? 'inline-block' : 'none';
}
});
}
// Funzione per salvare bozza
window.saveDraft = function() {
// Qui implementeremo il salvataggio bozza
alert('Funzione Salva Bozza in sviluppo');
};
// Gestione palazzine e locali esistente...
// Gestione Palazzine
let palazzineData = [];
try {
palazzineData = JSON.parse(document.getElementById('palazzine-data').value || '[]');
} catch(e) {
palazzineData = [];
}
function renderPalazzine() {
const tbody = document.getElementById('palazzine-tbody');
tbody.innerHTML = '';
palazzineData.forEach((palazzina, index) => {
const row = document.createElement('tr');
row.innerHTML = `
<td>
<input type="text" value="${palazzina.denominazione || ''}"
onchange="updatePalazzina(${index}, 'denominazione', this.value)"
class="form-control form-control-sm">
</td>
<td>
<input type="text" value="${palazzina.codice || ''}"
onchange="updatePalazzina(${index}, 'codice', this.value)"
class="form-control form-control-sm">
</td>
<td>
<input type="number" value="${palazzina.piani || ''}"
onchange="updatePalazzina(${index}, 'piani', this.value)"
class="form-control form-control-sm">
</td>
<td>
<input type="number" value="${palazzina.unita_per_piano || ''}"
onchange="updatePalazzina(${index}, 'unita_per_piano', this.value)"
class="form-control form-control-sm">
</td>
<td>
<button type="button" onclick="removePalazzina(${index})"
class="btn btn-danger btn-sm">
<i class="fas fa-trash"></i>
</button>
</td>
`;
tbody.appendChild(row);
});
document.getElementById('palazzine-data').value = JSON.stringify(palazzineData);
}
window.updatePalazzina = function(index, field, value) {
palazzineData[index][field] = value;
document.getElementById('palazzine-data').value = JSON.stringify(palazzineData);
};
window.removePalazzina = function(index) {
palazzineData.splice(index, 1);
renderPalazzine();
};
document.getElementById('add-palazzina').addEventListener('click', function() {
palazzineData.push({
denominazione: '',
codice: '',
piani: '',
unita_per_piano: ''
});
renderPalazzine();
});
// Gestione Locali di Servizio
let localiData = [];
try {
localiData = JSON.parse(document.getElementById('locali-data').value || '[]');
} catch(e) {
localiData = [];
}
function renderLocali() {
const tbody = document.getElementById('locali-tbody');
tbody.innerHTML = '';
localiData.forEach((locale, index) => {
const row = document.createElement('tr');
row.innerHTML = `
<td>
<select onchange="updateLocale(${index}, 'tipo', this.value)"
class="form-select form-select-sm">
<option value="">Seleziona tipo</option>
<option value="cantina" ${locale.tipo === 'cantina' ? 'selected' : ''}>Cantina</option>
<option value="garage" ${locale.tipo === 'garage' ? 'selected' : ''}>Garage</option>
<option value="posto_auto" ${locale.tipo === 'posto_auto' ? 'selected' : ''}>Posto Auto</option>
<option value="locale_tecnico" ${locale.tipo === 'locale_tecnico' ? 'selected' : ''}>Locale Tecnico</option>
<option value="portineria" ${locale.tipo === 'portineria' ? 'selected' : ''}>Portineria</option>
<option value="altro" ${locale.tipo === 'altro' ? 'selected' : ''}>Altro</option>
</select>
</td>
<td>
<input type="text" value="${locale.descrizione || ''}"
onchange="updateLocale(${index}, 'descrizione', this.value)"
class="form-control form-control-sm">
</td>
<td>
<input type="text" value="${locale.piano || ''}"
onchange="updateLocale(${index}, 'piano', this.value)"
class="form-control form-control-sm">
</td>
<td>
<input type="number" step="0.01" value="${locale.superficie || ''}"
onchange="updateLocale(${index}, 'superficie', this.value)"
class="form-control form-control-sm">
</td>
<td>
<button type="button" onclick="removeLocale(${index})"
class="btn btn-danger btn-sm">
<i class="fas fa-trash"></i>
</button>
</td>
`;
tbody.appendChild(row);
});
document.getElementById('locali-data').value = JSON.stringify(localiData);
}
window.updateLocale = function(index, field, value) {
localiData[index][field] = value;
document.getElementById('locali-data').value = JSON.stringify(localiData);
};
window.removeLocale = function(index) {
localiData.splice(index, 1);
renderLocali();
};
document.getElementById('add-locale').addEventListener('click', function() {
localiData.push({
tipo: '',
descrizione: '',
piano: '',
superficie: ''
});
renderLocali();
});
// Render iniziale
renderPalazzine();
renderLocali();
renderEsercizi();
// === GESTIONE ESERCIZI CONTABILI ===
let eserciziData = {
ordinaria: [],
riscaldamento: [],
straordinaria: []
};
// Funzione per aggiungere un nuovo esercizio
window.addEsercizio = function(tipologia) {
const currentYear = new Date().getFullYear();
const lastEsercizio = eserciziData[tipologia].length > 0
? eserciziData[tipologia][eserciziData[tipologia].length - 1]
: null;
let nextYear = currentYear;
if (lastEsercizio) {
nextYear = lastEsercizio.anno + 1;
}
const nuovoEsercizio = {
tipologia: tipologia,
anno: nextYear,
descrizione: `Esercizio ${tipologia} ${nextYear}`,
data_inizio: `${nextYear}-01-01`,
data_fine: `${nextYear}-12-31`,
descrizione_straordinaria: tipologia === 'straordinaria' ? '' : null,
stato: 'aperto'
};
// Per riscaldamento, imposta date tipiche stagionali
if (tipologia === 'riscaldamento') {
nuovoEsercizio.data_inizio = `${nextYear}-10-15`;
nuovoEsercizio.data_fine = `${nextYear + 1}-03-31`;
nuovoEsercizio.descrizione = `Esercizio Riscaldamento ${nextYear}/${nextYear + 1}`;
}
eserciziData[tipologia].push(nuovoEsercizio);
renderEsercizi();
};
// Funzione per rimuovere un esercizio
window.removeEsercizio = function(tipologia, index) {
eserciziData[tipologia].splice(index, 1);
renderEsercizi();
};
// Funzione per aggiornare un esercizio
function updateEsercizio(tipologia, index, field, value) {
if (eserciziData[tipologia][index]) {
eserciziData[tipologia][index][field] = value;
// Aggiorna automaticamente la descrizione se cambia l'anno
if (field === 'anno') {
if (tipologia === 'riscaldamento') {
eserciziData[tipologia][index].descrizione = `Esercizio Riscaldamento ${value}/${value + 1}`;
} else {
eserciziData[tipologia][index].descrizione = `Esercizio ${tipologia} ${value}`;
}
}
}
updateEserciziData();
}
// Funzione per renderizzare gli esercizi
function renderEsercizi() {
['ordinaria', 'riscaldamento', 'straordinaria'].forEach(tipologia => {
const container = document.getElementById(`esercizi-${tipologia === 'ordinaria' ? 'ordinarie' : tipologia}-container`);
const alertElement = container.querySelector('.alert');
// Mantieni l'alert esistente
container.innerHTML = '';
if (alertElement) {
container.appendChild(alertElement);
}
eserciziData[tipologia].forEach((esercizio, index) => {
const row = document.createElement('div');
row.className = 'esercizio-row border rounded p-3 mb-3 bg-light';
row.innerHTML = `
<div class="d-flex justify-content-between align-items-center mb-3">
<h6 class="mb-0">
<i class="fas ${getIconaTipologia(tipologia)} me-2"></i>
${esercizio.descrizione}
</h6>
<button type="button" class="btn btn-outline-danger btn-sm" onclick="removeEsercizio('${tipologia}', ${index})">
<i class="fas fa-trash"></i>
</button>
</div>
<div class="row g-3">
<div class="col-md-3">
<label class="form-label">Anno</label>
<input type="number" class="form-control" value="${esercizio.anno}"
onchange="updateEsercizio('${tipologia}', ${index}, 'anno', parseInt(this.value))"
min="2020" max="2030">
</div>
<div class="col-md-4">
<label class="form-label">Data Inizio</label>
<input type="date" class="form-control" value="${esercizio.data_inizio}"
onchange="updateEsercizio('${tipologia}', ${index}, 'data_inizio', this.value)">
</div>
<div class="col-md-4">
<label class="form-label">Data Fine</label>
<input type="date" class="form-control" value="${esercizio.data_fine}"
onchange="updateEsercizio('${tipologia}', ${index}, 'data_fine', this.value)">
</div>
${tipologia === 'straordinaria' ? `
<div class="col-md-12">
<label class="form-label">Descrizione Straordinaria</label>
<textarea class="form-control" rows="2" placeholder="Descrizione dettagliata dell'intervento straordinario"
onchange="updateEsercizio('${tipologia}', ${index}, 'descrizione_straordinaria', this.value)">${esercizio.descrizione_straordinaria || ''}</textarea>
</div>
` : ''}
</div>
`;
container.appendChild(row);
});
});
updateEserciziData();
}
function getIconaTipologia(tipologia) {
switch(tipologia) {
case 'ordinaria': return 'fa-calendar-alt';
case 'riscaldamento': return 'fa-fire';
case 'straordinaria': return 'fa-exclamation-triangle';
default: return 'fa-book';
}
}
function updateEserciziData() {
const allEsercizi = [
...eserciziData.ordinaria,
...eserciziData.riscaldamento,
...eserciziData.straordinaria
];
document.getElementById('esercizi-data').value = JSON.stringify(allEsercizi);
}
// Auto-genera codice stabile
const denominazioneField = document.getElementById('denominazione');
if (denominazioneField) {
denominazioneField.addEventListener('blur', function() {
const codiceField = document.getElementById('codice_stabile');
if (!codiceField.value && this.value) {
let codice = this.value.toUpperCase()
.replace(/[^A-Z0-9]/g, '')
.substring(0, 6);
if (codice.length < 3) {
codice = 'STB' + String(Date.now()).slice(-3);
}
codiceField.value = codice;
}
});
}
// === GESTIONE DOCUMENTI ===
// Upload documenti
const uploadDocumenti = document.getElementById('upload_documenti');
if (uploadDocumenti) {
uploadDocumenti.addEventListener('change', function() {
const files = this.files;
const categoria = document.getElementById('categoria_documento').value;
if (files.length > 0 && !categoria) {
alert('Seleziona una categoria per i documenti da caricare');
return;
}
// Validazione file
const maxSize = 10 * 1024 * 1024; // 10MB
const allowedTypes = ['application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'image/jpeg', 'image/jpg', 'image/png', 'image/gif'];
for (let file of files) {
if (file.size > maxSize) {
alert(`Il file ${file.name} supera la dimensione massima di 10MB`);
this.value = '';
return;
}
if (!allowedTypes.includes(file.type)) {
alert(`Il file ${file.name} ha un formato non supportato`);
this.value = '';
return;
}
}
// Preview upload (se lo stabile esiste già)
if (files.length > 0) {
previewUploadDocuments(files, categoria);
}
});
}
// Gestione checkbox "Seleziona tutti"
const selectAllDocs = document.getElementById('select-all-docs');
if (selectAllDocs) {
selectAllDocs.addEventListener('change', function() {
const checkboxes = document.querySelectorAll('.documento-checkbox');
checkboxes.forEach(cb => cb.checked = this.checked);
updateSelectedCount();
});
}
// Aggiorna contatore documenti selezionati
document.addEventListener('change', function(e) {
if (e.target.classList.contains('documento-checkbox')) {
updateSelectedCount();
}
});
});
// === FUNZIONI DOCUMENTI ===
function previewUploadDocuments(files, categoria) {
const tbody = document.getElementById('documenti-tbody');
// Rimuovi messaggio "nessun documento"
const emptyRow = tbody.querySelector('tr.text-center.text-muted');
if (emptyRow) {
emptyRow.remove();
}
Array.from(files).forEach(file => {
const row = document.createElement('tr');
row.className = 'table-warning'; // Evidenzia come nuovo
row.innerHTML = `
<td><i class="fas fa-clock text-warning" title="In attesa di caricamento"></i></td>
<td>
<div class="d-flex align-items-center">
<i class="fas ${getFileIcon(file.name)} me-2"></i>
<span>${file.name}</span>
</div>
</td>
<td><span class="badge bg-secondary">${categoria}</span></td>
<td>${formatFileSize(file.size)}</td>
<td><small class="text-muted">Nuovo</small></td>
<td>
<span class="badge bg-warning">
<i class="fas fa-upload me-1"></i>Da caricare
</span>
</td>
`;
tbody.appendChild(row);
});
}
function getFileIcon(filename) {
const ext = filename.toLowerCase().split('.').pop();
switch (ext) {
case 'pdf': return 'fa-file-pdf text-danger';
case 'doc':
case 'docx': return 'fa-file-word text-primary';
case 'xls':
case 'xlsx': return 'fa-file-excel text-success';
case 'jpg':
case 'jpeg':
case 'png':
case 'gif': return 'fa-file-image text-info';
default: return 'fa-file text-secondary';
}
}
function formatFileSize(bytes) {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
function refreshDocumenti() {
// Ricarica l'elenco documenti via AJAX
const stabileId = document.querySelector('input[name="_method"]')?.form?.action?.match(/\d+/)?.[0];
if (!stabileId) return;
fetch(`/admin/stabili/${stabileId}/documenti`)
.then(response => response.json())
.then(data => {
updateDocumentiTable(data.documenti);
})
.catch(error => {
console.error('Errore nel caricamento documenti:', error);
alert('Errore nel caricamento dei documenti');
});
}
function updateDocumentiTable(documenti) {
const tbody = document.getElementById('documenti-tbody');
tbody.innerHTML = '';
if (documenti.length === 0) {
tbody.innerHTML = `
<tr class="text-center text-muted">
<td colspan="6">
<i class="fas fa-folder-open fa-2x mb-2"></i><br>
Nessun documento caricato
</td>
</tr>
`;
return;
}
documenti.forEach(doc => {
const row = document.createElement('tr');
row.setAttribute('data-documento-id', doc.id);
row.innerHTML = `
<td>
<input type="checkbox" class="form-check-input documento-checkbox" value="${doc.id}">
</td>
<td>
<div class="d-flex align-items-center">
<i class="fas ${getFileIcon(doc.nome_file)} me-2"></i>
<span>${doc.nome_file}</span>
</div>
</td>
<td><span class="badge bg-${getCategoryColor(doc.categoria)}">${doc.categoria}</span></td>
<td>${formatFileSize(doc.dimensione)}</td>
<td><small>${new Date(doc.created_at).toLocaleDateString('it-IT')}</small></td>
<td>
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-outline-primary" onclick="downloadDocument(${doc.id})" title="Scarica">
<i class="fas fa-download"></i>
</button>
<button type="button" class="btn btn-outline-info" onclick="viewDocument(${doc.id})" title="Visualizza">
<i class="fas fa-eye"></i>
</button>
<button type="button" class="btn btn-outline-danger" onclick="deleteDocument(${doc.id})" title="Elimina">
<i class="fas fa-trash"></i>
</button>
</div>
</td>
`;
tbody.appendChild(row);
});
}
function getCategoryColor(categoria) {
const colors = {
'contratti': 'primary',
'amministrativi': 'info',
'tecnici': 'warning',
'catastali': 'success',
'bancari': 'secondary',
'legali': 'danger',
'assemblee': 'dark',
'altri': 'light'
};
return colors[categoria] || 'secondary';
}
function downloadDocument(docId) {
window.open(`/admin/documenti/${docId}/download`, '_blank');
}
function viewDocument(docId) {
window.open(`/admin/documenti/${docId}/view`, '_blank');
}
function deleteDocument(docId) {
if (!confirm('Sei sicuro di voler eliminare questo documento?')) {
return;
}
fetch(`/admin/documenti/${docId}`, {
method: 'DELETE',
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content'),
'Accept': 'application/json'
}
})
.then(response => response.json())
.then(data => {
if (data.success) {
refreshDocumenti();
alert('Documento eliminato con successo');
} else {
alert('Errore nell\'eliminazione del documento');
}
})
.catch(error => {
console.error('Errore:', error);
alert('Errore nell\'eliminazione del documento');
});
}
function updateSelectedCount() {
const checkboxes = document.querySelectorAll('.documento-checkbox:checked');
const count = checkboxes.length;
const countElement = document.getElementById('selected-count');
const azioniMassali = document.getElementById('azioni-massali');
if (countElement) {
countElement.textContent = `${count} documento${count !== 1 ? 'i' : ''} selezionat${count !== 1 ? 'i' : 'o'}`;
}
if (azioniMassali) {
azioniMassali.style.display = count > 0 ? 'block' : 'none';
}
}
function downloadSelected() {
const checkboxes = document.querySelectorAll('.documento-checkbox:checked');
const ids = Array.from(checkboxes).map(cb => cb.value);
if (ids.length === 0) {
alert('Nessun documento selezionato');
return;
}
// Crea un form per il download multiplo
const form = document.createElement('form');
form.method = 'POST';
form.action = '/admin/documenti/download-multiple';
const csrfInput = document.createElement('input');
csrfInput.type = 'hidden';
csrfInput.name = '_token';
csrfInput.value = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
form.appendChild(csrfInput);
ids.forEach(id => {
const input = document.createElement('input');
input.type = 'hidden';
input.name = 'documento_ids[]';
input.value = id;
form.appendChild(input);
});
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
}
function deleteSelected() {
const checkboxes = document.querySelectorAll('.documento-checkbox:checked');
const ids = Array.from(checkboxes).map(cb => cb.value);
if (ids.length === 0) {
alert('Nessun documento selezionato');
return;
}
if (!confirm(`Sei sicuro di voler eliminare ${ids.length} documento${ids.length !== 1 ? 'i' : ''}?`)) {
return;
}
fetch('/admin/documenti/delete-multiple', {
method: 'POST',
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content'),
'Content-Type': 'application/json',
'Accept': 'application/json'
},
body: JSON.stringify({ documento_ids: ids })
})
.then(response => response.json())
.then(data => {
if (data.success) {
refreshDocumenti();
alert(`${data.deleted_count} documento${data.deleted_count !== 1 ? 'i eliminati' : ' eliminato'} con successo`);
} else {
alert('Errore nell\'eliminazione dei documenti');
}
})
.catch(error => {
console.error('Errore:', error);
alert('Errore nell\'eliminazione dei documenti');
});
}
function printDocumentiList() {
const stabileId = document.querySelector('input[name="_method"]')?.form?.action?.match(/\d+/)?.[0];
if (stabileId) {
window.open(`/admin/stabili/${stabileId}/documenti/print`, '_blank');
} else {
alert('Salva prima lo stabile per stampare l\'elenco documenti');
}
}
// Salva bozza (funzione già esistente, da non duplicare)
function saveDraft() {
const form = document.querySelector('form');
if (form) {
// Aggiungi un campo hidden per indicare che è una bozza
const draftInput = document.createElement('input');
draftInput.type = 'hidden';
draftInput.name = 'draft';
draftInput.value = '1';
form.appendChild(draftInput);
form.submit();
}
}
// JavaScript per collegamenti documentali
window.linkToCatasto = function() {
alert('Collegamento al catasto: funzionalità in sviluppo. Qui si aprirà la consultazione online del catasto.');
};
window.viewNominaVerbale = function() {
alert('Visualizzazione verbale nomina: funzionalità in sviluppo. Qui si aprirà il documento del verbale di nomina.');
};
window.viewAssembleaNomina = function() {
alert('Visualizzazione assemblea nomina: funzionalità in sviluppo. Qui si aprirà la scheda dell\'assemblea che ha nominato l\'amministratore.');
};
window.viewTicketsCollegati = function() {
alert('Tickets collegati: funzionalità in sviluppo. Qui si apriranno i ticket generati dalle delibere assembleari.');
};
window.linkToDocumenti = function() {
alert('Documenti stabile: funzionalità in sviluppo. Qui si aprirà l\'archivio documenti dello stabile (libretto impianti, mappe, planimetrie, ecc.)');
};
window.linkToContratti = function() {
alert('Contratti fornitori: funzionalità in sviluppo. Qui si apriranno i contratti stipulati con i fornitori.');
};
window.linkToPagamenti = function() {
alert('Pagamenti e fatture: funzionalità in sviluppo. Qui si aprirà la gestione pagamenti, fatture e ritenute d\'acconto.');
};
window.searchComune = function() {
alert('Ricerca comune: funzionalità in sviluppo. Qui si aprirà la ricerca nei comuni italiani.');
};
window.validateAddress = function() {
alert('Validazione indirizzo: funzionalità in sviluppo. Qui si verificherà l\'indirizzo con servizi esterni.');
};
</script>