352 lines
20 KiB
PHP
352 lines
20 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Impressao\Ambulatorio;
|
|
|
|
use App\Enums\Ambulatorio\AtendimentoImpressaoTipo;
|
|
use App\Enums\Cadastro\SujeitoAtencao\TipoRegistroUsuario;
|
|
use App\Enums\Parametrizacao\Exame\Tipo;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\Ambulatorio\Atendimento;
|
|
use App\Models\Ambulatorio\AtendimentoSoapExameSolicitado;
|
|
use App\Models\Ambulatorio\AtendimentoSoapTriagemNeonatalSolicitado;
|
|
use App\Models\Ambulatorio\ClassificacaoRisco;
|
|
use App\Models\Cadastro\SujeitoAtencao\Paciente;
|
|
use App\Models\Geral\Ciap;
|
|
use App\Models\Regulacao\Solicitacao as RegulacaoSolicitacao;
|
|
use App\Models\Sigtap\Cid;
|
|
use App\Services\Ambulatorio\AtendimentoService;
|
|
use App\Utils\DataUtil;
|
|
use App\Utils\Exports\Pdf1;
|
|
use App\Utils\MaskUtil;
|
|
use Carbon\Carbon;
|
|
|
|
class ServicoAnaliseDiagnosticoTerapiaSolicitacaoExameController extends Controller
|
|
{
|
|
private const TITLE = 'SERVIÇO DE ANÁLISES, DIAGNÓSTICOS E TERAPIA, SOLICITAÇÃO DE EXAMES (SADAT)';
|
|
private const TEMPLATE = 'ambulatorio.servico-analise-diagnostico-terapia-solicitacao-exame';
|
|
|
|
public function __invoke($atendimentoId, $dados = [])
|
|
{
|
|
|
|
if (request()->has('em_atendimento') && request()->em_atendimento == true) {
|
|
|
|
$dadosNaoSalvos = self::getDadosNaoSalvos($atendimentoId);
|
|
|
|
AtendimentoService::saveLogImpressao(
|
|
request()->atendimento_id,
|
|
AtendimentoImpressaoTipo::SERVICO_DE_ANALISES_DIAGNOSTICOS_E_TERAPIA_SOLICITACAO_DE_EXAMES_SADAT
|
|
);
|
|
|
|
return Pdf1::generate(self::TITLE, self::TEMPLATE, $dadosNaoSalvos);
|
|
} else {
|
|
|
|
return Pdf1::generate(self::TITLE, self::TEMPLATE, self::getAtendimento($atendimentoId, $dados));
|
|
}
|
|
}
|
|
|
|
public static function getDadosNaoSalvos($pacienteId) {
|
|
|
|
$currentLotacao = self::getCurrentLotacao();
|
|
$paciente = Paciente::where('id', $pacienteId)->first();
|
|
|
|
$solicitacoesExames = collect();
|
|
|
|
foreach (request()->exames as $solicitacao) {
|
|
|
|
$itens[] = [
|
|
'exame' => [
|
|
'codigo' => $solicitacao['codigo'],
|
|
'nome' => $solicitacao['nome'],
|
|
],
|
|
];
|
|
};
|
|
|
|
$solicitacoesExames->push([
|
|
'data' =>Carbon::now()->format('d/m/Y') ?? null,
|
|
'cid' => request()->cid ? request()->cid['codigo'] .' - '. request()->cid['nome'] : '-',
|
|
'ciap' => request()->ciap ? request()->ciap['codigo'] .' - '. request()->ciap['descricao'] : '-',
|
|
'classificacao_risco' => ClassificacaoRisco::findOrFail(request()->classificacao_risco_id)->descricao_encaminhamento,
|
|
'justificativa' => request()->justificativa,
|
|
'observacao' => request()->observacao,
|
|
'itens' => $itens,
|
|
'informacoes_administrativas' => [
|
|
'usuario_nome' => $currentLotacao->usuario->cidadao->nome,
|
|
'ocupacao_descricao' => $currentLotacao->ocupacao->codigo . ' - '
|
|
. $currentLotacao->ocupacao->nome,
|
|
'documento' => $currentLotacao->usuario->registro_tipo_id
|
|
? ($currentLotacao->usuario->registro_tipo_id === TipoRegistroUsuario::OUTRO
|
|
? $currentLotacao->usuario->registro_tipo_outro
|
|
: $currentLotacao->usuario->registroTipo->sigla
|
|
) . ": {$currentLotacao->usuario->registro_numero}"
|
|
: 'Conselho profissional: NÃO INFORMADO',
|
|
],
|
|
]);
|
|
|
|
return [
|
|
'paraAssinar' => false,
|
|
'requisitante' => [
|
|
'unidade' => $currentLotacao->infraestrutura->unidade->nome_fantasia,
|
|
'cnes' => $currentLotacao->infraestrutura->unidade->cnes,
|
|
],
|
|
'paciente' => [
|
|
'prontuario' => $paciente->prontuario,
|
|
'nome' => $paciente->cidadao->nome,
|
|
'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',
|
|
'uf' => $paciente->cidadao->domicilio->endereco->logradouro->municipio->estado->uf ?? null,
|
|
'bairro' => $paciente->cidadao->domicilio->endereco->logradouro->bairro->nome ?? null,
|
|
'endereco' => optional(optional(optional($paciente->cidadao)->domicilio)->endereco),
|
|
'logradouro' => optional(optional(optional(optional($paciente->cidadao)->domicilio)->endereco)->logradouro)->nome,
|
|
'numero' => optional(optional(optional($paciente->cidadao)->domicilio)->endereco)->numero,
|
|
'sem_numero' => optional(optional(optional($paciente->cidadao)->domicilio)->endereco)->sem_numero,
|
|
'complemento' => optional(optional(optional($paciente->cidadao)->domicilio)->endereco)->complemento ?? '',
|
|
'cep' => optional(optional(optional(optional($paciente->cidadao)->domicilio)->endereco)->logradouro)->cep
|
|
? MaskUtil::getCepMasked(optional(optional(optional(optional($paciente->cidadao)->domicilio)->endereco)->logradouro)->cep)
|
|
: null,
|
|
'municipio' => optional(optional(optional(optional(optional($paciente->cidadao)->domicilio)->endereco)->logradouro)->municipio)->nome,
|
|
'ibge' => optional(optional(optional(optional(optional($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,
|
|
],
|
|
'solicitacoes' => $solicitacoesExames,
|
|
];
|
|
}
|
|
|
|
public static function getAtendimento($atendimentoId, $dados = []) {
|
|
|
|
$atendimento = Atendimento::findOrFail($atendimentoId);
|
|
|
|
$solicitacoesExames = collect();
|
|
$regulacaoData = self::getRegulacaoData();
|
|
|
|
$paraAssinaturaEletronica = request()->para_assinatura_eletronica === true
|
|
|| (DataUtil::isStringBoolean(request()->para_assinatura_eletronica)
|
|
&& DataUtil::isStringTrue(request()->para_assinatura_eletronica));
|
|
|
|
if (!isset($dados['itens'])) {
|
|
|
|
$dados['itens'] = request()->itens;
|
|
}
|
|
|
|
$solicitacoesItensIds = isset($dados['itens'])
|
|
? collect($dados['itens'])->where('tipo_solicitacao', 'padrao')->pluck('id')
|
|
: null;
|
|
|
|
$atendimento->soaps()
|
|
->where('is_rascunho', false)
|
|
->when($regulacaoData['soap_id'], fn ($q, $id) => $q->where('id', $id))
|
|
->get()
|
|
->each(function ($soap) use ($solicitacoesExames, $regulacaoData, $solicitacoesItensIds) {
|
|
|
|
$soap->solicitacoesExames->each(function ($solicitacao) use ($solicitacoesExames, $regulacaoData, $solicitacoesItensIds) {
|
|
|
|
$itens = $solicitacao->itens()
|
|
->when(isset(request()->solicitacao_exame_item_id), fn ($q) => $q->where('id', request()->solicitacao_exame_item_id))
|
|
->when(isset($solicitacoesItensIds), fn ($q) => $q->whereIn('id', $solicitacoesItensIds))
|
|
->whereHas('exame', fn ($q) => $q->where('tipo_id', Tipo::LABORATORIAL))
|
|
->when($regulacaoData['exames_ids'], fn ($q, $ids) => $q->whereIn('exame_id', $ids))
|
|
->get()
|
|
->map(fn ($item) => [
|
|
'exame' => [
|
|
'codigo' => MaskUtil::getProcedimentoMasked($item->exame->codigo),
|
|
'nome' => $item->exame->nome,
|
|
],
|
|
]);
|
|
|
|
if ($itens->isNotEmpty()) {
|
|
|
|
$cid = $solicitacao->cid_id ? Cid::where('id', $solicitacao->cid_id)->first() : null;
|
|
$ciap = $solicitacao->ciap_id ? Ciap::where('id', $solicitacao->ciap_id)->first() : null;
|
|
|
|
$solicitacoesExames->push([
|
|
'data' => $solicitacao->created_at->format('d/m/Y'),
|
|
'cid' => $cid ? $cid->codigo .' - '. $cid->nome : '-',
|
|
'ciap' => $ciap ? $ciap->codigo .' - '. $ciap->descricao : '-',
|
|
'classificacao_risco' => $solicitacao->classificacaoRisco->descricao_encaminhamento ?? null,
|
|
'justificativa' => $solicitacao->justificativa,
|
|
'observacao' => $solicitacao->observacao,
|
|
'itens' => $itens,
|
|
'informacoes_administrativas' => [
|
|
'usuario_nome' => $solicitacao->createdLotacao->usuario->cidadao->nome,
|
|
'ocupacao_descricao' => $solicitacao->createdLotacao->ocupacao->codigo . ' - '
|
|
. $solicitacao->createdLotacao->ocupacao->nome,
|
|
'documento' => $solicitacao->createdLotacao->usuario->registro_tipo_id
|
|
? ($solicitacao->createdLotacao->usuario->registro_tipo_id === TipoRegistroUsuario::OUTRO
|
|
? $solicitacao->createdLotacao->usuario->registro_tipo_outro
|
|
: $solicitacao->createdLotacao->usuario->registroTipo->sigla
|
|
) . ": {$solicitacao->createdLotacao->usuario->registro_numero}"
|
|
: 'Conselho profissional: NÃO INFORMADO',
|
|
],
|
|
]);
|
|
}
|
|
});
|
|
});
|
|
|
|
if (!isset(request()->solicitacao_exame_item_id)) {
|
|
|
|
$solicitacoesPredefinidos = isset($dados['itens'])
|
|
? collect($dados['itens'])->where('tipo_solicitacao', 'predefinido')
|
|
: null;
|
|
|
|
AtendimentoSoapExameSolicitado::whereHas('soap', function ($q) use ($atendimento) {
|
|
$q->where('is_rascunho', false)->where('atendimento_id', $atendimento->id);
|
|
})
|
|
->get()
|
|
->map(function ($solicitacao) use ($solicitacoesExames, $solicitacoesPredefinidos) {
|
|
|
|
$itens = $solicitacao->examesSolicitados()
|
|
->when(isset($solicitacoesPredefinidos), fn ($q) => $q
|
|
->whereIn('id', $solicitacoesPredefinidos->where('solicitacao_id', $solicitacao->id)->pluck('exame_id'))
|
|
)
|
|
->get()
|
|
->map(fn ($item) => [
|
|
'exame' => [
|
|
'codigo' => MaskUtil::getProcedimentoMasked($item->codigo_procedimento),
|
|
'nome' => $item->descricao,
|
|
],
|
|
]);
|
|
|
|
if ($itens->isNotEmpty()) {
|
|
|
|
$cid = $solicitacao->cid_id ? Cid::where('id', $solicitacao->cid_id)->first() : null;
|
|
$ciap = $solicitacao->ciap_id ? Ciap::where('id', $solicitacao->ciap_id)->first() : null;
|
|
|
|
$solicitacoesExames->push([
|
|
'data' => $solicitacao->created_at->format('d/m/Y'),
|
|
'cid' => $cid ? $cid->codigo .' - '. $cid->nome : '-',
|
|
'ciap' => $ciap ? $ciap->codigo .' - '. $ciap->descricao : '-',
|
|
'classificacao' => null,
|
|
'justificativa' => $solicitacao->justificativa,
|
|
'observacao' => $solicitacao->observacao,
|
|
'itens' => $itens,
|
|
'informacoes_administrativas' => [
|
|
'usuario_nome' => $solicitacao->createdLotacao->usuario->cidadao->nome,
|
|
'ocupacao_descricao' => $solicitacao->createdLotacao->ocupacao->codigo . ' - '
|
|
. $solicitacao->createdLotacao->ocupacao->nome,
|
|
'documento' => $solicitacao->createdLotacao->usuario->registro_tipo_id
|
|
? ($solicitacao->createdLotacao->usuario->registro_tipo_id === TipoRegistroUsuario::OUTRO
|
|
? $solicitacao->createdLotacao->usuario->registro_tipo_outro
|
|
: $solicitacao->createdLotacao->usuario->registroTipo->sigla
|
|
) . ": {$solicitacao->createdLotacao->usuario->registro_numero}"
|
|
: 'Conselho profissional: NÃO INFORMADO',
|
|
],
|
|
]);
|
|
}
|
|
});
|
|
|
|
$solicitacoesPredefinidos = isset($dados['itens'])
|
|
? collect($dados['itens'])->where('tipo_solicitacao', 'triagem_neonatal')
|
|
: null;
|
|
|
|
AtendimentoSoapTriagemNeonatalSolicitado::whereHas('soap', function ($q) use ($atendimento) {
|
|
$q->where('is_rascunho', false)->where('atendimento_id', $atendimento->id);
|
|
})
|
|
->get()
|
|
->map(function ($solicitacao) use ($solicitacoesExames, $solicitacoesPredefinidos) {
|
|
|
|
$itens = $solicitacao->triagensNeonatalSolicitados()
|
|
->when(isset($solicitacoesPredefinidos), fn ($q) => $q
|
|
->whereIn('id', $solicitacoesPredefinidos->where('solicitacao_id', $solicitacao->id)->pluck('exame_id'))
|
|
)
|
|
->get()
|
|
->map(fn ($item) => [
|
|
'exame' => [
|
|
'codigo' => MaskUtil::getProcedimentoMasked($item->codigo_procedimento),
|
|
'nome' => $item->descricao,
|
|
],
|
|
]);
|
|
|
|
if ($itens->isNotEmpty()) {
|
|
|
|
$cid = $solicitacao->cid_id ? Cid::where('id', $solicitacao->cid_id)->first() : null;
|
|
$ciap = $solicitacao->ciap_id ? Ciap::where('id', $solicitacao->ciap_id)->first() : null;
|
|
|
|
$solicitacoesExames->push([
|
|
'data' => $solicitacao->created_at->format('d/m/Y'),
|
|
'cid' => $cid ? $cid->codigo .' - '. $cid->nome : '-',
|
|
'ciap' => $ciap ? $ciap->codigo .' - '. $ciap->descricao : '-',
|
|
'classificacao' => null,
|
|
'justificativa' => $solicitacao->justificativa,
|
|
'observacao' => $solicitacao->observacao,
|
|
'itens' => $itens,
|
|
'informacoes_administrativas' => [
|
|
'usuario_nome' => $solicitacao->createdLotacao->usuario->cidadao->nome,
|
|
'ocupacao_descricao' => $solicitacao->createdLotacao->ocupacao->codigo . ' - '
|
|
. $solicitacao->createdLotacao->ocupacao->nome,
|
|
'documento' => $solicitacao->createdLotacao->usuario->registro_tipo_id
|
|
? ($solicitacao->createdLotacao->usuario->registro_tipo_id === TipoRegistroUsuario::OUTRO
|
|
? $solicitacao->createdLotacao->usuario->registro_tipo_outro
|
|
: $solicitacao->createdLotacao->usuario->registroTipo->sigla
|
|
) . ": {$solicitacao->createdLotacao->usuario->registro_numero}"
|
|
: 'Conselho profissional: NÃO INFORMADO',
|
|
],
|
|
]);
|
|
}
|
|
});
|
|
}
|
|
|
|
return [
|
|
'paraAssinar' => $paraAssinaturaEletronica,
|
|
'requisitante' => [
|
|
'unidade' => $atendimento->createdLotacao()->withTrashed()->first()->infraestrutura->unidade->nome_fantasia,
|
|
'cnes' => $atendimento->createdLotacao()->withTrashed()->first()->infraestrutura->unidade->cnes,
|
|
],
|
|
'paciente' => [
|
|
'prontuario' => $atendimento->paciente->prontuario,
|
|
'nome' => $atendimento->paciente->cidadao->nome,
|
|
'nome_social' => $atendimento->paciente->cidadao->nome_social,
|
|
'idade' => $atendimento->paciente->cidadao->idade_formatada,
|
|
'cns' => $atendimento->paciente->cidadao->cns ? MaskUtil::getCnsMasked($atendimento->paciente->cidadao->cns) : 'NÃO INFORMADO',
|
|
'cpf' => $atendimento->paciente->cidadao->cpf ? MaskUtil::getCpfMasked($atendimento->paciente->cidadao->cpf) : 'NÃO INFORMADO',
|
|
'rg' => $paciente->cidadao->carteiraIdentidade->numero ?? '-',
|
|
'sexo' => $atendimento->paciente->cidadao->sexo->descricao,
|
|
'data_nascimento' => $atendimento->paciente->cidadao->data_nascimento
|
|
? $atendimento->paciente->cidadao->data_nascimento->format('d/m/Y')
|
|
: 'NÃO INFORMADA',
|
|
'nome_mae' => $atendimento->paciente->cidadao->nome_mae ?? 'NÃO INFORMADO',
|
|
'municipio' => $atendimento->paciente->cidadao->domicilio->endereco->logradouro->municipio->nome ?? null,
|
|
'uf' => $atendimento->paciente->cidadao->domicilio->endereco->logradouro->municipio->estado->uf ?? null,
|
|
'bairro' => $atendimento->paciente->cidadao->domicilio->endereco->logradouro->bairro->nome ?? null,
|
|
'logradouro' => $atendimento->paciente->cidadao->domicilio->endereco->logradouro->nome ?? null,
|
|
'numero' => $atendimento->paciente->cidadao->domicilio->endereco->numero ?? null,
|
|
'sem_numero' => $atendimento->paciente->cidadao->domicilio->endereco->sem_numero ?? null,
|
|
'complemento' => $atendimento->paciente->cidadao->domicilio->endereco->complemento ?? '',
|
|
'cep' => $atendimento->paciente->cidadao->domicilio
|
|
? MaskUtil::getCepMasked( $atendimento->paciente->cidadao->domicilio->endereco->logradouro->cep)
|
|
: null,
|
|
'municipio' => $atendimento->paciente->cidadao->domicilio->endereco->logradouro->municipio->nome ?? null,
|
|
'ibge' => $atendimento->paciente->cidadao->domicilio->endereco->logradouro->municipio->ibge ?? null,
|
|
'telefones' => $atendimento->paciente->cidadao->telefones->map(fn ($t) => MaskUtil::getPhoneMasked($t->numero))->all(),
|
|
'unidade_referencia' => $atendimento->paciente->unidade->nome_fantasia ?? null,
|
|
],
|
|
'solicitacoes' => $solicitacoesExames,
|
|
];
|
|
}
|
|
|
|
private static function getRegulacaoData()
|
|
{
|
|
$regulacaoData = [
|
|
'soap_id' => null,
|
|
'exames_ids' => null,
|
|
];
|
|
|
|
if (request()->regulacao_solicitacao_id) {
|
|
|
|
$regulacaoSolicitacao = RegulacaoSolicitacao::findOrFail(request()->regulacao_solicitacao_id);
|
|
|
|
$regulacaoData['soap_id'] = $regulacaoSolicitacao->ambulatorio_atendimento_soap_id;
|
|
$regulacaoData['exames_ids'] = $regulacaoSolicitacao->itens()->pluck('exame_id');
|
|
}
|
|
|
|
return $regulacaoData;
|
|
}
|
|
}
|