init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,699 @@
<?php
namespace App\Services\Integracao\Ria;
use App\Exceptions\Integracao\Ria\EnvioException;
use App\Models\Integracao\Ria\DocumentoImunologicoRotina;
use App\Models\Intranet\Cliente;
use App\Services\Integracao\RiaService;
use App\Services\Service;
use Carbon\Carbon;
use Exception;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class GerenciamentoEnvioService extends Service
{
public static function index()
{
$params = self::getParams();
$registrosAplicacao = 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_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();
}
}