'date', 'data_scadenza' => 'date', 'data_pagamento' => 'date', 'importo_ordinario' => 'decimal:2', 'importo_straordinario' => 'decimal:2', 'importo_riscaldamento' => 'decimal:2', 'importo_totale' => 'decimal:2', 'importo_pagato' => 'decimal:2' ]; const STATO_EMESSA = 'emessa'; const STATO_PAGATA = 'pagata'; const STATO_PARZIALE = 'parziale'; const STATO_SCADUTA = 'scaduta'; const TIPO_ORDINARIA = 'ordinaria'; const TIPO_STRAORDINARIA = 'straordinaria'; const TIPO_RISCALDAMENTO = 'riscaldamento'; const TIPO_MISTA = 'mista'; public function amministratore(): BelongsTo { return $this->belongsTo(Administrator::class); } public function annoGestione(): BelongsTo { return $this->belongsTo(AnnoGestione::class); } public function stabile(): BelongsTo { return $this->belongsTo(StabileGescon::class); } public function condomino(): BelongsTo { return $this->belongsTo(CondominoStabile::class); } public function incassi() { return $this->hasMany(IncassoPagamento::class, 'rata_id'); } public function scopePagate($query) { return $query->where('stato_pagamento', self::STATO_PAGATA); } public function scopeScadute($query) { return $query->where('data_scadenza', '<', now()) ->whereIn('stato_pagamento', [self::STATO_EMESSA, self::STATO_PARZIALE]); } public function scopeByTipo($query, $tipo) { return $query->where('tipo_rata', $tipo); } public function scopeByAnno($query, $anno) { return $query->whereHas('annoGestione', function ($q) use ($anno) { $q->where('anno_ordinario', $anno); }); } public function getImportoResiduoAttribute() { return $this->importo_totale - $this->importo_pagato; } public function getIsScadutaAttribute() { return $this->data_scadenza < now() && in_array($this->stato_pagamento, [self::STATO_EMESSA, self::STATO_PARZIALE]); } public function getGiorniRitardoAttribute() { if (!$this->is_scaduta) { return 0; } return now()->diffInDays($this->data_scadenza); } }