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

1540 lines
68 KiB
PHP

<?php
namespace App\Services\Ambulatorio;
use App\Enums\Ambulatorio\AgendamentoStatus as AgendamentoStatusEnum;
use App\Enums\AtencaoBasica\AtendimentoIndividual\LocalAtendimento as EnumsLocalAtendimento;
use App\Enums\Geral\Turno as TurnoEnum;
use App\Enums\Regulacao\StatusTipo as RegulacaoStatusTipoEnum;
use App\Enums\Sigtap\Procedimento as EnumsSigtapProcedimento;
use App\Enums\Sigtap\Registro;
use App\Exceptions\Ambulatorio\NaoPodeCriarFichaAtencaoBasicaException;
use App\Exceptions\Ambulatorio\ProtocoloFechamentoException;
use App\Models\Administracao\Funcionalidade;
use App\Models\Ambulatorio\Agendamento;
use App\Models\Ambulatorio\AgendamentoStatus;
use App\Models\Ambulatorio\Atendimento;
use App\Models\Ambulatorio\AtendimentoSoap;
use App\Models\Ambulatorio\ParametrizacaoInfraestruturaEspecialidadeProcedimento;
use App\Models\Ambulatorio\ParametrizacaoInfraestruturaOcupacao;
use App\Models\AtencaoBasica\MarcadorConsumoAlimentar\LocalAtendimento;
use App\Models\Cadastro\Especialidade;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\Cns\TermoInvalido;
use App\Models\Geral\Turno;
use App\Models\Sigtap\Competencia;
use App\Models\Sigtap\Procedimento;
use App\Services\AtencaoBasica\AtendimentoIndividual\AtendimentoIndividualService;
use App\Services\AtencaoBasica\AtendimentoOdontologico\AtendimentoOdontologicoService;
use App\Services\AtencaoBasica\Procedimento\ProcedimentoService;
use App\Services\Regulacao\SolicitacaoService as RegulacaoSolicitacaoService;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Exception;
use Illuminate\Support\Facades\DB;
class FechamentoConsultaService extends Service
{
public static function index($params)
{
if (!request()->tipo_atendimento || request()->tipo_atendimento === 'agendamento') {
$agendamentos = DB::table('ambulatorio_agendamento as agendamento')
->join(
'ambulatorio_agendamento_status as status',
'status.id',
'agendamento.status_id'
)
->join(
'ambulatorio_agendamento_tipo as tipo',
'tipo.id',
'agendamento.tipo_id'
)
->join(
'ambulatorio_jornada as jornada',
'jornada.id',
'agendamento.jornada_id'
)
->join(
'cadastro_lotacao as lotacao',
'lotacao.id',
'jornada.lotacao_id'
)
->join(
'cadastro_infraestrutura as infraestrutura',
'infraestrutura.id',
'lotacao.infraestrutura_id'
)
->join(
'cadastro_unidade as unidade',
'unidade.id',
'infraestrutura.unidade_id'
)
->join(
'cadastro_usuario as usuario',
'usuario.id',
'lotacao.usuario_id'
)
->join(
'cadastro_cidadao as cidadao',
'cidadao.id',
'usuario.cidadao_id'
)
->join(
'sigtap.ocupacao as ocupacao',
'ocupacao.id',
'lotacao.ocupacao_id'
)
->join(
'cadastro_especialidade as especialidade',
'especialidade.id',
'jornada.especialidade_id'
)
->join(
'cadastro_lotacao as lotacao_agendamento',
'lotacao_agendamento.id',
'agendamento.created_lotacao_id'
)
->join(
'cadastro_usuario as usuario_agendamento',
'usuario_agendamento.id',
'lotacao_agendamento.usuario_id'
)
->join(
'cadastro_cidadao as cidadao_agendamento',
'cidadao_agendamento.id',
'usuario_agendamento.cidadao_id'
)
->join(
'cadastro_paciente as paciente_agendamento',
'paciente_agendamento.id',
'agendamento.paciente_id'
)
->join(
'cadastro_cidadao as cidadao_paciente',
'cidadao_paciente.id',
'paciente_agendamento.cidadao_id'
)
->leftJoin('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'agendamento.regulacao_solicitacao_id')
->leftJoin('regulacao_parametrizacao_prestador_interno as prestador_interno', 'prestador_interno.id', 'solicitacao.prestador_interno_id')
->leftJoin('ambulatorio_atendimento as atendimento', 'atendimento.agendamento_id', 'agendamento.id')
->where('agendamento.status_id', AgendamentoStatusEnum::AGENDADO)
->when($params->data ?? null, fn ($q, $data) => $q
->where('jornada.data', $data)
)
->when($params->unidade_id ?? null, fn ($q, $id) => $q->where('unidade.id', $id))
->when($params->infraestrutura_id ?? null, fn ($q, $id) => $q->where('infraestrutura.id', $id))
->when($params->ocupacao_id ?? null, fn ($q, $id) => $q->where('ocupacao.id', $id))
->when($params->especialidade_id ?? null, fn ($q, $id) => $q->where('especialidade.id', $id))
->when($params->usuario_id ?? null, fn ($q, $id) => $q->where('usuario.id', $id))
->when($params->tipo_id ?? null, fn ($q, $id) => $q->where('tipo.id', $id))
->when($params->status_id ?? null, fn ($q, $id) => $q->where('status.id', $id))
->select(DB::raw("
agendamento.id as agendamento_id,
atendimento.id as atendimento_id,
agendamento.paciente_id as paciente_id,
jornada.data,
DATE_FORMAT(agendamento.horario, '%H:%i') as horario,
unidade.nome_fantasia as unidade,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura,
cidadao.nome as usuario_nome,
usuario.id as usuario_id,
infraestrutura.id as infraestrutura_id,
unidade.id as unidade_id,
ocupacao.id as ocupacao_id,
CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) as ocupacao,
especialidade.nome as especialidade,
especialidade.id as especialidade_id,
especialidade.permite_fechamento_sem_procedimento as especialidade_sem_proc,
especialidade.atencao_basica_procedimento_padrao_codigo as especialidade_atencao_basica_procedimento_padrao_codigo,
NULL as status_id,
NULL as cid,
NULL as procedimento,
NULL as quantidade,
".EnumsLocalAtendimento::UBS." as atencao_basica_local_atendimento_id,
cidadao_agendamento.nome as usuario_agendamento,
DATE_FORMAT(agendamento.created_at, '%d/%m/%Y às %H:%i') as data_hora_agendamento,
cidadao_paciente.nome as cidadao_paciente_nome,
cidadao_paciente.nome_social as cidadao_paciente_nome_social,
LPAD(paciente_agendamento.prontuario,7,'0') as prontuario,
cidadao_paciente.data_nascimento as cidadao_paciente_data_nascimento,
cidadao_paciente.cpf as cidadao_paciente_cpf,
cidadao_paciente.cns as cidadao_paciente_cns,
cidadao_paciente.preferencia_nome_id,
cidadao_paciente.sexo_id as cidadao_paciente_sexo_id,
IF (cidadao_paciente.nome_mae IS NULL, 'Não informado', cidadao_paciente.nome_mae) as cidadao_paciente_nome_mae,
'Agendamento' as tipo_atendimento,
agendamento.regulacao_solicitacao_id,
solicitacao.numero,
CASE
WHEN controla_protocolo_fechamento IS NULL THEN NULL
WHEN controla_protocolo_fechamento = 0 THEN NULL
ELSE controla_protocolo_fechamento
END AS controla_protocolo_fechamento
"))
->get()
->toArray();
}
if (!request()->tipo_atendimento || request()->tipo_atendimento === 'demanda_espontanea') {
$atendimentos = DB::table('ambulatorio_atendimento as atendimento')
->join(
'cadastro_lotacao as lotacao',
'lotacao.id',
'atendimento.created_lotacao_id'
)
->leftJoin(
'ambulatorio_demanda_espontanea as demanda_espontanea',
'demanda_espontanea.id',
'atendimento.demanda_espontanea_id'
)
->join(
'cadastro_infraestrutura as infraestrutura',
'infraestrutura.id',
'lotacao.infraestrutura_id'
)
->join(
'cadastro_unidade as unidade',
'unidade.id',
'infraestrutura.unidade_id'
)
->leftJoin(
'cadastro_usuario as usuario',
'usuario.id',
'demanda_espontanea.usuario_id'
)
->leftJoin(
'cadastro_cidadao as cidadao',
'cidadao.id',
'usuario.cidadao_id'
)
->leftJoin(
'cadastro_especialidade as especialidade',
'especialidade.id',
'demanda_espontanea.especialidade_id'
)
->leftJoin(
'sigtap.ocupacao as ocupacao',
'ocupacao.id',
'especialidade.ocupacao_id'
)
->join(
'cadastro_usuario as usuario_atendimento',
'usuario_atendimento.id',
'lotacao.usuario_id'
)
->join(
'cadastro_cidadao as cidadao_atendimento',
'cidadao_atendimento.id',
'usuario_atendimento.cidadao_id'
)
->join(
'painel_senha_fila as fila',
'fila.id',
'atendimento.fila_id'
)
->join(
'cadastro_paciente as paciente_atendimento',
'paciente_atendimento.id',
'fila.paciente_id'
)
->join(
'cadastro_cidadao as cidadao_paciente',
'cidadao_paciente.id',
'paciente_atendimento.cidadao_id'
)
->whereNotNull('fila.id')
->whereNotNull('atendimento.demanda_espontanea_id')
->whereNull('atendimento.finalizado_em')
->when($params->data ?? null, fn ($q, $data) => $q
->whereDate('atendimento.created_at', '=', $data)
)
->where('fila.evadido', false)
->when($params->unidade_id ?? null, fn ($q, $id) => $q->where('unidade.id', $id))
->when($params->infraestrutura_id ?? null, fn ($q, $id) => $q->where('infraestrutura.id', $id))
->when($params->ocupacao_id ?? null, fn ($q, $id) => $q->where('ocupacao.id', $id))
->when($params->especialidade_id ?? null, fn ($q, $id) => $q->where('especialidade.id', $id))
->when($params->usuario_id ?? null, fn ($q, $id) => $q->where('usuario.id', $id))
->select(DB::raw("
NULL as agendamento_id,
atendimento.id as atendimento_id,
fila.paciente_id as paciente_id,
DATE_FORMAT(atendimento.created_at, '%Y-%m-%d') as data,
DATE_FORMAT(atendimento.created_at, '%H:%i') as horario,
unidade.nome_fantasia as unidade,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura,
cidadao.nome as usuario_nome,
usuario.id as usuario_id,
infraestrutura.id as infraestrutura_id,
unidade.id as unidade_id,
ocupacao.id as ocupacao_id,
CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) as ocupacao,
especialidade.nome as especialidade,
especialidade.id as especialidade_id,
especialidade.permite_fechamento_sem_procedimento as especialidade_sem_proc,
especialidade.atencao_basica_procedimento_padrao_codigo as especialidade_atencao_basica_procedimento_padrao_codigo,
NULL as status_id,
NULL as cid,
NULL as procedimento,
NULL as quantidade,
".EnumsLocalAtendimento::UBS." as atencao_basica_local_atendimento_id,
cidadao_atendimento.nome as usuario_agendamento,
DATE_FORMAT(atendimento.created_at, '%d/%m/%Y às %H:%i') as data_hora_agendamento,
cidadao_paciente.nome as cidadao_paciente_nome,
cidadao_paciente.nome_social as cidadao_paciente_nome_social,
LPAD(paciente_atendimento.prontuario,7,'0') as prontuario,
cidadao_paciente.data_nascimento as cidadao_paciente_data_nascimento,
cidadao_paciente.cpf as cidadao_paciente_cpf,
cidadao_paciente.cns as cidadao_paciente_cns,
cidadao_paciente.preferencia_nome_id,
cidadao_paciente.sexo_id as cidadao_paciente_sexo_id,
IF (cidadao_paciente.nome_mae IS NULL, 'Não informado', cidadao_paciente.nome_mae) as cidadao_paciente_nome_mae,
'Demanda espontânea' as tipo_atendimento
"))
->get()
->toArray();
}
if (!request()->tipo_atendimento) {
$consultas = array_merge($agendamentos, $atendimentos);
} else if (request()->tipo_atendimento === 'demanda_espontanea') {
$consultas = $atendimentos;
} else if (request()->tipo_atendimento === 'agendamento') {
$consultas = $agendamentos;
}
foreach ($consultas as $consulta) {
$procedimentoAtendimento = DB::table('ambulatorio_atendimento_procedimento as atendimento_procedimento')
->join(
'sigtap.procedimento as procedimento',
'procedimento.id',
'atendimento_procedimento.procedimento_id'
)
->join(
'ambulatorio_atendimento as atendimento',
'atendimento.id',
'atendimento_procedimento.atendimento_id'
)->join(
'ambulatorio_agendamento as agendamento',
'agendamento.id',
'atendimento.agendamento_id'
)
->join(
'ambulatorio_jornada as jornada',
'jornada.id',
'agendamento.jornada_id'
)->join(
'cadastro_lotacao as lotacao',
'lotacao.id',
'jornada.lotacao_id'
)
->where('atendimento_id', $consulta->atendimento_id)
->orderBy('procedimento.competencia_id', 'desc')
->select(
"procedimento.id as id",
"procedimento.codigo as codigo",
"procedimento.nome as nome",
"lotacao.usuario_id as usuario_id"
)
->get();
$consulta->procedimentos_atendimento = $procedimentoAtendimento->map(function ($item) {
return (object)[
'id' => $item->id,
'codigo' => $item->codigo,
'nome' => $item->nome,
'usuario_id' => $item->usuario_id
];
})->toArray();
$cidadao_paciente_idade_anos = (int) Carbon::create($consulta->cidadao_paciente_data_nascimento)->diff(Carbon::now())->format('%y');
$cidadao_agendamento_idade_meses = (int) Carbon::create($consulta->cidadao_paciente_data_nascimento)->diff(Carbon::now())->format('%m');
$cidadao_paciente_idade_dias = (int) Carbon::create($consulta->cidadao_paciente_data_nascimento)->diff(Carbon::now())->format('%d');
$cidadao_paciente_idade = $cidadao_paciente_idade_anos . ' anos, '
. $cidadao_agendamento_idade_meses . ' meses e '
. $cidadao_paciente_idade_dias . ' dias';
$consulta->cidadao_paciente_idade = $cidadao_paciente_idade;
$consulta->cidadao_paciente_idade_anos = $cidadao_paciente_idade_anos;
$consulta->cidadao_paciente_data_nascimento_formatada = Carbon::create($consulta->cidadao_paciente_data_nascimento)->format('d/m/Y');
$consulta->cidadao_paciente_cpf = MaskUtil::getCpfMasked($consulta->cidadao_paciente_cpf);
$consulta->cidadao_paciente_cns = MaskUtil::getCnsMasked($consulta->cidadao_paciente_cns);
$consulta->ocupacoes_jornada = [];
$consulta->procedimentos = self::getProcedimentosPadroes($consulta);
$consulta->especialidades_jornada = [];
$consulta->usuarios_jornada = [];
$consulta->turno_id = self::getTurnoMomento($consulta->horario);
$consulta->cria_ficha_atendimento_individual = $consulta->ocupacao_id
? self::criaFicha($consulta->infraestrutura_id, $consulta->ocupacao_id, 'atendimento-individual') : false;
$consulta->cria_ficha_atendimento_odontologico = $consulta->ocupacao_id
? self::criaFicha($consulta->infraestrutura_id, $consulta->ocupacao_id, 'atendimento-odontologico') : false;
$consulta->cadastro = [
'dataUsuarioResponsavel' => $consulta->data,
'usuario' => [
'id' => $consulta->usuario_id,
'cidadao_nome' => $consulta->usuario_nome
],
'unidade_id' => $consulta->unidade_id,
'infraestrutura_id' => $consulta->infraestrutura_id,
'equipe_id' => null,
'ocupacao_id' => $consulta->ocupacao_id
];
$consulta->protocolo_fechamento = null;
}
return [
'consultas' => $consultas,
'especialidades' => self::getEspecialidadesWithJornada(),
];
}
private static function getProcedimentosPadroes($atendimento)
{
if ($atendimento->especialidade) {
$procedimentosParametrizados = self::getProcedimentosParametrizados($atendimento);
if ($procedimentosParametrizados->isNotEmpty()) {
return $procedimentosParametrizados;
}
else if ($atendimento->especialidade_atencao_basica_procedimento_padrao_codigo) {
$especialidade = $atendimento->especialidade_id
? Especialidade::where('id', $atendimento->especialidade_id)->first()
: null;
$equipe = DB::table('atencao_basica_parametrizacao_equipe as equipe')
->join(
'atencao_basica_parametrizacao_equipe_usuario as equipe_usuario',
'equipe_usuario.equipe_id',
'equipe.id')
->join(
'ambulatorio_parametrizacao_infraestrutura as infr',
'infr.infraestrutura_id',
'equipe.infraestrutura_id')
->join(
'ambulatorio_parametrizacao_infraestrutura_ocupacao as ocup',
'ocup.parametrizacao_infraestrutura_id',
'infr.id')
->join(
'atencao_basica_parametrizacao_area as area',
'area.id',
'equipe.area_id')
->where('equipe_usuario.usuario_id', $atendimento->usuario_id)
->where('equipe.infraestrutura_id', $atendimento->infraestrutura_id)
->where('equipe.unidade_id', $atendimento->unidade_id)
->where('ocup.ocupacao_id', $atendimento->ocupacao_id)
->select([
'equipe.id as equipe_id',
'area.numero_ine as codigo_equipe'
])
->first();
return collect([
[
'id' => $especialidade ? $especialidade->atencao_basica_procedimento_padrao->id : null,
'codigo' => $especialidade ? $especialidade->atencao_basica_procedimento_padrao->codigo : null,
'nome' => $especialidade ? $especialidade->atencao_basica_procedimento_padrao->nome : null,
'has_instrumento_registro_raas' => $especialidade ? $especialidade->atencao_basica_procedimento_padrao
->registros()
->whereIn('codigo', [Registro::RAAS_ATENCAO_DOMICILIAR, Registro::RAAS_ATENCAO_PSICOSSOCIAL])
->exists() : null,
'has_cid_principal' => $especialidade ? $especialidade->atencao_basica_procedimento_padrao->has_cid_principal : null,
'quantidade_maxima_execucao' => $especialidade ? $especialidade->atencao_basica_procedimento_padrao->quantidade_maxima_execucao : null,
'cid' => null,
'quantidade' => 1,
'automatico' => true,
'padrao' => false,
'origem' => 'ambulatorio',
'usuario' => [
'cidadaoNome' => $atendimento->usuario_nome,
'id' => $atendimento->usuario_id,
],
'usuarioId' => $atendimento->usuario_id,
'ocupacaoId' => $atendimento->ocupacao_id,
'ocupacao' => $atendimento->ocupacao,
'equipeId' => $equipe ? $equipe->equipe_id : null,
'equipe' => $equipe ? $equipe->codigo_equipe : null,
]
]);
}
}
return collect();
}
private static function getProcedimentosParametrizados($atendimento)
{
return ParametrizacaoInfraestruturaEspecialidadeProcedimento::whereHas(
'parametrizacaoInfraestruturaEspecialidade',
fn ($q) => $q
->where('especialidade_id', $atendimento->especialidade_id)
->whereHas('parametrizacaoInfraestrutura', fn ($q) => $q
->where('infraestrutura_id', $atendimento->infraestrutura_id)
)
)
->get()
->map(fn ($parametrizacaoProcedimento) => [
'id' => $parametrizacaoProcedimento->procedimento->id,
'codigo' => $parametrizacaoProcedimento->procedimento->codigo,
'nome' => $parametrizacaoProcedimento->procedimento->nome,
'has_instrumento_registro_raas' => $parametrizacaoProcedimento->procedimento
->registros()
->whereIn('codigo', [Registro::RAAS_ATENCAO_DOMICILIAR, Registro::RAAS_ATENCAO_PSICOSSOCIAL])
->exists(),
'has_cid_principal' => $parametrizacaoProcedimento->procedimento->has_cid_principal,
'quantidade_maxima_execucao' => $parametrizacaoProcedimento->procedimento->quantidade_maxima_execucao,
'cid' => null,
'quantidade' => 1,
'automatico' => true,
'padrao' => false,
'origem' => 'ambulatorio',
'usuario' => [
'cidadaoNome' => $atendimento->usuario_nome,
'id' => $atendimento->usuario_id,
],
'usuarioId' => $atendimento->usuario_id,
'ocupacaoId' => $atendimento->ocupacao_id,
'ocupacao' => $atendimento->ocupacao,
'equipeId' => null,
'equipe' => null,
]);
}
public static function getEspecialidadesWithJornada()
{
return Especialidade::whereHas('ambulatorioJornadas', fn ($q) => $q
->whereNull('situacao_id')
->whereDate('data', request()->data)
->whereHas('lotacao', fn ($q) => $q
->where('infraestrutura_id', request()->infraestrutura_id)
)
)
->when(request()->paciente_nao_municipe, fn ($q) => $q
->where('permite_agendamento_nao_municipe', true)
)
->get(['id', 'nome', 'ocupacao_id', 'sexo_id', 'idade_minima', 'idade_maxima'])
->map(fn ($especialidade) => [
'id' => $especialidade->id,
'nome' => $especialidade->nome,
'sexo_id' => $especialidade->sexo_id,
'idade_minima' => $especialidade->idade_minima,
'idade_maxima' => $especialidade->idade_maxima,
'ocupacao' => $especialidade->ocupacao,
'cria_ficha_atendimento_individual' => $especialidade->ocupacao
? self::criaFicha(request()->infraestrutura_id, $especialidade->ocupacao->id, 'atendimento-individual')
: false,
'cria_ficha_atendimento_odontologico' => $especialidade->ocupacao
? self::criaFicha(request()->infraestrutura_id, $especialidade->ocupacao->id, 'atendimento-odontologico')
: false
])
->sortBy('nome')
->values();
}
public static function getUsuariosWithJornada()
{
return Usuario::setEagerLoads([])
->whereHas('lotacoes', fn ($q) => $q
->where('infraestrutura_id', request()->infraestrutura_id)
->whereHas('ambulatorioJornadas', fn ($q) => $q
->whereNull('situacao_id')
->whereDate('data', request()->data)
->where('especialidade_id', request()->especialidade_id)
)
)
->get(['id', 'cidadao_id'])
->map(fn ($usuario) => [
'id' => $usuario->id,
'nome' => $usuario->cidadao()->setEagerLoads([])->first(['nome'])->nome,
])
->sortBy('nome')
->values();
}
private static function getTurnoMomento($horario)
{
$hora = substr($horario, 0, 2);
$isManha = fn () => $hora >= 6 && $hora <= 11;
$isTarde = fn () => $hora >= 12 && $hora <= 17;
if ($isManha()) {
return TurnoEnum::MANHA;
}
else if ($isTarde()) {
return TurnoEnum::TARDE;
}
else {
return TurnoEnum::NOITE;
}
}
public static function create()
{
return self::getDadosCreateBusca();
}
private static function getDadosCreateBusca()
{
$formFilters = [
'unidades' => [],
'infraestruturas' => [],
'ocupacoes' => [],
'especialidades' => [],
'usuarios' => [],
'status' => [],
'atencao_basica_equipes' => [],
'equipes' => [],
'tipos_atendimento' => [],
];
$modelFilters = [
'periodo' => [
'start' => null,
'end' => null,
],
'inicio' => null,
'fim' => null,
'data' => null,
'unidade_id' => null,
'tipo_atendimento' => null,
'infraestrutura_id' => null,
'ocupacao_id' => null,
'especialidade_id' => null,
'usuario_id' => null,
'tipo_id' => null,
'status_id' => null,
'procedimento' => null,
'cid_principal' => null,
];
$usuarioLogado = self::getCurrentLotacao();
$agendamentosFilters = self::getAgendamentosFilters();
$formFilters['local_atendimento'] = $agendamentosFilters->form['local_atendimento'];
$formFilters['turnos'] = $agendamentosFilters->form['turnos'];
$formFilters['procedimentos'] = $agendamentosFilters->form['procedimentos'];
$formFilters['sigtap_competencias'] = $agendamentosFilters->form['sigtap_competencias'];
$formFilters['administracao_medicamento'] = $agendamentosFilters->form['administracao_medicamento'];
$formFilters['teste_rapido'] = $agendamentosFilters->form['teste_rapido'];
$formFilters['procedimento_usuario'] = $agendamentosFilters->form['procedimento_usuario'];
$formFilters['equipes'] = $agendamentosFilters->form['equipes'];
$formFilters['tipos_atendimento'] = $agendamentosFilters->form['tipos_atendimento'];
$formFilters['usuario_logado'] = $usuarioLogado;
$modelFilters['status_id'] = $agendamentosFilters->model['status_id'];
$modelFilters['data'] = $agendamentosFilters->model['data'];
return [
'additionals' => [
'search_by_apelido' => false,
'data_atual' => Carbon::now()->format('d/m/Y'),
'status' => AgendamentoStatus::whereIn('id', [AgendamentoStatusEnum::FALTA_DO_PACIENTE, AgendamentoStatusEnum::FALTA_DO_MEDICO, AgendamentoStatusEnum::REALIZADO])->get(),
'locais_atendimento' => LocalAtendimento::orderBy('descricao')->get(['id', 'descricao']),
],
'form' => $formFilters,
'model' => $modelFilters,
];
}
private static function getAgendamentosFilters()
{
return (object) [
'form' => [
'data_atual' => Carbon::now()->format('d/m/Y'),
'termos_invalidos' => TermoInvalido::all()->map(fn ($termo) => $termo->descricao),
'turnos' => Turno::orderBy('nome')->get(),
'local_atendimento' => LocalAtendimento::whereNotIn('id', [
EnumsLocalAtendimento::HOSPITAL,
EnumsLocalAtendimento::UNIDADE_PRONTO_ATENDIMENTO,
EnumsLocalAtendimento::CACON_UNACON,
])
->orderBy('descricao')
->get(),
'procedimentos' => Procedimento::whereIn('codigo', [
EnumsSigtapProcedimento::MEDICAO_PESO,
EnumsSigtapProcedimento::MEDICAO_ALTURA,
EnumsSigtapProcedimento::AFERICAO_TEMPERATURA,
EnumsSigtapProcedimento::AFERICAO_PRESSAO_ARTERIAL,
EnumsSigtapProcedimento::AVALIACAO_ANTROPOMETRICA,
EnumsSigtapProcedimento::GLICEMIA_CAPILAR,
EnumsSigtapProcedimento::COLETA_DE_MATERIAL_PARA_EXAME_LABORATORIAL,
])
->where('competencia_id', function ($query) {
$query->select('sigtap.competencia.id')
->from('sigtap.competencia')
->orderByDesc('sigtap.competencia.valor')
->limit(1);
})
->groupBy('codigo')
->get(),
'sigtap_competencias' => Competencia::orderByDesc('valor')->take(4)->get(),
'procedimento_pequena_cirurgia' => [],
'administracao_medicamento' => [],
'teste_rapido' => [],
'procedimento_usuario' => [],
'equipes' => [],
'tipos_atendimento' => [
['value' => 'agendamento', 'text' => 'AGENDAMENTO'],
['value' => 'demanda_espontanea', 'text' => 'DEMANDA ESPONTÂNEA'],
],
],
'model' => [
'data' => Carbon::today()->format('Y-m-d'),
'status_id' => null,
],
];
}
public static function list()
{
switch (request()->origem) {
case 'busca': {
return self::getDadosListBusca();
}
}
}
private static function getDadosListBusca()
{
$params = (object) request()->all();
$params->data = request()->data ?? Carbon::now()->format('Y-m-d');
switch (request()->listar) {
case 'unidades': {
return [
'unidades' => self::getBuscaUnidades($params),
];
}
case 'infraestruturas': {
return [
'infraestruturas' => self::getBuscaInfraestruturas($params),
];
return self::getBuscaInfraestruturas($params);
}
case 'especialidades': {
return [
'especialidades' => self::getBuscaEspecialidades($params),
];
}
case 'usuarios': {
return [
'usuarios' => self::getBuscaUsuarios($params),
];
}
case 'status': {
return [
'status' => self::getBuscaStatus($params),
];
}
}
}
private static function getBuscaUnidades($params)
{
$query = Unidade::query()->orderBy('nome_fantasia');
if (request()->tipo_atendimento === null || request()->tipo_atendimento === 'agendamento') {
$query->whereHas('infraestruturas', function ($q) use ($params) {
$q->whereHas('lotacoes', function ($q) use ($params) {
$q->whereHas('ambulatorioJornadas', function ($q) use ($params) {
$q->where('data', $params->data)
->whereHas('agendamentos', function ($q) {
$q->where('status_id', AgendamentoStatusEnum::AGENDADO);
});
});
});
});
}
if (request()->tipo_atendimento === null || request()->tipo_atendimento === 'demanda_espontanea') {
$query->orWhereHas('infraestruturas', function ($q) use ($params) {
$q->whereExists(function ($query) use ($params) {
$query->select(DB::raw(1))
->from('ambulatorio_atendimento')
->join('painel_senha_fila', 'painel_senha_fila.id', 'ambulatorio_atendimento.fila_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'painel_senha_fila.centro_custo_id')
->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id')
->where('painel_senha_fila.emitido_em', $params->data)
->whereNull('ambulatorio_atendimento.finalizado_em')
->whereNotNull('ambulatorio_atendimento.demanda_espontanea_id');
});
});
}
return $query->get(['id', 'nome_fantasia']);
}
private static function getBuscaInfraestruturas($params)
{
return Infraestrutura::setEagerLoads([])
->where('unidade_id', $params->unidade_id)
->where(function ($query) use ($params) {
if (request()->tipo_atendimento === null || request()->tipo_atendimento === 'agendamento') {
$query->whereHas('lotacoes', function ($q) use ($params) {
$q->whereHas('ambulatorioJornadas', function ($q) use ($params) {
$q->where('data', $params->data)
->whereHas('agendamentos', function ($q) {
$q->where('status_id', AgendamentoStatusEnum::AGENDADO);
});
});
});
}
if (request()->tipo_atendimento === null || request()->tipo_atendimento === 'demanda_espontanea') {
$query->orWhereExists(function ($query) use ($params) {
$query->select(DB::raw(1))
->from('ambulatorio_atendimento')
->join('painel_senha_fila', 'painel_senha_fila.id', 'ambulatorio_atendimento.fila_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'painel_senha_fila.centro_custo_id')
->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id')
->where('painel_senha_fila.emitido_em', $params->data)
->whereNull('ambulatorio_atendimento.finalizado_em')
->whereNotNull('ambulatorio_atendimento.demanda_espontanea_id');
});
}
})
->get(['id', 'nome', 'principal', 'unidade_id'])
->map(fn ($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome
])
->sortBy('nome')
->values();
}
private static function getBuscaEspecialidades($params)
{
return Especialidade::where(function ($query) use ($params) {
if (request()->tipo_atendimento === null || request()->tipo_atendimento === 'agendamento') {
$query->whereHas('ambulatorioJornadas', fn ($q) => $q
->where('data', $params->data)
->whereHas('lotacao', fn ($q) => $q
->when($params->infraestrutura_id ?? null,
fn ($q, $id) => $q->where('infraestrutura_id', $id),
fn ($q) => $q->when($params->unidade_id ?? null, fn ($q, $id) => $q
->whereHas('infraestrutura', fn ($q) => $q->where('unidade_id', $id))
)
)
)
->whereHas('agendamentos', function ($q) {
$q->where('status_id', AgendamentoStatusEnum::AGENDADO);
})
);
}
if (request()->tipo_atendimento === null || request()->tipo_atendimento === 'demanda_espontanea') {
$query->orWhereExists(function ($query) use ($params) {
$query->select(DB::raw(1))
->from('ambulatorio_demanda_espontanea')
->whereColumn('ambulatorio_demanda_espontanea.especialidade_id', 'cadastro_especialidade.id')
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.demanda_espontanea_id', 'ambulatorio_demanda_espontanea.id')
->join('painel_senha_fila', 'painel_senha_fila.id', 'ambulatorio_atendimento.fila_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'painel_senha_fila.centro_custo_id')
->where('painel_senha_fila.emitido_em', $params->data)
->where('cadastro_centro_custo.infraestrutura_id', $params->infraestrutura_id)
->whereNull('ambulatorio_atendimento.finalizado_em')
->whereNotNull('ambulatorio_atendimento.demanda_espontanea_id');
});
}
})
->orderBy('nome')
->get(['id', 'nome']);
}
private static function getBuscaUsuarios($params)
{
return Usuario::setEagerLoads([])
->where(function ($query) use ($params) {
if (request()->tipo_atendimento === null || request()->tipo_atendimento === 'agendamento') {
$query->whereHas('lotacoes', fn ($q) => $q
->whereHas('ambulatorioJornadas', fn ($q) => $q
->where('data', $params->data)
->whereHas('agendamentos', function ($q) {
$q->where('status_id', AgendamentoStatusEnum::AGENDADO);
})
->when($params->especialidade_id ?? null, fn ($q, $id) => $q->where('especialidade_id', $id))
)
->when($params->infraestrutura_id ?? null,
fn ($q, $id) => $q->where('infraestrutura_id', $id),
fn ($q) => $q->when($params->unidade_id ?? null, fn ($q, $id) => $q
->whereHas('infraestrutura', fn ($q) => $q->where('unidade_id', $id))
)
)
->when($params->ocupacao_id ?? null, fn ($q, $id) => $q->where('ocupacao_id', $id))
);
}
if (request()->tipo_atendimento === null || request()->tipo_atendimento === 'demanda_espontanea') {
$query->orWhereExists(function ($query) use ($params) {
$query->select(DB::raw(1))
->from('ambulatorio_demanda_espontanea')
->whereColumn('ambulatorio_demanda_espontanea.usuario_id', 'cadastro_usuario.id')
->join('ambulatorio_atendimento', 'ambulatorio_atendimento.demanda_espontanea_id', 'ambulatorio_demanda_espontanea.id')
->join('painel_senha_fila', 'painel_senha_fila.id', 'ambulatorio_atendimento.fila_id')
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'painel_senha_fila.centro_custo_id')
->where('painel_senha_fila.emitido_em', $params->data)
->where('cadastro_centro_custo.infraestrutura_id', $params->infraestrutura_id)
->whereNull('ambulatorio_atendimento.finalizado_em')
->whereNotNull('ambulatorio_atendimento.demanda_espontanea_id')
->when($params->especialidade_id ?? null, fn ($q, $id) => $q->where('ambulatorio_demanda_espontanea.especialidade_id', $id));
});
}
})
->get(['id', 'cidadao_id'])
->map(fn ($usuario) => [
'id' => $usuario->id,
'nome' => $usuario->cidadao()->setEagerLoads([])->first(['nome'])->nome,
])
->sortBy('nome')
->values();
}
public static function getEquipes(){
return DB::table('atencao_basica_parametrizacao_equipe_usuario')
->select([
'atencao_basica_parametrizacao_equipe.id AS id',
DB::raw("
CONCAT(
CASE
WHEN atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', atencao_basica_parametrizacao_area.numero_ine)
ELSE ''
END,
CASE
WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL AND atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN ' - Área: '
WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL THEN 'Área: '
ELSE ''
END,
COALESCE(atencao_basica_parametrizacao_area.descricao, ''),
CASE
WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL AND (atencao_basica_parametrizacao_area.numero_ine IS NOT NULL OR atencao_basica_parametrizacao_area.descricao IS NOT NULL) THEN ' - Microárea: '
WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL THEN 'Microárea: '
ELSE ''
END,
COALESCE(atencao_basica_parametrizacao_microarea.descricao, '')
) AS descricao
")
])
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id')
->leftJoin('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id')
->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id')
->join('cadastro_lotacao AS lotacao', 'lotacao.usuario_id', 'atencao_basica_parametrizacao_equipe_usuario.usuario_id')
->where('atencao_basica_parametrizacao_equipe_usuario.ativo', true)
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('cadastro_lotacao as lotacao')
->whereColumn('lotacao.infraestrutura_id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id')
->where('lotacao.infraestrutura_id', request()->infraestrutura_id)
->where('lotacao.usuario_id', request()->usuario_id)
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('ambulatorio_jornada as jornada')
->join(
'cadastro_especialidade as especialidade',
'especialidade.id',
'jornada.especialidade_id'
)
->whereColumn('jornada.lotacao_id', 'lotacao.id')
->whereNull('jornada.situacao_id')
->whereDate('jornada.data', request()->data)
->when(request()->paciente_id, fn ($q) => $q
->where(fn ($query) => self::setCadastroWhereEspecialidadePaciente(
$query,
request()->paciente_id,
'especialidade'
))
)
->when(request()->paciente_nao_municipe, fn ($q) => $q
->where('especialidade.permite_agendamento_nao_municipe', true)
)
)
)
->when(request()->usuario_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe_usuario.usuario_id', $id))
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', $id))
->when(request()->ocupacao_id, fn ($q, $id) => $q->where('lotacao.ocupacao_id', $id))
->distinct()
->get();
}
public static function getOcupacoes()
{
return DB::table('sigtap.ocupacao as ocupacao')
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('cadastro_lotacao as lotacao')
->whereColumn('lotacao.ocupacao_id', 'ocupacao.id')
->where('lotacao.infraestrutura_id', request()->infraestrutura_id)
->where('lotacao.usuario_id', request()->usuario_id)
->whereExists(fn ($q) => $q
->select(DB::raw(1))
->from('ambulatorio_jornada as jornada')
->join(
'cadastro_especialidade as especialidade',
'especialidade.id',
'jornada.especialidade_id'
)
->whereColumn('jornada.lotacao_id', 'lotacao.id')
->whereNull('jornada.situacao_id')
->whereDate('jornada.data', request()->data)
->when(request()->paciente_id, fn ($q) => $q
->where(fn ($query) => self::setCadastroWhereEspecialidadePaciente(
$query,
request()->paciente_id,
'especialidade'
))
)
->when(request()->paciente_nao_municipe, fn ($q) => $q
->where('especialidade.permite_agendamento_nao_municipe', true)
)
)
)
->orderByRaw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome)")
->select(DB::raw("
ocupacao.id,
CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) as codigo_nome
"))
->get();
}
private static function setCadastroWhereEspecialidadePaciente($query, $pacienteId, $tableAlias = '')
{
if (!empty($tableAlias)) {
$tableAlias .= '.';
}
$paciente = Paciente::find($pacienteId);
$idade = $paciente->cidadao->idade;
return $query->where(fn ($q) => $q
->when($idade, fn ($q) => $q
->where(fn ($q) => $q
->whereNull("{$tableAlias}idade_minima")
->orWhere("{$tableAlias}idade_minima", '<=', $idade['anos'])
)
->where(fn ($q) => $q
->whereNull("{$tableAlias}idade_maxima")
->orWhere("{$tableAlias}idade_maxima", '>=', $idade['anos'])
)
)
->where(fn ($q) => $q
->whereNull("{$tableAlias}sexo_id")
->orWhere("{$tableAlias}sexo_id", $paciente->cidadao->sexo_id)
)
);
}
private static function getBuscaStatus($params)
{
return AgendamentoStatus::whereHas('agendamentos', fn ($q) =>
self::setBuscaWhereAgendamento($q, $params)
->when($params->tipo_id ?? null, fn ($q, $id) => $q->where('tipo_id', $id))
->whereHas('jornada', fn ($q) => $q
->where('data', $params->data)
->whereHas('lotacao', fn ($q) => $q
->when($params->infraestrutura_id ?? null,
fn ($q, $id) => $q->where('infraestrutura_id', $id),
fn ($q) => $q->when($params->unidade_id ?? null, fn ($q, $id) => $q
->whereHas('infraestrutura', fn ($q) => $q->where('unidade_id', $id))
)
)
->when($params->usuario_id ?? null, fn ($q, $id) => $q->where('usuario_id', $id))
->when($params->ocupacao_id ?? null, fn ($q, $id) => $q->where('ocupacao_id', $id))
)
->when($params->especialidade_id ?? null, fn ($q, $id) => $q->where('especialidade_id', $id))
)
)
->orderBy('nome')
->get(['id', 'nome']);
}
private static function setBuscaWhereAgendamento($query)
{
return $query->where('status_id', AgendamentoStatusEnum::AGENDADO);
}
public static function store()
{
foreach (request()->consultas as $consulta) {
if ($consulta['status_id'] === AgendamentoStatusEnum::REALIZADO && isset($consulta['controla_protocolo_fechamento']) && $consulta['numero'] && $consulta['numero'] !== $consulta['protocolo_fechamento']) {
throw new ProtocoloFechamentoException();
}
if ($consulta['status_id'] == AgendamentoStatusEnum::REALIZADO) {
if (!empty($consulta['agendamento_id'])) {
$atendimento = Atendimento::where('agendamento_id', $consulta['agendamento_id'])
->first() ?? new Atendimento();
$atendimento->fill([
'agendamento_id' => $consulta['agendamento_id'],
'paciente_id' => $consulta['paciente_id'],
'finalizado_em' => Carbon::now(),
'finalizado_lotacao_id' => self::getCurrentLotacao()->id,
]);
} else {
$atendimento = Atendimento::where('id', $consulta['atendimento_id'])->first();
$atendimento->fill([
'finalizado_em' => Carbon::now(),
'finalizado_lotacao_id' => self::getCurrentLotacao()->id,
]);
if ($atendimento->demanda_espontanea_id) {
$atendimento->demandaEspontanea()->update([
'ocupacao_id' => $consulta['ocupacao_id'],
'especialidade_id' => $consulta['especialidade_id'],
'usuario_id' => $consulta['usuario_id'],
]);
}
}
$atendimento->save();
if ($atendimento->fila) {
$atendimento->fila->update(['finalizado' => true]);
}
$soap = new AtendimentoSoap();
$soap->fill(self::getSoapParams($consulta, $atendimento));
$soap->save();
$procedimentos = array_filter($consulta['procedimentos'], function($procedimento) use ($consulta) {
return $procedimento['usuario_id'] === $consulta['usuario_id'];
});
if (isset($consulta['procedimento']) && $consulta['procedimento'] !== null) {
$consulta['procedimento']['quantidade'] = $consulta['quantidade'] ?? null;
$consulta['procedimento']['cid'] = $consulta['cid'] ?? null;
$procedimentos[] = $consulta['procedimento'];
}
$procedimentos = collect($procedimentos)->unique('codigo')->values()->toArray();
foreach ($procedimentos as $procedimento) {
$atendimentoProcedimento = $soap->procedimentos()->create([
'atendimento_id' => $soap->atendimento_id,
'procedimento_id' => $procedimento['id'],
'quantidade' => $procedimento['quantidade'] ?? 1,
'cid_id' => isset($procedimento['cid']) && isset($procedimento['cid']['id']) ? $procedimento['cid']['id'] : null,
'automatico' => false,
'ocupacao_id' => $soap->atendimento->ocupacao->id,
'especialidade_id' => $soap->atendimento->especialidade->id,
'usuario_id' => $soap->atendimento->usuario->id,
]);
$soap->procedimentosClinicos()->create([
'atendimento_procedimento_id' => $atendimentoProcedimento->id,
'observacao' => $procedimento['observacao'] ?? null,
]);
}
if ($consulta['cid']) {
$data = [
'ciap_id' => null,
'cid_id' => $consulta['cid']['id'],
'situacao_id' => null,
];
$soap->problemasCondicoes()->create($data);
}
self::storeAtendimentoIndividual($consulta, $soap);
self::storeAtendimentoOdontologico($consulta, $soap);
} else {
if (!empty($consulta['agendamento_id'])) {
$atendimento = Atendimento::where('agendamento_id', $consulta['agendamento_id'])->first();
} else {
$atendimento = Atendimento::where('id', $consulta['atendimento_id'])->first();
}
if ($atendimento) {
$atendimento->update([
'finalizado_em' => Carbon::now(),
'finalizado_lotacao_id' => self::getCurrentLotacao()->id,
]);
if ($atendimento->fila) {
$atendimento->fila->update(['finalizado' => true]);
}
}
}
if (!empty($consulta['agendamento_id'])) {
$agendamentoStatus = Agendamento::findOrFail($consulta['agendamento_id']);
if ($agendamentoStatus) {
$params = [
'status_id' => $consulta['status_id'],
];
$agendamentoStatus->update($params);
}
if (!is_null($consulta['regulacao_solicitacao_id'])) {
$statusTipoId = null;
if ($consulta['status_id'] === AgendamentoStatusEnum::REALIZADO) {
$statusTipoId = RegulacaoStatusTipoEnum::REALIZADO;
} else if ($consulta['status_id'] === AgendamentoStatusEnum::FALTA_DO_PACIENTE) {
$statusTipoId = RegulacaoStatusTipoEnum::FALTA;
}
if (!is_null($statusTipoId)) {
RegulacaoSolicitacaoService::updateStatus($consulta['regulacao_solicitacao_id'], $statusTipoId);
}
}
}
}
self::procedimentosUsuarioCompartilhado(request()->consultas);
}
private static function storeAtendimentoIndividual($consulta, $soap) {
if (array_key_exists('atendimento_individual', $consulta)) {
if (!self::criaFicha($consulta['infraestrutura_id'], $consulta['ocupacao_id'], 'atendimento-individual')) {
return;
}
$fichaAtendimentoIndividual = $consulta['atendimento_individual'];
$fichaAtendimentoIndividual['soap_id'] = $soap->id;
$fichaAtendimentoIndividual['paciente_id'] = $soap->atendimento->paciente->id;
$fichaAtendimentoIndividual['cadastro']['usuario_id'] = $fichaAtendimentoIndividual['cadastro']['usuario']['id'];
$fichaAtendimentoIndividual['cadastro']['usuario_auxiliar_id'] = $fichaAtendimentoIndividual['cadastro']['usuario_auxiliar']['id'] ?? null;
try {
AtendimentoIndividualService::saveStore($fichaAtendimentoIndividual);
}
catch (Exception $e) {
throw new NaoPodeCriarFichaAtencaoBasicaException();
}
}
}
private static function storeAtendimentoOdontologico($consulta, $soap) {
if (array_key_exists('atendimento_odontologico', $consulta)) {
if (!self::criaFicha($consulta['infraestrutura_id'], $consulta['ocupacao_id'], 'atendimento-odontologico')) {
return;
}
$fichaAtendimentoOdontologico = $consulta['atendimento_odontologico'];
$fichaAtendimentoOdontologico['soap_id'] = $soap->id;
$fichaAtendimentoOdontologico['paciente_id'] = $soap->atendimento->paciente->id;
$fichaAtendimentoOdontologico['cadastro']['usuario_id'] = $fichaAtendimentoOdontologico['cadastro']['usuario']['id'];
$fichaAtendimentoOdontologico['cadastro']['usuario_auxiliar_id'] = $fichaAtendimentoOdontologico['cadastro']['usuario_auxiliar']['id'];
foreach ($consulta['procedimentos_quantidade'] as $procedimentoQuantidade) {
$fichaAtendimentoOdontologico['procedimentos'][] = $procedimentoQuantidade;
}
try {
AtendimentoOdontologicoService::saveStore($fichaAtendimentoOdontologico);
}
catch (Exception $e) {
throw new NaoPodeCriarFichaAtencaoBasicaException();
}
}
}
private static function criaFicha($infraestruturaId, $ocupacaoId, $funcionalidadeIdentificador)
{
return ParametrizacaoInfraestruturaOcupacao::whereHas('parametrizacaoInfraestrutura', fn ($q) => $q
->where('infraestrutura_id', $infraestruturaId)
)
->where('ocupacao_id', $ocupacaoId)
->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;
}
private static function procedimentosUsuarioCompartilhado($consultas) {
$atendimentos = [];
foreach ($consultas as $consulta) {
if ($consulta['status_id'] == AgendamentoStatusEnum::REALIZADO) {
$pacienteId = $consulta['paciente_id'];
$unidadeId = $consulta['unidade_id'];
$infraestruturaId = $consulta['infraestrutura_id'];
$localAtendimentoId = $consulta['atencao_basica_local_atendimento_id'];
$turnoId = $consulta['turno_id'];
$data = $consulta['data'];
$usuarioResponsavel = $consulta['usuario_id'];
$procedimentos = array_filter($consulta['procedimentos'], function($procedimento) use ($usuarioResponsavel) {
return $procedimento['usuario_id'] !== $usuarioResponsavel;
});
foreach ($procedimentos as $procedimento) {
if (!$procedimento['equipe_id']) {
continue;
}
$usuarioId = $procedimento['usuario_id'];
$ocupacaoId = $procedimento['ocupacao_id'];
$equipeId = $procedimento['equipe_id'];
$procedimentoId = $procedimento['id'];
$quantidade = $procedimento['quantidade'];
$index = self::getIndexProcedimento($atendimentos, $pacienteId, $usuarioId, $ocupacaoId,
$localAtendimentoId, $equipeId, $unidadeId, $infraestruturaId);
if ($index !== null) {
$item = array_search(
$procedimentoId,
array_column($atendimentos[$index]['procedimentos'], 'id')
);
if ($item !== false) {
$atendimentos[$index]['procedimentos'][$item]['quantidade'] += $quantidade;
} else {
$atendimentos[$index]['procedimentos'][] = [
'id' => $procedimentoId,
'quantidade' => $quantidade,
];
}
} else {
$atendimentos[] = [
'id' => null,
'paciente_id' => $pacienteId,
'local_atendimento_id' => $localAtendimentoId,
'usuario_id' => $usuarioId,
'ocupacao_id' => $ocupacaoId,
'equipe_id' => $equipeId,
'data_usuario_responsavel' => $data,
'infraestrutura_id' => $infraestruturaId,
'unidade_id' => $unidadeId,
'afericao_pa' => null,
'altura' => null,
'curativo' => null,
'exame_laboratorial' => null,
'glicemia' => null,
'teste_rapido' => null,
'procedimento_pequena_cirurgia' => null,
'administracao_medicamento' => null,
'peso' => null,
'temperatura' => null,
'microarea_id' => null,
'escuta_inicial' => null,
'turno_id' => $turnoId,
'procedimentos' => [[
'id' => $procedimentoId,
'quantidade' => $quantidade,
]],
];
}
}
}
}
self::storeProcedimentos($atendimentos);
}
private static function storeProcedimentos($procedimentos) {
$atendimentos = [];
$index = null;
foreach ($procedimentos as $procedimento) {
$usuarioId = $procedimento['usuario_id'];
$ocupacaoId = $procedimento['ocupacao_id'];
$equipeId = $procedimento['equipe_id'];
if (isset($atendimentos) && !empty($atendimentos)) {
$index = self::getIndexAtendimento($atendimentos, $usuarioId, $ocupacaoId, $equipeId);
}
if ($index !== null) {
$atendimentos[$index]['atendimentos'][] = $procedimento;
} else {
$atendimentos[] = [
'id' => null,
'origem' => 'ambulatorio',
'cadastro' => [
'data_usuario_responsavel' => $procedimento['data_usuario_responsavel'],
'equipe_id' => $procedimento['equipe_id'],
'infraestrutura_id' => $procedimento['infraestrutura_id'],
'ocupacao_id' => $procedimento['ocupacao_id'],
'unidade_id' => $procedimento['unidade_id'],
'usuario_id' => $procedimento['usuario_id'],
],
'atendimentos' => [$procedimento],
'procedimento_consolidado' => [
'afericao_pa' => null,
'altura' => null,
'curativo' => null,
'exame_laboratorial' => null,
'glicemia_capilar' => null,
'peso' => null,
'temperatura' => null,
]
];
}
foreach ($atendimentos as $atendimento) {
try {
ProcedimentoService::saveStore($atendimento);
}
catch (Exception $e) {
throw new NaoPodeCriarFichaAtencaoBasicaException();
}
}
}
}
private static function getIndexAtendimento($atendimentos, $usuarioId, $ocupacaoId, $equipeId) {
$index = null;
foreach ($atendimentos as $i => $item) {
if ($item['cadastro']['usuario_id'] == $usuarioId
&& $item['cadastro']['ocupacao_id'] == $ocupacaoId
&& $item['cadastro']['equipe_id'] == $equipeId
) {
$index = $i;
break;
}
}
return $index;
}
private static function getIndexProcedimento($procedimentos, $pacienteId, $usuarioId, $ocupacaoId,
$localAtendimentoId, $equipeId, $unidadeId, $infraestruturaId) {
$index = null;
foreach ($procedimentos as $i => $item) {
if ($item['paciente_id'] == $pacienteId
&& $item['local_atendimento_id'] == $localAtendimentoId
&& $item['usuario_id'] == $usuarioId
&& $item['ocupacao_id'] == $ocupacaoId
&& $item['equipe_id'] == $equipeId
&& $item['unidade_id'] == $unidadeId
&& $item['infraestrutura_id'] == $infraestruturaId
) {
$index = $i;
break;
}
}
return $index;
}
private static function getSoapParams($agendamento, $atendimento)
{
$params = [
'atendimento_id' => $atendimento->id,
'equipe_id' => null,
'atencao_basica_local_atendimento_id' => $agendamento['atencao_basica_local_atendimento_id'],
'turno_id' => $agendamento['turno_id'],
'paciente_liberado' => true
];
return $params;
}
}