Files
rkm-conectasus-ci-sandbox/api/app/Http/Controllers/Impressao/Ambulatorio/FichaRequisicaoServicoAuxiliarDiagnoseTerapiaController.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

344 lines
18 KiB
PHP

<?php
namespace App\Http\Controllers\Impressao\Ambulatorio;
use App\Enums\Ambulatorio\AtendimentoImpressaoTipo;
use App\Enums\Cadastro\SujeitoAtencao\Sexo;
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\ClassificacaoRisco;
use App\Models\Ambulatorio\ParametrizacaoAtendimento;
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\MaskUtil;
use Barryvdh\Snappy\Facades\SnappyPdf;
use Carbon\Carbon;
class FichaRequisicaoServicoAuxiliarDiagnoseTerapiaController extends Controller
{
public function __invoke($atendimentoId, $dados = [])
{
$impressao = null;
$parametrizacao = ParametrizacaoAtendimento::first();
if (!is_null($parametrizacao) && $parametrizacao->modelo_impressao_sadt === 'especifico') {
$impressao = 'impressoes.template.ambulatorio.ficha-requisicao-servico-auxiliar-diagnose-terapia-especifico';
} else {
$impressao = 'impressoes.template.ambulatorio.ficha-requisicao-servico-auxiliar-diagnose-terapia-padrao';
}
if (request()->has('em_atendimento') && request()->em_atendimento == true) {
$dadosNaoSalvos = self::getDadosNaoSalvos($atendimentoId);
AtendimentoService::saveLogImpressao(
request()->atendimento_id,
AtendimentoImpressaoTipo::FICHA_DE_REQUISICAO_DE_SERVICOS_AUXILIARES_DE_DIAGOSE_E_TERAPIA_SADT
);
return SnappyPdf::loadView($impressao, $dadosNaoSalvos)
->setOption('header-html', '')
->setOption('footer-html', '')
->setOption('margin-bottom', 0)
->setOption('margin-left', 2)
->setOption('margin-right', 2)
->setOption('margin-top', 6)
->setPaper('a4')
->inline();
} else {
return SnappyPdf::loadView($impressao, self::getAtendimento($atendimentoId, $dados))
->setOption('header-html', '')
->setOption('footer-html', '')
->setOption('margin-bottom', 0)
->setOption('margin-left', 2)
->setOption('margin-right', 2)
->setOption('margin-top', 6)
->setPaper('a4')
->inline();
}
}
public static function getDadosNaoSalvos($pacienteId)
{
$currentLotacao = self::getCurrentLotacao();
$paciente = Paciente::where('id', $pacienteId)->first();
$solicitacoesExames = collect();
foreach ((request()->exames ?? request()->procedimentos_cirurgicos) as $item) {
$itens[] = [
'codigo' => $item['codigo'],
'nome' => $item['nome'],
];
};
$classificacaoRisco = ClassificacaoRisco::findOrFail(request()->classificacao_risco_id)->descricao_encaminhamento ?? null;
$solicitacoesExames->push([
'data' =>Carbon::now()->format('d/m/Y') ?? null,
'cid' => request()->cid ? request()->cid['codigo'] .' - '. request()->cid['nome'] : null,
'ciap' => request()->ciap ? request()->ciap['codigo'] .' - '. request()->ciap['descricao'] : null,
'justificativa' => request()->justificativa,
'observacao' => ($classificacaoRisco ? "Classificação de risco: {$classificacaoRisco}. " : '') . request()->observacao,
'itens' => $itens,
'usuario_origem' => [
'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}"
: null,
],
]);
$dataNascimento = Carbon::parse($paciente->cidadao->data_nascimento);
$dataCriacao = Carbon::parse(Carbon::now()->format('Y-m-d'));
$diferenca = $dataNascimento->diff($dataCriacao);
$idade = [];
if ($diferenca->y > 0) {
$idade[] = $diferenca->y . ' ' . ($diferenca->y === 1 ? 'ano' : 'anos');
}
if ($diferenca->m > 0) {
$idade[] = $diferenca->m . ' ' . ($diferenca->m === 1 ? 'mês' : 'meses');
}
if ($diferenca->d > 0) {
$idade[] = $diferenca->d . ' ' . ($diferenca->d === 1 ? 'dia' : 'dias');
}
return [
'paraAssinar' => false,
'requisitante' => [
'unidade' => $currentLotacao->infraestrutura->unidade->nome_fantasia,
'cnes' => $currentLotacao->infraestrutura->unidade->cnes,
],
'paciente' => [
'rg' => $paciente->cidadao->carteiraIdentidade->numero ?? null,
'data_nascimento' => is_null($paciente->cidadao->data_nascimento)
? null
: (new Carbon($paciente->cidadao->data_nascimento))->format('dmy'),
'sexo_masculino' => is_null($paciente->cidadao->sexo_id)
? null : $paciente->cidadao->sexo_id === Sexo::MASCULINO,
'nome' => $paciente->cidadao->nome,
'nome_social' => $paciente->cidadao->nome_social,
'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 ?? null,
'sem_numero' => $paciente->cidadao->domicilio->endereco->sem_numero ?? false,
'complemento' => $paciente->cidadao->domicilio->endereco->complemento ?? '',
'cep' => $paciente->cidadao->domicilio
? $paciente->cidadao->domicilio->endereco->logradouro->cep
: null,
'ibge' => $paciente->cidadao->domicilio->endereco->logradouro->municipio->ibge ?? null,
'idade' => implode(', ', $idade),
'cns' => $paciente->cidadao->cns ?? null,
'cpf' => $paciente->cidadao->cpf ?? null,
'prontuario' => $paciente->prontuario
? str_pad($paciente->prontuario, 8, '0', STR_PAD_LEFT)
: null,
'telefones' => $paciente->cidadao->telefones->map(fn ($t) => MaskUtil::getPhoneMasked($t->numero))->all(),
'unidade_referencia' => $paciente->unidade->nome_fantasia ?? null,
'unidade_referencia_cnes' => $paciente->unidade->cnes ?? null,
'nome_mae' => $paciente->cidadao->nome_mae ?? null,
],
'solicitacoes' => $solicitacoesExames,
];
}
public static function getAtendimento($atendimentoId, $dados = []) {
$atendimento = Atendimento::findOrFail($atendimentoId);
$solicitacoesExames = collect();
$solicitacoesProcedimentosCirurgicos = collect();
$regulacaoData = self::getRegulacaoData();
if (!isset($dados['itens'])) {
$dados['itens'] = request()->itens;
}
$atendimento->soaps()
->where('is_rascunho', false)
->when($regulacaoData['soap_id'], fn ($q, $id) => $q->where('id', $id))
->get()
->each(function ($soap) use ($solicitacoesExames, $solicitacoesProcedimentosCirurgicos, $regulacaoData, $dados) {
$soap->solicitacoesExames->each(function ($solicitacao) use ($solicitacoesExames, $regulacaoData, $dados) {
$itens = $solicitacao->itens()
->when(isset(request()->solicitacao_exame_item_id), fn ($q) => $q->where('id', request()->solicitacao_exame_item_id))
->when(isset($dados['itens']), fn ($q) => $q->whereIn('id', collect($dados['itens'])->where('origem', 'exame')->pluck('id')))
->when($regulacaoData['exames_ids'], fn ($q, $ids) => $q->whereIn('exame_id', $ids))
->whereHas('exame', fn ($q) => $q->where('tipo_id', Tipo::IMAGEM))
->get()
->map(fn ($item) => [
'codigo' => $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;
$classificacaoRisco = $solicitacao->classificacaoRisco->descricao_encaminhamento ?? null;
$solicitacoesExames->push([
'data' => $solicitacao->created_at->format('d/m/Y'),
'cid' => $cid ? $cid->codigo .' - '. $cid->nome : null,
'ciap' => $ciap ? $ciap->codigo .' - '. $ciap->descricao : null,
'justificativa' => $solicitacao->justificativa,
'observacao' => ($classificacaoRisco ? "Classificação de risco: {$classificacaoRisco}. " : '') . ($solicitacao->observacao ?? null),
'itens' => $itens,
'usuario_origem' => [
'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}"
: null,
],
]);
}
});
if (!isset(request()->solicitacao_exame_item_id) && !$regulacaoData['exames_ids']) {
$soap->solicitacoesProcedimentosCirurgicos->each(function ($solicitacao) use ($solicitacoesProcedimentosCirurgicos, $dados) {
$itens = $solicitacao->itens()
->when(isset($dados['itens']), fn ($q) => $q->whereIn('id', collect($dados['itens'])->where('origem', 'procedimento_cirurgico')->pluck('id')))
->get()
->map(fn ($item) => [
'codigo' => $item->procedimentoCirurgico->procedimento_codigo,
'nome' => $item->procedimentoCirurgico->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;
$classificacaoRisco = $solicitacao->classificacaoRisco->descricao_encaminhamento ?? null;
$solicitacoesProcedimentosCirurgicos->push([
'data' => $solicitacao->created_at->format('d/m/Y'),
'cid' => $cid ? $cid->codigo .' - '. $cid->nome : null,
'ciap' => $ciap ? $ciap->codigo .' - '. $ciap->descricao : null,
'justificativa' => $solicitacao->justificativa,
'observacao' => ($classificacaoRisco ? "Classificação de risco: {$classificacaoRisco}. " : '') . ($solicitacao->observacao ?? null),
'itens' => $itens,
'usuario_origem' => [
'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}"
: null,
],
]);
}
});
}
});
$dataNascimento = Carbon::parse($atendimento->paciente->cidadao->data_nascimento);
$dataCriacao = Carbon::parse($atendimento->created_at);
$diferenca = $dataNascimento->diff($dataCriacao);
$idade = [];
if ($diferenca->y > 0) {
$idade[] = $diferenca->y . ' ' . ($diferenca->y === 1 ? 'ano' : 'anos');
}
if ($diferenca->m > 0) {
$idade[] = $diferenca->m . ' ' . ($diferenca->m === 1 ? 'mês' : 'meses');
}
if ($diferenca->d > 0) {
$idade[] = $diferenca->d . ' ' . ($diferenca->d === 1 ? 'dia' : 'dias');
}
$paraAssinaturaEletronica = request()->para_assinatura_eletronica === true
|| (DataUtil::isStringBoolean(request()->para_assinatura_eletronica)
&& DataUtil::isStringTrue(request()->para_assinatura_eletronica));
return [
'paraAssinar' => $paraAssinaturaEletronica,
'requisitante' => [
'unidade' => $atendimento->createdLotacao()->withTrashed()->first()->infraestrutura->unidade->nome_fantasia,
'cnes' => $atendimento->createdLotacao()->withTrashed()->first()->infraestrutura->unidade->cnes,
],
'paciente' => [
'rg' => $atendimento->paciente->cidadao->carteiraIdentidade->numero ?? null,
'data_nascimento' => is_null($atendimento->paciente->cidadao->data_nascimento)
? null
: (new Carbon($atendimento->paciente->cidadao->data_nascimento))->format('dmy'),
'sexo_masculino' => is_null($atendimento->paciente->cidadao->sexo_id)
? null : $atendimento->paciente->cidadao->sexo_id === Sexo::MASCULINO,
'nome' => $atendimento->paciente->cidadao->nome,
'nome_social' => $atendimento->paciente->cidadao->nome_social,
'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
? $atendimento->paciente->cidadao->domicilio->endereco->logradouro->cep
: null,
'ibge' => $atendimento->paciente->cidadao->domicilio->endereco->logradouro->municipio->ibge ?? null,
'idade' => implode(', ', $idade),
'cns' => $atendimento->paciente->cidadao->cns ?? null,
'cpf' => $atendimento->paciente->cidadao->cpf ?? null,
'prontuario' => $atendimento->paciente->prontuario
? str_pad($atendimento->paciente->prontuario, 8, '0', STR_PAD_LEFT)
: null,
'telefones' => $atendimento->paciente->cidadao->telefones->map(fn ($t) => MaskUtil::getPhoneMasked($t->numero))->all(),
'unidade_referencia' => $atendimento->paciente->unidade->nome_fantasia ?? null,
'unidade_referencia_cnes' => $atendimento->paciente->unidade->cnes ?? null,
'nome_mae' => $atendimento->paciente->cidadao->nome_mae ?? null,
],
'solicitacoes' => $solicitacoesExames->concat($solicitacoesProcedimentosCirurgicos),
];
}
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;
}
}