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; } }