231 lines
11 KiB
PHP
231 lines
11 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Ambulatorio\AtendimentoEnfermagem;
|
|
|
|
use App\Enums\Ambulatorio\OutroProcedimento;
|
|
use App\Enums\Ambulatorio\TesteRapido as AmbulatorioTesteRapido;
|
|
use App\Enums\AtencaoBasica\AtendimentoIndividual\TipoAtendimento;
|
|
use App\Enums\AtencaoBasica\ProcedimentoPequenaCirurgia;
|
|
use App\Enums\AtencaoBasica\TesteRapido as AtencaoBasicaTesteRapido;
|
|
use App\Enums\Sigtap\Procedimento;
|
|
use App\Models\Administracao\Funcionalidade;
|
|
use App\Models\Ambulatorio\ParametrizacaoInfraestruturaOcupacao;
|
|
use App\Services\AtencaoBasica\Procedimento\ProcedimentoService;
|
|
use App\Services\Service;
|
|
|
|
class PreAtendimentoAtencaoBasicaFichaService extends Service
|
|
{
|
|
public static function store($preAtendimento)
|
|
{
|
|
if (is_null($preAtendimento->equipe_id)) {
|
|
|
|
return;
|
|
}
|
|
|
|
self::storeProcedimento($preAtendimento);
|
|
}
|
|
|
|
public static function storeProcedimento($preAtendimento)
|
|
{
|
|
if (!self::criaFicha($preAtendimento, 'procedimento')) {
|
|
|
|
return;
|
|
}
|
|
|
|
$procedimentosParaIgnorar = collect();
|
|
$hasProcedimentoColetaMaterialExameLaboratoriao = false;
|
|
|
|
$procedimentosParaIgnorar->push(Procedimento::ESCUTA_INICIAL_ORIENTACAO_ACOLHIMENTO_A_DEMANDA_ESPONT_NEA);
|
|
|
|
$getPequenasCirurgias = function () use ($preAtendimento, $procedimentosParaIgnorar) {
|
|
|
|
$pequenasCirurgias = collect();
|
|
|
|
if ($preAtendimento->orientacao_individual_em_saude) {
|
|
|
|
$pequenasCirurgias->push(ProcedimentoPequenaCirurgia::ORIENTACAO_INDIVIDUAL_EM_SAUDE);
|
|
}
|
|
|
|
$outrosProcedimentos = $preAtendimento->outrosProcedimentos()->get(['id', 'codigo']);
|
|
|
|
if ($procedimento = $outrosProcedimentos->where('id', OutroProcedimento::RETIRADA_DE_PONTOS)->first()) {
|
|
|
|
$procedimentosParaIgnorar->push($procedimento->codigo);
|
|
$pequenasCirurgias->push(ProcedimentoPequenaCirurgia::RETIRADA_DE_PONTOS_DE_CIRURGIAS);
|
|
}
|
|
|
|
if ($procedimento = $outrosProcedimentos->where('id', OutroProcedimento::CURATIVO_SIMPLES)->first()) {
|
|
|
|
$procedimentosParaIgnorar->push($procedimento->codigo);
|
|
$pequenasCirurgias->push(ProcedimentoPequenaCirurgia::CURATIVO_SIMPLES);
|
|
}
|
|
|
|
if ($procedimento = $outrosProcedimentos->where('id', OutroProcedimento::CURATIVO_ESPECIAL)->first()) {
|
|
|
|
$procedimentosParaIgnorar->push($procedimento->codigo);
|
|
$pequenasCirurgias->push(ProcedimentoPequenaCirurgia::CURATIVO_ESPECIAL);
|
|
}
|
|
|
|
return $pequenasCirurgias;
|
|
};
|
|
|
|
$getTestesRapidos = function () use ($preAtendimento, $procedimentosParaIgnorar) {
|
|
|
|
$testesRapidos = collect();
|
|
$testesRapidosPreAtendimento = $preAtendimento->testesRapidos()->get(['id', 'codigo']);
|
|
|
|
if ($procedimento = $testesRapidosPreAtendimento->where('id', AmbulatorioTesteRapido::GRAVIDEZ)->first()) {
|
|
|
|
$procedimentosParaIgnorar->push($procedimento->codigo);
|
|
$testesRapidos->push(AtencaoBasicaTesteRapido::GRAVIDEZ);
|
|
}
|
|
|
|
if ($procedimento = $testesRapidosPreAtendimento->where('id', AmbulatorioTesteRapido::DETECCAO_DE_HEPATITE_C)->first()) {
|
|
|
|
$procedimentosParaIgnorar->push($procedimento->codigo);
|
|
$testesRapidos->push(AtencaoBasicaTesteRapido::HEPATITE_C);
|
|
}
|
|
|
|
if ($procedimento = $testesRapidosPreAtendimento->where('id', AmbulatorioTesteRapido::DETECCAO_DE_INFECCAO_PELO_HIV)->first()) {
|
|
|
|
$procedimentosParaIgnorar->push($procedimento->codigo);
|
|
$testesRapidos->push(AtencaoBasicaTesteRapido::HIV);
|
|
}
|
|
|
|
if ($procedimento = $testesRapidosPreAtendimento->where('id', AmbulatorioTesteRapido::SIFILIS)->first()) {
|
|
|
|
$procedimentosParaIgnorar->push($procedimento->codigo);
|
|
$testesRapidos->push(AtencaoBasicaTesteRapido::SIFILIS);
|
|
}
|
|
|
|
if ($procedimento = $testesRapidosPreAtendimento->where('id', AmbulatorioTesteRapido::DETECCAO_DE_INFECCAO_PELO_HBV)->first()) {
|
|
|
|
$procedimentosParaIgnorar->push($procedimento->codigo);
|
|
$testesRapidos->push(AtencaoBasicaTesteRapido::HEPATITE_B);
|
|
}
|
|
|
|
if ($procedimento = $testesRapidosPreAtendimento->where('id', AmbulatorioTesteRapido::PROTEINURIA)->first()) {
|
|
|
|
$procedimentosParaIgnorar->push($procedimento->codigo);
|
|
$testesRapidos->push(AtencaoBasicaTesteRapido::DOSAGEM_PROTEINURIA);
|
|
}
|
|
|
|
if ($procedimento = $testesRapidosPreAtendimento->where('id', AmbulatorioTesteRapido::TESTE_DO_OLHINHO_TRV)->first()) {
|
|
|
|
$procedimentosParaIgnorar->push($procedimento->codigo);
|
|
$testesRapidos->push(AtencaoBasicaTesteRapido::TESTE_OLHINHO_TRV);
|
|
}
|
|
|
|
return $testesRapidos;
|
|
};
|
|
|
|
$getAdministracoesMedicamento = function () use ($preAtendimento, $procedimentosParaIgnorar) {
|
|
|
|
$administracoesMedicamentos = collect();
|
|
|
|
$preAtendimento->administracoesMedicamentos()->get(['id', 'codigo_procedimento'])
|
|
->each(function ($administracaoMedicamento) use ($administracoesMedicamentos, $procedimentosParaIgnorar) {
|
|
|
|
$procedimentosParaIgnorar->push($administracaoMedicamento->codigo_procedimento);
|
|
$administracoesMedicamentos->push($administracaoMedicamento->id);
|
|
});
|
|
|
|
return $administracoesMedicamentos;
|
|
};
|
|
|
|
$getProcedimentos = function () use ($preAtendimento, $procedimentosParaIgnorar, &$hasProcedimentoColetaMaterialExameLaboratoriao) {
|
|
|
|
$procedimentos = collect();
|
|
|
|
$preAtendimento->procedimentos()
|
|
->get()
|
|
->reject(fn ($p) => $procedimentosParaIgnorar->contains($p->procedimento->codigo))
|
|
->each(function ($atendimentoProcedimento) use ($preAtendimento, $procedimentos, &$hasProcedimentoColetaMaterialExameLaboratoriao) {
|
|
|
|
if ($atendimentoProcedimento->procedimento->codigo === Procedimento::COLETA_DE_MATERIAL_PARA_EXAME_LABORATORIAL) {
|
|
|
|
$hasProcedimentoColetaMaterialExameLaboratoriao = true;
|
|
}
|
|
|
|
for ($i = 1; $i <= $atendimentoProcedimento->quantidade; $i++) {
|
|
|
|
$procedimentos->push([
|
|
'pre_atendimento_id' => $preAtendimento->id,
|
|
'procedimento_id' => $atendimentoProcedimento->procedimento->id
|
|
]);
|
|
}
|
|
});
|
|
|
|
return $procedimentos;
|
|
};
|
|
|
|
$pequenasCirurgias = $getPequenasCirurgias();
|
|
$testesRapidos = $getTestesRapidos();
|
|
$administracoesMedicamentos = $getAdministracoesMedicamento();
|
|
$procedimentos = $getProcedimentos();
|
|
|
|
ProcedimentoService::saveFromAmbulatorioPreAtendimento([
|
|
'cadastro' => [
|
|
'pre_atendimento_id' => $preAtendimento->id,
|
|
'data_usuario_responsavel' => $preAtendimento->created_at->format('Y-m-d'),
|
|
'usuario_id' => $preAtendimento->createdLotacao->usuario_id,
|
|
'equipe_id' => $preAtendimento->equipe_id,
|
|
'ocupacao_id' => $preAtendimento->createdLotacao->ocupacao_id,
|
|
],
|
|
'atendimentos' => [
|
|
[
|
|
'pre_atendimento_id' => $preAtendimento->id,
|
|
'paciente_id' => $preAtendimento->atendimento->paciente->id,
|
|
'turno_id' => $preAtendimento->turno_id,
|
|
'local_atendimento_id' => $preAtendimento->atencao_basica_local_atendimento_id,
|
|
'microarea_id' => is_null($preAtendimento->atendimento->paciente->cidadao->domicilio_id)
|
|
? null
|
|
: ProcedimentoService::getCadastroDomiciliar([
|
|
'domicilio_id' => $preAtendimento->atendimento->paciente->cidadao->domicilio_id,
|
|
'profissional_equipe_id' => $preAtendimento->equipe_id,
|
|
])['microarea_id'] ?? null,
|
|
'escuta_inicial' => $preAtendimento->atendimento_tipo_id === TipoAtendimento::ESCUTA_INICIAL_ORIENTACAO,
|
|
'peso' => $preAtendimento->antropometria->peso ?? null,
|
|
'altura' => $preAtendimento->antropometria->altura ?? null,
|
|
'temperatura' => $preAtendimento->sinalVital->temperatura ?? null,
|
|
'afericao_pa' => $preAtendimento->sinalVital->pressao_arterial ?? null,
|
|
'frequencia_respiratoria' => $preAtendimento->sinalVital->frequencia_respiratoria ?? null,
|
|
'frequencia_cardiaca' => $preAtendimento->sinalVital->frequencia_cardiaca ?? null,
|
|
'saturacao_o2' => $preAtendimento->sinalVital->saturacao_o2 ?? null,
|
|
'glicemia' => $preAtendimento->glicemiaCapilar->valor ?? null,
|
|
'momento_coleta_id' => $preAtendimento->glicemiaCapilar->momento_coleta_id ?? null,
|
|
'perimetro_cefalico' => $preAtendimento->antropometria->perimetro_cefalico ?? null,
|
|
'circunferencia_abdominal' => $preAtendimento->antropometria->circunferencia_abdominal ?? null,
|
|
'perimetro_panturrilha' => $preAtendimento->antropometria->perimetro_panturrilha ?? null,
|
|
'exame_laboratorial' => $hasProcedimentoColetaMaterialExameLaboratoriao,
|
|
'teste_rapido' => $testesRapidos->all(),
|
|
'procedimento_pequena_cirurgia' => $pequenasCirurgias->all(),
|
|
'administracao_medicamento' => $administracoesMedicamentos->all(),
|
|
'procedimentos' => $procedimentos->all(),
|
|
],
|
|
],
|
|
]);
|
|
}
|
|
|
|
private static function criaFicha($preAtendimento, $funcionalidadeIdentificador)
|
|
{
|
|
return ParametrizacaoInfraestruturaOcupacao::whereHas('parametrizacaoInfraestrutura', fn ($q) => $q
|
|
->where('infraestrutura_id', $preAtendimento->createdLotacao->infraestrutura_id)
|
|
)
|
|
->where('ocupacao_id', $preAtendimento->createdLotacao->ocupacao_id)
|
|
->whereHas('fichasAtb', fn ($q) => $q
|
|
->where('funcionalidade_id', self::getAtencaoBasicaFuncionalidadeId($funcionalidadeIdentificador))
|
|
)
|
|
->exists();
|
|
}
|
|
|
|
private static function getAtencaoBasicaFuncionalidadeId($identificador)
|
|
{
|
|
return Funcionalidade::whereHas('modulo', fn ($q) => $q
|
|
->where('identificador', 'atencao-basica')
|
|
)
|
|
->where('identificador', $identificador)
|
|
->first('id')->id;
|
|
}
|
|
}
|