netgescon-master/_BACKUP_OLD_netgescon-laravel_INACTIVE/app/Models/Preventivo.php

156 lines
3.8 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Preventivo extends Model
{
use HasFactory, SoftDeletes;
protected $fillable = [
'stabile_id',
'anno_gestione',
'tipo_gestione',
'descrizione',
'stato',
'importo_totale',
'data_creazione',
'data_approvazione',
'approvato_da_user_id',
'note',
'versione',
];
protected $casts = [
'data_creazione' => 'date',
'data_approvazione' => 'date',
'importo_totale' => 'decimal:2',
'versione' => 'integer',
'created_at' => 'datetime',
'updated_at' => 'datetime',
'deleted_at' => 'datetime',
];
/**
* Relazione con Stabile
*/
public function stabile()
{
return $this->belongsTo(Stabile::class, 'stabile_id', 'id');
}
/**
* Relazione con Voci Preventivo
*/
public function voci()
{
return $this->hasMany(VocePreventivo::class, 'preventivo_id');
}
/**
* Relazione con Rate
*/
public function rate()
{
return $this->hasMany(Rata::class, 'preventivo_id');
}
/**
* Relazione con User che ha approvato
*/
public function approvatoDa()
{
return $this->belongsTo(User::class, 'approvato_da_user_id');
}
/**
* Relazione con Log Modifiche
*/
public function logModifiche()
{
return $this->morphMany(LogModificaPreventivo::class, 'entita');
}
/**
* Scope per stato
*/
public function scopeStato($query, $stato)
{
return $query->where('stato', $stato);
}
/**
* Scope per tipo gestione
*/
public function scopeTipoGestione($query, $tipo)
{
return $query->where('tipo_gestione', $tipo);
}
/**
* Calcola importo totale dalle voci
*/
public function calcolaImportoTotale()
{
$this->importo_totale = $this->voci()->sum('importo_preventivato');
$this->save();
return $this->importo_totale;
}
/**
* Crea nuova versione del preventivo
*/
public function creaVersione($motivo, $userId)
{
$nuovaVersione = $this->versione + 1;
// Log della modifica
LogModificaPreventivo::create([
'entita' => 'preventivo',
'entita_id' => $this->id,
'versione_precedente' => $this->versione,
'versione_nuova' => $nuovaVersione,
'utente_id' => $userId,
'tipo_operazione' => 'update',
'motivo' => $motivo,
'dati_precedenti' => $this->getOriginal(),
'dati_nuovi' => $this->getAttributes(),
]);
$this->versione = $nuovaVersione;
$this->save();
return $this;
}
/**
* Genera rate dal preventivo
*/
public function generaRate($numeroRate, $dataInizio, $userId)
{
$importoPerRata = $this->importo_totale / $numeroRate;
$rate = [];
for ($i = 1; $i <= $numeroRate; $i++) {
$dataScadenza = $dataInizio->copy()->addMonths($i - 1);
$numeroRata = $this->stabile_id . '/' . $this->anno_gestione . '/' . str_pad($i, 3, '0', STR_PAD_LEFT);
$rata = Rata::create([
'preventivo_id' => $this->id,
'numero_rata' => $numeroRata,
'descrizione' => "Rata {$i} di {$numeroRate} - {$this->descrizione}",
'data_scadenza' => $dataScadenza,
'stato' => 'emessa',
'importo_totale' => $importoPerRata,
'creato_da_user_id' => $userId,
]);
$rate[] = $rata;
}
return $rate;
}
}