netgescon-day0/app/Models/DestinatarioComunicazione.php

148 lines
3.9 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class DestinatarioComunicazione extends Model
{
use HasFactory;
protected $table = 'destinatari_comunicazioni';
protected $fillable = [
'amministratore_id',
'assemblea_id',
'condomino_id',
'tipo_comunicazione',
'data_invio',
'modalita_invio',
'indirizzo_destinatario',
'email_destinatario',
'pec_destinatario',
'stato_consegna',
'data_consegna',
'ricevuta_ritorno',
'note'
];
protected $casts = [
'data_invio' => 'date',
'data_consegna' => 'date',
'ricevuta_ritorno' => 'boolean'
];
const TIPO_CONVOCAZIONE = 'convocazione';
const TIPO_VERBALE = 'verbale';
const TIPO_COMUNICAZIONE = 'comunicazione';
const TIPO_SOLLECITO = 'sollecito';
const TIPO_AVVISO = 'avviso';
const MODALITA_POSTA = 'posta';
const MODALITA_EMAIL = 'email';
const MODALITA_PEC = 'pec';
const MODALITA_RACCOMANDATA = 'raccomandata';
const MODALITA_MANO = 'mano';
const STATO_INVIATO = 'inviato';
const STATO_CONSEGNATO = 'consegnato';
const STATO_NON_CONSEGNATO = 'non_consegnato';
const STATO_RIFIUTATO = 'rifiutato';
public function amministratore(): BelongsTo
{
return $this->belongsTo(Administrator::class);
}
public function assemblea(): BelongsTo
{
return $this->belongsTo(AssembleaVerbale::class);
}
public function condomino(): BelongsTo
{
return $this->belongsTo(CondominoStabile::class);
}
public function scopeByTipo($query, $tipo)
{
return $query->where('tipo_comunicazione', $tipo);
}
public function scopeByModalita($query, $modalita)
{
return $query->where('modalita_invio', $modalita);
}
public function scopeByStato($query, $stato)
{
return $query->where('stato_consegna', $stato);
}
public function scopeConsegnate($query)
{
return $query->where('stato_consegna', self::STATO_CONSEGNATO);
}
public function scopeNonConsegnate($query)
{
return $query->whereIn('stato_consegna', [
self::STATO_NON_CONSEGNATO,
self::STATO_RIFIUTATO
]);
}
public function scopeByPeriodo($query, $dataInizio, $dataFine)
{
return $query->whereBetween('data_invio', [$dataInizio, $dataFine]);
}
public function getGiorniConsegnaAttribute()
{
if (!$this->data_consegna || !$this->data_invio) {
return null;
}
return $this->data_invio->diffInDays($this->data_consegna);
}
public function getTipoComunicazioneLabelAttribute()
{
$labels = [
self::TIPO_CONVOCAZIONE => 'Convocazione',
self::TIPO_VERBALE => 'Verbale',
self::TIPO_COMUNICAZIONE => 'Comunicazione',
self::TIPO_SOLLECITO => 'Sollecito',
self::TIPO_AVVISO => 'Avviso'
];
return $labels[$this->tipo_comunicazione] ?? $this->tipo_comunicazione;
}
public function getModalitaInvioLabelAttribute()
{
$labels = [
self::MODALITA_POSTA => 'Posta Ordinaria',
self::MODALITA_EMAIL => 'Email',
self::MODALITA_PEC => 'PEC',
self::MODALITA_RACCOMANDATA => 'Raccomandata',
self::MODALITA_MANO => 'Consegna a Mano'
];
return $labels[$this->modalita_invio] ?? $this->modalita_invio;
}
public function getStatoConsegnaLabelAttribute()
{
$labels = [
self::STATO_INVIATO => 'Inviato',
self::STATO_CONSEGNATO => 'Consegnato',
self::STATO_NON_CONSEGNATO => 'Non Consegnato',
self::STATO_RIFIUTATO => 'Rifiutato'
];
return $labels[$this->stato_consegna] ?? $this->stato_consegna;
}
}