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,121 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\Aih;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Http\Controllers\Controller;
use App\Models\ProntoAtendimento\Aih\CausaExterna;
use App\Models\ProntoAtendimento\Aih\Internacao;
use App\Models\ProntoAtendimento\Aih\VinculoPrevidencia;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use Carbon\Carbon;
class LaudoController extends Controller
{
private const TITLE = 'LAUDO PARA SOLICITAÇÃO DE AUTORIZAÇÃO DE INTERNAÇÃO HOSPITALAR';
private const TEMPLATE = 'pronto-atendimento.aih.laudo';
public static function getTemplate($id)
{
$internacao = Internacao::findOrFail($id);
$data = [
'paciente' => self::getPacienteData($internacao->paciente),
'internacao' => [
'unidade_solicitante' => [
'nome' => $internacao->unidadeSolicitante->nome_fantasia,
'cnes' => $internacao->unidadeSolicitante->cnes
],
'unidade_internacao' => [
'nome' => $internacao->unidadeInternacao->nome_fantasia,
'cnes' => $internacao->unidadeInternacao->cnes
],
'principais_sinais_sintomas_clinicos' => $internacao->principais_sinais_sintomas_clinicos,
'condicoes_que_justificam_internacao' => $internacao->condicoes_que_justificam_internacao,
'principais_resultados_de_provas_diagnosticas' => $internacao->principais_resultados_de_provas_diagnosticas,
'cid_principal' => [
'codigo' => MaskUtil::getCidMasked($internacao->cidPrincipal->codigo),
'nome' => $internacao->cidPrincipal->nome
],
'cid_secundario' => $internacao->cidSecundario
? MaskUtil::getCidMasked($internacao->cidSecundario->codigo)
: '',
'cid_causas_associadas' => $internacao->cidCausasAssociadas
? MaskUtil::getCidMasked($internacao->cidCausasAssociadas->codigo)
: '',
'procedimento' => self::getProcedimentoData($internacao->procedimento),
'causa_externa' => self::getCausaExternaData(),
]
];
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
private static function getPacienteData($paciente)
{
$cidadao = $paciente->cidadao;
return [
'nome' => $cidadao->nome,
'nome_social' => $cidadao->nome_social,
'prefere_nome_social' => $cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'prontuario' => $paciente->prontuario,
'cns' => MaskUtil::getCnsMasked($cidadao->cns),
'cpf' => MaskUtil::getCpfMasked($cidadao->cpf),
'data_nascimento' => $cidadao->data_nascimento ? $cidadao->data_nascimento->format('d/m/Y') : '',
'idade' => $cidadao->data_nascimento
? "{$cidadao->idade['anos']} ano(s) "
. "{$cidadao->idade['meses']} mês(s) "
. "{$cidadao->idade['dias']} dia(s) "
: '',
'sexo' => $cidadao->sexo->descricao,
'raca_cor' => $cidadao->racaCor->descricao ?? '',
'etnia_indigena' => $cidadao->etniaIndigena->descricao ?? '',
'nome_mae' => $cidadao->nome_mae,
'telefone' => MaskUtil::getPhoneMasked($cidadao->telefone_principal->numero ?? ''),
'endereco' => [
'completo' => $cidadao->domicilio
? "{$cidadao->domicilio->endereco->completo}, "
. MaskUtil::getCepMasked($cidadao->domicilio->endereco->logradouro->cep)
: '',
'ibge' => $cidadao->domicilio->endereco->logradouro->municipio->ibge ?? ''
]
];
}
private static function getProcedimentoData($procedimento)
{
return [
'procedimento_solicitado' => [
'codigo' => MaskUtil::getProcedimentoMasked($procedimento->procedimentoSolicitado->codigo),
'nome' => $procedimento->procedimentoSolicitado->nome
],
'data_solicitacao' => (new Carbon($procedimento->data_solicitacao))->format('d/m/Y'),
'clinica' => $procedimento->clinica->nome,
'carater_internacao' => $procedimento->caraterInternacao->nome,
'profissional_solicitante_assistente' => $procedimento->profissionalSolicitanteAssistente->cidadao->nome,
'documento' => [
'nome' => $procedimento->documentoTipo->nome,
'numero' => MaskUtil::getDocumentMasked(
$procedimento->documento_tipo_id,
$procedimento->documento_numero
)
]
];
}
private static function getCausaExternaData()
{
return [
'causas_externas' => CausaExterna::pluck('nome'),
'vinculos_previdencia' => VinculoPrevidencia::pluck('nome')
];
}
public function __invoke($id)
{
return (new Pdf)->stream(self::getTemplate($id), self::TITLE);
}
}

View File

@@ -0,0 +1,58 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\Aih;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Http\Controllers\Controller;
use App\Models\ProntoAtendimento\Aih\Internacao;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use Carbon\Carbon;
class TermoResponsabilidadeController extends Controller
{
private const TITLE = 'TERMO DE RESPONSABILIDADE PARA PROCEDIMENTO MÉDICO';
private const TEMPLATE = 'pronto-atendimento.aih.termo-responsabilidade';
public static function getTemplate($id)
{
$internacao = Internacao::findOrFail($id);
$data = [
'paciente' => [
'nome' => $internacao->paciente->cidadao->nome,
'nome_social' => $internacao->paciente->cidadao->nome_social,
'prefere_nome_social' => $internacao->paciente->cidadao
->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'data_nascimento' => $internacao->paciente->cidadao->data_nascimento
? $internacao->paciente->cidadao->data_nascimento->format('d/m/Y')
: '',
'idade' => $internacao->paciente->cidadao->data_nascimento
? "{$internacao->paciente->cidadao->idade['anos']} ano(s) "
. "{$internacao->paciente->cidadao->idade['meses']} mês(s) "
. "{$internacao->paciente->cidadao->idade['dias']} dia(s) "
: '',
'cns' => MaskUtil::getCnsMasked($internacao->paciente->cidadao->cns),
'rg' => $internacao->paciente->cidadao->carteiraIdentidade->numero ?? '',
'cpf' => MaskUtil::getCpfMasked($internacao->paciente->cidadao->cpf),
'nome_mae' => $internacao->paciente->cidadao->nome_mae,
'endereco' => $internacao->paciente->cidadao->domicilio
? "{$internacao->paciente->cidadao->domicilio->endereco->completo}, "
. MaskUtil::getCepMasked($internacao->paciente->cidadao->domicilio->endereco->logradouro->cep)
: '',
],
'internacao' => [
'unidade' => $internacao->unidadeInternacao->nome_fantasia
],
'horaAtual' => Carbon::now()->format('H:i')
];
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
public function __invoke($id)
{
return (new Pdf)->stream(self::getTemplate($id), self::TITLE);
}
}

View File

@@ -0,0 +1,149 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\ProntoAtendimento\Atendimento\Medico\AtestadoModelo;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Geral\DocumentoTipo;
use App\Models\ProntoAtendimento\Atendimento\Medico\AtendimentoMedico;
use App\Models\ProntoAtendimento\Atendimento\Recepcao;
use App\Models\Sigtap\Cid;
use App\Utils\DataUtil;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use App\Utils\NumericUtil;
use DateTime;
class AtestadoAcompanhanteController extends Controller
{
private const TITLE = 'Atestado Acompanhante';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.atestado-acompanhante';
public static function getTemplate($atendimentoId = null)
{
if ($atendimentoId) {
$atendimentoMedico = AtendimentoMedico::orderByDesc('created_at')
->where('atendimento_id', $atendimentoId)
->has('atestado')
->firstOrFail();
$recepcao = Recepcao::orderByDesc('atendido_em')
->where('atendimento_id', $atendimentoId)
->firstOrFail();
$atestado = $atendimentoMedico->atestado;
$paciente = $atendimentoMedico->atendimento->faa->paciente;
$atendido_em = new DateTime($recepcao->atendido_em);
$data = [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'cpf' => MaskUtil::getDocumentMasked(1, $paciente->cidadao->cpf),
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
],
'nomeAcompanhante' => $atestado->nome_acompanhante,
'documento' => [
'tipo' => $atestado->documentoTipo->nome,
'numero' => MaskUtil::getDocumentMasked($atestado->documento_tipo_id, $atestado->documento_numero),
],
'unidade' => [
'nome' => $atestado->updatedLotacao->infraestrutura->unidade->nome_fantasia,
],
'data' => $atendido_em->format('d/m/Y'),
'hora' => $atendido_em->format('H:i:s'),
'cid' => $atestado->imprime_cid ? $atendimentoMedico->cid->cid->codigo : '',
'afastamento_texto' => self::getAfastamentoTexto(
$atestado->modelo_id ?? AtestadoModelo::PADRAO,
$atestado->dias,
$atestado->quantidade_horas,
$atestado->horario_inicial,
),
'profissional' => [
'nome' => $atestado->updatedLotacao->usuario->cidadao->nome,
'cbo' => $atestado->updatedLotacao->ocupacao->nome,
]
];
}
else {
$paciente = Paciente::findOrFail(request()->paciente_id);
$documentoTipo = DocumentoTipo::findOrFail(request()->documento_tipo_id);
$lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'));
$atendido_em = new DateTime(request()->atendido_em);
$data = [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'cpf' => MaskUtil::getDocumentMasked(1, $paciente->cidadao->cpf),
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
],
'nomeAcompanhante' => request()->nome,
'documento' => [
'tipo' => $documentoTipo->nome,
'numero' => MaskUtil::getDocumentMasked($documentoTipo->id, request()->documento_numero),
],
'unidade' => [
'nome' => $lotacao->infraestrutura->unidade->nome_fantasia,
],
'data' => $atendido_em->format('d/m/Y'),
'hora' => $atendido_em->format('H:i:s'),
'cid' => DataUtil::isStringTrue(request()->imprime_cid) && request()->cid_id
? Cid::findOrFail(request()->cid_id)->codigo : '',
'afastamento_texto' => self::getAfastamentoTexto(
request()->modelo_id ?? AtestadoModelo::PADRAO,
request()->dias,
request()->quantidade_horas,
request()->horario_inicial,
),
'profissional' => [
'nome' => $lotacao->usuario->cidadao->nome,
'cbo' => $lotacao->ocupacao->nome,
]
];
}
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
private static function getAfastamentoTexto($modeloId, $dias, $quantidadeHoras, $horarioInicial)
{
switch ((int) $modeloId) {
case AtestadoModelo::PERIODO_MANHA:
return 'Em decorrencia, devera permanecer em afastamento de suas atividades laborativas no periodo da manha.';
case AtestadoModelo::PERIODO_TARDE:
return 'Em decorrencia, devera permanecer em afastamento de suas atividades laborativas no periodo da tarde.';
case AtestadoModelo::PERIODO_NOITE:
return 'Em decorrencia, devera permanecer em afastamento de suas atividades laborativas no periodo da noite.';
case AtestadoModelo::QUANTIDADE_HORAS:
if (is_null($quantidadeHoras) || is_null($horarioInicial)) {
return '';
}
$horario = (new DateTime($horarioInicial))->format('H:i');
$horasPorExtenso = NumericUtil::getPorExtenso($quantidadeHoras);
return "Em decorrencia, devera permanecer em afastamento de suas atividades laborativas por um periodo de {$quantidadeHoras} ({$horasPorExtenso}) hora(s), a partir das {$horario} hora(s).";
default:
if (is_null($dias)) {
return '';
}
$diasPorExtenso = NumericUtil::getPorExtenso($dias);
$sufixoDia = (int) $dias > 1 ? 's' : '';
return "Em decorrencia, devera permanecer em afastamento de suas atividades laborativas por um periodo de {$dias} ({$diasPorExtenso}) dia{$sufixoDia} a partir desta data.";
}
}
public function __invoke($atendimentoId = null)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), 'atestado');
}
}

View File

@@ -0,0 +1,145 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\ProntoAtendimento\Atendimento\Medico\AtestadoModelo;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Geral\DocumentoTipo;
use App\Models\ProntoAtendimento\Atendimento\Medico\AtendimentoMedico;
use App\Models\ProntoAtendimento\Atendimento\Recepcao;
use App\Models\Sigtap\Cid;
use App\Utils\DataUtil;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use App\Utils\NumericUtil;
use DateTime;
class AtestadoController extends Controller
{
private const TITLE = 'Atestado';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.atestado';
public static function getTemplate($atendimentoId = null)
{
if ($atendimentoId) {
$atendimentoMedico = AtendimentoMedico::orderByDesc('created_at')
->where('atendimento_id', $atendimentoId)
->has('atestado')
->firstOrFail();
$recepcao = Recepcao::orderByDesc('atendido_em')
->where('atendimento_id', $atendimentoId)
->firstOrFail();
$atestado = $atendimentoMedico->atestado;
$paciente = $atendimentoMedico->atendimento->faa->paciente;
$atendido_em = new DateTime($recepcao->atendido_em);
$data = [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
],
'documento' => [
'tipo' => $atestado->documentoTipo->nome,
'numero' => MaskUtil::getDocumentMasked($atestado->documento_tipo_id, $atestado->documento_numero),
],
'unidade' => [
'nome' => $atestado->updatedLotacao->infraestrutura->unidade->nome_fantasia,
],
'data' => $atendido_em->format('d/m/Y'),
'hora' => $atendido_em->format('H:i:s'),
'cid' => $atestado->imprime_cid ? $atendimentoMedico->cid->cid->codigo : '',
'afastamento_texto' => self::getAfastamentoTexto(
$atestado->modelo_id ?? AtestadoModelo::PADRAO,
$atestado->dias,
$atestado->quantidade_horas,
$atestado->horario_inicial,
),
'profissional' => [
'nome' => $atestado->updatedLotacao->usuario->cidadao->nome,
'cbo' => $atestado->updatedLotacao->ocupacao->nome,
]
];
}
else {
$paciente = Paciente::findOrFail(request()->paciente_id);
$documentoTipo = DocumentoTipo::findOrFail(request()->documento_tipo_id);
$lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'));
$atendido_em = new DateTime(request()->atendido_em);
$data = [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
],
'documento' => [
'tipo' => $documentoTipo->nome,
'numero' => MaskUtil::getDocumentMasked($documentoTipo->id, request()->documento_numero),
],
'unidade' => [
'nome' => $lotacao->infraestrutura->unidade->nome_fantasia,
],
'data' => $atendido_em->format('d/m/Y'),
'hora' => $atendido_em->format('H:i:s'),
'cid' => DataUtil::isStringTrue(request()->imprime_cid) && request()->cid_id
? Cid::findOrFail(request()->cid_id)->codigo : '',
'afastamento_texto' => self::getAfastamentoTexto(
request()->modelo_id ?? AtestadoModelo::PADRAO,
request()->dias,
request()->quantidade_horas,
request()->horario_inicial,
),
'profissional' => [
'nome' => $lotacao->usuario->cidadao->nome,
'cbo' => $lotacao->ocupacao->nome,
]
];
}
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
private static function getAfastamentoTexto($modeloId, $dias, $quantidadeHoras, $horarioInicial)
{
switch ((int) $modeloId) {
case AtestadoModelo::PERIODO_MANHA:
return 'Em decorrencia, devera permanecer em afastamento de suas atividades laborativas no periodo da manha.';
case AtestadoModelo::PERIODO_TARDE:
return 'Em decorrencia, devera permanecer em afastamento de suas atividades laborativas no periodo da tarde.';
case AtestadoModelo::PERIODO_NOITE:
return 'Em decorrencia, devera permanecer em afastamento de suas atividades laborativas no periodo da noite.';
case AtestadoModelo::QUANTIDADE_HORAS:
if (is_null($quantidadeHoras) || is_null($horarioInicial)) {
return '';
}
$horario = (new DateTime($horarioInicial))->format('H:i');
$horasPorExtenso = NumericUtil::getPorExtenso($quantidadeHoras);
return "Em decorrencia, devera permanecer em afastamento de suas atividades laborativas por um periodo de {$quantidadeHoras} ({$horasPorExtenso}) hora(s), a partir das {$horario} hora(s).";
default:
if (is_null($dias)) {
return '';
}
$diasPorExtenso = NumericUtil::getPorExtenso($dias);
$sufixoDia = (int) $dias > 1 ? 's' : '';
return "Em decorrencia, devera permanecer em afastamento de suas atividades laborativas por um periodo de {$dias} ({$diasPorExtenso}) dia{$sufixoDia} a partir desta data.";
}
}
public function __invoke($atendimentoId = null)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), 'atestado');
}
}

View File

@@ -0,0 +1,235 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Enums\ProntoAtendimento\Atendimento\Medico\DeclaracaoComparecimentoTipo;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Geral\DocumentoTipo;
use App\Models\ProntoAtendimento\Atendimento\Medico\DeclaracaoComparecimento;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use Carbon\Carbon;
class DeclaracaoComparecimentoAcompanhanteController extends Controller
{
private const TITLE = 'Declaração de comparecimento do acompanhante';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.declaracao-comparecimento-acompanhante';
public static function getTemplate($atendimentoId = null)
{
$declaracoes = $atendimentoId
? DeclaracaoComparecimento::orderByDesc('created_at')
->where(function($query) use ($atendimentoId) {
$query
->whereHas('atendimentoMedico', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->orWhereHas('atendimentoEnfermagem', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->orWhereHas('pacienteObservacao', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->orWhereHas('atendimentoTriagem', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->orWhereHas('atendimentoExameImagem', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->orWhereHas('recepcao', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
});
})
->where('tipo_id', DeclaracaoComparecimentoTipo::ACOMPANHANTE)
->get()
: request()->declaracoes;
$now = new \DateTime;
$data['declaracoes'] = [];
foreach ($declaracoes as $declaracao) {
if ((is_array($declaracao) && is_numeric($declaracao['id'] ?? null))
|| $declaracao instanceof DeclaracaoComparecimento
) {
if (!($declaracao instanceof DeclaracaoComparecimento)) {
$declaracao = DeclaracaoComparecimento::findOrFail($declaracao['id']);
}
$paciente = self::getPaciente($declaracao);
$profissioanal = self::getProfissional($declaracao);
$data['declaracoes'][] = [
'acompanhante' => [
'nome' => $declaracao->nome,
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'sexoMasculino' => $paciente->cidadao->sexo->id === Sexo::MASCULINO
|| $paciente->cidadao->sexo->base_id === Sexo::MASCULINO,
],
'documento' => [
'tipo' => $declaracao->documentoTipo->nome,
'numero' => MaskUtil::getDocumentMasked($declaracao->documento_tipo_id, $declaracao->documento_numero),
],
'unidade' => [
'nome' => $declaracao->updatedLotacao->infraestrutura->unidade->nome_fantasia,
],
'de' => $declaracao->de->format('H:i (d/m/Y)'),
'ate' => $declaracao->ate->format('H:i (d/m/Y)'),
'motivo' => $declaracao->motivo,
'profissional' => [
'nome' => $profissioanal->updatedLotacao->usuario->cidadao->nome,
'cbo' => $profissioanal->updatedLotacao->ocupacao->nome,
],
];
}
else {
$paciente = Paciente::findOrFail(request()->paciente_id);
$lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'));
$documentoTipo = DocumentoTipo::findOrFail($declaracao['documento_tipo_id']);
$data['declaracoes'][] = [
'acompanhante' => [
'nome' => $declaracao['nome'],
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'sexoMasculino' => $paciente->cidadao->sexo->id === Sexo::MASCULINO
|| $paciente->cidadao->sexo->base_id === Sexo::MASCULINO,
],
'documento' => [
'tipo' => $documentoTipo->nome,
'numero' => MaskUtil::getDocumentMasked($documentoTipo->id, $declaracao['documento_numero']),
],
'unidade' => [
'nome' => $lotacao->infraestrutura->unidade->nome_fantasia,
],
'de' => Carbon::createFromFormat('Y-m-d H:i', $declaracao['de'])->format('H:i (d/m/Y)'),
'ate' => Carbon::createFromFormat('Y-m-d H:i', $declaracao['ate'])->format('H:i (d/m/Y)'),
'motivo' => $declaracao['motivo'],
'profissional' => [
'nome' => $lotacao->usuario->cidadao->nome,
'cbo' => $lotacao->ocupacao->nome,
],
];
}
}
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
public static function getPaciente($declaracao) {
$paciente = $declaracao->atendimentoMedico
? $declaracao->atendimentoMedico->atendimento->faa->paciente
: null;
if (!$paciente) {
$paciente = $declaracao->atendimentoEnfermagem
? $declaracao->atendimentoEnfermagem->atendimento->faa->paciente
: null;
}
if (!$paciente) {
$paciente = $declaracao->atendimentoTriagem
? $declaracao->atendimentoTriagem->atendimento->faa->paciente
: null;
}
if (!$paciente) {
$paciente = $declaracao->pacienteObservacao
? $declaracao->pacienteObservacao->atendimento->faa->paciente
: null;
}
if (!$paciente) {
$paciente = $declaracao->pacienteObservacao
? $declaracao->pacienteObservacao->atendimento->faa->paciente
: null;
}
if (!$paciente) {
$paciente = $declaracao->atendimentoExameImagem
? $declaracao->atendimentoExameImagem->atendimento->faa->paciente
: null;
}
if (!$paciente) {
$paciente = $declaracao->recepcao
? $declaracao->recepcao->atendimento->faa->paciente
: null;
}
return $paciente;
}
public static function getProfissional($declaracao) {
$profissional = $declaracao->atendimentoMedico
? $declaracao->atendimentoMedico
: null;
if (!$profissional) {
$profissional = $declaracao->atendimentoEnfermagem
? $declaracao->atendimentoEnfermagem
: null;
}
if (!$profissional) {
$profissional = $declaracao->atendimentoTriagem
? $declaracao->atendimentoTriagem
: null;
}
if (!$profissional) {
$profissional = $declaracao->pacienteObservacao
? $declaracao->pacienteObservacao
: null;
}
if (!$profissional) {
$profissional = $declaracao->atendimentoExameImagem
? $declaracao->atendimentoExameImagem
: null;
}
if (!$profissional) {
$profissional = $declaracao->recepcao
? $declaracao->recepcao
: null;
}
return $profissional;
}
public function __invoke($atendimentoId = null)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), 'declaracao-comparecimento-acompanhante');
}
}

View File

@@ -0,0 +1,235 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
use App\Enums\ProntoAtendimento\Atendimento\Medico\DeclaracaoComparecimentoTipo;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Geral\DocumentoTipo;
use App\Models\ProntoAtendimento\Atendimento\Medico\DeclaracaoComparecimento;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use Carbon\Carbon;
class DeclaracaoComparecimentoPacienteController extends Controller
{
private const TITLE = 'Declaração de comparecimento do paciente';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.declaracao-comparecimento';
public static function getTemplate($atendimentoId = null)
{
$declaracoes = $atendimentoId
? DeclaracaoComparecimento::orderByDesc('created_at')
->where(function($query) use ($atendimentoId) {
$query
->whereHas('atendimentoMedico', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->orWhereHas('atendimentoEnfermagem', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->orWhereHas('pacienteObservacao', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->orWhereHas('atendimentoTriagem', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->orWhereHas('atendimentoExameImagem', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->orWhereHas('recepcao', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
});
})
->where('tipo_id', DeclaracaoComparecimentoTipo::PACIENTE)
->get()
: request()->declaracoes;
$now = new \DateTime;
$data['declaracoes'] = [];
foreach ($declaracoes as $declaracao) {
if ((is_array($declaracao) && is_numeric($declaracao['id'] ?? null))
|| $declaracao instanceof DeclaracaoComparecimento
) {
if (!($declaracao instanceof DeclaracaoComparecimento)) {
$declaracao = DeclaracaoComparecimento::findOrFail($declaracao['id']);
}
$paciente = self::getPaciente($declaracao);
$profissioanal = self::getProfissional($declaracao);
$data['declaracoes'][] = [
'acompanhante' => [
'nome' => $declaracao->nome,
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'sexoMasculino' => $paciente->cidadao->sexo->id === Sexo::MASCULINO
|| $paciente->cidadao->sexo->base_id === Sexo::MASCULINO,
],
'documento' => [
'tipo' => $declaracao->documentoTipo->nome,
'numero' => MaskUtil::getDocumentMasked($declaracao->documento_tipo_id, $declaracao->documento_numero),
],
'unidade' => [
'nome' => $declaracao->updatedLotacao->infraestrutura->unidade->nome_fantasia,
],
'de' => $declaracao->de->format('H:i (d/m/Y)'),
'ate' => $declaracao->ate->format('H:i (d/m/Y)'),
'motivo' => $declaracao->motivo,
'profissional' => [
'nome' => $profissioanal->updatedLotacao->usuario->cidadao->nome,
'cbo' => $profissioanal->updatedLotacao->ocupacao->nome,
],
];
}
else {
$paciente = Paciente::findOrFail(request()->paciente_id);
$lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'));
$documentoTipo = DocumentoTipo::findOrFail($declaracao['documento_tipo_id']);
$data['declaracoes'][] = [
'acompanhante' => [
'nome' => $declaracao['nome'],
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'sexoMasculino' => $paciente->cidadao->sexo->id === Sexo::MASCULINO
|| $paciente->cidadao->sexo->base_id === Sexo::MASCULINO,
],
'documento' => [
'tipo' => $documentoTipo->nome,
'numero' => MaskUtil::getDocumentMasked($documentoTipo->id, $declaracao['documento_numero']),
],
'unidade' => [
'nome' => $lotacao->infraestrutura->unidade->nome_fantasia,
],
'de' => Carbon::createFromFormat('Y-m-d H:i', $declaracao['de'])->format('H:i (d/m/Y)'),
'ate' => Carbon::createFromFormat('Y-m-d H:i', $declaracao['ate'])->format('H:i (d/m/Y)'),
'motivo' => $declaracao['motivo'],
'profissional' => [
'nome' => $lotacao->usuario->cidadao->nome,
'cbo' => $lotacao->ocupacao->nome,
],
];
}
}
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
public static function getPaciente($declaracao) {
$paciente = $declaracao->atendimentoMedico
? $declaracao->atendimentoMedico->atendimento->faa->paciente
: null;
if (!$paciente) {
$paciente = $declaracao->atendimentoEnfermagem
? $declaracao->atendimentoEnfermagem->atendimento->faa->paciente
: null;
}
if (!$paciente) {
$paciente = $declaracao->atendimentoTriagem
? $declaracao->atendimentoTriagem->atendimento->faa->paciente
: null;
}
if (!$paciente) {
$paciente = $declaracao->pacienteObservacao
? $declaracao->pacienteObservacao->atendimento->faa->paciente
: null;
}
if (!$paciente) {
$paciente = $declaracao->pacienteObservacao
? $declaracao->pacienteObservacao->atendimento->faa->paciente
: null;
}
if (!$paciente) {
$paciente = $declaracao->atendimentoExameImagem
? $declaracao->atendimentoExameImagem->atendimento->faa->paciente
: null;
}
if (!$paciente) {
$paciente = $declaracao->recepcao
? $declaracao->recepcao->atendimento->faa->paciente
: null;
}
return $paciente;
}
public static function getProfissional($declaracao) {
$profissional = $declaracao->atendimentoMedico
? $declaracao->atendimentoMedico
: null;
if (!$profissional) {
$profissional = $declaracao->atendimentoEnfermagem
? $declaracao->atendimentoEnfermagem
: null;
}
if (!$profissional) {
$profissional = $declaracao->atendimentoTriagem
? $declaracao->atendimentoTriagem
: null;
}
if (!$profissional) {
$profissional = $declaracao->pacienteObservacao
? $declaracao->pacienteObservacao
: null;
}
if (!$profissional) {
$profissional = $declaracao->atendimentoExameImagem
? $declaracao->atendimentoExameImagem
: null;
}
if (!$profissional) {
$profissional = $declaracao->recepcao
? $declaracao->recepcao
: null;
}
return $profissional;
}
public function __invoke($atendimentoId = null)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), 'declaracao-comparecimento-paciente');
}
}

View File

@@ -0,0 +1,242 @@
<?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);
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Http\Controllers\Controller;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
class EvolucaoAndPrescricaoInternaController extends Controller
{
private const TITLE = 'Evolução médica/prescrição interna';
private const FILE_NAME = 'Evolução médica + prescrição interna';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.evolucao-prescricao';
public static function getTemplate(int $atendimentoMedicoId, int $prescricaoInternaId)
{
$templateEvolucaoMedica = EvolucaoController::getTemplate($atendimentoMedicoId, true);
$templatePrescricaoInterna = PrescricaoInternaController::getTemplate($prescricaoInternaId, true);
return Template::make(self::TITLE, self::TEMPLATE)
->withData(['conteudo' => $templateEvolucaoMedica . $templatePrescricaoInterna])
->getHtml();
}
public function __invoke(int $atendimentoMedicoId, int $prescricaoInternaId)
{
return (new Pdf)->stream(self::getTemplate($atendimentoMedicoId, $prescricaoInternaId), self::FILE_NAME);
}
}

View File

@@ -0,0 +1,46 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Http\Controllers\Controller;
use App\Models\ProntoAtendimento\Atendimento\Medico\AtendimentoMedico;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
class EvolucaoController extends Controller
{
private const TITLE = 'Evolução médica';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.evolucao-medica';
public static function getTemplate(int $atendimentoMedicoId, bool $onlyContent = false)
{
$atendimentoMedico = AtendimentoMedico::findOrFail($atendimentoMedicoId);
$evolucoes = [];
$atendimentoMedico->atendimento->atendimentosMedico()
->whereNotNull('evolucao')
->orderByDesc('created_at')
->get()
->each(function ($atendimentoMedico) use (&$evolucoes) {
$evolucoes[] = [
'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
];
});
$template = $onlyContent ? self::TEMPLATE . '-conteudo' : self::TEMPLATE;
return Template::make(self::TITLE, $template)->withData(compact('evolucoes'))->getHtml();
}
public function __invoke(int $atendimentoMedicoId)
{
return (new Pdf)->stream(self::getTemplate($atendimentoMedicoId), self::TITLE);
}
}

View File

@@ -0,0 +1,143 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\ProntoAtendimento\Atendimento\Medico\Encaminhamento;
use App\Models\Sigtap\Cid;
use App\Models\Sigtap\Ocupacao;
use App\Utils\DataUtil;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
class GuiaEncaminhamentoController extends Controller
{
private const TITLE = 'Guia de encaminhamento';
private const SUBTITLE = 'Referência';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.guia-encaminhamento';
public static function getTemplate($atendimentoId = null)
{
$encaminhamentos = $atendimentoId
? Encaminhamento::orderByDesc('created_at')
->whereHas('atendimentoMedico', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->get()
: request()->encaminhamentos;
$data['encaminhamentos'] = [];
foreach ($encaminhamentos as $encaminhamento) {
if ((is_array($encaminhamento) && is_numeric($encaminhamento['id'] ?? null))
|| $encaminhamento instanceof Encaminhamento
) {
if (!($encaminhamento instanceof Encaminhamento)) {
$encaminhamento = Encaminhamento::findOrFail($encaminhamento['id']);
}
$paciente = $encaminhamento->atendimentoMedico->atendimento->faa->paciente;
$cid = "{$encaminhamento->atendimentoMedico->cid->cid->codigo} - "
. $encaminhamento->atendimentoMedico->cid->cid->nome;
$data['encaminhamentos'][] = [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'cns' => $paciente->cidadao->cns,
'sexo' => $paciente->cidadao->sexo->descricao,
'idadeCompleta' => $paciente->cidadao->idade_formatada,
'dataNascimento' => $paciente->cidadao->data_nascimento
? (new \DateTime($paciente->cidadao->data_nascimento))->format('d/m/Y')
: null,
'telefone' => $paciente->cidadao->telefone_principal
? MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero)
: null,
'prontuarioUnidade' => $paciente->prontuario_unidade,
'nomeMae' => $paciente->cidadao->nome_mae,
'municipioNascimento' => $paciente->cidadao->municipioNascimento
? "{$paciente->cidadao->municipioNascimento->nome} / "
. $paciente->cidadao->municipioNascimento->estado->uf
: '',
],
'unidade' => [
'nome' => $encaminhamento->updatedLotacao->infraestrutura->unidade->nome_fantasia,
'cnes' => $encaminhamento->updatedLotacao->infraestrutura->unidade->cnes,
],
'profissional' => [
'nome' => $encaminhamento->updatedLotacao->usuario->cidadao->nome,
'cbo' => $encaminhamento->updatedLotacao->ocupacao->nome,
'cns' => $encaminhamento->updatedLotacao->usuario->cidadao->cns,
],
'cbo' => $encaminhamento->ocupacao->nome,
'cid' => $cid,
'urgente' => $encaminhamento->urgente,
'motivo' => $encaminhamento->motivo,
'observacoes' => $encaminhamento->observacoes ?? ''
];
}
else {
$paciente = Paciente::findOrFail(request()->paciente_id);
$cid = request()->cid_id ? Cid::findOrFail(request()->cid_id) : null;
$lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'));
$data['encaminhamentos'][] = [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'cns' => $paciente->cidadao->cns,
'sexo' => $paciente->cidadao->sexo->descricao,
'idadeCompleta' => $paciente->cidadao->idade_formatada,
'dataNascimento' => $paciente->cidadao->data_nascimento
? (new \DateTime($paciente->cidadao->data_nascimento))->format('d/m/Y')
: null,
'telefone' => $paciente->cidadao->telefone_principal
? MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero)
: null,
'prontuarioUnidade' => $paciente->prontuario_unidade,
'nomeMae' => $paciente->cidadao->nome_mae,
'municipioNascimento' => $paciente->cidadao->municipioNascimento
? "{$paciente->cidadao->municipioNascimento->nome} / "
. $paciente->cidadao->municipioNascimento->estado->uf
: '',
],
'unidade' => [
'nome' => $lotacao->infraestrutura->unidade->nome_fantasia,
'cnes' => $lotacao->infraestrutura->unidade->cnes,
],
'profissional' => [
'nome' => $lotacao->usuario->cidadao->nome,
'cbo' => $lotacao->ocupacao->nome,
'cns' => $lotacao->usuario->cidadao->cns,
],
'cbo' => Ocupacao::findOrFail($encaminhamento['ocupacao_id'])->nome,
'cid' => $cid ? "{$cid->codigo} - {$cid->nome}" : '',
'urgente' => DataUtil::getBooleanValueFromStringBoolean($encaminhamento['urgente']),
'motivo' => $encaminhamento['motivo'],
'observacoes' => $encaminhamento['observacoes'] ?? ''
];
}
}
return Template::make(self::TITLE, self::TEMPLATE)
->withSubtitle(self::SUBTITLE)
->withData($data)
->getHtml();
}
public function __invoke($atendimentoId = null)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), 'guia-encaminhamento');
}
}

View File

@@ -0,0 +1,56 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\ProntoAtendimento\Atendimento\Medico\AtendimentoMedico;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use Carbon\Carbon;
class OrientacoesController extends Controller
{
private const TITLE = 'Orientações ao paciente';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.orientacoes-medicas';
public static function getTemplate($atendimentoId = null)
{
if ($atendimentoId) {
$atendimentoMedico = AtendimentoMedico::orderByDesc('created_at')
->where('atendimento_id', $atendimentoId)
->whereNotNull('orientacoes')
->firstOrFail();
$data = [
'orientacoes' => $atendimentoMedico->orientacoes,
'dataHora' => $atendimentoMedico->updated_at->format('d/m/Y H:i:s'),
'profissional' => [
'nome' => $atendimentoMedico->updatedLotacao->usuario->cidadao->nome,
'cbo' => $atendimentoMedico->updatedLotacao->ocupacao->nome,
]
];
}
else {
$lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'));
$data = [
'orientacoes' => request()->orientacoes,
'dataHora' => Carbon::now()->format('d/m/Y H:i:s'),
'profissional' => [
'nome' => $lotacao->usuario->cidadao->nome,
'cbo' => $lotacao->ocupacao->nome,
]
];
}
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
public function __invoke($atendimentoId = null)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), 'orientacoes');
}
}

View File

@@ -0,0 +1,130 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Http\Controllers\Controller;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
use App\Models\ProntoAtendimento\Atendimento\AvaliacaoAntropometrica;
use App\Models\ProntoAtendimento\Atendimento\PrescricaoInterna;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
class PrescricaoInternaController extends Controller
{
private const TITLE = 'Prescrição interna';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.prescricao-interna';
public static function getTemplate($atendimentoId, bool $onlyContent = false)
{
$prescricao = [];
$prescricao = array_map(function ($atendimento){
return $atendimento['id'];
}, request()->atendimentos);
$prescricoesInternas = PrescricaoInterna::orderByDesc('created_at')
->whereHas('atendimentoMedico', function ($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->whereIn('atendimento_medico_id', $prescricao)
->get();
$avaliacaoAntropometrica = AvaliacaoAntropometrica::where('atendimento_id', $atendimentoId)
->orderByDesc('created_at')
->first();
$massa = empty($avaliacaoAntropometrica->massa ?? null)
? ''
: "{$avaliacaoAntropometrica->massa} {$avaliacaoAntropometrica->massaUnidadeMedida->sigla}";
$altura = empty($avaliacaoAntropometrica->altura ?? null)
? ''
: "{$avaliacaoAntropometrica->altura} {$avaliacaoAntropometrica->alturaUnidadeMedida->sigla}";
$data['paciente'] = self::getPacienteData(Atendimento::findOrFail($atendimentoId));
$data['avaliacaoAntropometrica'] = [
'massa' => $massa,
'altura' => $altura,
];
$data['prescricoesInternas'] = [];
foreach ($prescricoesInternas as $key => $prescricaoInterna) {
$avaliacaoAntropometrica = $prescricaoInterna->atendimentoMedico->avaliacaoAntropometrica;
$massa = empty($avaliacaoAntropometrica->massa ?? null)
? ''
: "{$avaliacaoAntropometrica->massa} {$avaliacaoAntropometrica->massaUnidadeMedida->sigla}";
$data['prescricoesInternas'][$key] = [
'massa' => $massa,
'dataHora' => $prescricaoInterna->updated_at->format('d/m/Y H:i:s'),
'profissional' => [
'nome' => $prescricaoInterna->updatedLotacao->usuario->cidadao->nome,
'cbo' => $prescricaoInterna->updatedLotacao->ocupacao->nome,
],
'doseUnica' => $prescricaoInterna->dose_unica,
'frequencia' => $prescricaoInterna->frequencia,
'observacoes' => $prescricaoInterna->observacoes ?? '',
'medicamentos' => [],
'id' => $prescricaoInterna->id,
'atendimento_medico_id' => $prescricaoInterna->atendimento_medico_id,
];
foreach ($prescricaoInterna->medicamentos as $medicamento) {
$data['prescricoesInternas'][$key]['medicamentos'][] = [
'nome' => $medicamento->medicamento->nome,
'quantidade' => $medicamento->quantidade,
'formaFarmaceutica' => $medicamento->medicamento->formaFarmaceutica->nome,
'administracao' => $medicamento->administracao,
];
}
}
$template = $onlyContent ? self::TEMPLATE . '-conteudo' : self::TEMPLATE;
return Template::make(self::TITLE, $template)->withData($data)->getHtml();
}
private static function getPacienteData($atendimento)
{
$paciente = $atendimento->faa->paciente;
$cidadao = $paciente->cidadao;
$gestacao = $atendimento->gestacoes->sortByDesc('created_at')->first();
return [
'nome' => $cidadao->nome,
'nome_social' => $cidadao->nome_social,
'prontuario' => $paciente->prontuario,
'cns' => $cidadao->cns ? MaskUtil::getCnsMasked($cidadao->cns) : 'NÃO INFORMADO',
'cpf' => $cidadao->cpf ? MaskUtil::getCpfMasked($cidadao->cpf) : 'NÃO INFORMADO',
'sexo' => $cidadao->sexo->descricao,
'data_nascimento' => $cidadao->data_nascimento
? $cidadao->data_nascimento->format('d/m/Y')
: 'NÃO INFORMADA',
'idade' => $cidadao->data_nascimento
? "{$cidadao->idade['anos']} ano(s), "
. "{$cidadao->idade['meses']} mês(es) e "
. "{$cidadao->idade['dias']} dia(s) "
: 'NÃO INFORMADA',
'idade_gestacional' => $gestacao && $gestacao->idade_gestacional
? "{$gestacao->idade_gestacional['semanas']} semana(s) e {$gestacao->idade_gestacional['dias']} dia(s)"
: null,
'nome_mae' => $cidadao->nome_mae ?? 'NÃO INFORMADO',
'endereco' => $cidadao->domicilio
? "{$cidadao->domicilio->endereco->completo}, "
. MaskUtil::getCepMasked($cidadao->domicilio->endereco->logradouro->cep)
: 'NÃO INFORMADO',
'telefones' => $cidadao->telefones->map(fn ($t) => MaskUtil::getPhoneMasked($t->numero))->all(),
];
}
public function __invoke(int $atendimentoId)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), 'prescricao-interna');
}
}

View File

@@ -0,0 +1,227 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Enums\Cadastro\Medicamento\TipoReceita;
use App\Enums\Cadastro\Medicamento\ViaAdministracao;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\Cadastro\SujeitoAtencao\TipoRegistroUsuario;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\ProntoAtendimento\Atendimento\Medico\Receita;
use App\Models\ProntoAtendimento\Atendimento\Medico\ReceitaMedicamento;
use App\Utils\DataUtil;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use Carbon\Carbon;
class ReceitaController extends Controller
{
private const TITLE = 'Receita médica';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.receita-medica';
public static function getTemplate($atendimentoId = null, $params = [])
{
$receitasIds = $params['receitas_ids'] ?? [];
$params['para_assinatura_eletronica'] = $params['para_assinatura_eletronica'] ?? false;
$paraAssinaturaEletronica = $params['para_assinatura_eletronica'] === true
|| (DataUtil::isStringBoolean($params['para_assinatura_eletronica'])
&& DataUtil::isStringTrue($params['para_assinatura_eletronica']));
$receitas = $atendimentoId
? Receita::orderByDesc('created_at')
->whereHas('medicamentos')
->whereHas('atendimentoMedico', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->when(!empty($receitasIds), fn ($q) => $q->whereIn('id', $receitasIds))
->get()
: request()->receitas;
$data['receitas'] = [];
$data['exibirAssinatura'] = !$paraAssinaturaEletronica;
foreach ($receitas as $key => $receita) {
if ((is_array($receita) && is_numeric($receita['id'] ?? null))
|| $receita instanceof Receita
) {
if (!($receita instanceof Receita)) {
$receita = Receita::findOrFail($receita['id']);
}
$paciente = $receita->atendimentoMedico->atendimento->faa->paciente;
$enderecoPaciente = $paciente->cidadao->domicilio
? "{$paciente->cidadao->domicilio->endereco->completo} - "
. MaskUtil::getCepMasked($paciente->cidadao->domicilio->endereco->logradouro->cep)
: '';
$data['receitas'][$key] = [
'isEspecial' => false,
'profissional' => [
'nome' => $receita->updatedLotacao->usuario->cidadao->nome,
'cbo' => $receita->updatedLotacao->ocupacao->nome,
'documento' => $receita->updatedLotacao->usuario->registro_tipo_id
? ($receita->updatedLotacao->usuario->registro_tipo_id === TipoRegistroUsuario::OUTRO
? $receita->updatedLotacao->usuario->registro_tipo_outro
: $receita->updatedLotacao->usuario->registroTipo->sigla
) . ": {$receita->updatedLotacao->usuario->registro_numero}"
: 'Conselho profissional: NÃO INFORMADO',
],
'unidade' => [
'endereco' => $receita->updatedLotacao->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($receita->updatedLotacao->infraestrutura->telefone),
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'endereco' => $enderecoPaciente,
'telefone' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null),
],
'dataCadastro' => [
'porExtenso' => $receita->created_at->translatedFormat('d \de F \de Y'),
],
'medicamentos' => [],
];
$medicamentos = $receita->medicamentos->where('medicamento.receita_tipo_id', TipoReceita::COMUM);
foreach ($medicamentos as $medicamento) {
$data['receitas'][$key]['medicamentos'][] = [
'nome' => $medicamento->medicamento->nome,
'usoContinuo' => $medicamento->uso_continuo,
'doseUnica' => $medicamento->dose_unica,
'livre' => $medicamento->livre,
'viaAdministracao' => $medicamento->medicamento->via_administracao_id === ViaAdministracao::OUTRAS
? $medicamento->via_administracao_outras
: $medicamento->medicamento->viaAdministracao->nome,
'posologia' => $medicamento->livre ? $medicamento->descricao : $medicamento->posologia,
'recomendacoes' => $medicamento->recomendacoes ?? '',
'descricao' => $medicamento->descricao ?? ''
];
}
$medicamentosManuais = $receita->medicamentos->whereNotNull('medicamento_manual');
foreach ($medicamentosManuais as $medicamentoManual) {
$data['receitas'][$key]['medicamentos'][] = [
'medicamento_manual' => $medicamentoManual->medicamento_manual,
'usoContinuo' => $medicamentoManual->uso_continuo,
'doseUnica' => $medicamentoManual->dose_unica,
'livre' => $medicamentoManual->livre,
'viaAdministracao' => null,
'posologia' => $medicamentoManual->livre ? $medicamentoManual->descricao : $medicamentoManual->posologia,
'recomendacoes' => $medicamentoManual->recomendacoes ?? '',
'descricao' => $medicamentoManual->descricao ?? ''
];
}
$prescricoesManuais = $receita->medicamentos->whereNotNull('prescricao_manual');
foreach ($prescricoesManuais as $prescricaoManual) {
$data['receitas'][$key]['medicamentos'][] = [
'prescricao_manual' => $prescricaoManual->prescricao_manual,
];
}
}
else {
$paciente = Paciente::findOrFail(request()->paciente_id);
$lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'));
$enderecoPaciente = $paciente->cidadao->domicilio
? "{$paciente->cidadao->domicilio->endereco->completo} - "
. MaskUtil::getCepMasked($paciente->cidadao->domicilio->endereco->logradouro->cep)
: '';
$data['receitas'][$key] = [
'isEspecial' => false,
'profissional' => [
'nome' => $lotacao->usuario->cidadao->nome,
'cbo' => $lotacao->ocupacao->nome,
'documento' => $lotacao->usuario->registro_tipo_id
? ($lotacao->usuario->registro_tipo_id === TipoRegistroUsuario::OUTRO
? $lotacao->usuario->registro_tipo_outro
: $lotacao->usuario->registroTipo->sigla
) . ": {$lotacao->usuario->registro_numero}"
: 'Conselho profissional: NÃO INFORMADO',
],
'unidade' => [
'endereco' => $lotacao->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($lotacao->infraestrutura->telefone),
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'endereco' => $enderecoPaciente,
'telefone' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null),
],
'dataCadastro' => [
'porExtenso' => Carbon::now()->translatedFormat('d \de F \de Y'),
],
'medicamentos' => [],
];
foreach ($receita['medicamentos'] as $medicamento) {
$medicamento = new ReceitaMedicamento($medicamento);
if ($medicamento->medicamento && $medicamento->medicamento->receita_tipo_id === TipoReceita::COMUM) {
$data['receitas'][$key]['medicamentos'][] = [
'nome' => $medicamento->medicamento->nome,
'usoContinuo' => $medicamento->uso_continuo,
'doseUnica' => $medicamento->dose_unica,
'livre' => $medicamento->livre,
'viaAdministracao' => $medicamento->medicamento->via_administracao_id === ViaAdministracao::OUTRAS
? $medicamento->via_administracao_outras
: $medicamento->medicamento->viaAdministracao->nome,
'posologia' => $medicamento->livre ? $medicamento->descricao : $medicamento->posologia,
'recomendacoes' => $medicamento->recomendacoes ?? '',
'descricao' => $medicamento->descricao ?? ''
];
}
if ($medicamento->medicamento_manual) {
$data['receitas'][$key]['medicamentos'][] = [
'medicamento_manual' => $medicamento->medicamento_manual,
'usoContinuo' => $medicamento->uso_continuo,
'doseUnica' => $medicamento->dose_unica,
'livre' => $medicamento->livre,
'viaAdministracao' => null,
'posologia' => $medicamento->livre ? $medicamento->descricao : $medicamento->posologia,
'recomendacoes' => $medicamento->recomendacoes ?? '',
'descricao' => $medicamento->descricao ?? '',
];
}
if ($medicamento->prescricao_manual) {
$data['receitas'][$key]['medicamentos'][] = [
'prescricao_manual' => $medicamento->prescricao_manual,
];
}
}
}
}
return Template::make(self::TITLE, self::TEMPLATE, true)->withData($data)->getHtml();
}
public function __invoke($atendimentoId = null)
{
$pdf = new Pdf();
$pdf->setPaper('A4', 'landscape');
return $pdf->stream(self::getTemplate($atendimentoId, request()->all()), 'receita-medica');
}
}

View File

@@ -0,0 +1,195 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Enums\Cadastro\Medicamento\TipoReceita;
use App\Enums\Cadastro\Medicamento\ViaAdministracao;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\Cadastro\SujeitoAtencao\TipoRegistroUsuario;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\ProntoAtendimento\Atendimento\Medico\Receita;
use App\Models\ProntoAtendimento\Atendimento\Medico\ReceitaMedicamento;
use App\Utils\DataUtil;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use Carbon\Carbon;
class ReceitaEspecialController extends Controller
{
private const TITLE = 'Receituário controle especial';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.receita-medica';
public static function getTemplate($atendimentoId = null, $params = [])
{
$receitasIds = $params['receitas_ids'] ?? [];
$params['para_assinatura_eletronica'] = $params['para_assinatura_eletronica'] ?? false;
$paraAssinaturaEletronica = $params['para_assinatura_eletronica'] === true
|| (DataUtil::isStringBoolean($params['para_assinatura_eletronica'])
&& DataUtil::isStringTrue($params['para_assinatura_eletronica']));
$receitas = $atendimentoId
? Receita::orderByDesc('created_at')
->whereHas('medicamentos')
->whereHas('atendimentoMedico', function($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->when(!empty($receitasIds), fn ($q) => $q->whereIn('id', $receitasIds))
->get()
: request()->receitas;
$data['receitas'] = [];
$data['exibirAssinatura'] = !$paraAssinaturaEletronica;
$tiposEpeciais = collect([
TipoReceita::ESPECIAL,
TipoReceita::ESPECIAL_AMARELA,
TipoReceita::ESPECIAL_AZUL
]);
foreach ($receitas as $key => $receita) {
if ((is_array($receita) && is_numeric($receita['id'] ?? null))
|| $receita instanceof Receita
) {
if (!($receita instanceof Receita)) {
$receita = Receita::findOrFail($receita['id']);
}
$paciente = $receita->atendimentoMedico->atendimento->faa->paciente;
$enderecoPaciente = $paciente->cidadao->domicilio
? "{$paciente->cidadao->domicilio->endereco->completo} - "
. MaskUtil::getCepMasked($paciente->cidadao->domicilio->endereco->logradouro->cep)
: '';
$data['receitas'][$key] = [
'isEspecial' => true,
'profissional' => [
'nome' => $receita->updatedLotacao->usuario->cidadao->nome,
'cbo' => $receita->updatedLotacao->ocupacao->nome,
'documento' => $receita->updatedLotacao->usuario->registro_tipo_id
? ($receita->updatedLotacao->usuario->registro_tipo_id === TipoRegistroUsuario::OUTRO
? $receita->updatedLotacao->usuario->registro_tipo_outro
: $receita->updatedLotacao->usuario->registroTipo->sigla
) . ": {$receita->updatedLotacao->usuario->registro_numero}"
: 'Conselho profissional: NÃO INFORMADO',
],
'unidade' => [
'endereco' => $receita->updatedLotacao->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($receita->updatedLotacao->infraestrutura->telefone),
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'endereco' => $enderecoPaciente,
'rg' => $paciente->cidadao->carteiraIdentidade->numero ?? null,
'telefone' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null),
],
'dataCadastro' => [
'porExtenso' => $receita->created_at->translatedFormat('d \de F \de Y'),
],
'medicamentos' => [],
];
$medicamentos = $receita->medicamentos
->whereIn('medicamento.receita_tipo_id', $tiposEpeciais->toArray());
foreach ($medicamentos as $medicamento) {
$data['receitas'][$key]['medicamentos'][] = [
'nome' => $medicamento->medicamento->nome,
'usoContinuo' => $medicamento->uso_continuo,
'doseUnica' => $medicamento->dose_unica,
'livre' => $medicamento->livre,
'viaAdministracao' => $medicamento->medicamento->via_administracao_id === ViaAdministracao::OUTRAS
? $medicamento->via_administracao_outras
: $medicamento->medicamento->viaAdministracao->nome,
'posologia' => $medicamento->livre ? $medicamento->descricao : $medicamento->posologia,
'recomendacoes' => $medicamento->recomendacoes ?? '',
'descricao' => $medicamento->descricao ?? ''
];
}
}
else {
$paciente = Paciente::findOrFail(request()->paciente_id);
$lotacao = Lotacao::findOrFail(auth()->payload()->get('lotacao_id'));
$enderecoPaciente = $paciente->cidadao->domicilio
? "{$paciente->cidadao->domicilio->endereco->completo} - "
. MaskUtil::getCepMasked($paciente->cidadao->domicilio->endereco->logradouro->cep)
: '';
$data['receitas'][$key] = [
'isEspecial' => true,
'profissional' => [
'nome' => $lotacao->usuario->cidadao->nome,
'cbo' => $lotacao->ocupacao->nome,
'documento' => $lotacao->usuario->registro_tipo_id
? ($lotacao->usuario->registro_tipo_id === TipoRegistroUsuario::OUTRO
? $lotacao->usuario->registro_tipo_outro
: $lotacao->usuario->registroTipo->sigla
) . ": {$lotacao->usuario->registro_numero}"
: 'Conselho profissional: NÃO INFORMADO',
],
'unidade' => [
'endereco' => $lotacao->infraestrutura->endereco->completo,
'telefone' => MaskUtil::getPhoneMasked($lotacao->infraestrutura->telefone),
],
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nomeSocial' => $paciente->cidadao->nome_social,
'prefereNomeSocial' => $paciente->cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'endereco' => $enderecoPaciente,
'rg' => $paciente->cidadao->carteiraIdentidade->numero ?? null,
'telefone' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null),
],
'dataCadastro' => [
'porExtenso' => Carbon::now()->translatedFormat('d \de F \de Y'),
],
'medicamentos' => [],
];
foreach ($receita['medicamentos'] as $medicamento) {
$medicamento = new ReceitaMedicamento($medicamento);
if (!$medicamento->medicamento || !$tiposEpeciais->contains($medicamento->medicamento->receita_tipo_id)) {
continue;
}
$data['receitas'][$key]['medicamentos'][] = [
'nome' => $medicamento->medicamento->nome,
'usoContinuo' => $medicamento->uso_continuo,
'doseUnica' => $medicamento->dose_unica,
'livre' => $medicamento->livre,
'viaAdministracao' => $medicamento->medicamento->via_administracao_id === ViaAdministracao::OUTRAS
? $medicamento->via_administracao_outras
: $medicamento->medicamento->viaAdministracao->nome,
'posologia' => $medicamento->livre ? $medicamento->descricao : $medicamento->posologia,
'recomendacoes' => $medicamento->recomendacoes ?? '',
'descricao' => $medicamento->descricao ?? ''
];
}
}
}
return Template::make(self::TITLE, self::TEMPLATE, true)->withData($data)->getHtml();
}
public function __invoke($atendimentoId = null)
{
$pdf = new Pdf();
$pdf->setPaper('A4', 'landscape');
return $pdf->stream(self::getTemplate($atendimentoId, request()->all()), 'receita-medica-especial');
}
}

View File

@@ -0,0 +1,91 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Http\Controllers\Controller;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
use App\Models\ProntoAtendimento\Atendimento\ServicoEnfermagem;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
class ServicoEnfermagemController extends Controller
{
private const TITLE = 'Solicitação de Serviços de Enfermagem';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.servicos-enfermagem';
public function __invoke(int $atendimentoId)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), 'servicos-enfermagem');
}
public static function getTemplate(int $atendimentoId)
{
$servicosEnfermagem = ServicoEnfermagem::whereHas('atendimentoMedico', function ($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->orWhereHas('atendimentoEnfermagem', function ($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->orWhereHas('pacienteObservacao', function ($query) use ($atendimentoId) {
$query->where('atendimento_id', $atendimentoId);
})
->get();
$data['paciente'] = self::getPacienteData(Atendimento::findOrFail($atendimentoId));
$data['servicosEnfermagem'] = [];
foreach ($servicosEnfermagem as $servicoEnfermagem) {
$data['servicosEnfermagem'][] = [
'data' => $servicoEnfermagem->created_at->format('d/m/Y H:i:s'),
'medico' => [
'nome' => $servicoEnfermagem->updatedLotacao->usuario->cidadao->nome,
'cbo' => $servicoEnfermagem->updatedLotacao->ocupacao->nome,
],
'procedimentos' => [
'nome' => $servicoEnfermagem->procedimento->nome,
'codigo' => MaskUtil::getProcedimentoMasked($servicoEnfermagem->procedimento->codigo),
],
];
}
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
private static function getPacienteData($atendimento)
{
$paciente = $atendimento->faa->paciente;
$cidadao = $paciente->cidadao;
$gestacao = $atendimento->gestacoes->sortByDesc('created_at')->first();
return [
'nome' => $cidadao->nome,
'nome_social' => $cidadao->nome_social,
'prontuario' => $paciente->prontuario,
'cns' => $cidadao->cns ? MaskUtil::getCnsMasked($cidadao->cns) : 'NÃO INFORMADO',
'cpf' => $cidadao->cpf ? MaskUtil::getCpfMasked($cidadao->cpf) : 'NÃO INFORMADO',
'sexo' => $cidadao->sexo->descricao,
'data_nascimento' => $cidadao->data_nascimento
? $cidadao->data_nascimento->format('d/m/Y')
: 'NÃO INFORMADA',
'idade' => $cidadao->data_nascimento
? "{$cidadao->idade['anos']} ano(s), "
. "{$cidadao->idade['meses']} mês(es) e "
. "{$cidadao->idade['dias']} dia(s) "
: 'NÃO INFORMADA',
'idade_gestacional' => $gestacao && $gestacao->idade_gestacional
? "{$gestacao->idade_gestacional['semanas']} semana(s) e {$gestacao->idade_gestacional['dias']} dia(s)"
: null,
'nome_mae' => $cidadao->nome_mae ?? 'NÃO INFORMADO',
'endereco' => $cidadao->domicilio
? "{$cidadao->domicilio->endereco->completo}, "
. MaskUtil::getCepMasked($cidadao->domicilio->endereco->logradouro->cep)
: 'NÃO INFORMADO',
'telefones' => $cidadao->telefones->map(fn ($t) => MaskUtil::getPhoneMasked($t->numero))->all(),
];
}
}

View File

@@ -0,0 +1,101 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Enums\Parametrizacao\Exame\Tipo;
use App\Http\Controllers\Controller;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
use App\Models\ProntoAtendimento\Atendimento\Medico\AtendimentoMedico;
use App\Models\ProntoAtendimento\PedidoExame\PedidoExame;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
class SolicitacaoExameImagemController extends Controller
{
private const TITLE = 'Solicitação de exames de imagem';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.solicitacao-exames-imagem';
public function __invoke(int $atendimentoId)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), 'solicitacao-exames-imagem');
}
public static function getTemplate(int $atendimentoId)
{
$pedidosExames = PedidoExame::orderByDesc('created_at')
->where('atendimento_id', $atendimentoId)
->get();
$data['paciente'] = self::getPacienteData(Atendimento::findOrFail($atendimentoId));
$data['pedidosExames'] = [];
foreach ($pedidosExames as $pedidoExame) {
$data['pedidosExames'][] = [
'urgente' => $pedidoExame->urgente,
'data' => $pedidoExame->created_at->format('d/m/Y H:i:s'),
'justificativa' => $pedidoExame->justificativa,
'medico' => [
'nome' => $pedidoExame->createdLotacao->usuario->cidadao->nome,
'cbo' => $pedidoExame->createdLotacao->ocupacao->nome
],
'exames' => self::getExames($pedidoExame)
];
}
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
private static function getExames($pedidoExme)
{
$result = [];
foreach ($pedidoExme['exames'] as $item) {
if ($item->exame->tipo_id === Tipo::IMAGEM) {
$result[] = [
'id' => $item->exame->id,
'nome' => $item->exame->nome,
'codigo' => $item->exame->codigo,
'observacao_medico' => $item->observacao_medico,
'observacao_executante' => $item->observacao_executante,
];
}
}
return $result;
}
private static function getPacienteData($atendimento)
{
$paciente = $atendimento->faa->paciente;
$cidadao = $paciente->cidadao;
$gestacao = $atendimento->gestacoes->sortByDesc('created_at')->first();
return [
'nome' => $cidadao->nome,
'nome_social' => $cidadao->nome_social,
'prontuario' => $paciente->prontuario,
'cns' => $cidadao->cns ? MaskUtil::getCnsMasked($cidadao->cns) : 'NÃO INFORMADO',
'cpf' => $cidadao->cpf ? MaskUtil::getCpfMasked($cidadao->cpf) : 'NÃO INFORMADO',
'sexo' => $cidadao->sexo->descricao,
'data_nascimento' => $cidadao->data_nascimento
? $cidadao->data_nascimento->format('d/m/Y')
: 'NÃO INFORMADA',
'idade' => $cidadao->data_nascimento
? "{$cidadao->idade['anos']} ano(s), "
. "{$cidadao->idade['meses']} mês(es) e "
. "{$cidadao->idade['dias']} dia(s) "
: 'NÃO INFORMADA',
'idade_gestacional' => $gestacao && $gestacao->idade_gestacional
? "{$gestacao->idade_gestacional['semanas']} semana(s) e {$gestacao->idade_gestacional['dias']} dia(s)"
: null,
'nome_mae' => $cidadao->nome_mae ?? 'NÃO INFORMADO',
'endereco' => $cidadao->domicilio
? "{$cidadao->domicilio->endereco->completo}, "
. MaskUtil::getCepMasked($cidadao->domicilio->endereco->logradouro->cep)
: 'NÃO INFORMADO',
'telefones' => $cidadao->telefones->map(fn ($t) => MaskUtil::getPhoneMasked($t->numero))->all(),
];
}
}

View File

@@ -0,0 +1,100 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoMedico;
use App\Enums\Parametrizacao\Exame\Tipo;
use App\Http\Controllers\Controller;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
use App\Models\ProntoAtendimento\Atendimento\Medico\AtendimentoMedico;
use App\Models\ProntoAtendimento\PedidoExame\PedidoExame;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
class SolicitacaoExameLaboratorialController extends Controller
{
private const TITLE = 'Solicitação de exames laboratoriais';
private const TEMPLATE = 'pronto-atendimento.atendimento-medico.solicitacao-exames-laboratoriais';
public static function getTemplate(int $atendimentoId)
{
$pedidosExames = PedidoExame::orderByDesc('created_at')
->where('atendimento_id', $atendimentoId)
->get();
$data['paciente'] = self::getPacienteData(Atendimento::findOrFail($atendimentoId));
$data['pedidosExames'] = [];
foreach ($pedidosExames as $pedidoExame) {
$data['pedidosExames'][] = [
'urgente' => $pedidoExame->urgente,
'data' => $pedidoExame->created_at->format('d/m/Y H:i:s'),
'justificativa' => $pedidoExame->justificativa,
'medico' => [
'nome' => $pedidoExame->createdLotacao->usuario->cidadao->nome,
'cbo' => $pedidoExame->createdLotacao->ocupacao->nome
],
'exames' => self::getExames($pedidoExame)
];
}
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
private static function getExames($pedidoExme)
{
$result = [];
foreach ($pedidoExme['exames'] as $item) {
if ($item->exame->tipo_id === Tipo::LABORATORIAL) {
$result[] = [
'id' => $item->exame->id,
'nome' => $item->exame->nome,
'codigo' => $item->exame->codigo,
'observacao_medico' => $item->observacao_medico,
'observacao_executante' => $item->observacao_executante,
];
}
}
return $result;
}
private static function getPacienteData($atendimento)
{
$paciente = $atendimento->faa->paciente;
$cidadao = $paciente->cidadao;
$gestacao = $atendimento->gestacoes->sortByDesc('created_at')->first();
return [
'nome' => $cidadao->nome,
'nome_social' => $cidadao->nome_social,
'prontuario' => $paciente->prontuario,
'cns' => $cidadao->cns ? MaskUtil::getCnsMasked($cidadao->cns) : 'NÃO INFORMADO',
'cpf' => $cidadao->cpf ? MaskUtil::getCpfMasked($cidadao->cpf) : 'NÃO INFORMADO',
'sexo' => $cidadao->sexo->descricao,
'data_nascimento' => $cidadao->data_nascimento
? $cidadao->data_nascimento->format('d/m/Y')
: 'NÃO INFORMADA',
'idade' => $cidadao->data_nascimento
? "{$cidadao->idade['anos']} ano(s), "
. "{$cidadao->idade['meses']} mês(es) e "
. "{$cidadao->idade['dias']} dia(s) "
: 'NÃO INFORMADA',
'idade_gestacional' => $gestacao && $gestacao->idade_gestacional
? "{$gestacao->idade_gestacional['semanas']} semana(s) e {$gestacao->idade_gestacional['dias']} dia(s)"
: null,
'nome_mae' => $cidadao->nome_mae ?? 'NÃO INFORMADO',
'endereco' => $cidadao->domicilio
? "{$cidadao->domicilio->endereco->completo}, "
. MaskUtil::getCepMasked($cidadao->domicilio->endereco->logradouro->cep)
: 'NÃO INFORMADO',
'telefones' => $cidadao->telefones->map(fn ($t) => MaskUtil::getPhoneMasked($t->numero))->all(),
];
}
public function __invoke(int $pedidoExameId)
{
return (new Pdf)->stream(self::getTemplate($pedidoExameId), 'solicitacao-exames-laboratoriais');
}
}

View File

@@ -0,0 +1,208 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\AtendimentoTriagem;
use App\Enums\Cadastro\SujeitoAtencao\TipoRegistroUsuario;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Intranet\Cliente;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
use App\Models\ProntoAtendimento\Atendimento\Triagem\Encaminhamento;
use App\Utils\MaskUtil;
use Barryvdh\Snappy\Facades\SnappyPdf;
use Carbon\Carbon;
use Illuminate\Support\Str;
class GuiaEncaminhamentoController extends Controller
{
public function __invoke($atendimentoId = null)
{
$cliente = Cliente::where('link', app('config')->get('database.default'))
->where('sistema_id', 1)
->firstOrFail();
$logotipo = $cliente->logotipo ? base64_encode(file_get_contents(storage_path('app/intranet/cliente/logotipo/' . $cliente->logotipo))) : null;
$encaminhamentos = [];
if (!is_null($atendimentoId)) {
$encaminhamentos = self::getEncaminhamentosByAtendimento($atendimentoId);
} else {
$encaminhamentos = self::getEncaminhamentos(request()->paciente_id);
}
$data = [
'cliente' => [
'nome' => Str::upper($cliente->nome),
'logotipo' => $logotipo,
],
'encaminhamentos' => $encaminhamentos,
];
return SnappyPdf::loadView('impressoes.template.pronto-atendimento.atendimento-triagem.guia-encaminhamento', compact('data'))
->setOption('header-html', '')
->setOption('footer-html', '')
->setOption('margin-top', '10')
->setOption('margin-bottom', '10')
->inline();
}
public static function getEncaminhamentosByAtendimento($atendimentoId)
{
$encaminhamentos = [];
$atendimento = Atendimento::findOrFail($atendimentoId);
$paciente = $atendimento->faa->paciente;
$atendimento->atendimentosTriagem->each(function ($atendimentoTriagem) use ($paciente, &$encaminhamentos) {
$atendimentoTriagem->encaminhamentos->each(function ($encaminhamento) use ($paciente, &$encaminhamentos) {
$lotacaoOrigem = $encaminhamento->createdLotacao;
$infraestruturaOrigem = $lotacaoOrigem->infraestrutura;
$usuarioOrigem = $lotacaoOrigem->usuario;
$infraestruturaDestino = $encaminhamento->infraestrutura;
$instituicao = $infraestruturaDestino->unidade->nome_fantasia;
$endereco = $infraestruturaDestino->endereco->completo;
$encaminhamentos[] = [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'prontuario' => $paciente->prontuario,
'nome_social' => $paciente->cidadao->nome_social,
'idade' => $paciente->cidadao->idade_formatada,
'cns' => $paciente->cidadao->cns ? MaskUtil::getCnsMasked($paciente->cidadao->cns) : 'NÃO INFORMADO',
'cpf' => $paciente->cidadao->cpf ? MaskUtil::getCpfMasked($paciente->cidadao->cpf) : 'NÃO INFORMADO',
'rg' => $paciente->cidadao->carteiraIdentidade->numero ?? '-',
'sexo' => $paciente->cidadao->sexo->descricao,
'data_nascimento' => $paciente->cidadao->data_nascimento
? $paciente->cidadao->data_nascimento->format('d/m/Y')
: 'NÃO INFORMADA',
'nome_mae' => $paciente->cidadao->nome_mae ?? 'NÃO INFORMADO',
'municipio' => $paciente->cidadao->domicilio->endereco->logradouro->municipio->nome ?? null,
'uf' => $paciente->cidadao->domicilio->endereco->logradouro->municipio->estado->uf ?? null,
'bairro' => $paciente->cidadao->domicilio->endereco->logradouro->bairro->nome ?? null,
'logradouro' => $paciente->cidadao->domicilio->endereco->logradouro->nome ?? null,
'numero' => $paciente->cidadao->domicilio->endereco->numero,
'sem_numero' => $paciente->cidadao->domicilio->endereco->sem_numero,
'complemento' => $paciente->cidadao->domicilio->endereco->complemento ?? '',
'cep' => $paciente->cidadao->domicilio
? MaskUtil::getCepMasked( $paciente->cidadao->domicilio->endereco->logradouro->cep)
: null,
'municipio' => $paciente->cidadao->domicilio->endereco->logradouro->municipio->nome,
'ibge' => $paciente->cidadao->domicilio->endereco->logradouro->municipio->ibge,
'telefones' => $paciente->cidadao->telefones->map(fn ($t) => MaskUtil::getPhoneMasked($t->numero))->all(),
'unidade_referencia' => $paciente->unidade->nome_fantasia ?? null,
],
'instituicao' => $instituicao,
'endereco' => $endereco,
'unidade_origem' => [
'nome_fantasia' => isset($infraestruturaOrigem->unidade->nome_fantasia)
? substr($infraestruturaOrigem->unidade->nome_fantasia, 0, 40) : null,
'cnes' => $infraestruturaOrigem->unidade->cnes,
'telefone' => $infraestruturaOrigem->telefone ? MaskUtil::getPhoneMasked($infraestruturaOrigem->telefone) : null,
],
'usuario_origem' => [
'nome' => $usuarioOrigem->cidadao->nome ?? null,
'usuario_nome' => $usuarioOrigem->cidadao->nome,
'ocupacao_descricao' => $lotacaoOrigem->ocupacao->codigo . ' - '
. $lotacaoOrigem->ocupacao->nome,
'documento' => $usuarioOrigem->registro_tipo_id
? ($usuarioOrigem->registro_tipo_id === TipoRegistroUsuario::OUTRO
? $usuarioOrigem->registro_tipo_outro
: $usuarioOrigem->registroTipo->sigla
) . ": {$usuarioOrigem->registro_numero}"
: 'Conselho profissional: NÃO INFORMADO',
],
'data' => Carbon::now()->format('d/m/Y') ?? null,
'horario' => Carbon::now()->format('H:i') ?? null,
'motivo' => $encaminhamento['motivo'] ?? null,
];
});
});
return $encaminhamentos;
}
public static function getEncaminhamentos($pacienteId)
{
$encaminhamentos = [];
$paciente = Paciente::findOrFail($pacienteId);
foreach (request()->encaminhamentos as $encaminhamento) {
$lotacaoOrigem = null;
$infraestruturaDestino = null;
if (isset($encaminhamento['id'])) {
$encaminhamento = Encaminhamento::findOrFail($encaminhamento['id']);
$lotacaoOrigem = $encaminhamento->createdLotacao;
$infraestruturaDestino = $encaminhamento->infraestrutura;
} else {
$lotacaoOrigem = self::getCurrentLotacao();
$infraestruturaDestino = Infraestrutura::findOrFail($encaminhamento['infraestrutura_id']);
}
$infraestruturaOrigem = $lotacaoOrigem->infraestrutura;
$usuarioOrigem = $lotacaoOrigem->usuario;
$instituicao = $infraestruturaDestino->unidade->nome_fantasia;
$endereco = $infraestruturaDestino->endereco->completo;
$encaminhamentos[] = [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'prontuario' => $paciente->prontuario,
'nome_social' => $paciente->cidadao->nome_social,
'idade' => $paciente->cidadao->idade_formatada,
'cns' => $paciente->cidadao->cns ? MaskUtil::getCnsMasked($paciente->cidadao->cns) : 'NÃO INFORMADO',
'cpf' => $paciente->cidadao->cpf ? MaskUtil::getCpfMasked($paciente->cidadao->cpf) : 'NÃO INFORMADO',
'rg' => $paciente->cidadao->carteiraIdentidade->numero ?? '-',
'sexo' => $paciente->cidadao->sexo->descricao,
'data_nascimento' => $paciente->cidadao->data_nascimento
? $paciente->cidadao->data_nascimento->format('d/m/Y')
: 'NÃO INFORMADA',
'nome_mae' => $paciente->cidadao->nome_mae ?? 'NÃO INFORMADO',
'municipio' => $paciente->cidadao->domicilio->endereco->logradouro->municipio->nome ?? null,
'uf' => $paciente->cidadao->domicilio->endereco->logradouro->municipio->estado->uf ?? null,
'bairro' => $paciente->cidadao->domicilio->endereco->logradouro->bairro->nome ?? null,
'logradouro' => $paciente->cidadao->domicilio->endereco->logradouro->nome ?? null,
'numero' => $paciente->cidadao->domicilio->endereco->numero,
'sem_numero' => $paciente->cidadao->domicilio->endereco->sem_numero,
'complemento' => $paciente->cidadao->domicilio->endereco->complemento ?? '',
'cep' => $paciente->cidadao->domicilio
? MaskUtil::getCepMasked( $paciente->cidadao->domicilio->endereco->logradouro->cep)
: null,
'municipio' => $paciente->cidadao->domicilio->endereco->logradouro->municipio->nome,
'ibge' => $paciente->cidadao->domicilio->endereco->logradouro->municipio->ibge,
'telefones' => $paciente->cidadao->telefones->map(fn ($t) => MaskUtil::getPhoneMasked($t->numero))->all(),
'unidade_referencia' => $paciente->unidade->nome_fantasia ?? null,
],
'instituicao' => $instituicao,
'endereco' => $endereco,
'unidade_origem' => [
'nome_fantasia' => isset($infraestruturaOrigem->unidade->nome_fantasia)
? substr($infraestruturaOrigem->unidade->nome_fantasia, 0, 40) : null,
'cnes' => $infraestruturaOrigem->unidade->cnes,
'telefone' => $infraestruturaOrigem->telefone ? MaskUtil::getPhoneMasked($infraestruturaOrigem->telefone) : null,
],
'usuario_origem' => [
'nome' => $usuarioOrigem->cidadao->nome ?? null,
'usuario_nome' => $usuarioOrigem->cidadao->nome,
'ocupacao_descricao' => $lotacaoOrigem->ocupacao->codigo . ' - '
. $lotacaoOrigem->ocupacao->nome,
'documento' => $usuarioOrigem->registro_tipo_id
? ($usuarioOrigem->registro_tipo_id === TipoRegistroUsuario::OUTRO
? $usuarioOrigem->registro_tipo_outro
: $usuarioOrigem->registroTipo->sigla
) . ": {$usuarioOrigem->registro_numero}"
: 'Conselho profissional: NÃO INFORMADO',
],
'data' => Carbon::now()->format('d/m/Y') ?? null,
'horario' => Carbon::now()->format('H:i') ?? null,
'motivo' => $encaminhamento['motivo'] ?? null,
];
}
return $encaminhamentos;
}
}

View File

@@ -0,0 +1,202 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento;
use App\Enums\ProntoAtendimento\Raat\CausaAcidente as RaatCausaAcidente;
use App\Enums\ProntoAtendimento\Raat\Diagnostico as RaatDiagnostico;
use App\Enums\ProntoAtendimento\Raat\ParteCorpoAtingida as RaatParteCorpoAtingida;
use App\Enums\ProntoAtendimento\Raat\RegimeTrabalho as RaatRegimeTrabalho;
use App\Http\Controllers\Controller;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
use App\Models\ProntoAtendimento\Atendimento\Cat;
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;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use Illuminate\Support\Collection;
class CatController extends Controller
{
private const TITLE = 'SOLICITAÇÃO PARA EMISSÃO DE COMUNICAÇÃO DE ACIDENTE DE TRABALHO - CAT';
private const TEMPLATE = 'pronto-atendimento.cat';
public static function getTemplate($atendimentoId)
{
$faa = Atendimento::findOrFail($atendimentoId)->faa;
$paciente = $faa->paciente;
$raat = $faa->raat;
$parecerMedico = $faa->raat ? $faa->raat->pareceresMedico()->orderByDesc('id')->first() : null;
$cat = Cat::where('raat_id', $raat->id)->first();
$tiposAcidentes = TipoAcidente::orderBy('nome')
->get()
->map(fn ($tipo) => [
$tipo->nome,
$tipo->id === ($raat->acidente_tipo_id ?? null)
]);
$regimeTrabalho = RegimeTrabalho::orderBy('nome')
->get()
->first(fn ($regime) => $regime->id === ($raat->regime_trabalho_id ?? null));
$regimeTrabalho = $regimeTrabalho->id === RaatRegimeTrabalho::OUTRO ? $raat->regime_trabalho_outro : $regimeTrabalho->nome;
$agentes = Agente::all()
->map(fn ($agente) => [
$agente->nome,
$agente->id === ($parecerMedico->agente_id ?? null)
]);
$partesCorpoAtingidasChecked = $parecerMedico ? $parecerMedico->partesCorpoAtingidas->pluck('id') : collect();
$partesCorpoAtingidas = ParteCorpoAtingida::orderBy('id')
->get()
->reject(fn ($parte) => $parte->id === RaatParteCorpoAtingida::OUTROS)
->map(fn ($parte) => [
$parte->nome,
$partesCorpoAtingidasChecked->contains($parte->id)
]);
$causasAcidenteChecked = $parecerMedico ? $parecerMedico->causasAcidente->pluck('id') : collect();
$causasAcidente = CausaAcidente::all()
->reject(fn ($causa) => $causa->id === RaatCausaAcidente::OUTROS)
->map(fn ($causa) => [
$causa->nome,
$causasAcidenteChecked->contains($causa->id)
]);
$diagnosticosChecked = $parecerMedico ? $parecerMedico->diagnosticos->pluck('id') : collect();
$diagnosticos = Diagnostico::all()
->reject(fn ($diagnostico) => $diagnostico->id === RaatDiagnostico::OUTROS)
->map(fn ($diagnostico) => [
$diagnostico->nome,
$diagnosticosChecked->contains($diagnostico->id)
]);
$classificacoesIniciais = ClassificacaoInicial::all()
->map(fn ($classificacao) => [
$classificacao->nome,
$classificacao->id === ($parecerMedico->classificacao_inicial_id ?? null)
]);
$data = [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'sexo' => $paciente->cidadao->sexo->descricao,
'dataNascimento' => $paciente->cidadao->data_nascimento
? $paciente->cidadao->data_nascimento->format('d/m/Y') : '',
],
'empresa' => [
'nome' => $raat->empresa_nome ?? '',
'ramoAtividade' => $raat->empresa_ramo_atividade ?? '',
'endereco' => $raat->empresa_endereco ?? '',
'telefone' => $raat && $raat->empresa_telefone ? MaskUtil::getPhoneMasked($raat->empresa_telefone) : '',
'ocupacaoPaciente' => $cat->empresa_ocupacao_paciente,
],
'identificacaoAcidente' => [
'data' => $raat && $raat->acidente_data ? $raat->acidente_data->format('d/m/Y') : null,
'hora' => $raat && $raat->acidente_hora ? $raat->acidente_hora->format('H:i') : null,
'tipoAcidente' => self::retonarPrimeiroVerdadeiro($tiposAcidentes),
'local' => $raat->acidente_local ?? '',
'descricao' => $raat->acidente_descricao ?? '',
'regimeTrabalho' => $regimeTrabalho,
'regimeTrabalhoOutro' => $raat->regime_trabalho_outro ?? '',
],
'agente' => self::retonarPrimeiroVerdadeiro($agentes),
'partesCorpoAtingidas' => $parecerMedico ? self::retornaElementosInline($partesCorpoAtingidas, $parecerMedico->parte_corpo_atingida_outras) : '',
'causasAcidente' => $parecerMedico ? self::retornaElementosInline($causasAcidente, $parecerMedico->causa_acidente_outras) : '',
'diagnosticos' => $parecerMedico ? self::retornaElementosInline($diagnosticos, $parecerMedico->diagnostico_outros) : '',
'cid' => ($parecerMedico->atendimentoMedico->cid->cid ?? null)
? $parecerMedico->atendimentoMedico->cid->cid->codigo
. ' - ' . $parecerMedico->atendimentoMedico->cid->cid->nome
: '',
'observacao' => $parecerMedico->observacao ?? '',
'comAfastamento' => $parecerMedico ? ($parecerMedico->afastado === true ? 'SIM' : ($parecerMedico->afastado === false ? 'NÃO' : '')) : '',
'classificacoesIniciais' => $classificacoesIniciais,
'hasParecerMedico' => !!$parecerMedico,
'profissional' => [
'nome' => $parecerMedico->updatedLotacao->usuario->cidadao->nome ?? null,
'cbo' => $parecerMedico->updatedLotacao->ocupacao->nome ?? null,
],
'sofreuAcidenteTrabalho' => self::converteBoleanoEmRadio($cat->paciente_sofreu_acidente_trabalho ?? null),
'portadorDoencaOcupacional' => self::converteBoleanoEmRadio($cat->paciente_portador_doenca_ocupacional ?? null),
'precisaInternacao' => $cat->paciente_precisa_internacao === true ? 'SIM' : ($cat->paciente_precisa_internacao === false ? 'NÃO' : ''),
'diasAfastamento' => $cat->dias_afastamento ? $cat->dias_afastamento . ' dias' : '',
'confirmacoesMedicas' => self::parecerMedicoOpcoes($cat),
];
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
private static function retornaElementosInline(Collection $arr, ?string $value)
{
$filteredItems = collect($arr)
->filter(fn ($item) => $item[1] === true)
->map(fn ($item) => $item[0]);
if ($value) {
$filteredItems->add($value);
}
$count = $filteredItems->count();
$result = '';
if ($count > 1) {
$lastItem = $filteredItems->pop();
$result = $filteredItems->implode(', ') . ' e ' . $lastItem;
}
if ($count === 1) {
$result = $filteredItems->first();
}
return $result;
}
private static function parecerMedicoOpcoes($cat)
{
return new Collection([
[
'Ter sofrido Acidente de Trabalho (Art.19 da Lei nº 8.213/1991).',
$cat->paciente_sofreu_acidente_trabalho
],
[
'Ser portador de Doença Ocupacional (Art.20 da Lei nº 8.213/1991).',
$cat->paciente_portador_doenca_ocupacional,
]
]);
}
private static function retonarPrimeiroVerdadeiro(Collection $arr)
{
return $arr->first(fn ($value) => $value[1] === true)[0] ?? null;
}
private static function converteBoleanoEmRadio(?bool $value)
{
return new Collection([
[
'Sim',
$value
],
[
'Não',
$value === false
],
]);
}
public function __invoke($atendimentoId)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), self::TITLE);
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Impressao\ProntoAtendimento\FaaSimplificadaController;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use Carbon\Carbon;
class FaaCompletaController extends Controller
{
private static $TITLE = 'FICHA DE ATENDIMENTO AMBULATORIAL - FAA ';
private const TEMPLATE = 'pronto-atendimento.faa-completa';
public static function getTemplate($atendimentoId)
{
$atendimento = Atendimento::findOrFail($atendimentoId);
$simplificadaData = FaaSimplificadaController::getTemplateData($atendimentoId);
$data = array_merge([
'folha2' => [
'paciente' => [
'nome' => $atendimento->faa->paciente->cidadao->nome,
'nomeSocial' => $atendimento->faa->paciente->cidadao->nome_social,
'prefereNomeSocial' => $atendimento->faa->paciente->cidadao
->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'prontuario' => $atendimento->faa->paciente->prontuario,
],
'recepcao' => [
'data' => (new Carbon($atendimento->recepcao->atendido_em))->format('d/m/Y')
]
]
], $simplificadaData);
self::$TITLE .= $atendimento->faa->numero;
return Template::make(self::$TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
public function __invoke($atendimentoId)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), self::$TITLE);
}
}

File diff suppressed because it is too large Load Diff

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

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento\Plantao;
use App\Http\Controllers\Controller;
use App\Services\ProntoAtendimento\Plantao\RelatorioPlantaoService;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
class RelatorioPlantaoController extends Controller
{
private const TITLE = 'Relatório de plantão';
private const TEMPLATE = 'pronto-atendimento.plantao.relatorio-plantao';
public static function getTemplate()
{
$data = [
'plantoes' => RelatorioPlantaoService::index(),
'params' => request()->all()
];
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
public function __invoke()
{
return (new Pdf)->stream(self::getTemplate(), self::TITLE);
}
}

View File

@@ -0,0 +1,142 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento;
use App\Enums\ProntoAtendimento\Raat\CausaAcidente as RaatCausaAcidente;
use App\Enums\ProntoAtendimento\Raat\Diagnostico as RaatDiagnostico;
use App\Enums\ProntoAtendimento\Raat\ParteCorpoAtingida as RaatParteCorpoAtingida;
use App\Enums\ProntoAtendimento\Raat\RegimeTrabalho as RaatRegimeTrabalho;
use App\Http\Controllers\Controller;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
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;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
class RaatController extends Controller
{
private const TITLE = 'RAAT';
private const TEMPLATE = 'pronto-atendimento.raat';
public static function getTemplate($atendimentoId)
{
$faa = Atendimento::findOrFail($atendimentoId)->faa;
$paciente = $faa->paciente;
$raat = $faa->raat;
$parecerMedico = $faa->raat ? $faa->raat->pareceresMedico()->orderByDesc('id')->first() : null;
$tiposAcidentes = TipoAcidente::orderBy('nome')
->get()
->map(fn ($tipo) => [
$tipo->nome,
$tipo->id === ($raat->acidente_tipo_id ?? null)
]);
$regimesTrabalho = RegimeTrabalho::orderBy('nome')
->get()
->reject(fn ($regime) => $regime->id === RaatRegimeTrabalho::OUTRO)
->map(fn ($regime) => [
$regime->nome,
$regime->id === ($raat->regime_trabalho_id ?? null)
]);
$agentes = Agente::all()
->map(fn ($agente) => [
$agente->nome,
$agente->id === ($parecerMedico->agente_id ?? null)
]);
$partesCorpoAtingidasChecked = $parecerMedico ? $parecerMedico->partesCorpoAtingidas->pluck('id') : collect();
$partesCorpoAtingidas = ParteCorpoAtingida::orderBy('id')
->get()
->reject(fn ($parte) => $parte->id === RaatParteCorpoAtingida::OUTROS)
->map(fn ($parte) => [
$parte->nome,
$partesCorpoAtingidasChecked->contains($parte->id)
]);
$causasAcidenteChecked = $parecerMedico ? $parecerMedico->causasAcidente->pluck('id') : collect();
$causasAcidente = CausaAcidente::all()
->reject(fn ($causa) => $causa->id === RaatCausaAcidente::OUTROS)
->map(fn ($causa) => [
$causa->nome,
$causasAcidenteChecked->contains($causa->id)
]);
$diagnosticosChecked = $parecerMedico ? $parecerMedico->diagnosticos->pluck('id') : collect();
$diagnosticos = Diagnostico::all()
->reject(fn ($diagnostico) => $diagnostico->id === RaatDiagnostico::OUTROS)
->map(fn ($diagnostico) => [
$diagnostico->nome,
$diagnosticosChecked->contains($diagnostico->id)
]);
$classificacoesIniciais = ClassificacaoInicial::all()
->map(fn ($classificacao) => [
$classificacao->nome,
$classificacao->id === ($parecerMedico->classificacao_inicial_id ?? null)
]);
$data = [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'sexo' => $paciente->cidadao->sexo->descricao,
'dataNascimento' => $paciente->cidadao->data_nascimento
? $paciente->cidadao->data_nascimento->format('d/m/Y') : '',
],
'empresa' => [
'nome' => $raat->empresa_nome ?? '',
'ramoAtividade' => $raat->empresa_ramo_atividade ?? '',
'endereco' => $raat->empresa_endereco ?? '',
'telefone' => $raat && $raat->empresa_telefone ? MaskUtil::getPhoneMasked($raat->empresa_telefone) : '',
],
'identificacaoAcidente' => [
'data' => $raat && $raat->acidente_data ? $raat->acidente_data->format('d/m/Y') : null,
'hora' => $raat && $raat->acidente_hora ? $raat->acidente_hora->format('H:i') : null,
'tiposAcidente' => $tiposAcidentes,
'local' => $raat->acidente_local ?? '',
'descricao' => $raat->acidente_descricao ?? '',
'regimesTrabalho' => $regimesTrabalho,
'regimeTrabalhoOutro' => $raat->regime_trabalho_outro ?? '',
],
'agentes' => $agentes,
'partesCorpoAtingidas' => $partesCorpoAtingidas,
'parteCorpoAtingidaOutras' => $parecerMedico->parte_corpo_atingida_outras ?? '',
'causasAcidente' => $causasAcidente,
'causaAcidenteOutras' => $parecerMedico->causa_acidente_outras ?? '',
'diagnosticos' => $diagnosticos,
'diagnosticoOutros' => $parecerMedico->diagnostico_outros ?? '',
'cid' => ($parecerMedico->atendimentoMedico->cid->cid ?? null)
? $parecerMedico->atendimentoMedico->cid->cid->codigo
. ' - ' . $parecerMedico->atendimentoMedico->cid->cid->nome
: '',
'observacao' => $parecerMedico->observacao ?? '',
'classificacoesIniciais' => $classificacoesIniciais,
'comAfastamento' => [
['SIM', $parecerMedico ? $parecerMedico->afastado : false],
['NÃO', $parecerMedico ? !$parecerMedico->afastado : false],
],
'hasParecerMedico' => !!$parecerMedico,
'profissional' => [
'nome' => $parecerMedico->updatedLotacao->usuario->cidadao->nome ?? null,
'cbo' => $parecerMedico->updatedLotacao->ocupacao->nome ?? null,
]
];
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
public function __invoke($atendimentoId)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), self::TITLE);
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento;
use App\Http\Controllers\Controller;
use App\Services\ProntoAtendimento\RelatorioAtendimentoService;
use App\Utils\Exports\Pdf1;
class RelatorioAtendimentoController extends Controller
{
private const TITLE = 'RELATÓRIO DE ATENDIMENTOS';
private const TEMPLATE = 'pronto-atendimento.relatorio-atendimento';
public static function getTemplate()
{
return [
'atendimentos' => RelatorioAtendimentoService::index(),
'params' => request()->all(),
];
}
public function __invoke()
{
$orientation = isset(request()->orientation) ? request()->orientation : 'portrait';
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate(), $orientation);
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento;
use App\Http\Controllers\Controller;
use App\Services\ProntoAtendimento\RelatorioClassificacaoRiscoService;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
class RelatorioClassificacaoRiscoController extends Controller
{
private const TITLE = 'RELATÓRIO DE CLASSIFICAÇÃO DE RISCO';
private const TEMPLATE = 'pronto-atendimento.relatorio-classificacao-risco';
public static function getTemplate()
{
$data = [
'classificacoes_risco' => RelatorioClassificacaoRiscoService::index(),
'params' => request()->all(),
];
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
public function __invoke()
{
return (new Pdf)->stream(self::getTemplate(), self::TITLE);
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento;
use App\Http\Controllers\Controller;
use App\Services\ProntoAtendimento\RelatorioDocumentoNaoAssinadoService;
use App\Utils\Exports\Pdf1;
class RelatorioDocumentoNaoAssinadoController extends Controller
{
private const TITLE = 'Relatório de documentos não assinados';
private const TEMPLATE = 'pronto-atendimento.relatorio-documento-nao-assinado';
public static function getTemplate()
{
return RelatorioDocumentoNaoAssinadoService::getPrintExportData();
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento;
use App\Http\Controllers\Controller;
use App\Services\ProntoAtendimento\RelatorioExameImagemService;
use App\Utils\Exports\Pdf1;
use App\Utils\Exports\Template;
class RelatorioExameImagemController extends Controller
{
private const TITLE = 'RELATÓRIO DE EXAME DE IMAGEM';
private const TEMPLATE = 'pronto-atendimento.relatorio-exame-imagem';
public static function getTemplate()
{
return [
'itens' => RelatorioExameImagemService::index(),
'colunas' => collect(request()->selectedCols),
'params' => request()->all(),
];
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento;
use App\Http\Controllers\Controller;
use App\Services\ProntoAtendimento\RelatorioPrescricaoInternaService;
use App\Utils\Exports\Pdf1;
class RelatorioPrescricaoInternaController extends Controller
{
private const TITLE = 'RELATÓRIO DE PRESCRIÇÃO INTERNA';
private const TEMPLATE = 'pronto-atendimento.relatorio-prescricao-interna';
public static function getTemplate()
{
return [
'atendimentos' => RelatorioPrescricaoInternaService::index(),
'params' => request()->all(),
];
}
public function __invoke()
{
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getTemplate());
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento;
use App\Http\Controllers\Controller;
use App\Services\ProntoAtendimento\RelatorioProducaoMedicoService;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
class RelatorioProducaoMedicoController extends Controller
{
private const TITLE = 'RELATÓRIO DE PRODUÇÃO DO MÉDICO';
private const TEMPLATE = 'pronto-atendimento.relatorio-producao-medico';
public static function getTemplate()
{
$data = [
'atendimentos' => RelatorioProducaoMedicoService::index(),
'params' => request()->all(),
];
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
public function __invoke()
{
return (new Pdf)->stream(self::getTemplate(), self::TITLE);
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento;
use App\Http\Controllers\Controller;
use App\Services\ProntoAtendimento\RelatorioQuantitativoProducaoService;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
class RelatorioQuantitativoProducaoController extends Controller
{
private const TITLE = 'RELATÓRIO QUANTITATIVO DE PRODUÇÃO';
private const TEMPLATE = 'pronto-atendimento.relatorio-quantitativo-producao';
public static function getTemplate()
{
$data = [
'procedimentos_atendimentos' => RelatorioQuantitativoProducaoService::index(),
'params' => request()->all(),
];
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
public function __invoke()
{
return (new Pdf)->stream(self::getTemplate(), self::TITLE);
}
}

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Http\Controllers\Impressao\ProntoAtendimento;
use App\Http\Controllers\Controller;
use App\Models\ProntoAtendimento\Atendimento\Atendimento;
use App\Utils\Exports\Pdf;
use App\Utils\Exports\Template;
use App\Utils\MaskUtil;
use Carbon\Carbon;
class TermoCienciaController extends Controller
{
private const TITLE = 'TERMO DE CIÊNCIA';
private const TEMPLATE = 'pronto-atendimento.termo-ciencia';
public static function getTemplate($atendimentoId)
{
$faa = Atendimento::findOrFail($atendimentoId)->faa;
$now = Carbon::now();
$data = [
'faa' => [
'numero' => $faa->numero,
'unidade' => [
'nome' => $faa->createdCentroCusto->infraestrutura->unidade->nome_fantasia
]
],
'paciente' => [
'nome' => $faa->paciente->cidadao->nome,
'cns' => $faa->paciente->cidadao->cns ? MaskUtil::getCnsMasked($faa->paciente->cidadao->cns) : '',
],
'dataHora' => $now->format('H') . ' horas e ' . $now->format('i') . ' minutos'
];
return Template::make(self::TITLE, self::TEMPLATE)->withData($data)->getHtml();
}
public function __invoke($atendimentoId)
{
return (new Pdf)->stream(self::getTemplate($atendimentoId), self::TITLE);
}
}