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); } }