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,573 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento;
use App\Enums\Cadastro\SujeitoAtencao\FatorRisco as EnumFatorRisco;
use App\Http\Controllers\Controller;
use App\Models\Geral\GlasgowInterpretacaoResultado;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
use App\Models\ProntoAtendimento\Atendimento\Enfermagem\Historico;
use App\Models\ProntoAtendimento\Atendimento\Triagem\FormularioDorToracica;
use App\Models\ProntoAtendimento\Atendimento\Triagem\OrigemDorToracica;
use App\Models\ProntoAtendimento\Atendimento\Triagem\RelacionadoFormularioDorToracica;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class FaaSimplificadaController extends Controller
{
private static $TITLE = 'FICHA DE ATENDIMENTO AMBULATORIAL - FAA ';
private const TEMPLATE = 'pronto-atendimento.faa-simplificada';
public static function getTemplate($atendimentoId)
{
$data = self::getTemplateData($atendimentoId);
self::$TITLE .= $data['faa']['faa_numero'];
return Template::make(self::$TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
public static function getTemplateData($atendimentoId)
{
$atendimento = Atendimento::findOrFail($atendimentoId);
$faa = $atendimento->faa;
$fila = $atendimento->fila;
$paciente = $faa->paciente;
$recepcao = $atendimento->recepcao;
$unidade = $fila
? $fila->CentroCusto->infraestrutura->unidade
: $faa->createdCentroCusto->infraestrutura->unidade;
$origemEntrada = $recepcao->origemEntrada;
$endereco = '';
$enderecoCompleto = 'Não informado';
$cep = 'Não informado';
if ($paciente->cidadao->domicilio_id) {
$endereco = $paciente->cidadao->domicilio->endereco;
$enderecoCompleto = $endereco->completo;
$cep = MaskUtil::getCepMasked($endereco->logradouro->cep);
}
$verificaMedicoFaa = $faa->where('pronto_atendimento_faa.paciente_id', $faa->paciente_id)->get();
if($verificaMedicoFaa->first()->desfecho_id != null){
$ultimasConsultas = $faa->where('pronto_atendimento_faa.paciente_id', $faa->paciente_id)
->join('pronto_atendimento_atendimento as atendimento', 'atendimento.faa_id', 'pronto_atendimento_faa.id')
->join('pronto_atendimento_atendimento_recepcao as recepcao', 'recepcao.atendimento_id', 'atendimento.id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'pronto_atendimento_faa.lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'sigtap.ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('painel_senha_fila', 'painel_senha_fila.id', 'atendimento.fila_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'painel_senha_fila.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->select(
'cadastro_cidadao.nome as nome_medico',
'sigtap.ocupacao.nome as nome_ocupacao',
'recepcao.atendido_em',
'cadastro_unidade.nome_fantasia'
)
->limit(3)
->orderBy('atendimento.created_at', 'desc')
->get()
->map(fn ($consulta) => [
'data' => $consulta->atendido_em
? date("d/m/Y", strtotime($consulta->atendido_em)) : '',
'horaEntrada' => $consulta->atendido_em
? date("H:i:s", strtotime($consulta->atendido_em)) : '',
'unidade' => $consulta->nome_fantasia,
'medico' => $consulta->nome_medico ?? null,
'especialidade' => $consulta->nome_ocupacao ?? null,
]);
} else {
$ultimasConsultas = $faa->where('pronto_atendimento_faa.paciente_id', $faa->paciente_id)
->join('pronto_atendimento_atendimento as atendimento', 'atendimento.faa_id', 'pronto_atendimento_faa.id')
->join('pronto_atendimento_atendimento_recepcao as recepcao', 'recepcao.atendimento_id', 'atendimento.id')
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'pronto_atendimento_faa.updated_lotacao_id')
->join('cadastro_usuario', 'cadastro_usuario.id', 'cadastro_lotacao.usuario_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->join('sigtap.ocupacao', 'sigtap.ocupacao.id', 'cadastro_lotacao.ocupacao_id')
->join('painel_senha_fila', 'painel_senha_fila.id', 'atendimento.fila_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'painel_senha_fila.centro_custo_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
->select(
'cadastro_cidadao.nome as nome_medico',
'sigtap.ocupacao.nome as nome_ocupacao',
'recepcao.atendido_em',
'cadastro_unidade.nome_fantasia'
)
->limit(3)
->orderBy('atendimento.created_at', 'desc')
->get()
->map(fn ($consulta) => [
'data' => $consulta->atendido_em
? date("d/m/Y", strtotime($consulta->atendido_em)) : '',
'horaEntrada' => $consulta->atendido_em
? date("H:i:s", strtotime($consulta->atendido_em)) : '',
'unidade' => $consulta->nome_fantasia,
'medico' => $consulta->nome_medico ?? null,
'especialidade' => $consulta->nome_ocupacao ?? null,
]);
}
$sinaisVitais = $atendimento->sinaisVitais()
->orderBy('created_at')
->limit(1)
->get()
->map(fn ($sinaisVitais) => [
'pa' => $sinaisVitais->pa ?? null,
'glicemia' => $sinaisVitais->glicemia ?? null,
'temperatura' => $sinaisVitais->temperatura ?? null,
'pulso' => $sinaisVitais->pulso ?? null,
'respiracao' => $sinaisVitais->respiracao ?? null,
'saturacao' => $sinaisVitais->saturacao ?? null,
'intensidade_dor' => $sinaisVitais->intensidade_dor ?? null,
'cintura' => $sinaisVitais->cintura ?? null,
'data' => $sinaisVitais->created_at
? date("d/m/Y", strtotime($sinaisVitais->created_at)) : null,
'horario' => $sinaisVitais->created_at
? date("H:i:s", strtotime($sinaisVitais->created_at)) : null,
]);
$medidas = $atendimento->avaliacoesAntropometricas()->orderByDesc('created_at')->first();
$classificacaoRisco = $atendimento->classificacoesRisco()
->where('atendimento_id', $atendimentoId)
->orderBy('created_at')
->get()
->map(fn ($classificacaoRisco) => [
'id' => $classificacaoRisco->id ?? null,
'classificacaoRiscoId' => $classificacaoRisco->classificacao_risco_id ?? null,
'nome' => $classificacaoRisco->classificacaoRisco->nome ?? 'NÃO INFORMADO',
'dataAtendimento' => $classificacaoRisco->created_at ?? null
? date("d/m/Y", strtotime($classificacaoRisco->created_at)): '',
'horaAtendimento' => $classificacaoRisco->created_at ?? null
? date("H:i:s", strtotime($classificacaoRisco->created_at)): '',
'setor' => $classificacaoRisco->createdCentroCusto->setor->nome ?? null,
]);
$fatoresRisco = collect();
$latestCreatedAt = DB::table('cadastro_cidadao_fator_risco')
->where('cidadao_id', $atendimento->faa->paciente->cidadao->id)
->max('created_at');
$atendimento->faa->paciente->cidadao->fatoresRisco()
->wherePivot('created_at', $latestCreatedAt)
->get()
->each(function ($fatorRiscoAtual) use ($fatoresRisco, $atendimento) {
$dataHora = $fatorRiscoAtual->cidadaoFatorRisco->created_at->format('d/m/Y H:i:s');
$profissional = optional(optional(optional($fatorRiscoAtual->cidadaoFatorRisco->createdLotacao()->withTrashed()->first())->usuario)->cidadao)->nome;
$cbo = optional(optional($fatorRiscoAtual->cidadaoFatorRisco->createdLotacao()->withTrashed()->first())->ocupacao)->nome;
$setor = optional(optional($fatorRiscoAtual->cidadaoFatorRisco->createdCentroCusto)->setor)->nome;
$fatorRisco = $fatoresRisco->where('data_hora', $dataHora)
->where('profissional', $profissional)
->where('cbo', $cbo)
->where('setor', $setor)
->first();
$fatorRiscoNome = $fatorRiscoAtual->nome;
if ($fatorRiscoAtual->id == EnumFatorRisco::OUTRO) {
$fatorRiscoNome = $fatorRiscoNome .
' (' . $atendimento->faa->paciente->cidadao->fator_risco_outro . ')';
}
if ($fatorRisco) {
$fatorRisco['fatores']->push($fatorRiscoNome);
} else {
$fatoresRisco->push([
'data_hora' => $dataHora,
'profissional' => $profissional,
'cbo' => $cbo,
'setor' => $setor,
'fatores' => collect([$fatorRiscoNome])
]);
}
});
$fatoresRisco->each(fn ($f) => $f['fatores'] = $f['fatores']->sort()->all());
$fatoresRisco = $fatoresRisco->sortBy('data_hora')->all();
$historicoEnfermagem = Historico::where('atendimento_id', $atendimento->id)
->orderBy('created_at')
->get()
->map(function ($historicoEnfermagem) use ($atendimento) {
return array_merge(
self::getBaseHistoricoAreaAtendimento($historicoEnfermagem, $atendimento),
[
'descricao' => $historicoEnfermagem->descricao,
]
);
});
if ($atendimento->dor_toracica == true) {
$formulario = FormularioDorToracica::where('atendimento_id', $atendimento->id)->get();
$data_sintoma = null;
$hora_sintoma = null;
$data_ecg_admissao = null;
$hora_ecg_admissao = null;
$dispneia = null;
foreach ($formulario as $registro) {
$data_sintoma = $registro->data_sintoma ?? null;
$hora_sintoma = $registro->hora_sintoma ?? null;
$data_ecg_admissao = $registro->data_ecg_admissao ?? null;
$hora_ecg_admissao = $registro->hora_ecg_admissao ?? null;
$dispneia = $registro->dispneia ?? null;
}
if (!empty($formulario)) {
$formulario_id = $formulario->pluck('id');
$formularioRelacionadoDor = RelacionadoFormularioDorToracica::whereIn('formulario_id', $formulario_id)->get();
$dorToracicaRelacionada = [];
foreach ($formularioRelacionadoDor as $registroRelacionado) {
$dorToracicaRelacionada[] = OrigemDorToracica::where('id', $registroRelacionado->dor_toracica_id)
->get()
->map(function ($duracao) {
return [
'id' => $duracao->id,
'nome' => $duracao->nome,
];
})->values();
}
}
}
$glasgowValor = null;
$atendimentosData = self::getAtendimentosData($atendimento);
foreach ($atendimentosData as $item) {
if (isset($item['glasgow'])) {
$glasgowValor = $item['glasgow'];
break;
}
}
return [
'faa' => [
'faa_id' => $faa->id,
'faa_numero' => $faa->numero,
'dor_toracica' => $atendimento->dor_toracica ?? null,
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNome' => $paciente->cidadao->preferencia_nome_id ?? null,
'prontuarioUnidade' => $paciente->prontuario,
'sexo' => $paciente->cidadao->sexo->descricao,
'cpf' => $paciente->cidadao->cpf ?? 'Não informado',
'cns' => $paciente->cidadao->cns ?? 'Não informado',
'idade' => $paciente->cidadao->idade ?? [
'anos' => 'Não informada',
'meses' => 'Não informada',
'dias' => 'Não informada',
],
'nomeMae' => $paciente->cidadao->nome_mae ?? 'Não informado',
'endereco' => $enderecoCompleto ?? 'Não informado',
'cep' => $cep ?? 'Não informado',
'dataNascimento' => $paciente->cidadao->data_nascimento
? $paciente->cidadao->data_nascimento->format('d/m/Y') : 'Não informada',
'altura' => $medidas->altura ?? null,
'peso' => $medidas->massa ?? null,
],
'telefones' => $paciente->cidadao->telefones->map(fn ($telefone) => [
'numero' => MaskUtil::getPhoneMasked($telefone->numero),
'obs' => $telefone->observacao,
]),
'recepcao' => [
'data' => $recepcao->atendido_em
? date("d/m/Y", strtotime($recepcao->atendido_em)) : '',
'horaEntrada' => $recepcao->atendido_em
? date("H:i:s", strtotime($recepcao->atendido_em)) : '',
'recepcionista' => $recepcao->createdLotacao->usuario->cidadao->nome ?? null,
'especialidade' => $recepcao->ocupacao->nome ?? null,
'medicoSamu' => $recepcao->medico_samu ?? 'NÃO INFORMADO',
'motivoAtendimento' => $recepcao->motivo_atendimento ?? 'NÃO INFORMADO',
],
'unidade' => [
'nomeFantasia' => $unidade->nome_fantasia ?? '',
],
'senha' => $fila->senha ?? '',
'ultimasConsultas' => $ultimasConsultas,
'origemEntrada' => [
'nome' => $origemEntrada->nome ?? '',
],
'sinaisVitais' => $sinaisVitais,
'classificacaoRisco' => $classificacaoRisco,
'fatoresRisco' => $fatoresRisco,
'historicoEnfermagem' => $historicoEnfermagem,
'observacoes' => self::getObservacoes($atendimento),
'triagemAvaliacoesCondicoes' => self::getOutrasAvaliacoesCondicoes($atendimento),
'formularioDorToracica' => [
'data_sintoma' => (new Carbon($data_sintoma ?? null))->format('d/m/Y'),
'hora_sintoma' => (new Carbon($hora_sintoma ?? null))->format('H:i:s'),
'data_ecg_admissao' => (new Carbon($data_ecg_admissao ?? null))->format('d/m/Y'),
'hora_ecg_admissao' => (new Carbon($hora_ecg_admissao ?? null))->format('H:i:s'),
'dispneia' => $dispneia ?? null,
'relacionados' => $dorToracicaRelacionada ?? null,
],
'glasgow' => $glasgowValor,
];
}
private static function getAtendimentosData($atendimento)
{
return collect(array_merge(
self::getAtendimentosTriagemData($atendimento->atendimentosTriagem),
self::getAtendimentosMedicosData($atendimento->atendimentosMedico),
self::getAtendimentosEnfermagemData($atendimento->atendimentosEnfermagem),
self::getAtendimentosExameImagemData($atendimento->atendimentosExameImagem),
self::getAtendimentosObservacaoData($atendimento->pacienteObservacoes),
self::getProcedimentosFechamentoData($atendimento),
))
->sortBy('data_hora')
->all();
}
private static function getAtendimentosTriagemData($atendimentosTriagem)
{
return $atendimentosTriagem->map(function ($atendimento) {
$escalas = $atendimento->escalasComaGlasgow->first();
$glasgow = self::getResultadoGlasgow($escalas);
return [
'data_hora' => $atendimento->created_at,
'glasgow' => $glasgow
];
})->all();
}
private static function getResultadoGlasgow($escala) {
if(!$escala) {
return null;
}
$pontuacao = $escala->aberturaOcular->pontos
+ $escala->respostaVerbal->pontos
+ $escala->respostaMotora->pontos
- $escala->reatividadePupilar->pontos;
if ($escala->aberturaOcular->pontos === 0
|| $escala->respostaVerbal->pontos === 0
|| $escala->respostaMotora->pontos === 0
) {
$resultado = 'A pontuação não pode ser calculada. Um ou mais itens não foram testados.';
}
else {
$resultado = (GlasgowInterpretacaoResultado::all()->filter(function ($interpretacao) use ($pontuacao) {
return $pontuacao >= $interpretacao->min
&& $pontuacao <= ($interpretacao->max ?? PHP_INT_MAX);
})->first())->descricao;
}
return [
'ocular' => $escala->aberturaOcular->pontos,
'verbal' => $escala->respostaVerbal->pontos,
'motora' => $escala->respostaMotora->pontos,
'pupilar' => $escala->reatividadePupilar->pontos * -1,
'pontuacao' => $pontuacao,
'resultado' => $resultado
];
}
private static function getAtendimentosMedicosData($atendimentosMedicos)
{
return $atendimentosMedicos->map(fn ($atendimento) => [
'data_hora' => $atendimento->created_at,
])->all();
}
private static function getAtendimentosEnfermagemData($atendimentosEnfermagem)
{
return $atendimentosEnfermagem->map(fn ($atendimento) => [
'data_hora' => $atendimento->created_at,
])->all();
}
private static function getAtendimentosExameImagemData($atendimentosExameImagem)
{
return $atendimentosExameImagem->map(fn ($atendimento) => [
'data_hora' => $atendimento->created_at,
])->all();
}
private static function getAtendimentosObservacaoData($atendimentosObservacao)
{
return $atendimentosObservacao->map(fn ($atendimento) => [
'data_hora' => $atendimento->created_at,
])->all();
}
private static function getProcedimentosFechamentoData($atendimento)
{
$atendimentosProcedimentos = collect();
$atendimento->procedimentos()
->whereNull('atendimento_medico_id')
->whereNull('atendimento_triagem_id')
->whereNull('atendimento_enfermagem_id')
->whereNull('paciente_observacao_id')
->whereNull('exame_imagem_id')
->get()
->each(function ($atendimentoProcedimento) use ($atendimentosProcedimentos) {
$realizadoEm = Carbon::create(
$atendimentoProcedimento->realizado_em->year,
$atendimentoProcedimento->realizado_em->month,
$atendimentoProcedimento->realizado_em->day,
23,
59,
59
);
$realizadoEmFormatted = $realizadoEm->format('d/m/Y H:i:s');
$atendimentoProcedimentoProfissional = $atendimentosProcedimentos
->where('lotacao_id', $atendimentoProcedimento->lotacao_id)
->where('data_hora_formatted', $realizadoEmFormatted)
->first();
if (is_null($atendimentoProcedimentoProfissional)) {
$atendimentoProcedimentoProfissional = collect([
'data_hora_formatted' => $realizadoEmFormatted,
'data_hora' => $realizadoEm,
]);
$atendimentosProcedimentos->push($atendimentoProcedimentoProfissional);
}
});
return $atendimentosProcedimentos->all();
}
static function getBaseHistoricoAreaAtendimento($model, $atendimento)
{
$result = [
'centro_custo' => [
'setor' => [
'nome' => $model->createdCentroCusto->setor->nome,
],
],
'lotacao' => [
'ocupacao' => [
'codigo' => $model->createdLotacao->ocupacao->codigo,
'nome' => $model->createdLotacao->ocupacao->nome,
],
'profissional' => [
'nome' => $model->createdLotacao->usuario->cidadao->nome,
],
],
'classificacao_risco' => [
'nome' => self::getClassificacaoRisco($atendimento, $model->created_at)['nome'] ?? null
],
'data_hora' => $model->created_at->format('d/m/Y H:i:s'),
];
return $result;
}
static function getOutrasAvaliacoesCondicoes($atendimento)
{
return $atendimento->atendimentosTriagem()->whereNotNull('outras_avaliacoes_condicoes')
->get()
->map(function($query) {
return [
'centro_custo' => [
'setor' => [
'nome' => $query->createdCentroCusto->setor->nome ?? null,
],
],
'classificacao_risco' => [
'nome' => $query->classificacaoRisco->classificacaoRisco->nome ?? null,
],
'data_hora' => $query->created_at->format('d/m/Y H:i:s'),
'descricao' => $query->outras_avaliacoes_condicoes,
'lotacao' => [
'ocupacao' => [
'nome' => $query->createdLotacao->ocupacao->nome ?? null,
],
'profissional' => [
'nome' => $query->createdLotacao->usuario->cidadao->nome ?? null,
],
],
];
})
->values();
}
static function getClassificacaoRisco($atendimento, $datetime)
{
$classificacaoRisco = $atendimento->classificacoesRisco()
->where('created_at', '<=', $datetime)
->get()
->sortByDesc('created_at')
->first();
if ($classificacaoRisco == null)
return null;
return [
'id' => $classificacaoRisco->id,
'classificacao_risco_id' => $classificacaoRisco->classificacao_risco_id,
'nome' => $classificacaoRisco->classificacaoRisco->nome,
];
}
static function getObservacoes($atendimento)
{
return $atendimento->observacoes->map(function($query) {
return [
'dataHora' => $query->created_at->format('d/m/Y H:i:s'),
'centroCusto' => [
'setor' => [
'nome' => $query->createdCentroCusto->setor->nome ?? null,
],
],
'descricao' => $query->descricao,
'lotacao' => [
'ocupacao' => [
'nome' => $query->createdLotacao->ocupacao->nome ?? null,
],
'profissional' => [
'nome' => $query->createdLotacao->usuario->cidadao->nome ?? null,
],
],
];
})->values();
}
public function __invoke($atendimentoId)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), self::$TITLE);
}
}