varie modifiche nella gestione affitti

This commit is contained in:
Amministratore 2025-10-03 15:47:17 +02:00
parent ed47d85375
commit 56539e8d38
10 changed files with 327 additions and 8 deletions

View File

@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use App\Models\CotrattiAffitti; use App\Models\CotrattiAffitti;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Barryvdh\DomPDF\Facade\Pdf;
class CotrattiAffittiController extends Controller class CotrattiAffittiController extends Controller
{ {
@ -35,6 +36,21 @@ class CotrattiAffittiController extends Controller
public function store(Request $request) public function store(Request $request)
{ {
// //
$data = $request->validate([
'immobile_id' => 'required|exists:immobilis,id',
'tipo_contratto_id' => 'required|exists:tipo_contrattos,id',
'data_inizio' => 'nullable|date',
'data_fine' => 'nullable|date',
'tacito_rinnovo' => 'nullable|boolean',
'canone_mensile' => 'nullable|string|max:255',
'deposito_cauzionale' => 'nullable|string|max:255',
'spese_condominiali' => 'nullable|string|max:255',
'iva' => 'nullable|string|max:255',
'registrazione' => 'nullable|string|max:255',
'note' => 'nullable|string|max:1000',
]);
CotrattiAffitti::create($data);
return redirect()->route('contratti_affitti');
} }
/** /**
@ -68,4 +84,12 @@ class CotrattiAffittiController extends Controller
{ {
// //
} }
public function renderPdf(CotrattiAffitti $cotrattiAffitti)
{
//
$contratto=CotrattiAffitti::find($cotrattiAffitti->id);
$pdf = PDF::loadView('affitti.contratti.pdf', compact('contratto'));
return $pdf->download('contratto.pdf');
}
} }

View File

@ -12,7 +12,8 @@ class TipoContrattoController extends Controller
*/ */
public function index() public function index()
{ {
// // Tipo di contratto non ha una vista di indice definita
return view('tipo_contrattos.index');
} }
/** /**
@ -21,6 +22,7 @@ class TipoContrattoController extends Controller
public function create() public function create()
{ {
// //
return view('tipo_contrattos.create');
} }
/** /**

View File

@ -7,6 +7,7 @@
"license": "MIT", "license": "MIT",
"require": { "require": {
"php": "^8.2", "php": "^8.2",
"barryvdh/laravel-dompdf": "^3.1",
"dompdf/dompdf": "^3.1", "dompdf/dompdf": "^3.1",
"jeroennoten/laravel-adminlte": "*", "jeroennoten/laravel-adminlte": "*",
"laravel/framework": "^12.0", "laravel/framework": "^12.0",

83
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "ddebac8f1beada895d0d5ce36fc77d5a", "content-hash": "b9191d246ae95843fd5b0ec2a810cfc7",
"packages": [ "packages": [
{ {
"name": "almasaeed2010/adminlte", "name": "almasaeed2010/adminlte",
@ -49,6 +49,83 @@
}, },
"time": "2022-02-07T20:33:09+00:00" "time": "2022-02-07T20:33:09+00:00"
}, },
{
"name": "barryvdh/laravel-dompdf",
"version": "v3.1.1",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-dompdf.git",
"reference": "8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d",
"reference": "8e71b99fc53bb8eb77f316c3c452dd74ab7cb25d",
"shasum": ""
},
"require": {
"dompdf/dompdf": "^3.0",
"illuminate/support": "^9|^10|^11|^12",
"php": "^8.1"
},
"require-dev": {
"larastan/larastan": "^2.7|^3.0",
"orchestra/testbench": "^7|^8|^9|^10",
"phpro/grumphp": "^2.5",
"squizlabs/php_codesniffer": "^3.5"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"PDF": "Barryvdh\\DomPDF\\Facade\\Pdf",
"Pdf": "Barryvdh\\DomPDF\\Facade\\Pdf"
},
"providers": [
"Barryvdh\\DomPDF\\ServiceProvider"
]
},
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"psr-4": {
"Barryvdh\\DomPDF\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Barry vd. Heuvel",
"email": "barryvdh@gmail.com"
}
],
"description": "A DOMPDF Wrapper for Laravel",
"keywords": [
"dompdf",
"laravel",
"pdf"
],
"support": {
"issues": "https://github.com/barryvdh/laravel-dompdf/issues",
"source": "https://github.com/barryvdh/laravel-dompdf/tree/v3.1.1"
},
"funding": [
{
"url": "https://fruitcake.nl",
"type": "custom"
},
{
"url": "https://github.com/barryvdh",
"type": "github"
}
],
"time": "2025-02-13T15:07:54+00:00"
},
{ {
"name": "brick/math", "name": "brick/math",
"version": "0.13.1", "version": "0.13.1",
@ -9263,12 +9340,12 @@
], ],
"aliases": [], "aliases": [],
"minimum-stability": "stable", "minimum-stability": "stable",
"stability-flags": {}, "stability-flags": [],
"prefer-stable": true, "prefer-stable": true,
"prefer-lowest": false, "prefer-lowest": false,
"platform": { "platform": {
"php": "^8.2" "php": "^8.2"
}, },
"platform-dev": {}, "platform-dev": [],
"plugin-api-version": "2.6.0" "plugin-api-version": "2.6.0"
} }

View File

@ -14,7 +14,9 @@ return new class extends Migration
Schema::create('immobilis', function (Blueprint $table) { Schema::create('immobilis', function (Blueprint $table) {
$table->id(); $table->id();
$table->timestamps(); $table->timestamps();
$table->string('nome')->unique();
$table->string('indirizzo')->nullable(); $table->string('indirizzo')->nullable();
$table->string('civico')->nullable();
$table->string('citta')->nullable(); $table->string('citta')->nullable();
$table->string('cap')->nullable(); $table->string('cap')->nullable();
$table->string('provincia')->nullable(); $table->string('provincia')->nullable();
@ -46,6 +48,11 @@ return new class extends Migration
$table->string('note')->nullable(); $table->string('note')->nullable();
$table->string('fibra-ottica')->nullable(); $table->string('fibra-ottica')->nullable();
$table->string('internet')->nullable(); $table->string('internet')->nullable();
$table->string('catasto_n')->nullable();
$table->string('cat_foglio')->nullable();
$table->string('cat_particella')->nullable();
$table->string('cat_sub')->nullable();
$table->string('cat_cat')->nullable();
}); });
} }

View File

@ -14,6 +14,9 @@ return new class extends Migration
Schema::create('tipo_contrattos', function (Blueprint $table) { Schema::create('tipo_contrattos', function (Blueprint $table) {
$table->id(); $table->id();
$table->timestamps(); $table->timestamps();
$table->string('nome')->nullable();
$table->string('descrizione')->nullable();
$table->longText('template')->nullable();
}); });
} }

View File

@ -12,6 +12,12 @@ return new class extends Migration
public function up(): void public function up(): void
{ {
// //
Schema::create('cotratto_inquilino', function (Blueprint $table) {
$table->id();
$table->timestamps();
$table->foreignId('contratto_id');
$table->foreignId('inquilino_id');
});
} }
/** /**
@ -20,5 +26,6 @@ return new class extends Migration
public function down(): void public function down(): void
{ {
// //
Schema::dropIfExists('cotratto_inquilino');
} }
}; };

View File

@ -0,0 +1,128 @@
<div class="row"> <div class="col">CONTRATTO DI LOCAZIONE AD USO ABITATIVO
A CANONE CONCORDATO O CONVENZIONATO</div></div>
<div class="row"> <div class="col">Il sig. {{ $proprietario->cognome }} {{ $proprietario->nome }}, nato a {{ $proprietario->nato_a }} il {{ $proprietario->nato_il }} (codice fiscale {{ $proprietario->codice_fiscale}}), residente in {{ $proprietario->residente_in}} via {{ $proprietario->res_indirizzo }} n. {{ $proprietario->res_civico }}, di seguito denominato locatore,
</div></div>
<div class="row"> <div class="col">CONCEDE IN LOCAZIONE</div></div>
@foreach($inquilini as $inquilino)<div class="row"> <div class="col">
al sig. {{ $inquilino->cognome }} {{ $inquilino->nome }}, nato a {{ $inquilino->nato_a }} il {{ $inquilino->nato_il }} (codice fiscale {{ $inquilino->codice_fiscale }}), residente in {{ $inquilino->residente_in }}, via {{ $inquilino->res_indirizzo }} n. {{ $inquilino->res_civico}},
</div>
</div>
@endforeach
<div class="row"> <div class="col">di seguito denominato/i conduttore, che accetta, l'unità immobiliare sita nel Comune di {{ $immobile->citta }} alla via {{ $immobile->indirizzo }} n. {{ $immobile->civico}}, piano {{ $immobile->piano }}, distinta al catasto al n. {{ $immobile->catasto_n }}, di proprietà esclusiva del locatore.
</div></div>
<div class="row"> <div class="col">A seguito di quanto sopra premesso, che costituisce parte integrante e sostanziale del presente contratto, le parti convengono e stipulano quanto segue:
</div></div>
<div class="row"> <div class="col">1. Oggetto
</div></div>
<div class="row"> <div class="col">Il Sig. {{ $proprietario->cognome }} {{ $proprietario->nome }} concede in locazione ad uso di civile abitazione al Sig. @foreach($inquilini as $inquilino) {{ $inquilino->cognome }} {{ $inquilino->nome }}, che accetta/no, limmobile sito al piano {{ $immobile->piano }}. del fabbricato in {{ $immobile->citta }}. via {{ $immobile->indirizzo }}. n. {{ $immobile->civico }}, di mq {{ $immobile->mq }}, composto di n. {{ $immobile->vani }} vani, distinto al Catasto Fabbricati al Foglio {{ $immobile->cat_foglio }}, Particella {{ $immobile->cat_particella }}, Sub. {{ $immobile->cat_sub }}, Cat. {{ $immobile->cat_cat }}.
</div></div>
<div class="row"> <div class="col">2. Durata e rinnovo
</div></div>
<div class="row"> <div class="col">Il contratto è stipulato per la durata di anni 3 (tre) dal {{ $contratto->data_inizio }} al {{ $contratto->data_fine }} e si intenderà rinnovato automaticamente alle medesime condizioni contrattuali per ulteriori 2 (due) anni, salvo che le parti concordino il rinnovo per ulteriori 3 (tre) anni a nuove condizioni contrattuali, ovvero, salvo espressa rinuncia di una delle parti al rinnovo contrattuale da comunicarsi allaltra parte almeno 6 (sei) mesi prima della scadenza tramite lettera raccomandata.
</div></div>
<div class="row"> <div class="col">3. Canone di locazione e modalità di pagamento
</div></div>
<div class="row"> <div class="col">Il canone di locazione è calcolato sulla base dei parametri stabiliti nellaccordo dellAssociazione1 . ed è fissato in ... (...) mensili.
</div></div>
<div class="row"> <div class="col">Il canone dovrà essere corrisposto entro il {{ $contratto->giorno }} di ciascun mese, a mezzo {{ $contratto->pagamento_mezzo }}.
</div></div>
<div class="row"> <div class="col">4. Cedolare secca
</div></div>
<div class="row"> <div class="col">In forza dell'articolo 3 del D.Lgs 14/03/2011 n. 23, per la durata del presente contratto e salvo revoca scritta che si riserva di esercitare in qualsiasi momento, il locatore dichiara di esercitare l'opzione per il sistema denominato "cedolare secca", restando pertanto esonerato dall'obbligo di inviare al conduttore la prevista comunicazione mediante lettera raccomandata.
</div></div>
<div class="row"> <div class="col">Negli anni di decorrenza del contratto, inoltre, il locatore rinuncia espressamente all'applicazione degli aggiornamenti del canone di cui sopra, inclusa la variazione accertata dallISTAT.
</div></div>
<div class="row"> <div class="col">5. Inadempimento del conduttore
</div></div>
<div class="row"> <div class="col">Il mancato puntuale pagamento del canone, ovvero, il mancato puntuale pagamento degli oneri accessori, oltre venti giorni dalla data di scadenza, quando limporto non pagato supera quello di . mensilità del canone, costituirà motivo di risoluzione del contratto.
</div></div>
<div class="row"> <div class="col">6. Sublocazione
</div></div>
<div class="row"> <div class="col">E fatto divieto al conduttore di sublocare o concedere in comodato o consentire a terzi luso sotto qualsiasi forma contrattuale, in tutto o in parte, dellimmobile locato, pena la risoluzione del contratto.
</div></div>
<div class="row"> <div class="col">7. Consegna e stato dellimmobile locato
</div></div>
<div class="row"> <div class="col">Il conduttore dichiara di aver visitato limmobile oggetto del presente contratto e di averlo trovato in buono stato e adatto alluso convenuto.
</div></div>
<div class="row"> <div class="col">Il conduttore si impegna a riconsegnare lunità immobiliare locata nello stato medesimo in cui lha ricevuta salvo il deperimento duso, pena il risarcimento del danno.
</div></div>
<div class="row"> <div class="col">A tal fine, si allega verbale di constatazione delle condizioni dellimmobile e di inventario che costituiscono parte integrante del presente contratto (all. Modello n. _____ e n. ______).
</div></div>
<div class="row"> <div class="col">8. Facoltà di accesso
</div></div>
<div class="row"> <div class="col">Il locatore ha facoltà di accedere allimmobile locato per giustificati motivi.
</div></div>
<div class="row"> <div class="col">Salvo espressa dispensa fornita dal conduttore, laccesso dovrà avvenire alla presenza di costui o di persona da esso delegata.
</div></div>
<div class="row"> <div class="col">Escluso il caso in cui sia indispensabile laccesso immediato, al conduttore dovrà essere fornito un preavviso di almeno 3 giorni.
</div></div>
<div class="row"> <div class="col">9. Attestazione di prestazione energetica
</div></div>
<div class="row"> <div class="col">Il conduttore atto di aver ricevuto le informazioni e la documentazione in ordine alla certificazione energetica dell'unità immobiliare in questione, eseguita da .... in data .... in conformità a quanto disposto dal D. Lgs. 3 marzo 2011, n. 28 art. 13.
</div></div>
<div class="row"> <div class="col">10. Rapporti di vicinato (nel caso di condominio)
</div></div>
<div class="row"> <div class="col">Il conduttore si impegna a rispettare le norme del regolamento condominiale dello stabile che dichiara di ben conoscere, e ad osservare ogni altra norma legittimamente emanata.
</div></div>
<div class="row"> <div class="col">È in ogni caso vietato al conduttore compiere atti e/o tenere comportamenti che possano recare molestia agli altri abitanti dello stabile.
</div></div>
<div class="row"> <div class="col">11. Modifiche o innovazioni
</div></div>
<div class="row"> <div class="col">Il conduttore non potrà apportare alcuna modifica, innovazione, miglioria o addizione ai locali locati ed alla loro destinazione, o agli impianti esistenti, senza il preventivo consenso scritto del Locatore.
</div></div>
<div class="row"> <div class="col">12. Deposito cauzionale
</div></div>
<div class="row"> <div class="col">A garanzia delle obbligazioni tutte che assume con il presente contratto, il conduttore rilascia al locatore la somma di . (), pari a 3 (tre) mensilità del canone, non imputabile in conto pigioni.
</div></div>
<div class="row"> <div class="col">Il deposito cauzionale come sopra costituito sarà restituito al termine della locazione, previa verifica dello stato dellunità immobiliare e dellosservanza di ogni obbligazione contrattuale.
</div></div>
<div class="row"> <div class="col">13. Oneri delle parti
</div></div>
<div class="row"> <div class="col">Le spese di ordinaria amministrazione, incluse le spese condominiali, sono integralmente a carico del conduttore, restando a carico del locatore le spese di straordinaria amministrazione.
</div></div>
<div class="row"> <div class="col">Lopzione di cui allart. 4 (Cedolare secca) comporta il venir meno dellobbligo di versamento delle imposte di registro e di bollo relative al presente contratto, comprese quelle dovute sulla risoluzione e sulle proroghe del contratto stesso.
</div></div>
<div class="row"> <div class="col">14. Variazioni condizioni contrattuali
</div></div>
<div class="row"> <div class="col">Il presente contratto potrà essere modificato soltanto mediante atto scritto.
</div></div>
<div class="row"> <div class="col">15. Autorizzazione al trattamento dei dati personali
</div></div>
<div class="row"> <div class="col">Il locatore ed il conduttore si autorizzano reciprocamente a comunicare a terzi i propri dati personali in relazione ad adempimenti connessi col rapporto di locazione, ai sensi del D. Lgs. n. 196/2003.
</div></div>
<div class="row"> <div class="col"> 16. Commissione di Conciliazione
</div></div>
<div class="row"> <div class="col">Per ogni controversia che sorga in merito all'interpretazione ed esecuzione del presente contratto ciascuna parte può richiedere, prima di adire l'Autorità giudiziaria, che si pronunci una Commissione di conciliazione stragiudiziale che deve decidere non oltre sessanta giorni dalla data della richiesta.
</div></div>
<div class="row"> <div class="col">La Commissione di conciliazione, di cui allarticolo 6 del decreto del Ministro delle infrastrutture e dei trasporti di concerto con il Ministro delleconomia e delle finanze, emanato ai sensi dellarticolo 4, comma 2, della legge 431/98, è composta al massimo da tre membri di cui due scelti fra appartenenti alle rispettive organizzazioni firmatarie dell'Accordo territoriale sulla base delle designazioni, rispettivamente, del locatore e del conduttore ed un terzo - che svolge funzioni di presidente - sulla base della scelta operata dai due componenti come sopra designati qualora gli stessi ritengano di nominarlo.
</div></div>
<div class="row"> <div class="col">La richiesta di intervento della Commissione non determina la sospensione delle obbligazioni contrattuali.
</div></div>
<div class="row"> <div class="col">Per quanto non previsto dal presente contratto le parti fanno espresso rinvio alle disposizioni del codice civile, alle norme vigenti ed agli usi locali.
</div></div>
<div class="row"><div class="col">Luogo e data</div></div>
<div class="row">
<div class="col">Il locatore</div>
<div class="col">Il conduttore</div>
</div>

View File

@ -0,0 +1,70 @@
@extends('adminlte::page')
@section('title', 'Crea Contratti')
@section('content_header')
<h1>Crea Contratto di Locazione</h1>
@stop
@section('content')
<div class="container">
@if ($errors->any())
<div class="alert alert-danger" dismissible>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form method="POST" action="{{ route('contratti_affitti.store') }}">
@csrf
<div class="form-group">
<label for="immobile_id">Immobile</label>
<select name="immobile_id" id="immobile_id" class="form-control">
@foreach($immobili as $immobile)
<option value="{{ $immobile->id }}">{{ $immobile->indirizzo }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label for="tipo_contratto_id">Tipo Contratto</label>
<input type="number" name="tipo_contratto_id" id="tipo_contratto_id" class="form-control">
</div>
<div class="form-group">
<label for="data_inizio">Data Inizio</label>
<input type="date" name="data_inizio" id="data_inizio" class="form-control">
</div>
<div class="form-group">
<label for="data_fine">Data Fine</label>
<input type="date" name="data_fine" id="data_fine" class="form-control">
</div>
<div class="form-group">
<label for="tacito_rinnovo">Tacito Rinnovo</label>
<input type="number" name="tacito_rinnovo" id="tacito_rinnovo" class="form-control" min="0" max="1">
</div>
<div class="form-group">
<label for="canone_mensile">Canone Mensile</label>
<input type="text" name="canone_mensile" id="canone_mensile" class="form-control">
</div>
<div class="form-group">
<label for="deposito_cauzionale">Deposito Cauzionale</label>
<input type="text" name="deposito_cauzionale" id="deposito_cauzionale" class="form-control">
</div>
<div class="form-group">
<label for="spese_condominiali">Spese Condominiali</label>
<input type="text" name="spese_condominiali" id="spese_condominiali" class="form-control">
</div>
<div class="form-group">
<label for="iva">IVA</label>
<input type="text" name="iva" id="iva" class="form-control">
</div>
<div class="form-group">
<label for="registrazione">Registrazione</label>
<input type="text" name="registrazione" id="registrazione" class="form-control">
</div>
<div class="form-group">
<label for="note">Note</label>
<input type="text" name="note" id="note" class="form-control">
</div>
<button type="submit" class="btn btn-primary">Salva</button>
</form>
</div>
@stop

View File

@ -7,7 +7,7 @@
@section('content') @section('content')
<div class="container"> <div class="container">
<a href="{{ route('contratti.create') }}" class="btn btn-primary mb-3">Crea Nuovo Contratto</a> <a href="{{ route('contratti_affitti.create') }}" class="btn btn-primary mb-3">Crea Nuovo Contratto</a>
<table class="table table-bordered"> <table class="table table-bordered">
<thead> <thead>
<tr> <tr>
@ -30,9 +30,9 @@
<td>{{ $contratto->data_inizio }}</td> <td>{{ $contratto->data_inizio }}</td>
<td>{{ $contratto->data_fine }}</td> <td>{{ $contratto->data_fine }}</td>
<td> <td>
<a href="{{ route('contratti.show', $contratto->id) }}" class="btn btn-info btn-sm">Visualizza</a> <a href="{{ route('contratti_affitti.show', $contratto->id) }}" class="btn btn-info btn-sm">Visualizza</a>
<a href="{{ route('contratti.edit', $contratto->id) }}" class="btn btn-warning btn-sm">Modifica</a> <a href="{{ route('contratti_affitti.edit', $contratto->id) }}" class="btn btn-warning btn-sm">Modifica</a>
<form action="{{ route('contratti.destroy', $contratto->id) }}" method="POST" style="display:inline;"> <form action="{{ route('contratti_affitti.destroy', $contratto->id) }}" method="POST" style="display:inline;">
@csrf @csrf
@method('DELETE') @method('DELETE')
<button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('Sei sicuro di voler eliminare questo contratto?')">Elimina</button> <button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('Sei sicuro di voler eliminare questo contratto?')">Elimina</button>