documento_id) ? Documento::create([ 'regulacao_solicitacao_item_id' => $params->solicitacao_item_id, 'identificador' => $params->identificador_documento, ]) : Documento::findOrFail($params->documento_id); $paramsEnvio = [ 'url_rnds' => $params->url_rnds, 'identificador_rnds' => $params->identificador_rnds, 'regulacao_status_enviado_id' => $params->status_id, 'identificador_solicitante' => $params->identificador_solicitante, 'cns_solicitante' => $params->cns_solicitante, 'data_hora_envio' => $params->data_hora_envio, 'request' => is_null($params->identificador_rnds) ? json_encode($params->request) : null, 'response' => is_null($params->response) ? null : json_encode($params->response), ]; $ultimoEnvio = $documento->envios()->orderByDesc('created_at')->first(); if (!is_null($ultimoEnvio) && is_null($ultimoEnvio->identificador_rnds)) { $ultimoEnvio->update($paramsEnvio); } else { $documento->envios()->create($paramsEnvio); } }); } public static function getSolicitacoes() { return DB::query() ->fromSub(DB::table('regulacao_solicitacao_item as solicitacao_item') ->join('parametrizacao_exame as exame', 'exame.id', 'solicitacao_item.exame_id') ->selectRaw(" solicitacao_item.id, solicitacao_item.solicitacao_id, exame.codigo as codigo_procedimento, COALESCE( ( SELECT ocupacao.codigo FROM sigtap.ocupacao as ocupacao JOIN exame_laboratorial_agendamento_exame as agendamento_exame ON agendamento_exame.ocupacao_id = ocupacao.id JOIN exame_laboratorial_agendamento as agendamento ON agendamento.id = agendamento_exame.agendamento_id WHERE agendamento_exame.exame_id = solicitacao_item.exame_id AND agendamento.regulacao_solicitacao_id = solicitacao_item.solicitacao_id ), ( SELECT ocupacao.codigo FROM sigtap.ocupacao as ocupacao JOIN exame_imagem_fechamento_faturamento as fechamento_faturamento ON fechamento_faturamento.ocupacao_id = ocupacao.id JOIN exame_imagem_agendamento_exame as agendamento_exame ON agendamento_exame.id = fechamento_faturamento.agendamento_exame_id JOIN exame_imagem_agendamento as agendamento ON agendamento.id = agendamento_exame.agendamento_id WHERE agendamento_exame.exame_id = solicitacao_item.exame_id AND agendamento.regulacao_solicitacao_id = solicitacao_item.solicitacao_id ) ) as cbo_prestador ") ->unionAll(DB::table('regulacao_solicitacao_item as solicitacao_item') ->join( 'parametrizacao_procedimento_cirurgico as procedimento_cirurgico', 'procedimento_cirurgico.id', 'solicitacao_item.procedimento_cirurgico_id' ) ->selectRaw(" solicitacao_item.id, solicitacao_item.solicitacao_id, procedimento_cirurgico.procedimento_codigo as codigo_procedimento, NULL as cbo_prestador ") ) ->unionAll(DB::table('regulacao_solicitacao_item as solicitacao_item') ->join('cadastro_especialidade as especialidade', 'especialidade.id', 'solicitacao_item.especialidade_id') ->join('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'especialidade.ocupacao_id') ->selectRaw(" solicitacao_item.id, solicitacao_item.solicitacao_id, '0301010072' as codigo_procedimento, -- TODO: Alterar para o código de procedimento da especialidade ocupacao.codigo as cbo_prestador ") ) , 'solicitacao_item') ->join('regulacao_solicitacao as solicitacao', 'solicitacao.id', 'solicitacao_item.solicitacao_id') ->join('regulacao_status as status', 'status.id', 'solicitacao.status_id') ->join('cadastro_paciente as paciente', 'paciente.id', 'solicitacao.paciente_id') ->join('cadastro_cidadao as paciente_cidadao', 'paciente_cidadao.id', 'paciente.cidadao_id') ->join('sigtap.cid as cid', 'cid.id', 'solicitacao.cid_id') ->join( 'cadastro_infraestrutura as infraestrutura_solicitante', 'infraestrutura_solicitante.id', 'solicitacao.infraestrutura_solicitante_id' ) ->join( 'cadastro_unidade as unidade_solicitante', 'unidade_solicitante.id', 'infraestrutura_solicitante.unidade_id' ) ->leftJoin( 'regulacao_parametrizacao_regulador as regulador', 'regulador.id', 'solicitacao.regulador_id' ) ->join( 'cadastro_infraestrutura as infraestrutura_regulador', 'infraestrutura_regulador.id', 'regulador.infraestrutura_id' ) ->join( 'cadastro_unidade as unidade_regulador', 'unidade_regulador.id', 'infraestrutura_regulador.unidade_id' ) ->leftJoin( 'integracao_rira_documento as rira_documento', 'rira_documento.regulacao_solicitacao_item_id', 'solicitacao_item.id' ) ->leftJoin('integracao_rira_documento_envio as rira_documento_envio', fn ($j) => $j ->on('rira_documento_envio.documento_id', 'rira_documento.id') ->where('rira_documento_envio.id', '=', fn ($q) => $q ->select('id') ->from('integracao_rira_documento_envio') ->whereColumn('documento_id', 'rira_documento.id') ->whereNotNull('identificador_rnds') ->orderByDesc('created_at') ->limit(1) ) ) ->leftJoin( 'regulacao_parametrizacao_prestador_interno as prestador_interno', 'prestador_interno.id', 'solicitacao.prestador_interno_id' ) ->leftJoin( 'cadastro_infraestrutura as prestador_interno_infraestrutura', 'prestador_interno_infraestrutura.id', 'prestador_interno.infraestrutura_id' ) ->leftJoin( 'cadastro_unidade as prestador_interno_unidade', 'prestador_interno_unidade.id', 'prestador_interno_infraestrutura.unidade_id' ) ->leftJoin( 'regulacao_parametrizacao_prestador_externo as prestador_externo', 'prestador_externo.id', 'solicitacao.prestador_externo_id' ) ->leftJoin( 'transporte_paciente_destino as prestador_externo_destino', 'prestador_externo_destino.id', 'prestador_externo.destino_id' ) ->where('solicitacao.created_at', '>=', '2024-10-01 00:00:00') ->where(fn ($q) => $q ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('integracao_rira_documento as rira_documento') ->whereColumn('rira_documento.regulacao_solicitacao_item_id', 'solicitacao_item.id') ) ->orWhereExists(fn ($q) => $q ->selectRaw(1) ->from('integracao_rira_documento_envio as rira_documento_envio') ->join( 'integracao_rira_documento as rira_documento', 'rira_documento.id', 'rira_documento_envio.documento_id' ) ->whereColumn('rira_documento.regulacao_solicitacao_item_id', 'solicitacao_item.id') ->whereNull('rira_documento_envio.identificador_rnds') ) ->orWhere('solicitacao.status_id', '<>', fn ($q) => $q ->selectRaw("rira_documento_envio.regulacao_status_enviado_id") ->from('integracao_rira_documento_envio as rira_documento_envio') ->join( 'integracao_rira_documento as rira_documento', 'rira_documento.id', 'rira_documento_envio.documento_id' ) ->whereColumn('rira_documento.regulacao_solicitacao_item_id', 'solicitacao_item.id') ->orderByDesc('rira_documento_envio.created_at') ->limit(1) ) ) ->selectRaw(" rira_documento.id as documento_id, rira_documento.identificador as identificador_documento, rira_documento_envio.identificador_rnds as ultimo_identificador_rnds, solicitacao_item.id as solicitacao_item_id, solicitacao_item.codigo_procedimento, solicitacao_item.cbo_prestador, solicitacao.data, solicitacao.data_agendada, solicitacao.hora_agendada, solicitacao.prioridade_id, solicitacao.hipotese_diagnostica_justificativa, status.id as status_id, status.tipo_id as status_tipo_id, paciente_cidadao.cns as paciente_cns, paciente_cidadao.cpf as paciente_cpf, cid.codigo as cid_codigo, unidade_solicitante.cnes as cnes_solicitante, unidade_regulador.cnes as cnes_regulador, COALESCE(prestador_interno_unidade.cnes, NULL /* prestador_externo_destino.cnes */) as cnes_prestador ") ->orderBy('solicitacao.updated_at') ->get() ->map(function ($solicitacao) { $solicitacao->has_agendamento = !is_null($solicitacao->data_agendada) && !is_null($solicitacao->hora_agendada); return (object) [ 'documento_id' => $solicitacao->documento_id, 'identificador_documento' => $solicitacao->identificador_documento ?? uniqid(), 'ultimo_identificador_rnds' => $solicitacao->ultimo_identificador_rnds, 'solicitacao_item_id' => $solicitacao->solicitacao_item_id, 'paciente_cns' => $solicitacao->paciente_cns, 'paciente_cpf' => $solicitacao->paciente_cpf, 'codigo_procedimento' => $solicitacao->codigo_procedimento, 'cid_codigo' => $solicitacao->cid_codigo, 'prioridade' => self::getPrioridade($solicitacao->prioridade_id), 'data_solicitacao' => new Carbon($solicitacao->data), 'data_hora_agendada' => $solicitacao->has_agendamento ? new Carbon("{$solicitacao->data_agendada} {$solicitacao->hora_agendada}") : null, 'data_execucao' => null, 'status_id' => $solicitacao->status_id, 'status_composicao' => self::getStatusComposicao($solicitacao->status_tipo_id), 'status_consulta' => self::getStatusConsulta($solicitacao->status_tipo_id), 'status_paciente_consulta' => self::getStatusPacienteConsulta(), 'status_requisicao' => self::getStatusRequisicao(), 'status_condicao' => self::getStatusCondicao(), 'cnes_solicitante' => $solicitacao->cnes_solicitante, 'cnes_prestador' => $solicitacao->cnes_prestador, 'cnes_regulador' => $solicitacao->cnes_regulador, 'cnes_responsavel_status_composicao' => self::getCnesResponsavelStatusComposicao($solicitacao), 'cbo_prestador' => $solicitacao->cbo_prestador, 'hipotese_diagnostica_justificativa' => $solicitacao->hipotese_diagnostica_justificativa, 'intencao_requisicao' => self::getIntencaoRequisicao($solicitacao->status_tipo_id), 'categoria_condicao' => self::getCategoriaCondicao(), ]; }); } private static function getPrioridade($prioridadeId) { switch ($prioridadeId) { case SolicitacaoPrioridade::ELETIVO: { return 'routine'; } case SolicitacaoPrioridade::URGENCIA: { return 'urgent'; } } } private static function getStatusComposicao($statusTipoId) { switch ($statusTipoId) { case StatusTipo::SOLICITADO: { return 'pending'; } case StatusTipo::DEVOLVIDO: { return 'returned-to-requester'; } case StatusTipo::REENVIADA: { return 'pending'; } case StatusTipo::CANCELADO: { return 'cancelled'; } case StatusTipo::EM_ESPERA: { return 'pending'; } case StatusTipo::AGENDADO: { return 'booked'; } case StatusTipo::REAGENDADO: { return 'booked'; } case StatusTipo::FALTA: { return 'absence'; } case StatusTipo::REALIZADO: { return 'attended'; } case StatusTipo::REMARCAR: { return 'pending'; } } } private static function getStatusConsulta($statusTipoId) { switch ($statusTipoId) { case StatusTipo::SOLICITADO: { return 'proposed'; } case StatusTipo::DEVOLVIDO: { return 'proposed'; } case StatusTipo::REENVIADA: { return 'proposed'; } case StatusTipo::CANCELADO: { return 'cancelled'; } case StatusTipo::EM_ESPERA: { return 'waitlist'; } case StatusTipo::AGENDADO: { return 'booked'; } case StatusTipo::REAGENDADO: { return 'booked'; } case StatusTipo::FALTA: { return 'noshow'; } case StatusTipo::REALIZADO: { return 'fulfilled'; } case StatusTipo::REMARCAR: { return 'proposed'; } } } private static function getStatusPacienteConsulta() { return 'accepted'; } private static function getStatusRequisicao() { return 'active'; } private static function getStatusCondicao() { return 'active'; } private static function getCnesResponsavelStatusComposicao($solicitacao) { switch ($solicitacao->status_tipo_id) { case StatusTipo::SOLICITADO: { return $solicitacao->cnes_solicitante; } case StatusTipo::DEVOLVIDO: { return $solicitacao->cnes_regulador; } case StatusTipo::REENVIADA: { return $solicitacao->cnes_solicitante; } case StatusTipo::CANCELADO: { return $solicitacao->has_agendamento ? $solicitacao->cnes_prestador : $solicitacao->cnes_regulador; } case StatusTipo::EM_ESPERA: { return $solicitacao->cnes_solicitante; } case StatusTipo::AGENDADO: { return $solicitacao->cnes_prestador; } case StatusTipo::REAGENDADO: { return $solicitacao->cnes_prestador; } case StatusTipo::FALTA: { return $solicitacao->cnes_prestador; } case StatusTipo::REALIZADO: { return $solicitacao->cnes_prestador; } case StatusTipo::REMARCAR: { return $solicitacao->cnes_solicitante; } } } private static function getCategoriaCondicao() { return (object) [ 'codigo' => '01', 'exibicao' => 'Principal' ]; } private static function getIntencaoRequisicao($statusTipoId) { switch ($statusTipoId) { case StatusTipo::SOLICITADO: { return 'proposal'; } case StatusTipo::DEVOLVIDO: { return 'proposal'; } case StatusTipo::REENVIADA: { return 'proposal'; } case StatusTipo::CANCELADO: { return 'order'; } case StatusTipo::EM_ESPERA: { return 'proposal'; } case StatusTipo::AGENDADO: { return 'order'; } case StatusTipo::REAGENDADO: { return 'order'; } case StatusTipo::FALTA: { return 'order'; } case StatusTipo::REALIZADO: { return 'order'; } case StatusTipo::REMARCAR: { return 'proposal'; } } } }