Files
rkm-conectasus-ci-sandbox/api/app/Services/Integracao/Ria/RelatorioEnvioService.php
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

1269 lines
77 KiB
PHP

<?php
namespace App\Services\Integracao\Ria;
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Cadastro\SujeitoAtencao\Sexo;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\Cadastro\Vacina;
use App\Models\Imunizacao\Parametrizacao;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioEnvioService extends Service
{
public static function index()
{
$totalizadores = [
'sem_inconsistencias' => 0,
'com_inconsistencias' => 0,
'total_envios' => 0,
];
$params = self::getParams();
$parametrizacao = Parametrizacao::first();
$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_rnds',
'integracao_ria_documento_imunologico_rotina.identificador_solicitante',
'integracao_ria_documento_imunologico_rotina.cns_solicitante',
'integracao_ria_documento_imunologico_rotina.identificador_documento',
'integracao_ria_documento_imunologico_rotina.identificador_composicao',
'integracao_ria_documento_imunologico_rotina.identificador_imunizacao',
'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_usuario.cns AS usuario_cns',
'cadastro_cidadao_paciente.nome AS paciente_nome',
DB::raw("DATE_FORMAT(cadastro_cidadao_paciente.data_nascimento, '%d/%m/%Y') AS paciente_data_nascimento"),
'cadastro_cidadao_paciente.cns AS paciente_cns',
DB::raw('TIMESTAMPDIFF(YEAR, cadastro_cidadao_paciente.data_nascimento, imunizacao_registro_aplicacao.data_aplicacao) AS paciente_idade'),
'cadastro_sexo_paciente.descricao AS paciente_sexo',
DB::raw("DATE_FORMAT(imunizacao_registro_aplicacao.data_aplicacao, '%d/%m/%Y') AS data"),
'cadastro_vacina.nome AS vacina_nome',
'cadastro_vacina.abreviacao AS vacina_abreviacao',
'cadastro_vacina.sigla AS vacina_sigla',
'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',
'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"),
'cidadao_atualizacao.nome as usuario_atualizacao_nome',
])
->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_sexo AS cadastro_sexo_paciente', 'cadastro_sexo_paciente.id', 'cadastro_cidadao_paciente.sexo_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')
->join('cadastro_lotacao AS lotacao_atualizacao', 'lotacao_atualizacao.id', 'imunizacao_registro_aplicacao.updated_lotacao_id')
->join('cadastro_usuario AS usuario_atualizacao', 'usuario_atualizacao.id', 'lotacao_atualizacao.usuario_id')
->join('cadastro_cidadao AS cidadao_atualizacao', 'cidadao_atualizacao.id', 'usuario_atualizacao.cidadao_id')
->leftJoin('imunizacao_grupo_atendimento', 'imunizacao_grupo_atendimento.id', 'imunizacao_registro_aplicacao.grupo_atendimento_id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_aplicacao.data_aplicacao', $params->periodo_aplicacao)
)
->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->prontuario, fn ($q, $prontuario) => $q
->where('cadastro_paciente.prontuario', $prontuario)
)
->when($params->sexo_id, fn ($q, $sexoId) => $q
->where('cadastro_cidadao_paciente.sexo_id', $sexoId)
)
->when($params->vacina_id, fn ($q, $vacinaId) => $q
->where('cadastro_vacina.id', $vacinaId)
)
->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)
)
)
->when($params->situacao_envio === 'rejeitado', fn ($q) => $q
->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')
)
)
->when($params->situacao_envio === 'corrigido_e_reenviado', fn ($q) => $q
->where(fn ($q) => $q
->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')
)
->where('integracao_ria_documento_imunologico_rotina.atualizado', true)
)
)
->when($params->situacao_envio === 'enviado', fn ($q) => $q
->where(fn ($q) => $q
->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')
)
->where('integracao_ria_documento_imunologico_rotina.atualizado', false)
)
);
$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_rnds',
'integracao_ria_documento_imunologico_rotina.identificador_solicitante',
'integracao_ria_documento_imunologico_rotina.cns_solicitante',
'integracao_ria_documento_imunologico_rotina.identificador_documento',
'integracao_ria_documento_imunologico_rotina.identificador_composicao',
'integracao_ria_documento_imunologico_rotina.identificador_imunizacao',
'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_usuario.cns AS usuario_cns',
'cadastro_cidadao_paciente.nome AS paciente_nome',
DB::raw("DATE_FORMAT(cadastro_cidadao_paciente.data_nascimento, '%d/%m/%Y') AS paciente_data_nascimento"),
'cadastro_cidadao_paciente.cns AS paciente_cns',
DB::raw('TIMESTAMPDIFF(YEAR, cadastro_cidadao_paciente.data_nascimento, imunizacao_registro_atualizacao.data_atualizacao) AS paciente_idade'),
'cadastro_sexo_paciente.descricao AS paciente_sexo',
DB::raw("DATE_FORMAT(imunizacao_registro_atualizacao.data_atualizacao, '%d/%m/%Y') AS data"),
'cadastro_vacina.nome AS vacina_nome',
'cadastro_vacina.abreviacao AS vacina_abreviacao',
'cadastro_vacina.sigla AS vacina_sigla',
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"),
'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"),
'cidadao_atualizacao.nome as usuario_atualizacao_nome',
])
->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_sexo AS cadastro_sexo_paciente', 'cadastro_sexo_paciente.id', 'cadastro_cidadao_paciente.sexo_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')
->join('cadastro_lotacao AS lotacao_atualizacao', 'lotacao_atualizacao.id', 'imunizacao_registro_atualizacao.updated_lotacao_id')
->join('cadastro_usuario AS usuario_atualizacao', 'usuario_atualizacao.id', 'lotacao_atualizacao.usuario_id')
->join('cadastro_cidadao AS cidadao_atualizacao', 'cidadao_atualizacao.id', 'usuario_atualizacao.cidadao_id')
->leftJoin('imunizacao_grupo_atendimento', 'imunizacao_grupo_atendimento.id', 'imunizacao_registro_atualizacao.grupo_atendimento_id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_atualizacao.data_atualizacao', $params->periodo_aplicacao)
)
->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->prontuario, fn ($q, $prontuario) => $q
->where('cadastro_paciente.prontuario', $prontuario)
)
->when($params->sexo_id, fn ($q, $sexoId) => $q
->where('cadastro_cidadao_paciente.sexo_id', $sexoId)
)
->when($params->vacina_id, fn ($q, $vacinaId) => $q
->where('cadastro_vacina.id', $vacinaId)
)
->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)
)
)
->when($params->situacao_envio === 'rejeitado', fn ($q) => $q
->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')
)
)
->when($params->situacao_envio === 'corrigido_e_reenviado', fn ($q) => $q
->where(fn ($q) => $q
->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')
)
->where('integracao_ria_documento_imunologico_rotina.atualizado', true)
)
)
->when($params->situacao_envio === 'enviado', fn ($q) => $q
->where(fn ($q) => $q
->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')
)
->where('integracao_ria_documento_imunologico_rotina.atualizado', false)
)
);
$resultado = $registrosAplicacao->union($registrosAtualizacao)
->get()
->map(function($query) use ($parametrizacao, &$totalizadores) {
$inconsistencias = [];
DB::table('integracao_ria_documento_imunologico_rotina_resposta')
->select(['resposta'])
->where('documento_imunologico_rotina_id', $query->documento_imunologico_rotina_id)
->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];
});
$query->inconsistencias = $inconsistencias;
$query->usuario_cns = MaskUtil::getCnsMasked($query->usuario_cns);
$query->paciente_cns = MaskUtil::getCnsMasked($query->paciente_cns);
switch($parametrizacao->parametrizacao_descricao_vacina_id ?? null) {
case ParametrizacaoDescricaoVacina::DESCRICAO:
$query->vacina = $query->vacina_nome;
break;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA:
$query->vacina = $query->vacina_abreviacao;
break;
case ParametrizacaoDescricaoVacina::SIGLA:
$query->vacina = $query->vacina_sigla;
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO:
$query->vacina = "$query->vacina_sigla - $query->vacina_nome";
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA:
$query->vacina = "$query->vacina_sigla - $query->vacina_abreviacao";
break;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO:
$query->vacina = "$query->vacina_abreviacao - $query->vacina_nome";
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO:
$query->vacina = "$query->vacina_sigla - $query->vacina_abreviacao - $query->vacina_nome";
break;
default:
$query->vacina = $query->vacina_nome;
break;
}
if (sizeof($inconsistencias) === 0) {
$totalizadores['sem_inconsistencias'] = $totalizadores['sem_inconsistencias'] + 1;
} else {
$totalizadores['com_inconsistencias'] = $totalizadores['com_inconsistencias'] + 1;
}
$totalizadores['total_envios'] = $totalizadores['total_envios'] + 1;
unset($query->vacina_nome);
unset($query->vacina_abreviacao);
unset($query->vacina_sigla);
if (!is_null($query->identificador_rnds)) {
$query->identificador_rnds = basename(parse_url($query->identificador_rnds, PHP_URL_PATH));
}
$query->situacao_envio = sizeof($inconsistencias) === 0 ? (!!$query->atualizado ? 'Corrigido e reenviado' : 'Enviado') : 'Rejeitado';
return $query;
});
return ['resultado' => $resultado, 'totalizadores' => $totalizadores];
}
public static function create()
{
return [
'form' => [
'unidades' => [],
'infraestruturas' => [],
'usuarios' => [],
'sexos' => [],
'vacinas' => [],
'status' => [],
'tipos_envio' => [],
'situacoes_envio' => [],
],
'model' => [
'periodo_envio' => ['start' => null, 'end' => null],
'periodo_aplicacao' => ['start' => null, 'end' => null],
'unidade_id' => null,
'infraestrutura_id' => null,
'usuario_id' => null,
'sexo_id' => null,
'prontuario' => null,
'vacina_id' => null,
'status' => null,
'tipo_envio' => null,
'situacao_envio' => null,
],
];
}
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),
'sexos' => self::getSexos($params),
'vacinas' => self::getVacinas($params),
'status' => self::getStatus($params),
'tipos_envio' => self::getTiposEnvio($params),
'situacoes_envio' => self::getSituacoesEnvio($params),
];
}
case 'infraestruturas': {
return [
'infraestruturas' => self::getInfraestruturas($params),
'usuarios' => self::getUsuarios($params),
'sexos' => self::getSexos($params),
'vacinas' => self::getVacinas($params),
'status' => self::getStatus($params),
'tipos_envio' => self::getTiposEnvio($params),
'situacoes_envio' => self::getSituacoesEnvio($params),
];
}
case 'usuarios': {
return [
'usuarios' => self::getUsuarios($params),
'sexos' => self::getSexos($params),
'vacinas' => self::getVacinas($params),
'status' => self::getStatus($params),
'tipos_envio' => self::getTiposEnvio($params),
'situacoes_envio' => self::getSituacoesEnvio($params),
];
}
case 'sexos': {
return [
'sexos' => self::getSexos($params),
'vacinas' => self::getVacinas($params),
'status' => self::getStatus($params),
'tipos_envio' => self::getTiposEnvio($params),
'situacoes_envio' => self::getSituacoesEnvio($params),
];
}
case 'vacinas': {
return [
'vacinas' => self::getVacinas($params),
'status' => self::getStatus($params),
'tipos_envio' => self::getTiposEnvio($params),
'situacoes_envio' => self::getSituacoesEnvio($params),
];
}
case 'status': {
return [
'status' => self::getStatus($params),
'tipos_envio' => self::getTiposEnvio($params),
'situacoes_envio' => self::getSituacoesEnvio($params),
];
}
case 'tipos_envio': {
return [
'tipos_envio' => self::getTiposEnvio($params),
'situacoes_envio' => self::getSituacoesEnvio($params),
];
}
case 'situacoes_envio': {
return [
'situacoes_envio' => self::getSituacoesEnvio($params),
];
}
}
}
private static function getParams()
{
return (object) [
'periodo_envio' => [
'start' => request()->get('periodo_envio') && request()->get('periodo_envio')['start'] ? Carbon::createFromFormat('d/m/Y', request()->get('periodo_envio')['start'])->setTime(0, 0, 0) : null,
'end' => request()->get('periodo_envio') && request()->get('periodo_envio')['end'] ? Carbon::createFromFormat('d/m/Y', request()->get('periodo_envio')['end'])->setTime(23, 59, 59) : null,
],
'periodo_aplicacao' => [
'start' => request()->get('periodo_aplicacao') && request()->get('periodo_aplicacao')['start'] ? Carbon::createFromFormat('d/m/Y', request()->get('periodo_aplicacao')['start'])->setTime(0, 0, 0) : null,
'end' => request()->get('periodo_aplicacao') && request()->get('periodo_aplicacao')['end'] ? Carbon::createFromFormat('d/m/Y', request()->get('periodo_aplicacao')['end'])->setTime(23, 59, 59) : null,
],
'unidade_id' => request()->get('unidade_id'),
'infraestrutura_id' => request()->get('infraestrutura_id'),
'usuario_id' => request()->get('usuario_id'),
'prontuario' => request()->get('prontuario'),
'sexo_id' => request()->get('sexo_id'),
'vacina_id' => request()->get('vacina_id'),
'status' => request()->get('status'),
'tipo_envio' => request()->get('tipo_envio'),
'situacao_envio' => request()->get('situacao_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')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_aplicacao.data_aplicacao', $params->periodo_aplicacao)
)
)
->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')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_atualizacao.data_atualizacao', $params->periodo_aplicacao)
)
)
)
->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')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_aplicacao.data_aplicacao', $params->periodo_aplicacao)
)
)
->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')
->whereColumn('imunizacao_sala_vacinacao.infraestrutura_id', 'cadastro_infraestrutura.id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_atualizacao.data_atualizacao', $params->periodo_aplicacao)
)
)
)
->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')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_aplicacao.data_aplicacao', $params->periodo_aplicacao)
)
->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')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_atualizacao.data_atualizacao', $params->periodo_aplicacao)
)
->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 getSexos($params)
{
return DB::table('cadastro_sexo')
->select([
'cadastro_sexo.id',
'cadastro_sexo.descricao',
])
->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')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_aplicacao.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereColumn('cadastro_cidadao.sexo_id', 'cadastro_sexo.id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_aplicacao.data_aplicacao', $params->periodo_aplicacao)
)
->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)
)
->when($params->prontuario, fn ($q, $prontuario) => $q
->where('cadastro_paciente.prontuario', $prontuario)
)
)
->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')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_atualizacao.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereColumn('cadastro_cidadao.sexo_id', 'cadastro_sexo.id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_atualizacao.data_atualizacao', $params->periodo_aplicacao)
)
->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->prontuario, fn ($q, $prontuario) => $q
->where('cadastro_paciente.prontuario', $prontuario)
)
)
)
->orderBy('cadastro_sexo.descricao')
->get();
}
private static function getVacinas($params)
{
$parametrizacao = Parametrizacao::first();
return DB::table('cadastro_vacina')
->select([
'cadastro_vacina.id',
'cadastro_vacina.nome',
'cadastro_vacina.abreviacao',
'cadastro_vacina.sigla',
])
->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')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_aplicacao.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereColumn('imunizacao_entrada_vacina.vacina_id', 'cadastro_vacina.id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_aplicacao.data_aplicacao', $params->periodo_aplicacao)
)
->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)
)
->when($params->prontuario, fn ($q, $prontuario) => $q
->where('cadastro_paciente.prontuario', $prontuario)
)
->when($params->sexo_id, fn ($q, $sexoId) => $q
->where('cadastro_cidadao.sexo_id', $sexoId)
)
)
->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')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_atualizacao.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereColumn('imunizacao_registro_atualizacao.vacina_id', 'cadastro_vacina.id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_atualizacao.data_atualizacao', $params->periodo_aplicacao)
)
->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->prontuario, fn ($q, $prontuario) => $q
->where('cadastro_paciente.prontuario', $prontuario)
)
->when($params->sexo_id, fn ($q, $sexoId) => $q
->where('cadastro_cidadao.sexo_id', $sexoId)
)
)
)
->orderBy('cadastro_vacina.nome')
->get()
->map(function($query) use ($parametrizacao) {
switch($parametrizacao->parametrizacao_descricao_vacina_id ?? null) {
case ParametrizacaoDescricaoVacina::DESCRICAO:
$query->vacina = $query->nome;
break;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA:
$query->vacina = $query->abreviacao;
break;
case ParametrizacaoDescricaoVacina::SIGLA:
$query->vacina = $query->sigla;
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO:
$query->vacina = "$query->sigla - $query->nome";
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA:
$query->vacina = "$query->sigla - $query->abreviacao";
break;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO:
$query->vacina = "$query->abreviacao - $query->nome";
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO:
$query->vacina = "$query->sigla - $query->abreviacao - $query->nome";
break;
default:
$query->vacina = $query->nome;
break;
unset($query->nome);
unset($query->abreviacao);
unset($query->sigla);
}
return $query;
});
}
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
"),
])
->where(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')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_aplicacao.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereColumn('imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_aplicacao.data_aplicacao', $params->periodo_aplicacao)
)
->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)
)
->when($params->prontuario, fn ($q, $prontuario) => $q
->where('cadastro_paciente.prontuario', $prontuario)
)
->when($params->sexo_id, fn ($q, $sexoId) => $q
->where('cadastro_cidadao.sexo_id', $sexoId)
)
->when($params->vacina_id, fn ($q, $vacinaId) => $q
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
)
)
->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')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_atualizacao.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereColumn('imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_atualizacao.data_atualizacao', $params->periodo_aplicacao)
)
->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->prontuario, fn ($q, $prontuario) => $q
->where('cadastro_paciente.prontuario', $prontuario)
)
->when($params->sexo_id, fn ($q, $sexoId) => $q
->where('cadastro_cidadao.sexo_id', $sexoId)
)
->when($params->vacina_id, fn ($q, $vacinaId) => $q
->where('imunizacao_registro_atualizacao.vacina_id', $vacinaId)
)
)
)
->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
"),
])
->where(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')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_aplicacao.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereColumn('imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_aplicacao.data_aplicacao', $params->periodo_aplicacao)
)
->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)
)
->when($params->prontuario, fn ($q, $prontuario) => $q
->where('cadastro_paciente.prontuario', $prontuario)
)
->when($params->sexo_id, fn ($q, $sexoId) => $q
->where('cadastro_cidadao.sexo_id', $sexoId)
)
->when($params->vacina_id, fn ($q, $vacinaId) => $q
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
)
)
->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')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_atualizacao.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereColumn('imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_atualizacao.data_atualizacao', $params->periodo_aplicacao)
)
->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->prontuario, fn ($q, $prontuario) => $q
->where('cadastro_paciente.prontuario', $prontuario)
)
->when($params->sexo_id, fn ($q, $sexoId) => $q
->where('cadastro_cidadao.sexo_id', $sexoId)
)
->when($params->vacina_id, fn ($q, $vacinaId) => $q
->where('imunizacao_registro_atualizacao.vacina_id', $vacinaId)
)
)
)
->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();
}
private static function getSituacoesEnvio($params)
{
return DB::table('integracao_ria_documento_imunologico_rotina')
->select([
DB::raw("
IF((
SELECT 1
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
), 'rejeitado', IF(integracao_ria_documento_imunologico_rotina.atualizado = 1, 'corrigido_e_reenviado', 'enviado')) AS value,
IF((
SELECT 1
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
), 'Rejeitado', IF(integracao_ria_documento_imunologico_rotina.atualizado = 1, 'Corrigido e reenviado', 'Enviado')) AS text
"),
])
->where(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')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_aplicacao.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereColumn('imunizacao_registro_aplicacao.id', 'integracao_ria_documento_imunologico_rotina.registro_aplicacao_id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_aplicacao.data_aplicacao', $params->periodo_aplicacao)
)
->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)
)
->when($params->prontuario, fn ($q, $prontuario) => $q
->where('cadastro_paciente.prontuario', $prontuario)
)
->when($params->sexo_id, fn ($q, $sexoId) => $q
->where('cadastro_cidadao.sexo_id', $sexoId)
)
->when($params->vacina_id, fn ($q, $vacinaId) => $q
->where('imunizacao_entrada_vacina.vacina_id', $vacinaId)
)
)
->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')
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_atualizacao.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereColumn('imunizacao_registro_atualizacao.id', 'integracao_ria_documento_imunologico_rotina.registro_atualizacao_id')
->when($params->periodo_envio['start'] && $params->periodo_envio['end'], fn ($q) => $q
->whereBetween('integracao_ria_documento_imunologico_rotina.data_hora_envio', $params->periodo_envio)
)
->when($params->periodo_aplicacao['start'] && $params->periodo_aplicacao['end'], fn ($q) => $q
->whereBetween('imunizacao_registro_atualizacao.data_atualizacao', $params->periodo_aplicacao)
)
->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->prontuario, fn ($q, $prontuario) => $q
->where('cadastro_paciente.prontuario', $prontuario)
)
->when($params->sexo_id, fn ($q, $sexoId) => $q
->where('cadastro_cidadao.sexo_id', $sexoId)
)
->when($params->vacina_id, fn ($q, $vacinaId) => $q
->where('imunizacao_registro_atualizacao.vacina_id', $vacinaId)
)
)
)
->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)
)
)
->groupBy([
DB::raw("
IF((
SELECT 1
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
), 'rejeitado', IF(integracao_ria_documento_imunologico_rotina.atualizado = 1, 'corrigido_e_reenviado', 'enviado')),
IF((
SELECT 1
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
), 'Rejeitado', IF(integracao_ria_documento_imunologico_rotina.atualizado = 1, 'Corrigido e reenviado', 'Enviado'))
")
])
->get();
}
public static function getPrintData()
{
$unidade = Unidade::find(request()->get('unidade_id'));
$infraestrutura = Infraestrutura::find(request()->get('infraestrutura_id'));
$usuario = Usuario::find(request()->get('usuario_id'));
$paciente = request()->get('prontuario') ? Paciente::where('prontuario', request()->get('prontuario'))->first() : null;
$sexo = Sexo::find(request()->get('sexo_id'));
$vacina = Vacina::find(request()->get('vacina_id'));
$status = null;
if (request()->get('status')) {
if (request()->get('status') === 'com_inconsistencia') {
$status = 'Com inconsistência';
}
else if (request()->get('status') === 'sem_inconsistencia') {
$status = 'Sem inconsistência';
}
} else {
$status = 'Todos';
}
$tipoEnvio = null;
if (request()->get('tipo_envio')) {
if (request()->get('tipo_envio') === 'inicial') {
$tipoEnvio = 'Inicial';
}
else if (request()->get('tipo_envio') === 'substituicao') {
$tipoEnvio = 'Substituição';
}
} else {
$tipoEnvio = 'Todos';
}
$situacaoEnvio = null;
if (request()->get('situacao_envio')) {
if (request()->get('situacao_envio') === 'rejeitado') {
$situacaoEnvio = 'Rejeitado';
}
else if (request()->get('situacao_envio') === 'corrigido_e_reenviado') {
$situacaoEnvio = 'Corrigido e reenviado';
}
else if (request()->get('situacao_envio') === 'enviado') {
$situacaoEnvio = 'Enviado';
}
} else {
$situacaoEnvio = 'Todas';
}
return [
'periodo_envio' => [
'inicio' => request()->periodo_envio['start'],
'fim' => request()->periodo_envio['end'],
],
'periodo_aplicacao' => [
'inicio' => request()->periodo_aplicacao['start'],
'fim' => request()->periodo_aplicacao['end'],
],
'unidade_nome_fantasia' => $unidade->nome_fantasia ?? 'Todas',
'infraestrutura_nome' => $infraestrutura->nome ?? 'Todos',
'usuario_nome' => $usuario->cidadao->nome ?? 'Todos',
'paciente_prontuario' => $paciente->prontuario ?? '-',
'sexo' => $sexo->descricao ?? 'Todos',
'vacina_nome' => $vacina->nome ?? 'Todas',
'status' => $status,
'tipo_envio' => $tipoEnvio,
'situacao_envio' => $situacaoEnvio,
'itens' => self::index(),
'colunas' => collect(request()->selected_cols),
];
}
public static function getPrintExportData()
{
return self::getPrintData();
}
}