180 lines
5.0 KiB
PHP
180 lines
5.0 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
|
|
class ComposizioneUnita extends Model
|
|
{
|
|
protected $table = 'composizione_unita';
|
|
|
|
protected $fillable = [
|
|
'unita_originale_id',
|
|
'unita_risultante_id',
|
|
'tipo_operazione',
|
|
'data_operazione',
|
|
'superficie_trasferita',
|
|
'millesimi_trasferiti',
|
|
'vani_trasferiti',
|
|
'millesimi_automatici',
|
|
'coefficiente_ripartizione',
|
|
'numero_pratica',
|
|
'riferimento_catastale',
|
|
'note_variazione',
|
|
'stato_pratica',
|
|
'data_approvazione',
|
|
'created_by'
|
|
];
|
|
|
|
protected $casts = [
|
|
'data_operazione' => 'date',
|
|
'data_approvazione' => 'date',
|
|
'superficie_trasferita' => 'decimal:2',
|
|
'millesimi_trasferiti' => 'decimal:4',
|
|
'millesimi_automatici' => 'boolean',
|
|
'coefficiente_ripartizione' => 'decimal:4'
|
|
];
|
|
|
|
// === RELAZIONI ===
|
|
|
|
public function unitaOriginale(): BelongsTo
|
|
{
|
|
return $this->belongsTo(UnitaImmobiliare::class, 'unita_originale_id');
|
|
}
|
|
|
|
public function unitaRisultante(): BelongsTo
|
|
{
|
|
return $this->belongsTo(UnitaImmobiliare::class, 'unita_risultante_id');
|
|
}
|
|
|
|
public function createdBy(): BelongsTo
|
|
{
|
|
return $this->belongsTo(User::class, 'created_by');
|
|
}
|
|
|
|
// === METODI UTILITÀ ===
|
|
|
|
public function getStatoBadgeColor(): string
|
|
{
|
|
return match($this->stato_pratica) {
|
|
'in_corso' => 'warning',
|
|
'approvata' => 'info',
|
|
'completata' => 'success',
|
|
'respinta' => 'danger',
|
|
default => 'secondary'
|
|
};
|
|
}
|
|
|
|
public function getTipoOperazioneIcon(): string
|
|
{
|
|
return match($this->tipo_operazione) {
|
|
'unione' => 'fas fa-compress-arrows-alt',
|
|
'divisione' => 'fas fa-expand-arrows-alt',
|
|
'modifica' => 'fas fa-edit',
|
|
default => 'fas fa-puzzle-piece'
|
|
};
|
|
}
|
|
|
|
public function getTipoOperazioneBadgeColor(): string
|
|
{
|
|
return match($this->tipo_operazione) {
|
|
'unione' => 'primary',
|
|
'divisione' => 'info',
|
|
'modifica' => 'warning',
|
|
default => 'secondary'
|
|
};
|
|
}
|
|
|
|
public function isNuovaComposizione(): bool
|
|
{
|
|
return $this->unita_originale_id === null;
|
|
}
|
|
|
|
public function isPending(): bool
|
|
{
|
|
return in_array($this->stato_pratica, ['in_corso', 'approvata']);
|
|
}
|
|
|
|
public function isCompletata(): bool
|
|
{
|
|
return $this->stato_pratica === 'completata';
|
|
}
|
|
|
|
public function calcolaImpatto(): array
|
|
{
|
|
$impatto = [
|
|
'superficie_percentuale' => 0,
|
|
'millesimi_percentuale' => 0,
|
|
'vani_percentuale' => 0
|
|
];
|
|
|
|
if ($this->unitaRisultante) {
|
|
$superficieTotale = $this->unitaRisultante->superficie_commerciale;
|
|
$millesimiTotali = $this->unitaRisultante->millesimi_proprieta;
|
|
$vaniTotali = $this->unitaRisultante->numero_vani;
|
|
|
|
if ($superficieTotale > 0 && $this->superficie_trasferita) {
|
|
$impatto['superficie_percentuale'] = round(($this->superficie_trasferita / $superficieTotale) * 100, 2);
|
|
}
|
|
|
|
if ($millesimiTotali > 0 && $this->millesimi_trasferiti) {
|
|
$impatto['millesimi_percentuale'] = round(($this->millesimi_trasferiti / $millesimiTotali) * 100, 2);
|
|
}
|
|
|
|
if ($vaniTotali > 0 && $this->vani_trasferiti) {
|
|
$impatto['vani_percentuale'] = round(($this->vani_trasferiti / $vaniTotali) * 100, 2);
|
|
}
|
|
}
|
|
|
|
return $impatto;
|
|
}
|
|
|
|
public function calcolaCostiOperazione(): array
|
|
{
|
|
$costiBase = [
|
|
'unione' => 500,
|
|
'divisione' => 800,
|
|
'modifica' => 300
|
|
];
|
|
|
|
$costoBase = $costiBase[$this->tipo_operazione] ?? 400;
|
|
$costoSuperficie = ($this->superficie_trasferita ?? 0) * 5; // €5 per m²
|
|
$costoVani = ($this->vani_trasferiti ?? 0) * 100; // €100 per vano
|
|
|
|
return [
|
|
'costo_base' => $costoBase,
|
|
'costo_superficie' => $costoSuperficie,
|
|
'costo_vani' => $costoVani,
|
|
'costo_totale_stimato' => $costoBase + $costoSuperficie + $costoVani
|
|
];
|
|
}
|
|
|
|
// === SCOPES ===
|
|
|
|
public function scopePending($query)
|
|
{
|
|
return $query->whereIn('stato_pratica', ['in_corso', 'approvata']);
|
|
}
|
|
|
|
public function scopeCompletate($query)
|
|
{
|
|
return $query->where('stato_pratica', 'completata');
|
|
}
|
|
|
|
public function scopePerTipo($query, string $tipo)
|
|
{
|
|
return $query->where('tipo_operazione', $tipo);
|
|
}
|
|
|
|
public function scopeDelPeriodo($query, $dataInizio, $dataFine)
|
|
{
|
|
return $query->whereBetween('data_operazione', [$dataInizio, $dataFine]);
|
|
}
|
|
|
|
public function scopeNuoveComposizioni($query)
|
|
{
|
|
return $query->whereNull('unita_originale_id');
|
|
}
|
|
}
|