[], 'form' => [], 'model' => [], ]; $params = self::getParams(); $sets = [ 'exame' => function () use ($data, $params) { $exameData = self::getExames($params); $data->form['exames'] = $exameData['form']; $data->model['exames'] = $exameData['model']; $params->exames = $data->model['exames']; }, 'procedimento_cirurgico' => function () use ($data, $params) { $procedimentoCirurgicoData = self::getProcedimentosCirurgicos($params); $data->form['procedimentos_cirurgicos'] = $procedimentoCirurgicoData['form']; $data->model['procedimentos_cirurgicos'] = $procedimentoCirurgicoData['model']; $params->procedimentos_cirurgicos = $data->model['procedimentos_cirurgicos']; }, 'especialidade' => function () use ($data, $params) { $especialidadeData = self::getEspecialidades($params); $data->form['especialidades'] = $especialidadeData['form']; $data->model['especialidades'] = $especialidadeData['model']; $params->especialidades = $data->model['especialidades']; }, ]; $load = is_null(request()->load_from); if ($load) { $data->additionals = [ 'data_atual' => Carbon::today()->format('d/m/Y'), 'colunas_visiveis' => DB::table('regulacao_parametrizacao_divulgacao_aba_coluna as aba_coluna') ->where('aba_coluna.aba_id', request()->aba === 'solicitacao-espera' ? ParametrizacaoDivulgacaoAba::SOLICITACOES_EM_ESPERA : ParametrizacaoDivulgacaoAba::SOLICITACOES_ATENDIDAS) ->where('aba_coluna.visivel', true) ->pluck('aba_coluna.coluna_id') ]; } $fieldsItem = collect(['exame', 'procedimento_cirurgico', 'especialidade']); $isLoadFromItens = $fieldsItem->contains(request()->load_from); foreach ($sets as $field => $set) { if ($load) { if ($isLoadFromItens && $fieldsItem->contains($field)) { continue; } $set(); } else if ($field === request()->load_from) { $load = true; } } foreach ($data as $property => $itens) { if (empty($itens)) { unset($data->{$property}); } } return $data; } private static function getParams() { $params = (object) [ 'exames' => request()->get('exames', []), 'procedimentos_cirurgicos' => request()->get('procedimentos_cirurgicos', []), 'especialidades' => request()->get('especialidades', []), ]; return $params; } private static function getExames() { $exames = DB::table('parametrizacao_exame as exame') ->whereNull('exame.deleted_at') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('regulacao_solicitacao_item as item') ->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id') ->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j ->on('movimentacao.solicitacao_id', 'solicitacao.id') ->where('movimentacao.id', fn ($q) => $q ->select('movimentacao2.id') ->from('regulacao_solicitacao_movimentacao as movimentacao2') ->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id') ->orderByDesc('movimentacao2.id') ->limit(1) ) ) ->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id') ->join( 'regulacao_parametrizacao_divulgacao_regulador as regulador', 'regulador.regulacao_parametrizacao_regulador_id', 'solicitacao.regulador_id' ) ->join( 'regulacao_parametrizacao_divulgacao_regulador_exame as regulador_exame', 'regulador_exame.regulador_id', 'regulador.id' ) ->join( 'regulacao_parametrizacao_regulador as regulacao_regulador', 'regulacao_regulador.id', 'regulador.regulacao_parametrizacao_regulador_id' ) ->join( 'cadastro_infraestrutura as infraestrutura_reguladora', 'infraestrutura_reguladora.id', 'regulacao_regulador.infraestrutura_id' ) ->join( 'regulacao_status as status', 'status.id', 'solicitacao.status_id' ) ->whereColumn('item.exame_id', 'exame.id') ->whereColumn('regulador_exame.exame_id', 'exame.id') ->where('regulador_exame.ativo', true) ->where('regulador.ativo', true) ->whereNotNull('item.exame_id') ->whereNotNull('solicitacao.confirmado_em') ->whereIn('status.tipo_id', self::getStatusTiposVisiveis()) ) ->selectRaw(" exame.id, exame.nome ") ->orderBy('exame.nome') ->get() ->map(fn ($exame) => [ 'id' => $exame->id, 'descricao' => $exame->nome, ]); return ['form' => $exames, 'model' => collect()]; } private static function getProcedimentosCirurgicos() { $procedimentosCirurgicos = DB::table('parametrizacao_procedimento_cirurgico as procedimento_cirurgico') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('regulacao_solicitacao_item as item') ->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id') ->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j ->on('movimentacao.solicitacao_id', 'solicitacao.id') ->where('movimentacao.id', fn ($q) => $q ->select('movimentacao2.id') ->from('regulacao_solicitacao_movimentacao as movimentacao2') ->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id') ->orderByDesc('movimentacao2.id') ->limit(1) ) ) ->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id') ->join( 'regulacao_parametrizacao_divulgacao_regulador as regulador', 'regulador.regulacao_parametrizacao_regulador_id', 'solicitacao.regulador_id' ) ->join( 'regulacao_parametrizacao_divulgacao_regulador_cirurgico as regulador_cirurgico', 'regulador_cirurgico.regulador_id', 'regulador.id' ) ->join( 'regulacao_parametrizacao_regulador as regulacao_regulador', 'regulacao_regulador.id', 'regulador.regulacao_parametrizacao_regulador_id' ) ->join( 'cadastro_infraestrutura as infraestrutura_reguladora', 'infraestrutura_reguladora.id', 'regulacao_regulador.infraestrutura_id' ) ->join( 'regulacao_status as status', 'status.id', 'solicitacao.status_id' ) ->whereColumn('item.procedimento_cirurgico_id', 'procedimento_cirurgico.id') ->whereColumn('regulador_cirurgico.procedimento_cirurgico_id', 'procedimento_cirurgico.id') ->where('regulador_cirurgico.ativo', true) ->where('regulador.ativo', true) ->whereNotNull('item.procedimento_cirurgico_id') ->whereNotNull('solicitacao.confirmado_em') ->whereIn('status.tipo_id', self::getStatusTiposVisiveis()) ) ->selectRaw(" procedimento_cirurgico.id, procedimento_cirurgico.nome ") ->orderBy('procedimento_cirurgico.nome') ->get() ->map(fn ($procedimentoCirurgico) => [ 'id' => $procedimentoCirurgico->id, 'descricao' => $procedimentoCirurgico->nome, ]); return ['form' => $procedimentosCirurgicos, 'model' => collect()]; } private static function getEspecialidades() { $especialidades = DB::table('cadastro_especialidade as especialidade') ->join('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('regulacao_solicitacao_item as item') ->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id') ->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j ->on('movimentacao.solicitacao_id', 'solicitacao.id') ->where('movimentacao.id', fn ($q) => $q ->select('movimentacao2.id') ->from('regulacao_solicitacao_movimentacao as movimentacao2') ->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id') ->orderByDesc('movimentacao2.id') ->limit(1) ) ) ->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id') ->join( 'regulacao_parametrizacao_divulgacao_regulador as regulador', 'regulador.regulacao_parametrizacao_regulador_id', 'solicitacao.regulador_id' ) ->join( 'regulacao_parametrizacao_divulgacao_regulador_especialidade as regulador_especialidade', 'regulador_especialidade.regulador_id', 'regulador.id' ) ->join( 'regulacao_parametrizacao_regulador as regulacao_regulador', 'regulacao_regulador.id', 'regulador.regulacao_parametrizacao_regulador_id' ) ->join( 'cadastro_infraestrutura as infraestrutura_reguladora', 'infraestrutura_reguladora.id', 'regulacao_regulador.infraestrutura_id' ) ->join( 'regulacao_status as status', 'status.id', 'solicitacao.status_id' ) ->whereColumn('item.especialidade_id', 'especialidade.id') ->whereColumn('regulador_especialidade.especialidade_id', 'especialidade.id') ->where('regulador_especialidade.ativo', true) ->where('regulador.ativo', true) ->whereNotNull('item.especialidade_id') ->whereNotNull('solicitacao.confirmado_em') ->whereIn('status.tipo_id', self::getStatusTiposVisiveis()) ) ->selectRaw(" especialidade.id, especialidade.nome ") ->orderBy('especialidade.nome') ->get() ->map(fn ($especialidade) => [ 'id' => $especialidade->id, 'descricao' => $especialidade->nome, ]); return ['form' => $especialidades, 'model' => collect()]; } private static function getStatusTiposVisiveis() { return DB::table('regulacao_parametrizacao_divulgacao_aba_status_tipo as aba_status_tipo') ->where('aba_status_tipo.aba_id', request()->aba === 'solicitacao-espera' ? ParametrizacaoDivulgacaoAba::SOLICITACOES_EM_ESPERA : ParametrizacaoDivulgacaoAba::SOLICITACOES_ATENDIDAS) ->where('visivel', true) ->pluck('aba_status_tipo.status_tipo_id'); } public static function datatableSolicitacaoEspera() { $statusTipos = DB::table('regulacao_parametrizacao_divulgacao_aba_status_tipo as aba_status_tipo') ->where('aba_status_tipo.aba_id', ParametrizacaoDivulgacaoAba::SOLICITACOES_EM_ESPERA) ->where('visivel', true) ->pluck('aba_status_tipo.status_tipo_id'); $params = self::getParams(); $solicitacoes = DB::table('regulacao_solicitacao as solicitacao') ->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j ->on('movimentacao.solicitacao_id', 'solicitacao.id') ->where('movimentacao.id', fn ($q) => $q ->select('movimentacao2.id') ->from('regulacao_solicitacao_movimentacao as movimentacao2') ->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id') ->orderByDesc('movimentacao2.id') ->limit(1) ) ) ->join('regulacao_solicitacao_prioridade as prioridade', 'prioridade.id', 'solicitacao.prioridade_id') ->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id') ->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id') ->join('regulacao_status as status', 'status.id', 'solicitacao.status_id') ->join( 'regulacao_parametrizacao_divulgacao_regulador as regulador', 'regulador.regulacao_parametrizacao_regulador_id', 'solicitacao.regulador_id' ) ->join('regulacao_parametrizacao_regulador as regulacao_regulador', 'regulacao_regulador.id', 'regulador.regulacao_parametrizacao_regulador_id') ->join( 'cadastro_infraestrutura as infraestrutura_reguladora', 'infraestrutura_reguladora.id', 'regulacao_regulador.infraestrutura_id' ) ->join('regulacao_solicitacao_item as item', 'item.solicitacao_id', 'solicitacao.id') ->leftJoin('parametrizacao_exame as exame', 'exame.id', 'item.exame_id') ->leftJoin( 'parametrizacao_procedimento_cirurgico as procedimento_cirurgico', 'procedimento_cirurgico.id', 'item.procedimento_cirurgico_id' ) ->leftJoin('cadastro_especialidade as especialidade', 'especialidade.id', 'item.especialidade_id') ->leftJoin('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id') ->whereNotNull('solicitacao.confirmado_em') ->whereIn('status.tipo_id', $statusTipos) ->where('regulador.ativo', true) ->where(function ($q) use ($params) { if (!empty($params->exames) || !empty($params->procedimentos_cirurgicos)) { $q->where(function ($sub) use ($params) { if (!empty($params->exames)) { $sub->whereIn('item.exame_id', $params->exames); } if (!empty($params->procedimentos_cirurgicos)) { $sub->orWhereIn('item.procedimento_cirurgico_id', $params->procedimentos_cirurgicos); } }); } if (!empty($params->especialidades)) { $q->orWhereIn('item.especialidade_id', $params->especialidades); } }) ->selectRaw(" solicitacao.id, solicitacao.data, DATE_FORMAT(movimentacao.movimentado_em, '%d/%m/%Y %H:%i:%s') as data_movimentacao, IF(solicitacao.posicao_portal IS NULL, NULL, LPAD(solicitacao.posicao_portal, 4, '0')) AS posicao, CONCAT( paciente_cidadao.nome, IF(paciente_cidadao.nome_social IS NULL, '', CONCAT(' (', paciente_cidadao.nome_social, ')') ) ) as paciente_nome, paciente_cidadao.cns as paciente_cns, paciente_cidadao.cpf as paciente_cpf, status.tipo_id as status_tipo_id, status.nome as status_nome, TIMESTAMPDIFF( DAY, ( SELECT STR_TO_DATE(CONCAT(solicitacao_historico.data, ' 00:00:00'), '%Y-%m-%d %H:%i:%s') FROM regulacao_solicitacao_historico as solicitacao_historico JOIN regulacao_status solicitacao_historico_status ON solicitacao_historico_status.id = solicitacao_historico.status_id WHERE solicitacao_historico.solicitacao_id = solicitacao.id AND solicitacao_historico_status.tipo_id = " . StatusTipo::SOLICITADO . " ORDER BY solicitacao_historico.created_at LIMIT 1 ), COALESCE(( SELECT solicitacao_historico.created_at FROM regulacao_solicitacao_historico as solicitacao_historico JOIN regulacao_status solicitacao_historico_status ON solicitacao_historico_status.id = solicitacao_historico.status_id WHERE solicitacao_historico.solicitacao_id = solicitacao.id AND solicitacao_historico_status.tipo_id IN ( " . StatusTipo::AGENDADO . ", " . StatusTipo::REAGENDADO . " ) ORDER BY solicitacao_historico.created_at LIMIT 1 ), CURRENT_TIMESTAMP) ) as tempo_espera, IF(status.tipo_id IN (" . self::getStatusTiposQueFinalizamSolicitacao()->join(', ') . "), 0, 1) as allow_update, IF(status.tipo_id IN (" . self::getStatusTipoDeAgendamento()->join(', ') . "), 1, 0) as allow_update_protocolo_agendamento, GROUP_CONCAT(( CASE WHEN item.exame_id IS NOT NULL THEN exame.nome WHEN item.procedimento_cirurgico_id IS NOT NULL THEN procedimento_cirurgico.nome WHEN item.especialidade_id IS NOT NULL THEN especialidade.nome END ) SEPARATOR '#') AS itens, GROUP_CONCAT(( CASE WHEN item.exame_id IS NOT NULL THEN CONCAT('EXAME|', item.exame_id) WHEN item.procedimento_cirurgico_id IS NOT NULL THEN CONCAT('PROCEDIMENTO|', item.procedimento_cirurgico_id) WHEN item.especialidade_id IS NOT NULL THEN CONCAT('ESPECIALIDADE|', item.especialidade_id) END ) SEPARATOR '#') AS itens_ids, (status.tipo_id = " . StatusTipo::AGENDADO . ") as is_agendado, IF(status.tipo_id = " . StatusTipo::DEVOLVIDO . ", solicitacao.justificativa_devolucao, NULL) as justificativa_devolucao, prioridade.nome as prioridade_nome, solicitacao.observacao, ( CASE WHEN item.exame_id IS NOT NULL THEN 'EXAME' WHEN item.procedimento_cirurgico_id IS NOT NULL THEN 'PROCEDIMENTO CIRÚRGICO' WHEN item.especialidade_id IS NOT NULL THEN 'CONSULTA' END ) AS tipo_solicitacao ") ->groupByRaw(" solicitacao.id, DATE_FORMAT(solicitacao.data, '%d/%m/%Y'), DATE_FORMAT(solicitacao.data_desejada, '%d/%m/%Y'), DATE_FORMAT(movimentacao.movimentado_em, '%d/%m/%Y'), posicao, paciente_nome, status.tipo_id, status.nome, tempo_espera, allow_update, allow_update_protocolo_agendamento, is_agendado, IF(status.tipo_id = " . StatusTipo::DEVOLVIDO . ", solicitacao.justificativa_devolucao, NULL), prioridade.nome, solicitacao.observacao, tipo_solicitacao ") ->orderBy('solicitacao.posicao_portal'); return $solicitacoes; } public static function datatableSolicitacaoAtendida() { $statusTipos = DB::table('regulacao_parametrizacao_divulgacao_aba_status_tipo as aba_status_tipo') ->where('aba_status_tipo.aba_id', ParametrizacaoDivulgacaoAba::SOLICITACOES_ATENDIDAS) ->where('visivel', true) ->pluck('aba_status_tipo.status_tipo_id'); $params = self::getParams(); $solicitacoes = DB::table('regulacao_solicitacao as solicitacao') ->join('regulacao_solicitacao_movimentacao as movimentacao', fn ($j) => $j ->on('movimentacao.solicitacao_id', 'solicitacao.id') ->where('movimentacao.id', fn ($q) => $q ->select('movimentacao2.id') ->from('regulacao_solicitacao_movimentacao as movimentacao2') ->whereColumn('movimentacao2.solicitacao_id', 'solicitacao.id') ->orderByDesc('movimentacao2.id') ->limit(1) ) ) ->join('regulacao_status as status_movimentacao', 'status_movimentacao.id', 'movimentacao.status_id') ->join('regulacao_solicitacao_prioridade as prioridade', 'prioridade.id', 'solicitacao.prioridade_id') ->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id') ->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id') ->join('regulacao_status as status', 'status.id', 'solicitacao.status_id') ->join('regulacao_status_tipo as status_tipo', 'status_tipo.id', 'status.tipo_id') ->join( 'regulacao_parametrizacao_divulgacao_regulador as regulador', 'regulador.regulacao_parametrizacao_regulador_id', 'solicitacao.regulador_id' ) ->join('regulacao_parametrizacao_regulador as regulacao_regulador', 'regulacao_regulador.id', 'regulador.regulacao_parametrizacao_regulador_id') ->join( 'cadastro_infraestrutura as infraestrutura_reguladora', 'infraestrutura_reguladora.id', 'regulacao_regulador.infraestrutura_id' ) ->join('regulacao_solicitacao_item as item', 'item.solicitacao_id', 'solicitacao.id') ->leftJoin('parametrizacao_exame as exame', 'exame.id', 'item.exame_id') ->leftJoin( 'parametrizacao_procedimento_cirurgico as procedimento_cirurgico', 'procedimento_cirurgico.id', 'item.procedimento_cirurgico_id' ) ->leftJoin('cadastro_especialidade as especialidade', 'especialidade.id', 'item.especialidade_id') ->leftJoin('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id') ->whereNotNull('solicitacao.confirmado_em') ->whereIn('status.tipo_id', $statusTipos) ->where('regulador.ativo', true) ->where(function ($q) use ($params) { if (!empty($params->exames) || !empty($params->procedimentos_cirurgicos)) { $q->where(function ($sub) use ($params) { if (!empty($params->exames)) { $sub->whereIn('item.exame_id', $params->exames); } if (!empty($params->procedimentos_cirurgicos)) { $sub->orWhereIn('item.procedimento_cirurgico_id', $params->procedimentos_cirurgicos); } }); } if (!empty($params->especialidades)) { $q->orWhereIn('item.especialidade_id', $params->especialidades); } }) ->selectRaw(" solicitacao.id, solicitacao.data, DATE_FORMAT(movimentacao.movimentado_em, '%d/%m/%Y %H:%i:%s') as data_movimentacao, IF(solicitacao.posicao_portal IS NULL, NULL, LPAD(solicitacao.posicao_portal, 4, '0')) AS posicao, CONCAT( paciente_cidadao.nome, IF(paciente_cidadao.nome_social IS NULL, '', CONCAT(' (', paciente_cidadao.nome_social, ')') ) ) as paciente_nome, paciente_cidadao.cns as paciente_cns, paciente_cidadao.cpf as paciente_cpf, status.tipo_id as status_tipo_id, status.nome as status_nome, TIMESTAMPDIFF( DAY, ( SELECT STR_TO_DATE(CONCAT(solicitacao_historico.data, ' 00:00:00'), '%Y-%m-%d %H:%i:%s') FROM regulacao_solicitacao_historico as solicitacao_historico JOIN regulacao_status solicitacao_historico_status ON solicitacao_historico_status.id = solicitacao_historico.status_id WHERE solicitacao_historico.solicitacao_id = solicitacao.id AND solicitacao_historico_status.tipo_id = " . StatusTipo::SOLICITADO . " ORDER BY solicitacao_historico.created_at LIMIT 1 ), COALESCE(( SELECT solicitacao_historico.created_at FROM regulacao_solicitacao_historico as solicitacao_historico JOIN regulacao_status solicitacao_historico_status ON solicitacao_historico_status.id = solicitacao_historico.status_id WHERE solicitacao_historico.solicitacao_id = solicitacao.id AND solicitacao_historico_status.tipo_id IN ( " . StatusTipo::AGENDADO . ", " . StatusTipo::REAGENDADO . " ) ORDER BY solicitacao_historico.created_at LIMIT 1 ), CURRENT_TIMESTAMP) ) as tempo_espera, IF(status.tipo_id IN (" . self::getStatusTiposQueFinalizamSolicitacao()->join(', ') . "), 0, 1) as allow_update, IF(status.tipo_id IN (" . self::getStatusTipoDeAgendamento()->join(', ') . "), 1, 0) as allow_update_protocolo_agendamento, GROUP_CONCAT(( CASE WHEN item.exame_id IS NOT NULL THEN exame.nome WHEN item.procedimento_cirurgico_id IS NOT NULL THEN procedimento_cirurgico.nome WHEN item.especialidade_id IS NOT NULL THEN especialidade.nome END ) SEPARATOR '#') AS itens, GROUP_CONCAT(( CASE WHEN item.exame_id IS NOT NULL THEN CONCAT('EXAME|', item.exame_id) WHEN item.procedimento_cirurgico_id IS NOT NULL THEN CONCAT('PROCEDIMENTO|', item.procedimento_cirurgico_id) WHEN item.especialidade_id IS NOT NULL THEN CONCAT('ESPECIALIDADE|', item.especialidade_id) END ) SEPARATOR '#') AS itens_ids, (status.tipo_id = " . StatusTipo::AGENDADO . ") as is_agendado, IF(status.tipo_id = " . StatusTipo::DEVOLVIDO . ", solicitacao.justificativa_devolucao, NULL) as justificativa_devolucao, prioridade.nome as prioridade_nome, solicitacao.observacao, ( CASE WHEN item.exame_id IS NOT NULL THEN 'EXAME' WHEN item.procedimento_cirurgico_id IS NOT NULL THEN 'PROCEDIMENTO CIRÚRGICO' WHEN item.especialidade_id IS NOT NULL THEN 'CONSULTA' END ) AS tipo_solicitacao, status_tipo.nome as status_tipo_nome, IF( status_movimentacao.tipo_id = " . StatusTipo::REALIZADO . ", DATE(movimentacao.movimentado_em), NULL ) as data_realizacao ") ->groupByRaw(" solicitacao.id, DATE_FORMAT(solicitacao.data, '%d/%m/%Y'), DATE_FORMAT(solicitacao.data_desejada, '%d/%m/%Y'), DATE_FORMAT(movimentacao.movimentado_em, '%d/%m/%Y'), posicao, paciente_nome, status.tipo_id, status.nome, tempo_espera, allow_update, allow_update_protocolo_agendamento, is_agendado, IF(status.tipo_id = " . StatusTipo::DEVOLVIDO . ", solicitacao.justificativa_devolucao, NULL), prioridade.nome, solicitacao.observacao, tipo_solicitacao, status_tipo.nome, data_realizacao "); return $solicitacoes; } public static function getStatusTipoDeAgendamento() { return collect([ StatusTipo::AGENDADO, StatusTipo::REAGENDADO, ]); } public static function getStatusTiposQueFinalizamSolicitacao() { return collect([ StatusTipo::FALTA, StatusTipo::REALIZADO, StatusTipo::CANCELADO, ]); } public static function getTempoMedioPrevistoAtendimento() { $tempoMedioAutomatico = (ParametrizacaoDivulgacao::first()->modo_tempo_medio_id ?? null) === ParametrizacaoDivulgacaoModoTempoMedio::AUTOMATICO; return [ 'exames' => self::getTempoMedioPrevistoAtendimentoExames($tempoMedioAutomatico), 'procedimentos_cirurgicos' => self::getTempoMedioPrevistoAtendimentoProcedimentosCirurgicos($tempoMedioAutomatico), 'especialidades' => self::getTempoMedioPrevistoAtendimentoEspecialidades($tempoMedioAutomatico), ]; } private static function getTempoMedioPrevistoAtendimentoExames($tempoMedioAutomatico) { $medias = []; if ($tempoMedioAutomatico) { $tempoEsperaExames = []; foreach (request()->exames as $id) { DB::table('regulacao_solicitacao_item as item') ->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id') ->where('item.exame_id', $id) ->select( DB::raw("TIMESTAMPDIFF( DAY, CONCAT(solicitacao.data, ' 00:00:00'), CONCAT(solicitacao.data_agendada, ' 00:00:00') ) AS tempo_espera") ) ->get() ->each(function ($data) use ($id, &$tempoEsperaExames) { if (isset($data->tempo_espera)) { $tempoEsperaExames[$id][] = (int) $data->tempo_espera; } }); } foreach ($tempoEsperaExames as $id => $temposEspera) { $medias[$id] = (int) ceil(collect($temposEspera)->sum() / count($temposEspera)); } } else { foreach (request()->exames as $id) { $tempoMedio = DB::table('parametrizacao_exame as exame') ->where('exame.id', $id) ->select('exame.tempo_medio_previsto_atendimento_dias') ->first()->tempo_medio_previsto_atendimento_dias ?? null; $medias[$id] = $tempoMedio; } } return $medias; } private static function getTempoMedioPrevistoAtendimentoProcedimentosCirurgicos($tempoMedioAutomatico) { $medias = []; if ($tempoMedioAutomatico) { $tempoEsperaProcedimentos = []; foreach (request()->procedimentos_cirurgicos as $id) { DB::table('regulacao_solicitacao_item as item') ->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id') ->where('item.procedimento_cirurgico_id', $id) ->select( DB::raw("TIMESTAMPDIFF( DAY, CONCAT(solicitacao.data, ' 00:00:00'), CONCAT(solicitacao.data_agendada, ' 00:00:00') ) AS tempo_espera") ) ->get() ->each(function ($data) use ($id, &$tempoEsperaProcedimentos) { if (isset($data->tempo_espera)) { $tempoEsperaProcedimentos[$id][] = (int) $data->tempo_espera; } }); } foreach ($tempoEsperaProcedimentos as $id => $temposEspera) { $medias[$id] = (int) ceil(collect($temposEspera)->sum() / count($temposEspera)); } } else { foreach (request()->procedimentos_cirurgicos as $id) { $medias[$id] = null; } } return $medias; } private static function getTempoMedioPrevistoAtendimentoEspecialidades($tempoMedioAutomatico) { $medias = []; if ($tempoMedioAutomatico) { $tempoEsperaEspecialidades = []; foreach (request()->especialidades as $id) { DB::table('regulacao_solicitacao_item as item') ->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'item.solicitacao_id') ->where('item.especialidade_id', $id) ->select( DB::raw("TIMESTAMPDIFF( DAY, CONCAT(solicitacao.data, ' 00:00:00'), CONCAT(solicitacao.data_agendada, ' 00:00:00') ) AS tempo_espera") ) ->get() ->each(function ($data) use ($id, &$tempoEsperaEspecialidades) { if (isset($data->tempo_espera)) { $tempoEsperaEspecialidades[$id][] = (int) $data->tempo_espera; } }); } foreach ($tempoEsperaEspecialidades as $id => $temposEspera) { $medias[$id] = (int) ceil(collect($temposEspera)->sum() / count($temposEspera)); } } else { foreach (request()->especialidades as $id) { $tempoMedio = DB::table('cadastro_especialidade as especialidade') ->where('especialidade.id', $id) ->select('especialidade.tempo_medio_previsto_atendimento_dias') ->first()->tempo_medio_previsto_atendimento_dias ?? null; $medias[$id] = $tempoMedio; } } return $medias; } }