2084 lines
100 KiB
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>
|