Files
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

444 lines
19 KiB
PHP

<?php
namespace App\Services\Integracao\Rira;
use App\Enums\Regulacao\SolicitacaoPrioridade;
use App\Enums\Regulacao\StatusTipo;
use App\Models\Integracao\Rira\Documento;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class DocumentoService
{
public static function save($params)
{
DB::transaction(function () use ($params) {
$documento = is_null($params->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';
}
}
}
}