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