Files
rkm-conectasus-ci-sandbox/api/app/Http/Controllers/Impressao/ProntoAtendimento/AtendimentoMedico/EncaminhamentoHospitalarController.php
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

243 lines
8.9 KiB
PHP

<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Http\Controllers\Controller;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
use App\Utils\DataUtil;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Collection;
class EncaminhamentoHospitalarController extends Controller
{
private const TITLE = 'Encaminhamento hospitalar';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.encaminhamento-hospitalar';
public static function getTemplate(int $atendimentoId)
{
$atendimento = Atendimento::findOrFail($atendimentoId);
$atendimentoMedico = $atendimento->atendimentosMedico->last();
$paciente = $atendimento->faa->paciente;
$encaminhamentoHospitalar = $atendimentoMedico->encaminhamentoHospitalar;
$data = [
'unidade' => [
'nome' => $encaminhamentoHospitalar->updatedLotacao->infraestrutura->unidade->nome_fantasia ?? null,
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'idadeCompleta' => $paciente->cidadao->idade_formatada,
'sexo' => $paciente->cidadao->sexo->descricao,
'dataNascimento' => (new \DateTime($paciente->cidadao->data_nascimento))->format('d/m/Y'),
'telefone' => $paciente->cidadao->telefone_principal
? MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero)
: null,
'municipioNascimento' => $paciente->cidadao->municipioNascimento
? "{$paciente->cidadao->municipioNascimento->nome} / "
. $paciente->cidadao->municipioNascimento->estado->uf
: '',
'nomeMae' => $paciente->cidadao->nome_mae ?? '',
],
'encaminhamentoHospitalar' => [
'dataCadastro' => [
'porExtenso' => $encaminhamentoHospitalar->created_at->format('d \d\e F \d\e Y'),
],
'unidade' => $encaminhamentoHospitalar->unidade->nome_fantasia,
'quarto' => $encaminhamentoHospitalar->quarto ?? '',
'leito' => $encaminhamentoHospitalar->leito ?? '',
'medico_hospitalar' => $encaminhamentoHospitalar->medico_hospitalar ?? '',
'observacoes' => $encaminhamentoHospitalar->observacoes ?? '',
'profissional' => [
'nome' => $encaminhamentoHospitalar->updatedLotacao->usuario->cidadao->nome,
'cbo' => $encaminhamentoHospitalar->updatedLotacao->ocupacao->nome,
]
]
];
self::setEvolucoesMedicas($data, $atendimento);
self::setEvolucoesEnfermagem($data, $atendimento);
if (DataUtil::isStringTrue(request()->atendimento_geral)) {
self::setAtendimentosGerais($data, $atendimento);
}
else if (is_array(request()->anamnese)) {
self::setAnamneses($data, $atendimento);
}
if (DataUtil::isStringTrue(request()->imprime_cid)) {
$data['encaminhamentoHospitalar']['cid'] = $encaminhamentoHospitalar->cid
? "{$encaminhamentoHospitalar->cid->codigo} - {$encaminhamentoHospitalar->cid->nome}" : '';
}
self::setPrescricoesInternas($data, $atendimento);
$data['data_impressao'] = Carbon::now()->format('d/m/Y H:i:s');
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
private static function setEvolucoesMedicas(&$data, $atendimento)
{
if (request()->evolucao_medica !== 'ultima' && request()->evolucao_medica !== 'todas') {
return;
}
$atendimentosMedico = $atendimento->atendimentosMedico()
->whereNotNull('evolucao')
->orderByDesc('created_at');
if (request()->evolucao_medica === 'ultima') {
$atendimentosMedico->take(1);
}
$data['evolucoesMedicas'] = $atendimentosMedico->get()->map(fn ($atendimentoMedico) => [
'dataHora' => $atendimentoMedico->created_at->format('d/m/Y H:i:s'),
'profissional' => [
'nome' => $atendimentoMedico->createdLotacao->usuario->cidadao->nome,
'cbo' => $atendimentoMedico->createdLotacao->ocupacao->nome,
],
'evolucao' => $atendimentoMedico->evolucao
]);
}
private static function setEvolucoesEnfermagem(&$data, $atendimento)
{
if (request()->evolucao_enfermagem !== 'ultima' && request()->evolucao_enfermagem !== 'todas') {
return;
}
$data['evolucoesEnfermagem'] = [];
// TODO: Adicionar as evoluções de enfermagem.
}
private static function setAtendimentosGerais(&$data, $atendimento)
{
$atendimentosMedico = $atendimento->atendimentosMedico()->orderBy('created_at');
$data['atendimentosGerais'] = $atendimentosMedico->pluck('atendimento_geral');
}
private static function setAnamneses(&$data, $atendimento)
{
$atendimentosMedico = $atendimento->atendimentosMedico()->orderBy('created_at');
$plurais = [
'queixa_principal_duracao' => 'queixasPrincipaisDuracoes',
'historia' => 'historias',
'exame_fisico' => 'examesFisicos',
'diagnostico' => 'diagnosticos',
'conduta' => 'condutas',
];
$anamnese = [
'queixa_principal_duracao',
'historia',
'exame_fisico',
'diagnostico',
'conduta',
];
foreach ($anamnese as $i => $item) {
if (!in_array($item, request()->anamnese)) {
unset($anamnese[$i]);
}
}
$atendimentosMedico->get()->each(function ($atendimentoMedico) use (&$data, $plurais, $anamnese) {
foreach ($anamnese as $item) {
if (empty($atendimentoMedico->{$item})) {
continue;
}
$data[$plurais[$item]][] = $atendimentoMedico->{$item};
}
});
}
private static function setPrescricoesInternas(&$data, $atendimento)
{
if (request()->prescricao_interna !== 'ultima' && request()->prescricao_interna !== 'todas') {
return;
}
$prescricoesInternas = new Collection;
$atendimento->atendimentosMedico()->get()->each(function ($atendimentoMedico) use ($prescricoesInternas) {
$atendimentoMedico->prescricoesInternas->each(function ($prescricaoInterna) use ($prescricoesInternas) {
$prescricoesInternas->push($prescricaoInterna);
});
});
if (request()->prescricao_interna === 'ultima') {
$prescricoesInternas = $prescricoesInternas->sortByDesc('created_at')->take(1);
}
else {
$prescricoesInternas = $prescricoesInternas->sortBy('created_at');
}
$data['prescricoesInternas'] = $prescricoesInternas->map(function ($prescricaoInterna) {
$data = [
'dataHora' => $prescricaoInterna->updated_at->format('d/m/Y H:i:s'),
'profissional' => [
'nome' => $prescricaoInterna->updatedLotacao->usuario->cidadao->nome,
'cbo' => $prescricaoInterna->updatedLotacao->ocupacao->nome,
],
'viaAdministracao' => $prescricaoInterna->viaAdministracao->nome,
'doseUnica' => $prescricaoInterna->dose_unica,
'frequencia' => $prescricaoInterna->frequencia,
'observacoes' => $prescricaoInterna->observacoes ?? '',
'medicamentos' => [],
];
foreach ($prescricaoInterna->medicamentos as $medicamento) {
$data['medicamentos'][] = [
'nome' => $medicamento->medicamento->nome,
'quantidade' => $medicamento->quantidade,
'formaFarmaceutica' => $medicamento->medicamento->formaFarmaceutica->nome,
'administracao' => $medicamento->administracao,
'aplicacoes' => $medicamento->aplicacoes->map(function ($aplicacao, $index) {
return [
'aplicacao' => $index + 1,
'status' => $aplicacao->status->nome ?? null
];
}),
];
}
return $data;
});
}
public function __invoke(int $atendimentoMedicoId)
{
return (new Pdf)->stream(self::getTemplate($atendimentoMedicoId), self::TITLE);
}
}