netgescon-master/netgescon-laravel/app/Models/ComposizioneUnita.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');
}
}