select([ 'integracao_ria_documento_imunologico_rotina.id AS documento_imunologico_rotina_id', DB::raw("DATE_FORMAT(integracao_ria_documento_imunologico_rotina.data_hora_envio, '%d/%m/%Y às %H:%i') AS data_hora_envio"), 'integracao_ria_documento_imunologico_rotina.identificador_solicitante', 'integracao_ria_documento_imunologico_rotina.cns_solicitante', 'integracao_ria_documento_imunologico_rotina.identificador_documento', 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"), 'cadastro_cidadao_usuario.nome AS usuario_nome', 'cadastro_cidadao_paciente.nome AS paciente_nome', 'imunizacao_registro_aplicacao.data_aplicacao', DB::raw("DATE_FORMAT(imunizacao_registro_aplicacao.data_aplicacao, '%d/%m/%Y') AS data_aplicacao"), 'cadastro_vacina.nome AS vacina_nome', 'imunizacao_entrada_vacina.lote', DB::raw("DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, '%d/%m/%Y') AS data_validade_lote"), 'imunizacao_dose.nome AS dose_nome', 'imunizacao_grupo_atendimento.nome AS grupo_atendimento_nome', 'imunizacao_estrategia.nome AS estrategia_nome', 'imunizacao_produtor.nome AS produtor_nome', 'imunizacao_registro_aplicacao.gestante', 'imunizacao_registro_aplicacao.puerpera', DB::raw(" ( SELECT COUNT(*) FROM integracao_ria_documento_imunologico_rotina_resposta WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id ) AS inconsistencias "), 'integracao_ria_documento_imunologico_rotina.atualizado', DB::raw("IF(integracao_ria_documento_imunologico_rotina.atualizado = 1 OR integracao_ria_documento_imunologico_rotina.tentou_substituir = 1, 'Substituição', 'Inicial') as tipo_envio"), 'integracao_ria_documento_imunologico_rotina.identificador_rnds as identificador_rnds', ]) ->join('imunizacao_registro_aplicacao', 'imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id') ->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id') ->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'imunizacao_registro_aplicacao.aplicador_id') ->join('cadastro_cidadao AS cadastro_cidadao_usuario', 'cadastro_cidadao_usuario.id', 'cadastro_usuario.cidadao_id') ->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_aplicacao.paciente_id') ->join('cadastro_cidadao AS cadastro_cidadao_paciente', 'cadastro_cidadao_paciente.id', 'cadastro_paciente.cidadao_id') ->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_entrada_vacina.vacina_id') ->join('imunizacao_dose', 'imunizacao_dose.id', 'imunizacao_registro_aplicacao.dose_id') ->join('imunizacao_estrategia', 'imunizacao_estrategia.id', 'imunizacao_registro_aplicacao.estrategia_id') ->join('imunizacao_produtor', 'imunizacao_produtor.id', 'imunizacao_entrada_vacina.produtor_id') ->leftJoin('imunizacao_grupo_atendimento', 'imunizacao_grupo_atendimento.id', 'imunizacao_registro_aplicacao.grupo_atendimento_id') ->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo) ->when($params->unidade_id, fn ($q, $unidadeId) => $q ->where('cadastro_unidade.id', $unidadeId) ) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q ->where('cadastro_infraestrutura.id', $infraestruturaId) ) ->when($params->usuario_id, fn ($q, $usuarioId) => $q ->where('cadastro_usuario.id', $usuarioId) ) ->when($params->paciente_id, fn ($q, $pacienteId) => $q ->where('cadastro_paciente.id', $pacienteId) ) ->when($params->status, function($query) use ($params) { if ($params->status === 'com_inconsistencia') { $query->whereExists(fn ($q) => $q->select(DB::raw(1)) ->from('integracao_ria_documento_imunologico_rotina_resposta') ->whereColumn('integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id', 'integracao_ria_documento_imunologico_rotina.id') ); } else if ($params->status === 'sem_inconsistencia') { $query->whereNotExists(fn ($q) => $q->select(DB::raw(1)) ->from('integracao_ria_documento_imunologico_rotina_resposta') ->whereColumn('integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id', 'integracao_ria_documento_imunologico_rotina.id') ); } }) ->when($params->tipo_envio === 'inicial', fn ($q) => $q ->where('integracao_ria_documento_imunologico_rotina.atualizado', false) ->where('integracao_ria_documento_imunologico_rotina.tentou_substituir', false) ) ->when($params->tipo_envio === 'substituicao', fn ($q) => $q ->where(fn ($q) => $q ->where('integracao_ria_documento_imunologico_rotina.atualizado', true) ->orWhere('integracao_ria_documento_imunologico_rotina.tentou_substituir', true) ) ); $registrosAtualizacao = DB::table('integracao_ria_documento_imunologico_rotina') ->select([ 'integracao_ria_documento_imunologico_rotina.id AS documento_imunologico_rotina_id', DB::raw("DATE_FORMAT(integracao_ria_documento_imunologico_rotina.data_hora_envio, '%d/%m/%Y às %H:%i') AS data_hora_envio"), 'integracao_ria_documento_imunologico_rotina.identificador_solicitante', 'integracao_ria_documento_imunologico_rotina.cns_solicitante', 'integracao_ria_documento_imunologico_rotina.identificador_documento', 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"), 'cadastro_cidadao_usuario.nome AS usuario_nome', 'cadastro_cidadao_paciente.nome AS paciente_nome', 'imunizacao_registro_atualizacao.data_atualizacao', DB::raw("DATE_FORMAT(imunizacao_registro_atualizacao.data_atualizacao, '%d/%m/%Y') AS data_atualizacao"), 'cadastro_vacina.nome AS vacina_nome', DB::raw("NULL AS lote"), DB::raw("NULL AS data_validade_lote"), 'imunizacao_dose.nome AS dose_nome', 'imunizacao_grupo_atendimento.nome AS grupo_atendimento_nome', 'imunizacao_estrategia.nome AS estrategia_nome', DB::raw("NULL AS produtor_nome"), DB::raw("FALSE AS gestante"), DB::raw("FALSE AS puerpera"), DB::raw(" ( SELECT COUNT(*) FROM integracao_ria_documento_imunologico_rotina_resposta WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id ) AS inconsistencias "), 'integracao_ria_documento_imunologico_rotina.atualizado', DB::raw("IF(integracao_ria_documento_imunologico_rotina.atualizado = 1 OR integracao_ria_documento_imunologico_rotina.tentou_substituir = 1, 'Substituição', 'Inicial') as tipo_envio"), 'integracao_ria_documento_imunologico_rotina.identificador_rnds as identificador_rnds', ]) ->join('imunizacao_registro_atualizacao', 'imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'imunizacao_registro_atualizacao.aplicador_id') ->join('cadastro_cidadao AS cadastro_cidadao_usuario', 'cadastro_cidadao_usuario.id', 'cadastro_usuario.cidadao_id') ->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_atualizacao.paciente_id') ->join('cadastro_cidadao AS cadastro_cidadao_paciente', 'cadastro_cidadao_paciente.id', 'cadastro_paciente.cidadao_id') ->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_registro_atualizacao.vacina_id') ->join('imunizacao_dose', 'imunizacao_dose.id', 'imunizacao_registro_atualizacao.dose_id') ->join('imunizacao_estrategia', 'imunizacao_estrategia.id', 'imunizacao_registro_atualizacao.estrategia_id') ->leftJoin('imunizacao_grupo_atendimento', 'imunizacao_grupo_atendimento.id', 'imunizacao_registro_atualizacao.grupo_atendimento_id') ->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo) ->when($params->unidade_id, fn ($q, $unidadeId) => $q ->where('cadastro_unidade.id', $unidadeId) ) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q ->where('cadastro_infraestrutura.id', $infraestruturaId) ) ->when($params->usuario_id, fn ($q, $usuarioId) => $q ->where('cadastro_usuario.id', $usuarioId) ) ->when($params->paciente_id, fn ($q, $pacienteId) => $q ->where('cadastro_paciente.id', $pacienteId) ) ->when($params->status, function($query) use ($params) { if ($params->status === 'com_inconsistencia') { $query->whereExists(fn ($q) => $q->select(DB::raw(1)) ->from('integracao_ria_documento_imunologico_rotina_resposta') ->whereColumn('integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id', 'integracao_ria_documento_imunologico_rotina.id') ); } else if ($params->status === 'sem_inconsistencia') { $query->whereNotExists(fn ($q) => $q->select(DB::raw(1)) ->from('integracao_ria_documento_imunologico_rotina_resposta') ->whereColumn('integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id', 'integracao_ria_documento_imunologico_rotina.id') ); } }) ->when($params->tipo_envio === 'inicial', fn ($q) => $q ->where('integracao_ria_documento_imunologico_rotina.atualizado', false) ->where('integracao_ria_documento_imunologico_rotina.tentou_substituir', false) ) ->when($params->tipo_envio === 'substituicao', fn ($q) => $q ->where(fn ($q) => $q ->where('integracao_ria_documento_imunologico_rotina.atualizado', true) ->orWhere('integracao_ria_documento_imunologico_rotina.tentou_substituir', true) ) ); $registros = $registrosAplicacao->union($registrosAtualizacao)->get(); $registros->each(function ($registro) { if (!is_null($registro->identificador_rnds)) { $registro->identificador_rnds = basename(parse_url($registro->identificador_rnds, PHP_URL_PATH)); } }); return $registros; } public static function create() { return [ 'form' => [ 'unidades' => [], 'infraestruturas' => [], 'usuarios' => [], 'status' => [], 'tipos_envio' => [], ], 'model' => [ 'periodo' => ['start' => null, 'end' => null], 'unidade_id' => null, 'infraestrutura_id' => null, 'usuario_id' => null, 'paciente' => null, 'status' => null, 'tipo_envio' => null ], ]; } public static function send($request) { $response = null; $inconsistencias = []; try { $cliente = Cliente::where('link', app('config')->get('database.default')) ->where('sistema_id', 1) ->firstOrFail(); $documentoImunologicoRotina = DocumentoImunologicoRotina::findOrFail($request->documento_imunologico_rotina_id); if ($documentoImunologicoRotina->alterar) { $documentoImunologicoRotinaAlterado = DocumentoImunologicoRotinaService::getDocumentoAlterado($request->documento_imunologico_rotina_id); if (!is_null($documentoImunologicoRotinaAlterado)) { $parametrizacao = RiaService::getParametrizacao(); $token = RiaService::getToken($parametrizacao->senha); $headers = [ 'Authorization' => $parametrizacao->cns_solicitante, 'Content-Type' => 'application/json', 'X-Authorization-Server' => "Bearer " . $token['access_token'], ]; $documentoImunologicoRotinaAlterado->identificador_solicitante = $parametrizacao->identificador_solicitante; $documentoImunologicoRotinaAlterado->cns_solicitante = $parametrizacao->cns_solicitante; $documentoImunologicoRotinaAlterado->data_hora_envio = Carbon::now(); $response = RiaService::sendDocumentoImunologicoRotina($headers, $documentoImunologicoRotinaAlterado, $cliente->municipio->estado->uf); if ($response->status() === 201) { $documentoImunologicoRotinaAlterado->identificador_rnds = $response->header('Location') ? $response->header('Location') : null; $documentoImunologicoRotinaAlterado->response = $response->json(); $documentoImunologicoRotinaAlterado->alterar = false; $documentoImunologicoRotinaAlterado->atualizado = true; DocumentoImunologicoRotinaService::update($documentoImunologicoRotinaAlterado->documento_imunologico_rotina_id, $documentoImunologicoRotinaAlterado); } else { DocumentoImunologicoRotina::where('id', $documentoImunologicoRotinaAlterado->documento_imunologico_rotina_id)->update([ 'tentou_substituir' => true, ]); DocumentoImunologicoRotinaService::updateInconsistencias($documentoImunologicoRotinaAlterado->documento_imunologico_rotina_id, $response->json()); } Log::channel('integracao-ria')->info('Comando executado com sucesso.', [ 'cliente' => $cliente->link, 'origem' => 'GerenciamentoEnvioService' ]); } } else { $documentoImunologicoRotinaComInconsistencia = DocumentoImunologicoRotinaService::getDocumentoComInconsistencia($request->documento_imunologico_rotina_id); if (!is_null($documentoImunologicoRotinaComInconsistencia)) { $parametrizacao = RiaService::getParametrizacao(); $token = RiaService::getToken($parametrizacao->senha); $headers = [ 'Authorization' => $parametrizacao->cns_solicitante, 'Content-Type' => 'application/json', 'X-Authorization-Server' => "Bearer " . $token['access_token'], ]; $documentoImunologicoRotinaComInconsistencia->identificador_solicitante = $parametrizacao->identificador_solicitante; $documentoImunologicoRotinaComInconsistencia->cns_solicitante = $parametrizacao->cns_solicitante; $documentoImunologicoRotinaComInconsistencia->data_hora_envio = Carbon::now(); $response = RiaService::sendDocumentoImunologicoRotina($headers, $documentoImunologicoRotinaComInconsistencia, $cliente->municipio->estado->uf); $documentoImunologicoRotinaComInconsistencia->identificador_rnds = $response->header('Location') ? $response->header('Location') : null; $documentoImunologicoRotinaComInconsistencia->response = $response->json(); DocumentoImunologicoRotinaService::update($documentoImunologicoRotinaComInconsistencia->documento_imunologico_rotina_id, $documentoImunologicoRotinaComInconsistencia); Log::channel('integracao-ria')->info('Comando executado com sucesso.', [ 'cliente' => $cliente->link, 'origem' => 'GerenciamentoEnvioService' ]); } } } catch (Exception $error) { Log::channel('integracao-ria')->error('Erro ao executar o comando', [ 'origem' => 'GerenciamentoEnvioService', 'erro' => $error->getMessage(), ]); throw new EnvioException(); } if ($response) { $response = $response->json(); if (isset($response->issue)) { foreach ($response->issue as $issue) { $inconsistencias[] = ['resposta' => $issue->diagnostics]; } } } return $inconsistencias; } public static function list() { $params = self::getParams(); switch (request()->listar) { case 'unidades': { return [ 'unidades' => self::getUnidades($params), 'infraestruturas' => self::getInfraestruturas($params), 'usuarios' => self::getUsuarios($params), 'status' => self::getStatus($params), 'tipos_envio' => self::getTiposEnvio($params), ]; } case 'infraestruturas': { return [ 'infraestruturas' => self::getInfraestruturas($params), 'usuarios' => self::getUsuarios($params), 'status' => self::getStatus($params), 'tipos_envio' => self::getTiposEnvio($params), ]; } case 'usuarios': { return [ 'usuarios' => self::getUsuarios($params), 'status' => self::getStatus($params), 'tipos_envio' => self::getTiposEnvio($params), ]; } case 'status': { return [ 'status' => self::getStatus($params), 'tipos_envio' => self::getTiposEnvio($params), ]; } case 'tipos_envio': { return [ 'tipos_envio' => self::getTiposEnvio($params), ]; } } } public static function getInconsistencias($documentoImunologicoRotinaId) { return DB::table('integracao_ria_documento_imunologico_rotina_resposta') ->select(['resposta']) ->where('documento_imunologico_rotina_id', $documentoImunologicoRotinaId) ->get() ->each(function($documentoImunologicoRotinaResposta) use (&$inconsistencias) { $resposta = null; if (preg_match("/\(([^)]+)\)\s(.+)/", $documentoImunologicoRotinaResposta->resposta, $matches)) { $resposta = DB::table('integracao_ria_resposta') ->select(['descricao']) ->where('codigo', str_replace('EHR-', '', $matches[1])) ->first()->descricao ?? $documentoImunologicoRotinaResposta->resposta; } else { $resposta = $documentoImunologicoRotinaResposta->resposta; } $inconsistencias[] = ['resposta' => $resposta]; }); } private static function getParams() { return (object) [ 'periodo' => [ 'start' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['start'])->setTime(0, 0, 0), 'end' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['end'])->setTime(23, 59, 59) ], 'unidade_id' => request()->get('unidade_id'), 'infraestrutura_id' => request()->get('infraestrutura_id'), 'usuario_id' => request()->get('usuario_id'), 'paciente_id' => request()->get('paciente_id'), 'status' => request()->get('status'), 'tipo_envio' => request()->get('tipo_envio'), ]; } private static function getUnidades($params) { return DB::table('cadastro_unidade') ->select([ 'cadastro_unidade.id', 'cadastro_unidade.nome_fantasia', ]) ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('integracao_ria_documento_imunologico_rotina') ->join('imunizacao_registro_aplicacao', 'imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id') ->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id') ->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id') ->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo) ) ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('integracao_ria_documento_imunologico_rotina') ->join('imunizacao_registro_atualizacao', 'imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id') ->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo) ) ) ->orderBy('cadastro_unidade.nome_fantasia') ->get(); } private static function getInfraestruturas($params) { return DB::table('cadastro_infraestrutura') ->select([ 'cadastro_infraestrutura.id', DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS nome"), ]) ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->where('cadastro_infraestrutura.unidade_id', $params->unidade_id) ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('integracao_ria_documento_imunologico_rotina') ->join('imunizacao_registro_aplicacao', 'imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id') ->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id') ->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id') ->whereColumn('imunizacao_sala_vacinacao.infraestrutura_id', 'cadastro_infraestrutura.id') ->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo) ) ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('integracao_ria_documento_imunologico_rotina') ->join('imunizacao_registro_atualizacao', 'imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->whereColumn('imunizacao_sala_vacinacao.infraestrutura_id', 'cadastro_infraestrutura.id') ->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo) ) ) ->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)') ->get(); } private static function getUsuarios($params) { return DB::table('cadastro_usuario') ->select([ 'cadastro_usuario.id', 'cadastro_cidadao.nome', ]) ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('integracao_ria_documento_imunologico_rotina') ->join('imunizacao_registro_aplicacao', 'imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id') ->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id') ->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->whereColumn('imunizacao_registro_aplicacao.aplicador_id', 'cadastro_usuario.id') ->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo) ->when($params->unidade_id, fn ($q, $unidadeId) => $q ->where('cadastro_infraestrutura.unidade_id', $unidadeId) ) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q ->where('cadastro_infraestrutura.id', $infraestruturaId) ) ) ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('integracao_ria_documento_imunologico_rotina') ->join('imunizacao_registro_atualizacao', 'imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->whereColumn('imunizacao_registro_atualizacao.aplicador_id', 'cadastro_usuario.id') ->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo) ->when($params->unidade_id, fn ($q, $unidadeId) => $q ->where('cadastro_infraestrutura.unidade_id', $unidadeId) ) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q ->where('cadastro_infraestrutura.id', $infraestruturaId) ) ) ) ->orderBy('cadastro_cidadao.nome') ->get(); } private static function getStatus($params) { return DB::table('integracao_ria_documento_imunologico_rotina') ->select([ DB::raw(" COALESCE(( SELECT 'com_inconsistencia' FROM integracao_ria_documento_imunologico_rotina_resposta WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id LIMIT 1 ), 'sem_inconsistencia') AS value, COALESCE(( SELECT 'Com inconsistência' FROM integracao_ria_documento_imunologico_rotina_resposta WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id LIMIT 1 ), 'Sem inconsistência') AS text "), ]) ->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo) ->whereExists(fn ($q) => $q ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('imunizacao_registro_aplicacao') ->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id') ->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->whereColumn('imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id') ->when($params->unidade_id, fn ($q, $unidadeId) => $q ->where('cadastro_infraestrutura.unidade_id', $unidadeId) ) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q ->where('cadastro_infraestrutura.id', $infraestruturaId) ) ->when($params->usuario_id, fn ($q, $usuarioId) => $q ->where('imunizacao_registro_aplicacao.aplicador_id', $usuarioId) ) ) ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('imunizacao_registro_atualizacao') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->whereColumn('imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id') ->when($params->unidade_id, fn ($q, $unidadeId) => $q ->where('cadastro_infraestrutura.unidade_id', $unidadeId) ) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q ->where('cadastro_infraestrutura.id', $infraestruturaId) ) ->when($params->usuario_id, fn ($q, $usuarioId) => $q ->where('imunizacao_registro_atualizacao.aplicador_id', $usuarioId) ) ) ) ->groupBy([ DB::raw(" COALESCE(( SELECT 'com_inconsistencia' FROM integracao_ria_documento_imunologico_rotina_resposta WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id LIMIT 1 ), 'sem_inconsistencia'), COALESCE(( SELECT 'Com inconsistência' FROM integracao_ria_documento_imunologico_rotina_resposta WHERE integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id = integracao_ria_documento_imunologico_rotina.id LIMIT 1 ), 'Sem inconsistência') ") ]) ->get(); } private static function getTiposEnvio($params) { return DB::table('integracao_ria_documento_imunologico_rotina') ->select([ DB::raw(" ( CASE WHEN integracao_ria_documento_imunologico_rotina.atualizado = 0 AND integracao_ria_documento_imunologico_rotina.tentou_substituir = 0 THEN 'inicial' WHEN integracao_ria_documento_imunologico_rotina.atualizado = 1 OR integracao_ria_documento_imunologico_rotina.tentou_substituir = 1 THEN 'substituicao' END ) AS value, ( CASE WHEN integracao_ria_documento_imunologico_rotina.atualizado = 0 AND integracao_ria_documento_imunologico_rotina.tentou_substituir = 0 THEN 'Inicial' WHEN integracao_ria_documento_imunologico_rotina.atualizado = 1 OR integracao_ria_documento_imunologico_rotina.tentou_substituir = 1 THEN 'Substituição' END ) AS text "), ]) ->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo) ->whereExists(fn ($q) => $q ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('imunizacao_registro_aplicacao') ->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_registro_aplicacao.entrada_vacina_id') ->join('imunizacao_entrada', 'imunizacao_entrada.id', 'imunizacao_entrada_vacina.entrada_id') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_entrada.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->whereColumn('imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id') ->when($params->unidade_id, fn ($q, $unidadeId) => $q ->where('cadastro_infraestrutura.unidade_id', $unidadeId) ) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q ->where('cadastro_infraestrutura.id', $infraestruturaId) ) ->when($params->usuario_id, fn ($q, $usuarioId) => $q ->where('imunizacao_registro_aplicacao.aplicador_id', $usuarioId) ) ) ->orWhereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('imunizacao_registro_atualizacao') ->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_registro_atualizacao.sala_vacinacao_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id') ->whereColumn('imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id') ->when($params->unidade_id, fn ($q, $unidadeId) => $q ->where('cadastro_infraestrutura.unidade_id', $unidadeId) ) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q ->where('cadastro_infraestrutura.id', $infraestruturaId) ) ->when($params->usuario_id, fn ($q, $usuarioId) => $q ->where('imunizacao_registro_atualizacao.aplicador_id', $usuarioId) ) ) ) ->when($params->status, function($query) use ($params) { if ($params->status === 'com_inconsistencia') { $query->whereExists(fn ($q) => $q->select(DB::raw(1)) ->from('integracao_ria_documento_imunologico_rotina_resposta') ->whereColumn('integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id', 'integracao_ria_documento_imunologico_rotina.id') ); } else if ($params->status === 'sem_inconsistencia') { $query->whereNotExists(fn ($q) => $q->select(DB::raw(1)) ->from('integracao_ria_documento_imunologico_rotina_resposta') ->whereColumn('integracao_ria_documento_imunologico_rotina_resposta.documento_imunologico_rotina_id', 'integracao_ria_documento_imunologico_rotina.id') ); } }) ->groupBy([ DB::raw(" ( CASE WHEN integracao_ria_documento_imunologico_rotina.atualizado = 0 AND integracao_ria_documento_imunologico_rotina.tentou_substituir = 0 THEN 'inicial' WHEN integracao_ria_documento_imunologico_rotina.atualizado = 1 OR integracao_ria_documento_imunologico_rotina.tentou_substituir = 1 THEN 'substituicao' END ), ( CASE WHEN integracao_ria_documento_imunologico_rotina.atualizado = 0 AND integracao_ria_documento_imunologico_rotina.tentou_substituir = 0 THEN 'Inicial' WHEN integracao_ria_documento_imunologico_rotina.atualizado = 1 OR integracao_ria_documento_imunologico_rotina.tentou_substituir = 1 THEN 'Substituição' END ) ") ]) ->get(); } }