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'); } };