init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,108 @@
<?php
namespace App\Services\ProntoAtendimento\Atendimento;
use App\Enums\ProntoAtendimento\ClassificacaoRisco;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
use Carbon\Carbon;
class AtendimentoService
{
public static function getTimelineItems($filaId)
{
$atendimento = Atendimento::where('fila_id', $filaId)->firstOrFail();
$items = collect();
$items->push([
'date_time' => new Carbon($atendimento->recepcao->atendido_em),
'title' => 'Recepção',
'label' => $atendimento->fila->senha,
'disabled' => true,
]);
$atendimento->atendimentosTriagem->each(fn ($atendimento) => $items->push([
'date_time' => $atendimento->created_at,
'title' => 'Triagem',
'disabled' => false,
'list_class' => self::getClassificacaoRiscoCssClass(
$atendimento->classificacaoRisco->classificacao_risco_id ?? null
),
]));
$atendimento->atendimentosMedico->each(fn ($atendimento) => $items->push([
'date_time' => $atendimento->created_at,
'title' => 'Atendimento médico',
'disabled' => false,
'list_class' => self::getClassificacaoRiscoCssClass(
$atendimento->classificacaoRisco->classificacao_risco_id ?? null
),
]));
$atendimento->atendimentosEnfermagem->each(fn ($atendimento) => $items->push([
'date_time' => $atendimento->created_at,
'title' => 'Enfermagem',
'disabled' => false,
'list_class' => self::getClassificacaoRiscoCssClass(
$atendimento->classificacaoRisco->classificacao_risco_id ?? null
),
]));
$atendimento->atendimentosExameImagem->each(fn ($atendimento) => $items->push([
'date_time' => $atendimento->created_at,
'title' => 'Exames de imagem',
'disabled' => false,
]));
$atendimento->pacienteObservacoes->each(fn ($atendimento) => $items->push([
'date_time' => $atendimento->created_at,
'title' => 'Observação',
'disabled' => false,
'list_class' => self::getClassificacaoRiscoCssClass(
$atendimento->classificacaoRisco->classificacao_risco_id ?? null
),
]));
return $items
->sortBy('date_time')
->map(function ($item) {
$item['date_time'] = $item['date_time']->format('d/m/Y H:i');
return $item;
})
->values();
}
private static function getClassificacaoRiscoCssClass($classificacaoRiscoId)
{
$class = 'pronto-atendimento-classificacao-risco-';
switch ($classificacaoRiscoId) {
case ClassificacaoRisco::NAO_URGENTE: {
return $class . 'NAO_URGENTE';
}
case ClassificacaoRisco::POUCO_URGENTE: {
return $class . 'POUCO_URGENTE';
}
case ClassificacaoRisco::URGENTE: {
return $class . 'URGENTE';
}
case ClassificacaoRisco::MUITO_URGENTE: {
return $class . 'MUITO_URGENTE';
}
case ClassificacaoRisco::EMERGENCIA: {
return $class . 'EMERGENCIA';
}
default: {
return '';
}
}
}
}

View File

@@ -0,0 +1,82 @@
<?php
namespace App\Services\ProntoAtendimento\Atendimento;
use App\Enums\ProntoAtendimento\Raat\CausaAcidente as CausaAcidenteEnum;
use App\Enums\ProntoAtendimento\Raat\Diagnostico as DiagnosticoEnum;
use App\Enums\ProntoAtendimento\Raat\ParteCorpoAtingida as ParteCorpoAtingidaEnum;
use App\Enums\ProntoAtendimento\Raat\RegimeTrabalho as RegimeTrabalhoEnum;
use App\Models\ProntoAtendimento\Atendimento\RaatParecerMedico;
use App\Models\ProntoAtendimento\Raat\Agente;
use App\Models\ProntoAtendimento\Raat\CausaAcidente;
use App\Models\ProntoAtendimento\Raat\ClassificacaoInicial;
use App\Models\ProntoAtendimento\Raat\Diagnostico;
use App\Models\ProntoAtendimento\Raat\ParteCorpoAtingida;
use App\Models\ProntoAtendimento\Raat\RegimeTrabalho;
use App\Models\ProntoAtendimento\Raat\TipoAcidente;
class RaatService
{
public static function get($atendimentoMedico)
{
return [
'identificacao' => self::getRaatIdentificacao($atendimentoMedico->atendimento->faa->raat),
'parecer_medico' => self::getParecerMedico($atendimentoMedico->raatParecerMedico),
];
}
public static function getOptionsParecerMedico()
{
return [
'agente' => Agente::all(),
'causa_acidente' => CausaAcidente::all(),
'classificacao_inicial' => ClassificacaoInicial::all(),
'diagnostico' => Diagnostico::all(),
'parte_corpo_atingida' => ParteCorpoAtingida::all(),
'regime_trabalho' => RegimeTrabalho::all(),
'tipo_acidente' => TipoAcidente::all(),
];
}
private static function getRaatIdentificacao($raat)
{
if (is_null($raat)) {
return null;
}
$hiddenFields = [];
if ($raat->regime_trabalho_id !== RegimeTrabalhoEnum::OUTRO) {
$hiddenFields[] ='regime_trabalho_outro';
}
return $raat->makeHidden($hiddenFields);
}
private static function getParecerMedico($parecerMedico)
{
if (is_null($parecerMedico)) {
return null;
}
$hiddenFields = [];
if (!$parecerMedico->partesCorpoAtingidas->contains('id', ParteCorpoAtingidaEnum::OUTROS)) {
$hiddenFields[] = 'parte_corpo_atingida_outras';
}
if (!$parecerMedico->diagnosticos->contains('id', DiagnosticoEnum::OUTROS)) {
$hiddenFields[] = 'diagnostico_outros';
}
return $parecerMedico
->with('causasAcidente', 'diagnosticos', 'partesCorpoAtingidas')
->get()
->makeHidden($hiddenFields);
}
}

View File

@@ -0,0 +1,425 @@
<?php
namespace App\Services\ProntoAtendimento\Atendimento;
use App\Enums\Cadastro\SujeitoAtencao\Classificacao;
use App\Enums\ProntoAtendimento\Atendimento\Desfecho;
use App\Enums\ProntoAtendimento\Atendimento\OrigemEntrada as AtendimentoOrigemEntrada;
use App\Models\Cadastro\Parametrizacao\ParametrizacaoPermissaoUsuario;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Cadastro\SujeitoAtencao\PacienteClassificacao;
use App\Models\Cadastro\SujeitoAtencao\Sexo;
use App\Models\Cns\TermoInvalido;
use App\Models\ProntoAtendimento\Atendimento\Faa;
use App\Models\ProntoAtendimento\Atendimento\OrigemEntrada;
use App\Rules\CnsTermoValido;
use App\Rules\NomeCompleto;
use App\Services\Cadastro\SujeitoAtencao\PacienteDesconhecidoSaveService;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
class RetroativoService
{
public static function create()
{
$now = Carbon::now();
$pacienteIdentificado = null;
if (is_numeric(request()->paciente_id)) {
$paciente = Paciente::findOrFail(request()->paciente_id);
$endereco = '';
if ($paciente->cidadao->domicilio_id) {
$endereco = $paciente->cidadao->domicilio->endereco;
$endereco = $endereco->completo . ' - ' . MaskUtil::getCepMasked($endereco->logradouro->cep);
}
$pacienteIdentificado = [
'prontuario' => $paciente->prontuario,
'classificacao_id' => $paciente->classificacao_id,
'cns' => $paciente->cidadao->cns,
'nome' => $paciente->cidadao->nome,
'nome_social' => $paciente->cidadao->nome_social,
'nome_mae' => $paciente->cidadao->nome_mae ?? '',
'sexo' => [
'id' => $paciente->cidadao->sexo->id,
'descricao' => $paciente->cidadao->sexo->descricao,
],
'preferencia_nome_id' => $paciente->cidadao->preferencia_nome_id ?? null,
'data_nascimento' => $paciente->cidadao->data_nascimento->format('d/m/Y'),
'idade' => $paciente->cidadao->idade,
'endereco' => $endereco,
'telefones' => $paciente->cidadao->telefones->map(fn ($telefone) => [
'id' => $telefone->id,
'numero' => MaskUtil::getPhoneMasked($telefone->numero),
'observacao' => $telefone->observacao ?? '',
'autoriza_sms' => $telefone->autoriza_sms,
'principal' => $telefone->principal,
]),
];
}
$lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'));
$permissaoUsuario = ParametrizacaoPermissaoUsuario::where('usuario_id', $lotacao->usuario_id)
->where('infraestrutura_id', $lotacao->infraestrutura_id)
->first();
$countUsuario = ParametrizacaoPermissaoUsuario::count();
$classificacoes = $permissaoUsuario
? PacienteClassificacao::orderBy('descricao')
->get()
->filter(function ($classificacao) use ($permissaoUsuario) {
$exibe = false;
switch ($classificacao->id) {
case Classificacao::MUNICIPE:
$exibe = $permissaoUsuario->municipe;
break;
case Classificacao::PROVISORIO:
$exibe = $permissaoUsuario->provisorio;
break;
case Classificacao::OUTRO_MUNICIPIO:
$exibe = $permissaoUsuario->outro_municipio;
break;
}
return $exibe ? [
'id' => $classificacao->id,
'descricao' => $classificacao->descricao
] : null;
})
->values()
: [];
return [
'form' => [
'data_atual_menos_um_ano' => $now->copy()->subYear()->format('d/m/Y'),
'data_atual' => $now->format('d/m/Y'),
'data_registro' => $now->format('Y-m-d'),
'isEncaminhamento' => false,
'sem_acompanhante' => true,
'paciente_identificado' => $pacienteIdentificado,
'origem_unidade_value' => 'interna',
'unidade_encaminhamento' => null,
'paciente_desconhecido' => [
'sexos' => Sexo::orderBy('descricao')
->get()
->map(fn ($sexo) => [
'id' => $sexo->id,
'descricao' => $sexo->descricao
]),
],
'origens_entrada' => OrigemEntrada::orderBy('nome')
->get()
->map(fn ($origem) => [
'id' => $origem->id,
'nome' => $origem->nome,
]),
'origens_unidade' => [
[ 'id' => 'interna', 'nome' => 'INTERNA' ],
[ 'id' => 'externa', 'nome' => 'EXTERNA' ],
],
'faa_aberta' => self::getFaaAberta(request()->paciente_id),
'classificacoes' => $classificacoes,
'is_permissao_cadastro' => $countUsuario === 0 ? true : false,
],
'model' => [
'acompanhante' => null,
'atendido_em' => null,
'atendido_hora' => null,
'medico_samu' => null,
'medico_solicitante_encaminhamento' => null,
'motivo_atendimento' => null,
'observacao' => null,
'origem_entrada_id' => AtendimentoOrigemEntrada::ESPONTANEA,
'unidade_encaminhamento_id' => null,
'unidade_externa_encaminhamento_id' => null,
'paciente_desconhecido' => [
'sexo_id' => null,
'caracteristicas_fisicas' => null,
],
],
'adittional' => [
'termos_invalidos' => TermoInvalido::all()->map(fn ($termo) => $termo->descricao),
]
];
}
public static function pacienteHasAtendimento($pacienteId)
{
if (is_numeric($pacienteId)) {
$faa = Faa::with('atendimentos.fila')
->where('paciente_id', $pacienteId)
->whereHas('atendimentos.fila', function($query) {
$query
->whereHas('centroCusto', function($query) {
$query->where(
'infraestrutura_id',
Lotacao::findOrFail(auth()->payload()->get('lotacao_id'))->infraestrutura_id
);
});
})
->where(function($query) {
$query->whereNull('desfecho_id')
->orWhere('desfecho_id', Desfecho::EVASAO);
})
->first();
if ($faa) {
$setor = null;
$emitidoEm = null;
$procedimentos = 0;
$faa->atendimentos->map(function($atendimento) use (&$setor, &$procedimentos, &$emitidoEm) {
$emitidoEm = $atendimento->fila->emitido_em;
$setor = $atendimento->fila->centroCusto->setor;
$procedimentos = $atendimento->procedimentos->count();
});
$emitidoEm = Carbon::parse($emitidoEm)->format('Y-m-d');
if ($emitidoEm === Carbon::now()->format('Y-m-d')) {
if ($procedimentos > 0) {
return response()->json(['message' => 'Paciente já está em atendimento no setor de ' . $setor['nome']
. '. Finalize o atendimento para iniciar um novo.'], Response::HTTP_BAD_REQUEST);
}
}
}
if (is_null($faa)) {
$faa = Faa::where('paciente_id', $pacienteId)
->where('finalizado', false)
->whereHas('createdCentroCusto', function ($query) {
$query->where(
'infraestrutura_id',
Lotacao::findOrFail(auth()->payload()->get('lotacao_id'))->infraestrutura_id
);
})
->first();
if ($faa) {
return [
'message' => 'Paciente já está em atendimento no setor de ' . $faa->createdCentroCusto->setor->nome . '. Finalize o atendimento para iniciar um novo.',
'response' => Response::HTTP_BAD_REQUEST
];
}
}
}
return false;
}
public static function getFaaAberta($pacienteId)
{
if (is_numeric($pacienteId)) {
$faa = Faa::with('atendimentos.fila')
->where('paciente_id', $pacienteId)
->whereHas('atendimentos.fila', function($query) {
$query
->whereHas('centroCusto', function($query) {
$query->where(
'infraestrutura_id',
Lotacao::findOrFail(auth()->payload()->get('lotacao_id'))->infraestrutura_id
);
});
})
->where(function($query) {
$query->whereNull('desfecho_id')
->orWhere('desfecho_id', Desfecho::EVASAO);
})
->first();
if ($faa) {
$setor = null;
$emitidoEm = null;
$procedimentos = 0;
$faa->atendimentos->map(function($atendimento) use (&$setor, &$procedimentos, &$emitidoEm) {
$emitidoEm = $atendimento->fila->emitido_em;
$setor = $atendimento->fila->centroCusto->setor;
$procedimentos = $atendimento->procedimentos->count();
});
$emitidoEm = Carbon::parse($emitidoEm)->format('Y-m-d');
if ($emitidoEm === Carbon::now()->format('Y-m-d')) {
if ($procedimentos > 0) {
return response()->json(['message' => 'Paciente já está em atendimento no setor de ' . $setor['nome']
. '. Finalize o atendimento para iniciar um novo.'], Response::HTTP_BAD_REQUEST);
}
if ($faa->desfecho_id == null) {
return [
'alert_faa_aberta' => true,
'setor' => $setor['nome'],
];
}
}
}
}
return false;
}
public static function store()
{
self::validations();
$recepcao = null;
$params = self::getParams();
DB::transaction(function () use (&$recepcao, $params) {
$pacienteId = self::savePaciente($params['paciente'], $params['atendido_em']);
$faa = Faa::create(['paciente_id' => $pacienteId]);
$atendimento = $faa->atendimentos()->create();
$recepcao = self::saveAtendimentoRecepcao($atendimento, $params);
});
return $recepcao->refresh();
}
private static function getParams()
{
$params = request()->all();
if (isset($params['medico_samu'])) {
$params['medico_samu'] = mb_strtoupper($params['medico_samu']);
}
if (isset($params['acompanhante'])) {
$params['acompanhante'] = mb_strtoupper($params['acompanhante']);
}
if (isset($params['medico_solicitante_encaminhamento'])) {
$params['medico_solicitante_encaminhamento'] = mb_strtoupper($params['medico_solicitante_encaminhamento']);
}
return $params;
}
private static function savePaciente($params, $atendidoEm)
{
if (isset($params['id'])) {
return $params['id'];
}
return (new PacienteDesconhecidoSaveService(
$atendidoEm,
$params['sexo_id'],
$params['caracteristicas_fisicas'] ?? null
))->save()->id;
}
private static function saveAtendimentoRecepcao($atendimento, $params)
{
return $atendimento->recepcao()->create([
'atendido_em' => Carbon::createFromFormat('d-m-Y H:i', $params['atendido_em']),
'urgente' => false,
'origem_entrada_id' => $params['origem_entrada_id'] ?? null,
'medico_samu' => $params['medico_samu'] ?? null,
'motivo_atendimento' => $params['motivo_atendimento'] ?? null,
'acompanhante' => $params['acompanhante'] ?? null,
'unidade_encaminhamento_id' => $params['unidade_encaminhamento_id'] ?? null,
'unidade_externa_encaminhamento_id' => $params['unidade_externa_encaminhamento_id'] ?? null,
'medico_solicitante_encaminhamento' => $params['medico_solicitante_encaminhamento'] ?? null,
'observacao' => $params['observacao'] ?? null,
]);
}
private static function validations()
{
return request()->validate([
'paciente' => [
'required',
'array'
],
'paciente.id' => [
'nullable',
'integer'
],
'paciente.sexo_id' => [
'required_without:paciente.id',
'nullable',
'integer'
],
'paciente.caracteristicas_fisicas' => [
'required_without:paciente.id',
'string',
'max:500'
],
'atendido_em' => [
'required',
'date_format:d-m-Y H:i',
'before_or_equal:now'
],
'origem_entrada_id' => ['nullable', 'integer'],
'medico_samu' => [
'nullable',
'string',
'max:150'
],
"motivo_atendimento" => [
'required',
'nullable',
'string',
'max:3000'
],
"acompanhante" => [
'nullable',
'string',
'between:6,150',
new NomeCompleto,
new CnsTermoValido(['attribute' => 'Acompanhante']),
],
"unidade_encaminhamento_id" => [
'nullable',
'integer'
],
"unidade_externa_encaminhamento_id" => [
'nullable',
'integer'
],
"medico_solicitante_encaminhamento" => [
'nullable',
'string',
'between:6,150',
new NomeCompleto,
],
"observacao" => [
'nullable',
'string',
'max:500'
],
],
[
'atendido_em.before_or_equal' => 'O início do atendimento deve ser anterior ou igual hora atual.'
]);
}
}