Files
rkm-conectasus-ci-sandbox/api/app/Services/Ambulatorio/FormularioRaasService.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

303 lines
16 KiB
PHP

<?php
namespace App\Services\Ambulatorio;
use App\Enums\Sigtap\ClassificacaoServicoAtencaoPsicossocial;
use App\Enums\Sigtap\Procedimento as ProcedimentoEnum;
use App\Enums\Sigtap\Registro as RegistroEnum;
use App\Enums\Sigtap\Servico as ServicoEnum;
use App\Models\Ambulatorio\Atendimento;
use App\Models\Ambulatorio\AtendimentoRaas;
use App\Models\Raas\CaraterAtendimento;
use App\Models\Raas\DestinoPaciente;
use App\Models\Raas\LocalRealizacaoExame;
use App\Models\Raas\MotivoSaidaPermanencia;
use App\Models\Raas\OrigemPaciente;
use App\Models\Sigtap\Classificacao;
use App\Models\Sigtap\Competencia;
use App\Services\Service;
use App\Utils\MaskUtil;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class FormularioRaasService extends Service
{
public static function datatable()
{
$infraestruturaId = self::getCurrentCentroCusto()->infraestrutura_id;
$atendimentosComRaasPendentes = DB::table('ambulatorio_atendimento_procedimento')
->join('sigtap.procedimento_registro', 'procedimento_registro.procedimento_id', 'ambulatorio_atendimento_procedimento.procedimento_id')
->join('sigtap.registro', 'registro.id', 'procedimento_registro.registro_id')
->whereNull('ambulatorio_atendimento_procedimento.raas_atendimento_procedimento_id')
->where('registro.codigo', RegistroEnum::RAAS_ATENCAO_PSICOSSOCIAL)
->where(fn ($q) => $q
->whereNull('ambulatorio_atendimento_procedimento.soap_id')
->orWhereExists(fn ($q) => $q
->selectRaw(1)
->from('ambulatorio_atendimento_soap')
->whereColumn('ambulatorio_atendimento_soap.id', 'ambulatorio_atendimento_procedimento.soap_id')
->where('ambulatorio_atendimento_soap.is_rascunho', false)
)
)
->select('ambulatorio_atendimento_procedimento.atendimento_id')
->distinct();
return DB::table('ambulatorio_atendimento as atendimento')
->joinSub($atendimentosComRaasPendentes, 'raas_sub',
fn ($join) => $join->on('raas_sub.atendimento_id', 'atendimento.id')
)
->leftJoin('painel_senha_fila as fila', 'fila.id', 'atendimento.fila_id')
->leftJoin('ambulatorio_agendamento as agendamento', 'agendamento.id', 'atendimento.agendamento_id')
->leftJoin('ambulatorio_jornada as jornada', 'jornada.id', 'agendamento.jornada_id')
->leftJoin('cadastro_lotacao as jornada_lotacao', 'jornada_lotacao.id', 'jornada.lotacao_id')
->leftJoin('ambulatorio_demanda_espontanea as demanda_espontanea', 'demanda_espontanea.id', 'atendimento.demanda_espontanea_id')
->leftJoin('cadastro_centro_custo as demanda_espontanea_centro_custo', 'demanda_espontanea_centro_custo.id', 'demanda_espontanea.created_centro_custo_id')
->leftJoin('cadastro_paciente as paciente', 'paciente.id', DB::raw("COALESCE(demanda_espontanea.paciente_id, agendamento.paciente_id)"))
->leftJoin('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id')
->leftJoin('cadastro_sexo as paciente_cidadao_sexo', 'paciente_cidadao_sexo.id', 'paciente_cidadao.sexo_id')
->leftJoin('cadastro_usuario as usuario', 'usuario.id', DB::raw("COALESCE(demanda_espontanea.usuario_id, jornada_lotacao.usuario_id)"))
->leftJoin('cadastro_cidadao as usuario_cidadao', 'usuario_cidadao.id', 'usuario.cidadao_id')
->leftJoin('cadastro_especialidade as especialidade', 'especialidade.id', DB::raw("COALESCE(demanda_espontanea.especialidade_id, jornada.especialidade_id)"))
->whereRaw('COALESCE(jornada_lotacao.infraestrutura_id, demanda_espontanea_centro_custo.infraestrutura_id) = ?', [$infraestruturaId])
->selectRaw("
atendimento.id,
DATE_FORMAT(COALESCE(jornada.data, CAST(demanda_espontanea.created_at AS DATE)), '%d/%m/%Y') as data,
paciente_cidadao.nome as paciente_nome,
paciente_cidadao.nome_social as paciente_nome_social,
paciente_cidadao.preferencia_nome_id as paciente_preferencia_nome_id,
DATE_FORMAT(paciente_cidadao.data_nascimento, '%d/%m/%Y') as paciente_data_nascimento,
paciente_cidadao.cpf as paciente_cpf,
paciente_cidadao.cns as paciente_cns,
paciente_cidadao.nome_mae as paciente_nome_mae,
LPAD(paciente.prontuario, 7, '0') as paciente_prontuario,
usuario_cidadao.nome as usuario_nome,
especialidade.nome as especialidade_nome,
DATE_FORMAT(agendamento.horario, '%H:%i') as horario_agendado,
DATE_FORMAT(fila.created_at, '%H:%i') as horario_chegada
");
}
public static function create()
{
$atendimento = Atendimento::findOrFail(request()->atendimento_id);
$hasProcedimentoRaasQuePrecisaDeClassificacao = self::hasProcedimentoRaasQuePrecisaDeClassificacao($atendimento->id);
$hasProcedimentoRaasQuePrecisaDeAutorizacao = self::hasProcedimentoRaasQuePrecisaDeAutorizacao($atendimento->id);
return [
'additionals' => [
'has_procedimento_raas_que_precisa_de_classificacao' => $hasProcedimentoRaasQuePrecisaDeClassificacao,
'has_procedimento_raas_que_precisa_de_autorizacao' => $hasProcedimentoRaasQuePrecisaDeAutorizacao,
],
'form' => [
'origens_paciente' => OrigemPaciente::orderBy('nome')->get(['id', 'nome']),
'destinos_paciente' => DestinoPaciente::orderBy('nome')->get(['id', 'nome']),
'motivos_saida_permanencia' => MotivoSaidaPermanencia::orderBy('nome')->get(['id', 'nome']),
'carateres_atendimento' => CaraterAtendimento::orderBy('nome')->get(['id', 'nome']),
'classificacoes' => Classificacao::where('competencia_id', Competencia::max('id'))
->whereHas('servico', fn ($q) => $q
->where('codigo', ServicoEnum::SERVICO_DE_ATENCAO_PSICOSSOCIAL)
)
->whereIn('codigo', [
ClassificacaoServicoAtencaoPsicossocial::RESIDENCIA_TERAPEUTICA_EM_SAUDE_MENTAL,
ClassificacaoServicoAtencaoPsicossocial::SERVICO_RESIDENCIAL_TERAPEUTICO_TIPO_I_SRT_TIPO_I,
ClassificacaoServicoAtencaoPsicossocial::SERVICO_RESIDENCIAL_TERAPEUTICO_TIPO_II_SRT_TIPO_II,
])
->orderBy('nome')
->get(['id', 'nome']),
'locais_realizacao_exame' => LocalRealizacaoExame::orderBy('nome')->get(['id', 'nome']),
'procedimentos' => self::getProcedimentos($atendimento),
],
'model' => [
'origem_paciente_id' => $atendimento->raas->origem_paciente_id ?? null,
'destino_paciente_id' => $atendimento->raas->destino_paciente_id ?? null,
'motivo_saida_permanencia_id' => $atendimento->raas->motivo_saida_permanencia_id
?? $atendimento->especialidade->atencao_basica_motivo_saida_permanencia_id
?? null,
'carater_atendimento_id' => $atendimento->raas->carater_atendimento_id ?? null,
'numero_autorizacao' => $hasProcedimentoRaasQuePrecisaDeAutorizacao
? ($atendimento->raas->numero_autorizacao
?? $atendimento->especialidade->atencao_basica_numero_autorizacao
?? null
) : null,
'classificacao_id' => $hasProcedimentoRaasQuePrecisaDeClassificacao
? ($atendimento->raas->classificacao_id
?? (is_null($atendimento->especialidade)
? null
: Classificacao::where('competencia_id', Competencia::max('id'))
->whereHas('servico', fn ($q) => $q
->where('codigo', ServicoEnum::SERVICO_DE_ATENCAO_PSICOSSOCIAL)
)
->where('codigo', $atendimento->especialidade->atencao_basica_classificacao_codigo)
->first()->id ?? null
)
) : null,
'local_realizacao_exame_id' => $atendimento->raas->local_realizacao_exame_id ?? null,
],
];
}
private static function getProcedimentos($atendimento)
{
$procedimentos = DB::table('ambulatorio_atendimento_procedimento as atendimento_procedimento')
->join('sigtap.procedimento as procedimento', 'procedimento.id', 'atendimento_procedimento.procedimento_id')
->join('sigtap.procedimento_registro as procedimento_registro', 'procedimento_registro.procedimento_id', 'procedimento.id')
->join('sigtap.registro as registro', 'registro.id', 'procedimento_registro.registro_id')
->whereNull('atendimento_procedimento.raas_atendimento_procedimento_id')
->where('atendimento_procedimento.atendimento_id', $atendimento->id)
->where(fn ($q) => $q
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('ambulatorio_atendimento_soap as soap')
->whereColumn('soap.id', 'atendimento_procedimento.soap_id')
->where('soap.is_rascunho', false)
)
->orWhereNotExists(fn ($q) => $q
->selectRaw(1)
->from('ambulatorio_atendimento_soap as soap')
->whereColumn('soap.id', 'atendimento_procedimento.soap_id')
)
)
->where('registro.codigo', RegistroEnum::RAAS_ATENCAO_PSICOSSOCIAL)
->selectRaw("
procedimento.id,
procedimento.codigo,
procedimento.nome
")
->distinct()
->get();
$procedimentos->each(function ($procedimento) {
$procedimento->codigo = MaskUtil::getProcedimentoMasked($procedimento->codigo);
});
return $procedimentos;
}
public static function store()
{
self::validate();
$atendimento = Atendimento::findOrFail(request()->atendimento_id);
AtendimentoRaas::updateOrCreate(
['atendimento_id' => $atendimento->id],
[
'origem_paciente_id' => request()->origem_paciente_id,
'destino_paciente_id' => request()->destino_paciente_id,
'motivo_saida_permanencia_id' => request()->motivo_saida_permanencia_id,
'carater_atendimento_id' => request()->carater_atendimento_id,
'numero_autorizacao' => self::hasProcedimentoRaasQuePrecisaDeAutorizacao($atendimento->id)
? request()->numero_autorizacao
: null,
'classificacao_id' => self::hasProcedimentoRaasQuePrecisaDeClassificacao($atendimento->id)
? request()->classificacao_id
: null,
'local_realizacao_exame_id' => request()->local_realizacao_exame_id,
]
);
return $atendimento->raas;
}
private static function validate()
{
request()->validate([
'atendimento_id' => [
'required',
'integer',
Rule::exists(Atendimento::class, 'id'),
],
'origem_paciente_id' => [
'required',
'integer',
Rule::exists(OrigemPaciente::class, 'id'),
],
'destino_paciente_id' => [
'required',
'integer',
Rule::exists(DestinoPaciente::class, 'id'),
],
'motivo_saida_permanencia_id' => [
'required',
'integer',
Rule::exists(MotivoSaidaPermanencia::class, 'id'),
],
'carater_atendimento_id' => [
'required',
'integer',
Rule::exists(CaraterAtendimento::class, 'id'),
],
'numero_autorizacao' => [
'nullable',
Rule::requiredIf(fn () => self::hasProcedimentoRaasQuePrecisaDeAutorizacao(request()->atendimento_id)),
'digits_between:1,13',
],
'classificacao_id' => [
'nullable',
Rule::requiredIf(fn () => self::hasProcedimentoRaasQuePrecisaDeClassificacao(request()->atendimento_id)),
'integer',
Rule::exists(Classificacao::class, 'id'),
],
'local_realizacao_exame_id' => [
'required',
'integer',
Rule::exists(LocalRealizacaoExame::class, 'id'),
],
]);
}
private static function hasProcedimentoRaasQuePrecisaDeClassificacao($atendimentoId)
{
return DB::table('ambulatorio_atendimento_procedimento as atendimento_procedimento')
->join('sigtap.procedimento as procedimento', 'procedimento.id', 'atendimento_procedimento.procedimento_id')
->whereNull('atendimento_procedimento.raas_atendimento_procedimento_id')
->where('atendimento_procedimento.atendimento_id', $atendimentoId)
->where(fn ($q) => $q
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('ambulatorio_atendimento_soap as soap')
->whereColumn('soap.id', 'atendimento_procedimento.soap_id')
->where('soap.is_rascunho', false)
)
->orWhereNotExists(fn ($q) => $q
->selectRaw(1)
->from('ambulatorio_atendimento_soap as soap')
->whereColumn('soap.id', 'atendimento_procedimento.soap_id')
)
)
->where('procedimento.codigo', ProcedimentoEnum::ACOMPANHAMENTO_DE_PACIENTE_EM_SAUDE_MENTAL)
->exists();
}
private static function hasProcedimentoRaasQuePrecisaDeAutorizacao($atendimentoId)
{
return DB::table('ambulatorio_atendimento_procedimento as atendimento_procedimento')
->join('sigtap.procedimento as procedimento', 'procedimento.id', 'atendimento_procedimento.procedimento_id')
->whereNull('atendimento_procedimento.raas_atendimento_procedimento_id')
->where('atendimento_procedimento.atendimento_id', $atendimentoId)
->where(fn ($q) => $q
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('ambulatorio_atendimento_soap as soap')
->whereColumn('soap.id', 'atendimento_procedimento.soap_id')
->where('soap.is_rascunho', false)
)
->orWhereNotExists(fn ($q) => $q
->selectRaw(1)
->from('ambulatorio_atendimento_soap as soap')
->whereColumn('soap.id', 'atendimento_procedimento.soap_id')
)
)
->whereIn('procedimento.codigo', [
ProcedimentoEnum::ACOMPANHAMENTO_DE_PACIENTE_EM_SAUDE_MENTAL,
ProcedimentoEnum::ACOMPANHAMENTO_DE_PESSOAS_COM_NECESSIDADES_DECORRENTES_DO_USO_DE_ALCOOL_CRACK_E_OUTRAS_DROGAS,
ProcedimentoEnum::ACOMPANHAMENTO_DE_PESSOAS_ADULTAS_COM_SOFRIMENTO_OU_TRANSTORNOS_MENTAIS_DECORRENTES_DO_USO_DE_CRACK_ALCOOL_E_OUTRAS_DROGAS,
ProcedimentoEnum::ACOMPANHAMENTO_DA_POPULACAO_INFANTO_JUVENIL_COM_SOFRIMENTO_OU_TRANSTORNOS_MENTAIS_DECORRENTES_DO_USO_DE_CRACK_ALCOOL_E_OUTRAS_DROGAS,
])
->exists();
}
}