File manager - Edit - /var/www/html/portalHomolog/app/Models/Demandas/Demanda.php
Back
<?php namespace App\Models\Demandas; use App\Enums\PrioridadeDemanda; use App\Enums\StatusDemanda; use App\Models\Structure; use App\Models\UnidadeOrganizacional; use App\Models\User; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Model; use App\Models\AtivosTi\Equipamento; use App\Models\AtivosTi\Licenca; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasOne; class Demanda extends Model { use HasUuids; protected $table = 'demandas'; public const TIPO = [ 'incidente' => 'Incidente', 'requisicao' => 'Requisição', 'problema' => 'Problema', 'melhoria' => 'Melhoria', 'help_desk' => 'Help Desk', ]; public const CANAL = [ 'portal' => 'Portal', 'telefone' => 'Telefone', 'email' => 'E-mail', 'presencial' => 'Presencial', 'sei' => 'SEI', 'interno' => 'Interno', ]; protected $fillable = [ 'numero', 'titulo', 'descricao', 'numero_sei', 'url_sei', 'status', 'prioridade', 'modulo', 'canal', 'structure_id', 'user_id', 'unidade_organizacional_id', 'data_abertura', 'data_fechamento', 'prazo', ]; protected $casts = [ 'data_abertura' => 'datetime', 'data_fechamento' => 'datetime', 'prazo' => 'date', ]; public function scopeTi(Builder $query): Builder { return $query->where('modulo', 'ti'); } public function scopeGeral(Builder $query): Builder { return $query->where('modulo', 'geral'); } public function tiDetalhe(): HasOne { return $this->hasOne(DemandaTiDetalhe::class, 'demanda_id'); } public function logs(): HasMany { return $this->hasMany(DemandaLog::class, 'demanda_id')->orderBy('created_at'); } public function subtarefas(): HasMany { return $this->hasMany(DemandaSubtarefa::class, 'demanda_id')->orderBy('ordem')->orderBy('id'); } public function anexos(): HasMany { return $this->hasMany(DemandaAnexo::class, 'demanda_id')->orderBy('created_at'); } public function solicitante(): BelongsTo { return $this->belongsTo(User::class, 'user_id'); } public function participantes(): BelongsToMany { return $this->belongsToMany(User::class, 'demanda_participantes', 'demanda_id', 'user_id') ->withTimestamps(); } public function secretaria(): BelongsTo { return $this->belongsTo(Structure::class, 'structure_id'); } public function unidade(): BelongsTo { return $this->belongsTo(UnidadeOrganizacional::class, 'unidade_organizacional_id'); } public function destinatarios(): HasMany { return $this->hasMany(DemandaDestinatario::class, 'demanda_id')->with('unidade'); } public function equipamentos(): BelongsToMany { return $this->belongsToMany(Equipamento::class, 'demanda_equipamento', 'demanda_id', 'equipamento_id') ->withTimestamps(); } public function licencas(): BelongsToMany { return $this->belongsToMany(Licenca::class, 'demanda_licenca', 'demanda_id', 'licenca_id') ->withTimestamps(); } // PROXY ACCESSORS - para compatibilidade futura com views de Indicadores TI // public function getSetorIdAttribute(): mixed { return $this->tiDetalhe?->setor_id; } public function getSetorNomeAttribute(): ?string { return $this->tiDetalhe?->setor_nome; } public function getAssuntoIdAttribute(): mixed { return $this->tiDetalhe?->assunto_id; } public function getAssuntoNomeAttribute(): ?string { return $this->tiDetalhe?->assunto_nome; } public function getSubassuntoIdAttribute(): mixed { return $this->tiDetalhe?->subassunto_id; } public function getSubassuntoNomeAttribute(): ?string { return $this->tiDetalhe?->subassunto_nome; } public function getClienteIdAttribute(): mixed { return $this->tiDetalhe?->cliente_id; } public function getCanalAttribute(): ?string { return $this->attributes['canal'] ?? $this->tiDetalhe?->canal; } public function getTipoAttribute(): ?string { return $this->tiDetalhe?->tipo; } public function getDataReberturaAttribute(): mixed { return $this->tiDetalhe?->data_reabertura; } public function getSetorAttribute(): mixed { return $this->tiDetalhe?->setor; } public function getAssuntoAttribute(): mixed { return $this->tiDetalhe?->assunto; } public function getSubassuntoAttribute(): mixed { return $this->tiDetalhe?->subassunto; } public function getClienteAttribute(): mixed { return $this->tiDetalhe?->cliente; } // ACCESSORS // public function getStatusColorAttribute(): string { return StatusDemanda::tryFrom($this->status)?->color() ?? 'secondary'; } public function getPrioridadeColorAttribute(): string { return PrioridadeDemanda::tryFrom($this->prioridade)?->color() ?? 'secondary'; } public function getPrioridadeTextColorAttribute(): string { return PrioridadeDemanda::tryFrom($this->prioridade)?->textColor() ?? 'white'; } public function getSolicitanteNomeAttribute(): string { if ($this->user_id && $this->solicitante) { return $this->solicitante->name; } if ($this->tiDetalhe?->cliente) { return $this->tiDetalhe->cliente->nome; } return '-'; } public function destinatarioPorUsuario(string $userId): ?DemandaDestinatario { return $this->destinatarios->first(fn($d) => $d->responsavel_id === $userId); } // LÓGICA DE NEGÓCIO // public static function gerarNumero(): string { $year = now()->year; // Deriva do maior sufixo existente no ano (não da contagem) para que a // exclusão de uma demanda não cause reaproveitamento/duplicação de número. $ultimo = static::whereRaw("numero LIKE ?", ["DEM-{$year}-%"]) ->selectRaw("MAX(CAST(SUBSTRING_INDEX(numero, '-', -1) AS UNSIGNED)) as seq") ->value('seq'); return sprintf('DEM-%d-%05d', $year, ((int) $ultimo) + 1); } public function isParticipante(string $userId): bool { return $this->participantes->contains('id', $userId); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings