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

444 lines
22 KiB
PHP

<?php
namespace App\Http\Controllers\Impressao\Ambulatorio;
use App\Enums\AtencaoBasica\AtendimentoIndividual\Encaminhamento as EncaminhamentoEnum;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\Intranet\Sistema;
use App\Http\Controllers\Controller;
use App\Models\Ambulatorio\AmbulatorioEncaminhamentoCaraterInternacao;
use App\Models\Ambulatorio\AmbulatorioEncaminhamentoClinica;
use App\Models\Ambulatorio\AmbulatorioEncaminhamentoCausaExterna;
use App\Models\Ambulatorio\AmbulatorioEncaminhamentoVinculoPrevidencia;
use App\Models\Ambulatorio\Atendimento;
use App\Models\Ambulatorio\AtendimentoSoap;
use App\Models\Cadastro\Estabelecimento\CentroCusto;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Geral\DocumentoTipo;
use App\Models\Intranet\Cliente;
use App\Models\Sigtap\Cid;
use App\Utils\MaskUtil;
use Barryvdh\Snappy\Facades\SnappyPdf;
use Carbon\Carbon;
class EncaminhamentoHospitalarController extends Controller
{
private const TITLE = 'LAUDO PARA SOLICITAÇÃO DE AUTORIZAÇÃO DE INTERNAÇÃO HOSPITALAR';
private const TEMPLATE = 'impressoes.template.ambulatorio.encaminhamento-hospitalar';
public function __invoke($atendimentoId)
{
if (request()->has('em_atendimento') && request()->em_atendimento == true) {
return SnappyPdf::loadView(self::TEMPLATE, [
'title' => self::TITLE,
'paciente' => self::getPacienteDataPacienteId($atendimentoId),
'internacao' => self::getInternacaoDataRascunho(),
'cliente' => self::getClienteData(),
'causa_externa' => self::getCausaExternaOptions(),
'usuario' => self::getUsuarioData(),
])
->setOption('header-html', '')
->setOption('footer-html', '')
->setOption('margin-top', '10')
->setOption('margin-bottom', '10')
->setOption('zoom', 0.8)
->inline();
}
return SnappyPdf::loadView(self::TEMPLATE, [
'title' => self::TITLE,
'paciente' => self::getPacienteData(request()->atendimento_id ?? $atendimentoId),
'internacao' => self::getInternacaoData(request()->atendimento_id ?? $atendimentoId),
'cliente' => self::getClienteData(),
'causa_externa' => self::getCausaExternaOptions(),
'usuario'=> self::getUsuarioData()
])
->setOption('header-html', '')
->setOption('footer-html', '')
->setOption('margin-top', '10')
->setOption('margin-bottom', '10')
->setOption('zoom', 0.8)
->inline();
}
private static function getClienteData(){
$cliente = Cliente::where('link', app('config')->get('database.default'))
->where('sistema_id', Sistema::CONECTASUS)
->firstOrFail();
$logotipo = $cliente->logotipo ? base64_encode(file_get_contents(storage_path('app/intranet/cliente/logotipo/' . $cliente->logotipo))) : null;
$ramoAtividade = $cliente->sistema->ramoAtividade;
$infraestruturaLogada = CentroCusto::findOrFail(auth()->payload()->get('centro_custo_id'))->infraestrutura;
return [
'logotipo' => $logotipo,
'nome' => $cliente->nome,
'ramoAtividade' => $ramoAtividade->nome,
'infraestrutura' => [
'nomeUnidade' => $infraestruturaLogada->unidade->nome_fantasia,
'telefone' => $infraestruturaLogada->telefone,
'endereco' => [
'logradouroNome' => $infraestruturaLogada->endereco->logradouro->nome,
'tipo' => $infraestruturaLogada->endereco->logradouro->tipo->descricao,
'numero' => $infraestruturaLogada->endereco->numero,
'referencia' => $infraestruturaLogada->endereco->referencia,
'bairro' => $infraestruturaLogada->endereco->logradouro->bairro->nome,
'cep'=> $infraestruturaLogada->endereco->logradouro->cep,
'municipio' => $infraestruturaLogada->endereco->logradouro->municipio->nome,
'uf'=> $infraestruturaLogada->endereco->logradouro->municipio->estado->uf
]
]
];
}
private static function getInternacaoData($atendimentoId)
{
$atendimentoSoap = AtendimentoSoap::where('atendimento_id', $atendimentoId)->first();
if (!$atendimentoSoap) {
return request()->has('internacaoHospitalar')
? self::getInternacaoDataRascunho()
: self::getInternacaoDataVazia();
}
$internacao = $atendimentoSoap->encaminhamentos
->where('tipo_id', EncaminhamentoEnum::ENCAMINHAMENTO_PARA_INTERNACAO_HOSPITALAR)
->first();
if (!$internacao) {
return request()->has('internacaoHospitalar')
? self::getInternacaoDataRascunho()
: self::getInternacaoDataVazia();
}
return [
'unidade_solicitante' => [
'nome' => $internacao->internacaoHospitalarUnidadeSolicitante->nome_fantasia,
'cnes' => $internacao->internacaoHospitalarUnidadeSolicitante->cnes
],
'unidade_internacao' =>[
'nome'=> null,
'cnes'=> null
],
'principais_sinais_sintomas_clinicos' => $internacao->internacao_hosp_principais_sinais_sintomas_clinicos,
'condicoes_que_justificam_internacao' => $internacao->internacao_hosp_condicoes_que_justificam_internacao,
'principais_resultados_de_provas_diagnosticas' => $internacao->internacao_hosp_principais_resultados_de_provas_diagnosticas,
'cid_principal' => [
'codigo' => MaskUtil::getCidMasked($internacao->InternacaoHospitalarCidPrincipal->codigo),
'nome' => $internacao->InternacaoHospitalarCidPrincipal->nome
],
'cid_secundario' => $internacao->internacao_hospitalar_cid_secundario_id
? MaskUtil::getCidMasked($internacao->InternacaoHospitalarCidSecundario->codigo)
: '',
'cid_causas_associadas' => $internacao->internacao_hospitalar_cid_causas_associadas_id
? MaskUtil::getCidMasked($internacao->InternacaoHospitalarCidCausasAssociadas->codigo)
: '',
'procedimento' => self::getProcedimentoData($internacao),
'causas_externas' => [
'causa_externa' => $internacao->internacao_hospitalar_causa_externa_id,
'vinculo_previdencia' => $internacao->internacao_hospitalar_vinculo_previdencia_id,
'cnpj_seguradora' => $internacao->internacao_hospitalar_cnpj_seguradora,
'numero_bilhete' => $internacao->internacao_hospitalar_numero_bilhete,
'serie' => $internacao->internacao_hospitalar_serie,
'cnpj_empresa' => $internacao->internacao_hospitalar_cnpj_empresa,
'cnae_empresa' => $internacao->internacao_hospitalar_cnae_empresa,
'cbor' => $internacao->internacao_hospitalar_cbor,
],
'autorizacao' => self::getAutorizacaoData($internacao)
];
}
private static function getInternacaoDataVazia()
{
return [
'unidade_solicitante' => [
'nome' => null,
'cnes' => null,
],
'unidade_internacao' => [
'nome' => null,
'cnes' => null,
],
'principais_sinais_sintomas_clinicos' => null,
'condicoes_que_justificam_internacao' => null,
'principais_resultados_de_provas_diagnosticas' => null,
'cid_principal' => null,
'cid_secundario' => '',
'cid_causas_associadas' => '',
'procedimento' => [
'procedimento_solicitado' => null,
'data_solicitacao' => null,
'clinica' => null,
'carater_internacao' => null,
'profissional_solicitante_assistente' => null,
'profissional_assistente_documento' => [
'nome' => null,
'numero' => null,
],
],
'causas_externas' => [
'causa_externa' => null,
'vinculo_previdencia' => null,
'cnpj_seguradora' => null,
'numero_bilhete' => null,
'serie' => null,
'cnpj_empresa' => null,
'cnae_empresa' => null,
'cbor' => null,
],
'autorizacao' => [
'profissional_autorizador' => null,
'orgao_codigo_emissor' => null,
'profissional_autorizador_documento' => [
'nome' => null,
'numero' => null,
],
'documento_numero' => null,
'data_autorizacao' => null,
],
];
}
private static function getUsuarioData(){
$lotacaoLogada = self::getCurrentLotacao();
return [
'nome' => $lotacaoLogada->usuario->cidadao->nome,
'unidade' => $lotacaoLogada->infraestrutura->unidade->nome_fantasia,
'data_hora_impressao' => Carbon::now()->format('d/m/Y H:i')
];
}
private static function getPacienteDataPacienteId($pacienteId)
{
$paciente = Paciente::findOrFail($pacienteId);
$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 getInternacaoDataRascunho()
{
$internacao = request()->internacaoHospitalar ?? [];
$procedimento = $internacao['procedimento'] ?? [];
$causasExternas = $internacao['causasExternas'] ?? [];
$autorizacao = $internacao['autorizacao'] ?? [];
$cidPrincipal = $internacao['cidPrincipal'] ?? null;
$cidSecundarioData = $internacao['cidSecundario'] ?? null;
$cidCausasAssociadasData = $internacao['cidCausasAssociadas'] ?? null;
$cidSecundarioCodigo = null;
if ($cidSecundarioData) {
if (isset($cidSecundarioData['codigo'])) {
$cidSecundarioCodigo = $cidSecundarioData['codigo'];
} elseif (isset($cidSecundarioData['id'])) {
$cid = Cid::find($cidSecundarioData['id']);
$cidSecundarioCodigo = $cid->codigo ?? null;
}
}
$cidCausasAssociadasCodigo = null;
if ($cidCausasAssociadasData) {
if (isset($cidCausasAssociadasData['codigo'])) {
$cidCausasAssociadasCodigo = $cidCausasAssociadasData['codigo'];
} elseif (isset($cidCausasAssociadasData['id'])) {
$cid = Cid::find($cidCausasAssociadasData['id']);
$cidCausasAssociadasCodigo = $cid->codigo ?? null;
}
}
$unidadeSolicitante = !empty($internacao['unidadeSolicitanteId'])
? Unidade::find($internacao['unidadeSolicitanteId'])
: null;
$clinica = !empty($procedimento['clinicaId'])
? AmbulatorioEncaminhamentoClinica::find($procedimento['clinicaId'])
: null;
$caraterInternacao = !empty($procedimento['caraterInternacaoId'])
? AmbulatorioEncaminhamentoCaraterInternacao::find($procedimento['caraterInternacaoId'])
: null;
$documentoTipo = !empty($procedimento['profissionalSolicitanteDocumentoTipoId'])
? DocumentoTipo::find($procedimento['profissionalSolicitanteDocumentoTipoId'])
: null;
$autorizadorDocumentoTipo = !empty($autorizacao['profissionalAutorizadorDocumentoTipoId'])
? DocumentoTipo::find($autorizacao['profissionalAutorizadorDocumentoTipoId'])
: null;
$procedimentoSolicitado = $procedimento['procedimentoSolicitado'] ?? null;
$profissionalSolicitante = $procedimento['profissionalSolicitanteAssistente'] ?? null;
$profissionalAutorizador = $autorizacao['profissionalAutorizador'] ?? null;
return [
'unidade_solicitante' => [
'nome' => $unidadeSolicitante->nome_fantasia ?? null,
'cnes' => $unidadeSolicitante->cnes ?? null,
],
'unidade_internacao' => [
'nome' => null,
'cnes' => null,
],
'principais_sinais_sintomas_clinicos' => $internacao['principaisSinaisSintomasClinicos'] ?? null,
'condicoes_que_justificam_internacao' => $internacao['condicoesQueJustificamInternacao'] ?? null,
'principais_resultados_de_provas_diagnosticas' => $internacao['principaisResultadosDeProvasDiagnosticas'] ?? null,
'cid_principal' => $cidPrincipal ? [
'codigo' => MaskUtil::getCidMasked($cidPrincipal['codigo']),
'nome' => $cidPrincipal['nome'],
] : null,
'cid_secundario' => $cidSecundarioCodigo ? MaskUtil::getCidMasked($cidSecundarioCodigo) : '',
'cid_causas_associadas' => $cidCausasAssociadasCodigo ? MaskUtil::getCidMasked($cidCausasAssociadasCodigo) : '',
'procedimento' => [
'procedimento_solicitado' => $procedimentoSolicitado ? [
'codigo' => MaskUtil::getProcedimentoMasked($procedimentoSolicitado['codigo']),
'nome' => $procedimentoSolicitado['nome'],
] : null,
'data_solicitacao' => !empty($procedimento['dataSolicitacao'])
? Carbon::parse($procedimento['dataSolicitacao'])->format('d/m/Y')
: null,
'clinica' => $clinica->nome ?? null,
'carater_internacao' => $caraterInternacao->nome ?? null,
'profissional_solicitante_assistente' => $profissionalSolicitante['cidadaoNome'] ?? null,
'profissional_assistente_documento' => [
'nome' => $documentoTipo->nome ?? null,
'numero' => ($documentoTipo && !empty($procedimento['profissionalSolicitanteDocumentoNumero']))
? MaskUtil::getDocumentMasked(
$procedimento['profissionalSolicitanteDocumentoTipoId'],
$procedimento['profissionalSolicitanteDocumentoNumero']
)
: null,
],
],
'causas_externas' => [
'causa_externa' => $causasExternas['causaExternaId'] ?? null,
'vinculo_previdencia' => $causasExternas['vinculoPrevidenciaId'] ?? null,
'cnpj_seguradora' => $causasExternas['cnpjSeguradora'] ?? null,
'numero_bilhete' => $causasExternas['numeroBilhete'] ?? null,
'serie' => $causasExternas['serie'] ?? null,
'cnpj_empresa' => $causasExternas['cnpjEmpresa'] ?? null,
'cnae_empresa' => $causasExternas['cnaeEmpresa'] ?? null,
'cbor' => $causasExternas['cbor'] ?? null,
],
'autorizacao' => [
'profissional_autorizador' => $profissionalAutorizador['cidadaoNome'] ?? null,
'orgao_codigo_emissor' => $autorizacao['codigoOrgaoEmissor'] ?? null,
'profissional_autorizador_documento' => [
'nome' => $autorizadorDocumentoTipo->nome ?? null,
'numero' => ($autorizadorDocumentoTipo && !empty($autorizacao['profissionalAutorizadorDocumentoNumero']))
? MaskUtil::getDocumentMasked(
$autorizacao['profissionalAutorizadorDocumentoTipoId'],
$autorizacao['profissionalAutorizadorDocumentoNumero']
)
: null,
],
'documento_numero' => null,
'data_autorizacao' => !empty($autorizacao['dataAutorizacao'])
? Carbon::parse($autorizacao['dataAutorizacao'])->format('d/m/Y')
: null,
],
];
}
private static function getPacienteData($atendimentoId)
{
$atendimento = Atendimento::findOrFail($atendimentoId);
$cidadao = $atendimento->paciente->cidadao;
return [
'nome' => $cidadao->nome,
'nome_social' => $cidadao->nome_social,
'prefere_nome_social' => $cidadao->preferencia_nome_id === PreferenciaNome::NOME_SOCIAL,
'prontuario' => $atendimento->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($internacao)
{
$procedimento = $internacao->internacaoHospitalarProcedimentoSolicitado;
return [
'procedimento_solicitado' => [
'codigo' => MaskUtil::getProcedimentoMasked($procedimento->codigo),
'nome' => $procedimento->nome
],
'data_solicitacao' => (new Carbon($internacao->internacao_hospitalar_data_solicitacao))->format('d/m/Y'),
'clinica' => $internacao->InternacaoHospitalarClinica->nome,
'carater_internacao' => $internacao->InternacaoHospitalarCaraterInternacao->nome,
'profissional_solicitante_assistente' => $internacao->internacaoHospitalarProfissionalSolicitanteAssistente->cidadao->nome,
'profissional_assistente_documento' => [
'nome' => $internacao->internacaoHospitalarProfissionalSolicitanteDocumentoTipo->nome,
'numero' => MaskUtil::getDocumentMasked(
$internacao->internacao_hospitalar_profissional_solicitante_documento_tipo_id,
$internacao->internacao_hospitalar_profissional_solicitante_documento_numero
)
]
];
}
private static function getAutorizacaoData($internacao){
return [
'profissional_autorizador' => optional(optional($internacao->internacaoHospitalarProfissionalAutorizador)->cidadao)->nome,
'orgao_codigo_emissor' => $internacao->internacao_hospitalar_codigo_orgao_emissor,
'profissional_autorizador_documento'=>[
'nome' => optional($internacao->internacaoHospitalarProfissionalAutorizadorDocumentoTipo)->nome,
'numero'=> $internacao->internacao_hospitalar_profissional_autorizador_documento_numero
? MaskUtil::getDocumentMasked(
$internacao->internacao_hospitalar_profissional_autorizador_documento_tipo_id,
$internacao->internacao_hospitalar_profissional_autorizador_documento_numero
)
: null
],
'documento_numero' => $internacao->internacao_hospitalar_documento_numero,
'data_autorizacao' => $internacao->internacao_hospitalar_data_autorizacao
? Carbon::parse($internacao->internacao_hospitalar_data_autorizacao)->format('d/m/Y')
: null
];
}
private static function getCausaExternaOptions()
{
return [
'causas_externas' => AmbulatorioEncaminhamentoCausaExterna::pluck('nome','id'),
'vinculos_previdencia' => AmbulatorioEncaminhamentoVinculoPrevidencia::pluck('nome', 'id')
];
}
}