226 lines
12 KiB
PHP
226 lines
12 KiB
PHP
<?php
|
|
|
|
use Illuminate\Database\Migrations\Migration;
|
|
use Illuminate\Database\Schema\Blueprint;
|
|
use Illuminate\Support\Facades\Schema;
|
|
|
|
return new class extends Migration
|
|
{
|
|
public function up(): void
|
|
{
|
|
// Esempio: aggiunta di nuovi campi a gestioni (solo se non esistono già)
|
|
Schema::table('gestioni', function (Blueprint $table) {
|
|
if (!Schema::hasColumn('gestioni', 'preventivo_approvato')) {
|
|
$table->boolean('preventivo_approvato')->default(false)->after('stato');
|
|
}
|
|
if (!Schema::hasColumn('gestioni', 'data_approvazione')) {
|
|
$table->date('data_approvazione')->nullable()->after('preventivo_approvato');
|
|
}
|
|
// ...aggiungi qui solo i nuovi campi che non esistono già...
|
|
});
|
|
|
|
// Esempio: aggiunta di nuovi campi a voci_spesa
|
|
Schema::table('voci_spesa', function (Blueprint $table) {
|
|
if (!Schema::hasColumn('voci_spesa', 'tabella_millesimale_default_id')) {
|
|
$table->unsignedBigInteger('tabella_millesimale_default_id')->nullable();
|
|
}
|
|
if (!Schema::hasColumn('voci_spesa', 'ritenuta_acconto_default')) {
|
|
$table->decimal('ritenuta_acconto_default', 5, 2)->default(0)->after('tabella_millesimale_default_id');
|
|
}
|
|
// NON aggiungere $table->bigIncrements('id')!
|
|
// ...aggiungi qui solo i nuovi campi che non esistono già...
|
|
});
|
|
|
|
// Tabella tabelle_millesimali (solo se non esiste)
|
|
if (!Schema::hasTable('tabelle_millesimali')) {
|
|
Schema::create('tabelle_millesimali', function (Blueprint $table) {
|
|
$table->id();
|
|
$table->unsignedBigInteger('stabile_id');
|
|
$table->string('nome');
|
|
$table->text('descrizione')->nullable();
|
|
$table->enum('tipo', ['proprieta', 'riscaldamento', 'ascensore', 'scale', 'altro']);
|
|
$table->boolean('attiva')->default(true);
|
|
$table->date('data_approvazione')->nullable();
|
|
$table->integer('ordinamento')->default(0);
|
|
$table->timestamps();
|
|
$table->foreign('stabile_id')->references('id_stabile')->on('stabili')->onDelete('cascade');
|
|
});
|
|
}
|
|
|
|
// Tabella dettagli_tabelle_millesimali (solo se non esiste)
|
|
if (!Schema::hasTable('dettagli_tabelle_millesimali')) {
|
|
Schema::create('dettagli_tabelle_millesimali', function (Blueprint $table) {
|
|
$table->id();
|
|
$table->unsignedBigInteger('tabella_millesimale_id');
|
|
$table->unsignedBigInteger('unita_immobiliare_id');
|
|
$table->decimal('millesimi', 10, 4);
|
|
$table->text('note')->nullable();
|
|
$table->timestamps();
|
|
$table->foreign('tabella_millesimale_id')->references('id')->on('tabelle_millesimali')->onDelete('cascade');
|
|
$table->foreign('unita_immobiliare_id')->references('id_unita')->on('unita_immobiliari')->onDelete('cascade');
|
|
$table->unique(['tabella_millesimale_id', 'unita_immobiliare_id'], 'unique_tabella_unita');
|
|
});
|
|
}
|
|
|
|
// Tabella documenti (solo se non esiste)
|
|
if (!Schema::hasTable('documenti')) {
|
|
Schema::create('documenti', function (Blueprint $table) {
|
|
$table->id();
|
|
$table->morphs('documentable');
|
|
$table->string('nome_file');
|
|
$table->string('path_file');
|
|
$table->string('tipo_documento', 100);
|
|
$table->unsignedBigInteger('dimensione_file')->nullable();
|
|
$table->string('mime_type', 100)->nullable();
|
|
$table->text('descrizione')->nullable();
|
|
$table->json('xml_data')->nullable();
|
|
$table->string('hash_file', 64)->nullable();
|
|
$table->timestamps();
|
|
|
|
//$table->index(['documentable_type', 'documentable_id']);
|
|
$table->index('tipo_documento');
|
|
});
|
|
}
|
|
|
|
// Tabella movimenti_contabili (solo se non esiste)
|
|
if (!Schema::hasTable('movimenti_contabili')) {
|
|
Schema::create('movimenti_contabili', function (Blueprint $table) {
|
|
$table->id();
|
|
$table->unsignedBigInteger('stabile_id');
|
|
$table->unsignedBigInteger('gestione_id');
|
|
$table->unsignedBigInteger('fornitore_id')->nullable();
|
|
$table->unsignedBigInteger('documento_id')->nullable();
|
|
$table->string('protocollo', 50)->unique();
|
|
$table->date('data_registrazione');
|
|
$table->date('data_documento');
|
|
$table->string('numero_documento', 50);
|
|
$table->text('descrizione');
|
|
$table->enum('tipo_movimento', ['entrata', 'uscita']);
|
|
$table->decimal('importo_totale', 10, 2);
|
|
$table->decimal('ritenuta_acconto', 10, 2)->default(0);
|
|
$table->decimal('importo_netto', 10, 2);
|
|
$table->enum('stato', ['bozza', 'registrato', 'contabilizzato', 'annullato'])->default('bozza');
|
|
$table->text('note')->nullable();
|
|
$table->timestamps();
|
|
$table->softDeletes();
|
|
|
|
$table->foreign('stabile_id')->references('id_stabile')->on('stabili')->onDelete('cascade');
|
|
$table->foreign('gestione_id')->references('id_gestione')->on('gestioni')->onDelete('cascade');
|
|
$table->foreign('fornitore_id')->references('id_fornitore')->on('fornitori')->onDelete('set null');
|
|
$table->foreign('documento_id')->references('id')->on('documenti')->onDelete('set null');
|
|
|
|
$table->index(['stabile_id', 'data_registrazione']);
|
|
$table->index(['gestione_id', 'tipo_movimento']);
|
|
});
|
|
}
|
|
|
|
// Tabella dettagli_movimenti (partita doppia) (solo se non esiste)
|
|
if (!Schema::hasTable('dettagli_movimenti')) {
|
|
Schema::create('dettagli_movimenti', function (Blueprint $table) {
|
|
$table->id();
|
|
$table->unsignedBigInteger('movimento_id');
|
|
$table->unsignedBigInteger('conto_id')->nullable();
|
|
$table->unsignedBigInteger('voce_spesa_id')->nullable();
|
|
$table->unsignedBigInteger('tabella_millesimale_id')->nullable();
|
|
$table->text('descrizione')->nullable();
|
|
$table->decimal('importo_dare', 10, 2)->default(0);
|
|
$table->decimal('importo_avere', 10, 2)->default(0);
|
|
$table->text('note')->nullable();
|
|
$table->timestamps();
|
|
|
|
$table->foreign('movimento_id')->references('id')->on('movimenti_contabili')->onDelete('cascade');
|
|
$table->foreign('voce_spesa_id')->references('id_voce')->on('voci_spesa')->onDelete('set null');
|
|
$table->foreign('tabella_millesimale_id')->references('id_tabella_millesimale')->on('tabelle_millesimali')->onDelete('set null');
|
|
});
|
|
}
|
|
|
|
// Tabella banche (solo se non esiste)
|
|
if (!Schema::hasTable('banche')) {
|
|
Schema::create('banche', function (Blueprint $table) {
|
|
$table->id();
|
|
$table->unsignedBigInteger('stabile_id');
|
|
$table->string('denominazione');
|
|
$table->string('iban', 34);
|
|
$table->string('bic_swift', 11)->nullable();
|
|
$table->string('agenzia')->nullable();
|
|
$table->string('indirizzo_agenzia')->nullable();
|
|
$table->enum('tipo_conto', ['corrente', 'deposito', 'altro'])->default('corrente');
|
|
$table->decimal('saldo_iniziale', 10, 2)->default(0);
|
|
$table->date('data_apertura')->nullable();
|
|
$table->enum('stato', ['attivo', 'chiuso'])->default('attivo');
|
|
$table->text('note')->nullable();
|
|
$table->timestamps();
|
|
|
|
$table->foreign('stabile_id')->references('id_stabile')->on('stabili')->onDelete('cascade');
|
|
$table->unique(['stabile_id', 'iban']);
|
|
});
|
|
}
|
|
|
|
// Tabella movimenti_bancari (solo se non esiste)
|
|
if (!Schema::hasTable('movimenti_bancari')) {
|
|
Schema::create('movimenti_bancari', function (Blueprint $table) {
|
|
$table->id();
|
|
$table->unsignedBigInteger('banca_id');
|
|
$table->unsignedBigInteger('movimento_contabile_id')->nullable();
|
|
$table->date('data_valuta');
|
|
$table->date('data_contabile');
|
|
$table->enum('tipo_movimento', ['entrata', 'uscita']);
|
|
$table->decimal('importo', 10, 2);
|
|
$table->text('causale');
|
|
$table->string('beneficiario')->nullable();
|
|
$table->string('ordinante')->nullable();
|
|
$table->string('cro_tro', 50)->nullable();
|
|
$table->enum('stato_riconciliazione', ['da_riconciliare', 'riconciliato', 'sospeso'])->default('da_riconciliare');
|
|
$table->text('note')->nullable();
|
|
$table->timestamps();
|
|
|
|
$table->foreign('banca_id')->references('id')->on('banche')->onDelete('cascade');
|
|
$table->foreign('movimento_contabile_id')->references('id')->on('movimenti_contabili')->onDelete('set null');
|
|
|
|
$table->index(['banca_id', 'data_valuta']);
|
|
$table->index('stato_riconciliazione');
|
|
});
|
|
}
|
|
|
|
// Tabella rate (solo se non esiste)
|
|
if (!Schema::hasTable('rate')) {
|
|
Schema::create('rate', function (Blueprint $table) {
|
|
$table->id();
|
|
$table->unsignedBigInteger('gestione_id');
|
|
$table->unsignedBigInteger('unita_immobiliare_id');
|
|
$table->unsignedBigInteger('soggetto_id');
|
|
$table->integer('numero_rata');
|
|
$table->string('descrizione');
|
|
$table->decimal('importo', 10, 2);
|
|
$table->date('data_scadenza');
|
|
$table->date('data_pagamento')->nullable();
|
|
$table->decimal('importo_pagato', 10, 2)->default(0);
|
|
$table->enum('stato', ['da_pagare', 'pagata', 'parziale', 'insoluta'])->default('da_pagare');
|
|
$table->enum('tipo_rata', ['ordinaria', 'riscaldamento', 'straordinaria', 'conguaglio'])->default('ordinaria');
|
|
$table->text('note')->nullable();
|
|
$table->timestamps();
|
|
|
|
$table->foreign('gestione_id')->references('id_gestione')->on('gestioni')->onDelete('cascade');
|
|
$table->foreign('unita_immobiliare_id')->references('id_unita')->on('unita_immobiliari')->onDelete('cascade');
|
|
$table->foreign('soggetto_id')->references('id_soggetto')->on('soggetti')->onDelete('cascade');
|
|
|
|
$table->index(['gestione_id', 'data_scadenza']);
|
|
$table->index(['unita_immobiliare_id', 'stato']);
|
|
});
|
|
}
|
|
}
|
|
|
|
public function down(): void
|
|
{
|
|
Schema::dropIfExists('rate');
|
|
Schema::dropIfExists('movimenti_bancari');
|
|
Schema::dropIfExists('banche');
|
|
Schema::dropIfExists('dettagli_movimenti');
|
|
Schema::dropIfExists('movimenti_contabili');
|
|
Schema::dropIfExists('documenti');
|
|
Schema::dropIfExists('dettagli_tabelle_millesimali');
|
|
Schema::dropIfExists('tabelle_millesimali');
|
|
Schema::dropIfExists('voci_spesa');
|
|
Schema::dropIfExists('gestioni');
|
|
}
|
|
}; |