243 lines
8.9 KiB
PHP
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);
|
|
}
|
|
}
|