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,816 @@
<?php
namespace App\Services\Imunizacao;
use App\Enums\Imunizacao\ParametrizacaoDescricaoVacina;
use App\Enums\Imunizacao\PreferenciaCampanha;
use App\Enums\Imunizacao\TipoRegistro;
use App\Models\AtencaoBasica\Parametrizacao\Equipe;
use App\Models\Imunizacao\RegistroAplicacao;
use App\Models\Imunizacao\RegistroAtualizacao;
use App\Models\Imunizacao\SalaVacinacao;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Http\Response;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
class RelatorioDeAplicacaoService extends Service
{
public static function index() {
$salaVacinacao = DB::table('imunizacao_sala_vacinacao')
->select([
'imunizacao_sala_vacinacao.id',
'cadastro_infraestrutura.unidade_id',
'imunizacao_sala_vacinacao.responsavel',
])
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->where('imunizacao_sala_vacinacao.ativo', true)
->where('cadastro_infraestrutura.id', auth()->payload()->get('infraestrutura_id'))
->first();
$dataAtual = Carbon::today()->format('d/m/Y');
return [
"sala_vacinacao" => $salaVacinacao,
"data_atual" => $dataAtual
];
}
public static function search() {
$params = request()->all();
$existeFaixaEtariaInicial = false;
$existeFaixaEtariaFinal = false;
$preferenciaCampanha = $params['campanha'];
$tipoRegistro = $params['tipo_registro'];
$totalizadores = [
"aplicacao" => 0,
"atualizacao" => 0,
];
$registrosAplicacao = [];
$registrosAtualizacao = [];
$registrosCampanha = [];
$registros = [];
$parametrizacaoVacina = DB::table('imunizacao_parametrizacao')
->select('parametrizacao_descricao_vacina_id')
->first();
$rowVacina = self::formataDescricaoVacina($parametrizacaoVacina->parametrizacao_descricao_vacina_id, 'cadastro_vacina', 'vacina');
$queryAplicacao = self::getQuerySearchAplicacao($rowVacina, $params);
$queryCampanha = self::getQuerySearchCampanha($rowVacina, $params);
$queryAtualizacao = self::getQuerySearchAtualizacao($rowVacina, $params);
if($preferenciaCampanha != PreferenciaCampanha::NAO_INCLUIR) {
$registrosCampanha = $queryCampanha->get();
}
if($preferenciaCampanha != PreferenciaCampanha::MOSTRAR_EXCLUSIVAMENTE){
if($tipoRegistro != TipoRegistro::ATUALIZACAO) {
$registrosAplicacao = $queryAplicacao->get();
}
if($tipoRegistro != TipoRegistro::APLICACAO) {
$registrosAtualizacao = $queryAtualizacao->get();
}
}
$registros = [...$registrosCampanha, ...$registrosAplicacao, ...$registrosAtualizacao];
if($registros instanceof Collection && $registros->isEmpty()){
return [];
}
foreach ($params['faixa_etaria'] as $key => $faixas) {
foreach ($faixas as $_ => $faixa) {
if(isset($faixa)){
if($key == 'inicial'){
$existeFaixaEtariaInicial = true;
}
if($key == 'final'){
$existeFaixaEtariaFinal = true;
}
}
}
}
foreach ($registros as $key => $registro) {
$data = Carbon::createFromFormat('d/m/Y', $registro->data);
$idade = Carbon::createFromFormat('d/m/Y', $registro->idade);
$idadeEpoca = $data->diff($idade);
$registro->idade = "{$idadeEpoca->y}a {$idadeEpoca->m}m {$idadeEpoca->d}d";
if($existeFaixaEtariaInicial) {
$excluirFaixaInicial = self::vefificaFaixaInicial($params, $idadeEpoca);
if($excluirFaixaInicial){
unset($registros[$key]);
continue;
}
}
if($existeFaixaEtariaFinal) {
$excluirFaixaFinal = self::verificaFaixaFinal($params, $idadeEpoca);
if($excluirFaixaFinal){
unset($registros[$key]);
continue;
}
}
}
foreach ($registros as $registro) {
if($registro->registro === "Aplicação"){
$totalizadores['aplicacao']++;
}
if($registro->registro === "Atualização"){
$totalizadores['atualizacao']++;
}
$totalizadores['paciente'][$registro->paciente_id] = $registro->paciente_id;
$totalizadores['unidade'][$registro->unidade_id] = $registro->unidade_id;
$totalizadores['sala'][$registro->sala_id] = $registro->sala_id;
$totalizadores['vacina'][$registro->vacina] = $registro->vacina;
}
$totalizadores['paciente'] = isset($totalizadores['paciente']) ? count($totalizadores['paciente']) : 0;
$totalizadores['unidade'] = isset($totalizadores['unidade']) ? count($totalizadores['unidade']) : 0;
$totalizadores['sala'] = isset($totalizadores['sala']) ? count($totalizadores['sala']) : 0;
$totalizadores['vacina'] = isset($totalizadores['vacina']) ? count($totalizadores['vacina']) : 0;
return([
"registros" =>[...$registros],
"totalizadores" => $totalizadores
]);
}
private static function getQuerySearchCampanha($rowVacina, $params) {
$periodo = $params['periodo'];
$salaVacinacao = $params['sala_vacinacao'];
$vacina = $params['vacina'];
$dose = $params['dose'];
$sexo = $params['sexo'];
$unidade = $params['unidade'];
$area = $params['area'];
$microarea = $params['microarea'];
$classificacao = $params['classificacao'];
$prontuario = $params['prontuario'];
return DB::table('imunizacao_registro_aplicacao')
->whereNotNull('imunizacao_registro_aplicacao.saida_vacina_id')
->whereNotNull('imunizacao_registro_aplicacao.campanha_id')
->whereBetween('imunizacao_registro_aplicacao.data_aplicacao', [
Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(),
Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(),
])
->where(fn($q) => isset($salaVacinacao) ? $q->where('imunizacao_sala_vacinacao.id', $salaVacinacao) : $q)
->where(fn($q) => isset($vacina) ? $q->where('cadastro_vacina.id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('imunizacao_dose.id', $dose) : $q)
->where(fn($q) => isset($sexo) ? $q->where('cadastro_sexo.id', $sexo) : $q)
->where(fn($q) => isset($unidade) ? $q->where('cadastro_unidade.id', $unidade) : $q)
->where(fn($q) => isset($area) ? $q->where('atencao_basica_parametrizacao_area.descricao', $area) : $q)
->where(fn($q) => isset($microarea) ? $q->where('atencao_basica_parametrizacao_microarea.descricao', $microarea) : $q)
->where(fn($q) => isset($classificacao) ? $q->where('cadastro_paciente_classificacao.id', $classificacao) : $q)
->where(fn($q) => isset($prontuario) ? $q->where('cadastro_paciente.prontuario', $prontuario) : $q)
->select(
'imunizacao_registro_aplicacao.id as registro_aplicacao_id',
'cadastro_paciente.id as paciente_id',
'cadastro_cidadao.nome as paciente',
'cadastro_sexo.descricao as sexo',
'cadastro_cidadao.cpf as cpf',
'cadastro_cidadao.cns as cns',
'cadastro_unidade.id as unidade_id',
'cadastro_unidade.nome_fantasia as unidade',
'cadastro_paciente_classificacao.descricao as classificacao',
'cadastro_paciente.prontuario as prontuario',
DB::raw("CONCAT(atencao_basica_parametrizacao_area.descricao, ' - ', unidade_area.nome_fantasia) as area"),
'atencao_basica_parametrizacao_microarea.descricao as microarea',
'agente_comunitario_cidadao.nome as agente',
'unidade_sala_vacinacao.id as sala_id',
'unidade_sala_vacinacao.nome_fantasia as sala',
$rowVacina,
'imunizacao_entrada_vacina.lote as lote',
'imunizacao_dose.nome as dose',
'atencao_basica_parametrizacao_equipe_usuario.equipe_id',
DB::raw('DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, "%d/%m/%Y") AS validade'),
DB::raw('DATE_FORMAT(imunizacao_registro_aplicacao.data_aplicacao, "%d/%m/%Y") AS data'),
DB::raw('"Aplicação" AS registro'),
'imunizacao_estrategia.nome as estrategia',
DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") AS idade'),
'imunizacao_campanha.nome as campanha',
)
->join('cadastro_paciente', 'cadastro_paciente.id', 'paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->join('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao.sexo_id')
->leftJoin('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_paciente.unidade_id')
->join('cadastro_paciente_classificacao', 'cadastro_paciente_classificacao.id', 'cadastro_paciente.classificacao_id')
->join('atencao_basica_parametrizacao_equipe_usuario', 'atencao_basica_parametrizacao_equipe_usuario.usuario_id', 'imunizacao_registro_aplicacao.aplicador_id')
->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id')
->join('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id')
->join('cadastro_unidade as unidade_area', 'unidade_area.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id')
->join('cadastro_usuario as agente_comunitario_usuario', 'agente_comunitario_usuario.id', 'imunizacao_registro_aplicacao.aplicador_id')
->join('cadastro_cidadao as agente_comunitario_cidadao', 'agente_comunitario_cidadao.id', 'agente_comunitario_usuario.cidadao_id')
->join('imunizacao_saida_vacina', 'imunizacao_saida_vacina.id', 'imunizacao_registro_aplicacao.saida_vacina_id')
->join('imunizacao_saida', 'imunizacao_saida.id', 'imunizacao_saida_vacina.saida_id')
->join('imunizacao_entrada_vacina', 'imunizacao_entrada_vacina.id', 'imunizacao_saida_vacina.entrada_vacina_id')
->join('imunizacao_sala_vacinacao', 'imunizacao_sala_vacinacao.id', 'imunizacao_saida.sala_vacinacao_id')
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'imunizacao_sala_vacinacao.infraestrutura_id')
->leftJoin('cadastro_unidade as unidade_sala_vacinacao', 'unidade_sala_vacinacao.id', 'cadastro_infraestrutura.unidade_id')
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_saida_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_campanha', 'imunizacao_campanha.id', 'imunizacao_registro_aplicacao.campanha_id');
}
private static function getQuerySearchAplicacao($rowVacina, $params) {
$periodo = $params['periodo'];
$salaVacinacao = $params['sala_vacinacao'];
$vacina = $params['vacina'];
$dose = $params['dose'];
$sexo = $params['sexo'];
$unidade = $params['unidade'];
$area = $params['area'];
$microarea = $params['microarea'];
$classificacao = $params['classificacao'];
$prontuario = $params['prontuario'];
return DB::table('imunizacao_registro_aplicacao')
->whereNotNull('imunizacao_registro_aplicacao.entrada_vacina_id')
->whereBetween('data_aplicacao', [
Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(),
Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(),
])
->where(fn($q) => isset($salaVacinacao) ? $q->where('imunizacao_sala_vacinacao.id', $salaVacinacao) : $q)
->where(fn($q) => isset($vacina) ? $q->where('cadastro_vacina.id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('imunizacao_dose.id', $dose) : $q)
->where(fn($q) => isset($sexo) ? $q->where('cadastro_sexo.id', $sexo) : $q)
->where(fn($q) => isset($unidade) ? $q->where('cadastro_unidade.id', $unidade) : $q)
->where(fn($q) => isset($area) ? $q->where('atencao_basica_parametrizacao_area.descricao', $area) : $q)
->where(fn($q) => isset($microarea) ? $q->where('atencao_basica_parametrizacao_microarea.descricao', $microarea) : $q)
->where(fn($q) => isset($classificacao) ? $q->where('cadastro_paciente_classificacao.id', $classificacao) : $q)
->where(fn($q) => isset($prontuario) ? $q->where('cadastro_paciente.prontuario', $prontuario) : $q)
->select(
'imunizacao_registro_aplicacao.id as registro_aplicacao_id',
'cadastro_paciente.id as paciente_id',
'cadastro_cidadao.nome as paciente',
'cadastro_sexo.descricao as sexo',
'cadastro_cidadao.cpf as cpf',
'cadastro_cidadao.cns as cns',
'cadastro_unidade.id as unidade_id',
'cadastro_unidade.nome_fantasia as unidade',
'cadastro_paciente_classificacao.descricao as classificacao',
'cadastro_paciente.prontuario as prontuario',
DB::raw("CONCAT(atencao_basica_parametrizacao_area.descricao, ' - ', unidade_area.nome_fantasia) as area"),
'atencao_basica_parametrizacao_microarea.descricao as microarea',
'agente_comunitario_cidadao.nome as agente',
'unidade_sala_vacinacao.id as sala_id',
'unidade_sala_vacinacao.nome_fantasia as sala',
$rowVacina,
'imunizacao_entrada_vacina.lote as lote',
'imunizacao_dose.nome as dose',
DB::raw('DATE_FORMAT(imunizacao_entrada_vacina.data_validade_lote, "%d/%m/%Y") AS validade'),
DB::raw('DATE_FORMAT(imunizacao_registro_aplicacao.data_aplicacao, "%d/%m/%Y") AS data'),
DB::raw('"Aplicação" AS registro'),
'imunizacao_estrategia.nome as estrategia',
DB::raw('"-" AS campanha'),
DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") AS idade'),
'atencao_basica_parametrizacao_equipe_usuario.equipe_id',
)
->join('cadastro_paciente', 'cadastro_paciente.id', 'imunizacao_registro_aplicacao.paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->join('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao.sexo_id')
->leftJoin('cadastro_paciente_classificacao', 'cadastro_paciente_classificacao.id', 'cadastro_paciente.classificacao_id')
->join('cadastro_usuario as agente_comunitario_usuario', 'agente_comunitario_usuario.id', 'imunizacao_registro_aplicacao.aplicador_id')
->join('cadastro_cidadao as agente_comunitario_cidadao', 'agente_comunitario_cidadao.id', 'agente_comunitario_usuario.cidadao_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 as unidade_sala_vacinacao', 'unidade_sala_vacinacao.id', 'cadastro_infraestrutura.unidade_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')
->leftJoin('atencao_basica_parametrizacao_equipe_usuario', 'atencao_basica_parametrizacao_equipe_usuario.usuario_id', 'imunizacao_registro_aplicacao.aplicador_id')
->leftJoin('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id')
->leftJoin('cadastro_unidade as unidade_area', 'unidade_area.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
->leftJoin('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id')
->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id')
->leftJoin('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_paciente.unidade_id')
->groupBy('imunizacao_registro_aplicacao.id');
}
private static function getQuerySearchAtualizacao($rowVacina, $params) {
$periodo = $params['periodo'];
$salaVacinacao = $params['sala_vacinacao'];
$vacina = $params['vacina'];
$dose = $params['dose'];
$sexo = $params['sexo'];
$unidade = $params['unidade'];
$area = $params['area'];
$microarea = $params['microarea'];
$classificacao = $params['classificacao'];
$prontuario = $params['prontuario'];
return DB::table('imunizacao_registro_atualizacao')
->whereBetween('data_atualizacao', [
Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(),
Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(),
])
->where(fn($q) => isset($salaVacinacao) ? $q->where('imunizacao_sala_vacinacao.id', $salaVacinacao) : $q)
->where(fn($q) => isset($vacina) ? $q->where('cadastro_vacina.id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('imunizacao_dose.id', $dose) : $q)
->where(fn($q) => isset($sexo) ? $q->where('cadastro_sexo.id', $sexo) : $q)
->where(fn($q) => isset($unidade) ? $q->where('cadastro_unidade.id', $unidade) : $q)
->where(fn($q) => isset($area) ? $q->where('atencao_basica_parametrizacao_area.descricao', $area) : $q)
->where(fn($q) => isset($microarea) ? $q->where('atencao_basica_parametrizacao_microarea.descricao', $microarea) : $q)
->where(fn($q) => isset($classificacao) ? $q->where('cadastro_paciente_classificacao.id', $classificacao) : $q)
->where(fn($q) => isset($prontuario) ? $q->where('cadastro_paciente.prontuario', $prontuario) : $q)
->select(
'imunizacao_registro_atualizacao.id as registro_atualizacao_id',
'cadastro_paciente.id as paciente_id',
'cadastro_cidadao.nome as paciente',
'cadastro_sexo.descricao as sexo',
'cadastro_cidadao.cpf as cpf',
'cadastro_cidadao.cns as cns',
'cadastro_unidade.id as unidade_id',
'cadastro_unidade.nome_fantasia as unidade',
'cadastro_paciente_classificacao.descricao as classificacao',
'cadastro_paciente.prontuario as prontuario',
DB::raw("CONCAT(atencao_basica_parametrizacao_area.descricao, ' - ', unidade_area.nome_fantasia) as area"),
'atencao_basica_parametrizacao_microarea.descricao as microarea',
'agente_comunitario_cidadao.nome as agente',
'unidade_sala_vacinacao.id as sala_id',
'unidade_sala_vacinacao.nome_fantasia as sala',
$rowVacina,
'imunizacao_registro_atualizacao.lote as lote',
'imunizacao_dose.nome as dose',
DB::raw('"-" AS validade'),
DB::raw('DATE_FORMAT(imunizacao_registro_atualizacao.data_atualizacao, "%d/%m/%Y") AS data'),
DB::raw('"Atualização" AS registro'),
DB::raw('"-" AS campanha'),
'imunizacao_estrategia.nome as estrategia',
'atencao_basica_parametrizacao_equipe_usuario.equipe_id',
DB::raw('DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") AS idade'),
)
->join('cadastro_paciente', 'cadastro_paciente.id', 'paciente_id')
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->join('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao.sexo_id')
->leftJoin('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_paciente.unidade_id')
->join('cadastro_paciente_classificacao', 'cadastro_paciente_classificacao.id', 'cadastro_paciente.classificacao_id')
->leftJoin('atencao_basica_parametrizacao_equipe_usuario', 'atencao_basica_parametrizacao_equipe_usuario.usuario_id', 'imunizacao_registro_atualizacao.aplicador_id')
->leftJoin('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_parametrizacao_equipe_usuario.equipe_id')
->leftJoin('cadastro_unidade as unidade_area', 'unidade_area.id', 'atencao_basica_parametrizacao_equipe.unidade_id')
->leftJoin('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id')
->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id')
->join('cadastro_usuario as agente_comunitario_usuario', 'agente_comunitario_usuario.id', 'imunizacao_registro_atualizacao.aplicador_id')
->join('cadastro_cidadao as agente_comunitario_cidadao', 'agente_comunitario_cidadao.id', 'agente_comunitario_usuario.cidadao_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 as unidade_sala_vacinacao', 'unidade_sala_vacinacao.id', 'cadastro_infraestrutura.unidade_id')
->join('cadastro_vacina', 'cadastro_vacina.id', 'imunizacao_registro_atualizacao.vacina_id')
->join('imunizacao_dose', 'imunizacao_dose.id', 'imunizacao_registro_atualizacao.dose_id')
->leftJoin('imunizacao_estrategia', 'imunizacao_estrategia.id', 'imunizacao_registro_atualizacao.estrategia_id')
->groupBy('imunizacao_registro_atualizacao.id');
}
private static function vefificaFaixaInicial($params, $idadeEpoca) {
$anosIniciais = $params['faixa_etaria']['inicial']['anos'];
$mesesIniciais = $params['faixa_etaria']['inicial']['meses'];
$diasIniciais = $params['faixa_etaria']['inicial']['dias'];
// Verifica anos
if (isset($anosIniciais) && $idadeEpoca->y < $anosIniciais) {
return true;
}
// Verifica meses quando os anos não estão definidos
if (!isset($anosIniciais) && isset($mesesIniciais) && (($idadeEpoca->y * 12 + $idadeEpoca->m) < $mesesIniciais)) {
return true;
}
// Verifica meses quando anos e meses estão definidos
if ((isset($anosIniciais) && isset($mesesIniciais)) && ($idadeEpoca->y == $anosIniciais && $idadeEpoca->m < $mesesIniciais)) {
return true;
}
// Verifica dias quando anos, meses e dias estão definidos
if ((isset($anosIniciais) && isset($mesesIniciais) && isset($diasIniciais)) &&
($idadeEpoca->y == $anosIniciais && $idadeEpoca->m == $mesesIniciais && $idadeEpoca->d < $diasIniciais)) {
return true;
}
// Verifica dias quando apenas anos estão definidos
if (isset($anosIniciais) && !isset($mesesIniciais) && isset($diasIniciais) &&
($idadeEpoca->y == $anosIniciais && $idadeEpoca->d < $diasIniciais)) {
return true;
}
// Verifica dias quando apenas meses estão definidos
if (!isset($anosIniciais) && isset($mesesIniciais) && isset($diasIniciais) &&
($idadeEpoca->m == $mesesIniciais && $idadeEpoca->d < $diasIniciais)) {
return true;
}
// Verifica dias quando nem anos nem meses estão definidos
if (!isset($anosIniciais) && !isset($mesesIniciais) && isset($diasIniciais) &&
$idadeEpoca->d < $diasIniciais) {
return true;
}
return false;
}
private static function verificaFaixaFinal($params, $idadeEpoca){
$anosFinais = $params['faixa_etaria']['final']['anos'];
$mesesFinais = $params['faixa_etaria']['final']['meses'];
$diasFinais = $params['faixa_etaria']['final']['dias'];
if(!isset($anosFinais) && $idadeEpoca->y > 0){
return true;
}
if((!isset($anosFinais) && $idadeEpoca->y > 0) && (!isset($mesesFinais) && $idadeEpoca->m > 0)){
return true;
}
if (isset($anosFinais) && $idadeEpoca->y > $anosFinais) {
return true;
}
// Verifica meses finais quando os anos não estão definidos
if (!isset($anosFinais) && isset($mesesFinais) && (($idadeEpoca->y * 12 + $idadeEpoca->m) > $mesesFinais)) {
return true;
}
// Verifica meses finais quando anos e meses estão definidos
if ((isset($anosFinais) && isset($mesesFinais)) && ($idadeEpoca->y == $anosFinais && $idadeEpoca->m > $mesesFinais)) {
return true;
}
// Verifica dias finais quando anos, meses e dias estão definidos
if ((isset($anosFinais) && isset($mesesFinais) && isset($diasFinais)) &&
($idadeEpoca->y == $anosFinais && $idadeEpoca->m == $mesesFinais && $idadeEpoca->d > $diasFinais)) {
return true;
}
// Verifica dias finais quando apenas anos estão definidos
if (isset($anosFinais) && !isset($mesesFinais) && isset($diasFinais) &&
($idadeEpoca->y == $anosFinais && $idadeEpoca->d > $diasFinais)) {
return true;
}
// Verifica dias finais quando apenas meses estão definidos
if (!isset($anosFinais) && isset($mesesFinais) && isset($diasFinais) &&
($idadeEpoca->m == $mesesFinais && $idadeEpoca->d > $diasFinais)) {
return true;
}
// Verifica dias finais quando nem anos nem meses estão definidos
if (!isset($anosFinais) && !isset($mesesFinais) && isset($diasFinais) &&
$idadeEpoca->d > $diasFinais) {
return true;
}
return false;
}
public static function list() {
$params = request()->all();
$tipoListagem = $params['listar'];
switch ($tipoListagem) {
case 'salaVacinacao':
return self::getSalasVacinacao($params);
case 'vacina':
return self::getVacinas($params);
case 'dose':
return self::getDoses($params);
case 'unidade':
return self::getUnidades($params);
case 'classificacao':
return self::getClassificacoes();
case 'equipe':
return self::getEquipes($params);
default:
return response()->json(["error" => "Informe o tipo de listagem através do listar"], Response::HTTP_NOT_ACCEPTABLE);
}
}
private static function getSalasVacinacao($params) {
$ids = self::getIdsPorQueries('sala', $params);
return SalaVacinacao::whereIn('id', $ids)
->with('infraestrutura')
->get()
->map(fn($item) => [
'id' => $item->id,
'nome' => $item->infraestrutura->nome
]);
}
private static function getVacinas($params) {
$ids = self::getIdsPorQueries('vacina', $params);
$parametrizacaoVacina = DB::table('imunizacao_parametrizacao')
->select('parametrizacao_descricao_vacina_id')
->first();
return DB::table('cadastro_vacina')
->whereIn('id', $ids)
->select(
'id',
self::formataDescricaoVacina($parametrizacaoVacina->parametrizacao_descricao_vacina_id, 'cadastro_vacina', 'nome'),
)
->get();
}
private static function formataDescricaoVacina($descricaoVacina, $tabela, $apelidoCampo) {
$formato = '';
switch ($descricaoVacina) {
case ParametrizacaoDescricaoVacina::DESCRICAO:
$formato = "{$tabela}.nome as {$apelidoCampo}";
break;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA:
$formato = "{$tabela}.abreviacao as {$apelidoCampo}";
break;
case ParametrizacaoDescricaoVacina::SIGLA:
$formato = "{$tabela}.sigla as {$apelidoCampo}";
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO:
$formato = "CONCAT({$tabela}.sigla, ' - ', {$tabela}.nome) as {$apelidoCampo}";
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA:
$formato = "CONCAT({$tabela}.sigla, ' - ', {$tabela}.abreviacao) as {$apelidoCampo}";
break;
case ParametrizacaoDescricaoVacina::DESCRICAO_ABREVIADA_DESCRICAO:
$formato = "CONCAT({$tabela}.abreviacao, ' - ', {$tabela}.nome) as {$apelidoCampo}";
break;
case ParametrizacaoDescricaoVacina::SIGLA_DESCRICAO_ABREVIADA_DESCRICAO:
$formato = "CONCAT({$tabela}.sigla, ' - ', {$tabela}.abreviacao, ' - ', {$tabela}.nome) as {$apelidoCampo}";
break;
}
return DB::raw($formato);
}
private static function getDoses($params) {
$ids = self::getIdsPorQueries('dose', $params);
return DB::table('imunizacao_dose')
->whereIn('id', $ids)
->select('id', 'nome')
->get();
}
private static function getUnidades($params) {
$ids = self::getIdsPorQueries('unidade', $params);
return DB::table('cadastro_unidade')
->whereIn('id', $ids)
->select('id', 'nome_fantasia as nome')
->get();
}
private static function getClassificacoes() {
return DB::table('cadastro_paciente_classificacao')
->select('id', 'descricao as nome')
->get();
}
private static function getEquipes($params) {
$ids = self::getIdsPorQueries('equipe', $params);
$equipesIds = DB::table('atencao_basica_parametrizacao_equipe_usuario')
->select('equipe_id')
->whereIn('usuario_id', $ids)
->get()
->pluck('equipe_id', 'equipe_id')
->filter();
return Equipe::whereIn('id', $equipesIds)
->with(['area', 'microarea', 'unidade'])
->get()
->map(fn ($item) => [
'area' => [
"nome" => $item->area->descricao . ' - ' . $item->unidade->nome_fantasia,
"valor" => $item->area->descricao
],
'microarea' => $item->microarea ? $item->microarea->descricao : null,
])
->filter(fn ($item) => isset($item['microarea']));
}
private static function getQueryAplicacao($tipoConsulta, $params) {
$periodo = $params['periodo'];
$salaVacinacao = $params['sala_vacinacao'];
$vacina = $params['vacina'];
$vacinas = isset($params['vacinas']) ? explode(', ', $params['vacinas']) : [];
$dose = $params['dose'];
$sexo = $params['sexo'];
$unidade = $params['unidade'];
$query = RegistroAplicacao::whereNotNull('entrada_vacina_id')
->whereBetween('data_aplicacao', [
Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(),
Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(),
]);
switch ($tipoConsulta) {
case 'sala':
$query->with(['entradaVacina.entrada']);
break;
case 'vacina':
$query->with(['entradaVacina', 'entradaVacina.entrada'])
->whereHas('entradaVacina.entrada', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q);
break;
case 'dose':
$query->with(['entradaVacina', 'entradaVacina.entrada'])
->whereHas('entradaVacina.entrada', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->whereHas('entradaVacina', fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q->whereIn('vacina_id', $vacinas));
break;
case 'unidade':
$query->with(['entradaVacina', 'entradaVacina.entrada', 'paciente', 'paciente.cidadao'])
->whereHas('entradaVacina.entrada', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->whereHas('entradaVacina', fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('dose_id', $dose) : $q)
->whereHas('paciente.cidadao', fn($q) => isset($sexo) ? $q->where('sexo_id', $sexo) : $q)
->whereHas('paciente', fn($q) => $q->whereNotNull('unidade_id'));
break;
case 'equipe':
$query->with(['entradaVacina', 'entradaVacina.entrada', 'paciente', 'paciente.cidadao'])
->whereHas('entradaVacina.entrada', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->whereHas('entradaVacina', fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('dose_id', $dose) : $q)
->whereHas('paciente.cidadao', fn($q) => isset($sexo) ? $q->where('sexo_id', $sexo) : $q)
->whereHas('paciente', fn($q) => $q->whereNotNull('unidade_id'))
->whereHas('paciente', fn($q) => isset($unidade) ? $q->where('unidade_id', $unidade) : $q);
break;
}
return $query;
}
private static function getQueryCampanha($tipoConsulta, $params) {
$periodo = $params['periodo'];
$salaVacinacao = $params['sala_vacinacao'];
$vacina = $params['vacina'];
$vacinas = isset($params['vacinas']) ? explode(', ', $params['vacinas']) : [];
$dose = $params['dose'];
$sexo = $params['sexo'];
$unidade = $params['unidade'];
$query = RegistroAplicacao::whereNotNull('saida_vacina_id')
->whereNotNull('campanha_id')
->whereBetween('data_aplicacao', [
Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(),
Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(),
]);
switch ($tipoConsulta) {
case 'sala':
$query->with(['saidaVacina.saida'])
->whereHas('saidaVacina.saida', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q);
break;
case 'vacina':
$query->with(['saidaVacina', 'saidaVacina.saida'])
->whereHas('saidaVacina.saida', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q);
break;
case 'dose':
$query->with(['saidaVacina', 'saidaVacina.saida'])
->whereHas('saidaVacina.saida', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->whereHas('saidaVacina', fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q->whereIn('vacina_id', $vacinas));
break;
case 'unidade':
$query->with(['saidaVacina', 'saidaVacina.saida', 'paciente', 'paciente.cidadao'])
->whereHas('saidaVacina.saida', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->whereHas('saidaVacina', fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('dose_id', $dose) : $q)
->whereHas('paciente.cidadao', fn($q) => isset($sexo) ? $q->where('sexo_id', $sexo) : $q)
->whereHas('paciente', fn($q) => $q->whereNotNull('unidade_id'));
break;
case 'equipe':
$query->with(['saidaVacina', 'saidaVacina.saida', 'paciente', 'paciente.cidadao'])
->whereHas('saidaVacina.saida', fn($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->whereHas('saidaVacina', fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q)
->where(fn($q) => isset($dose) ? $q->where('dose_id', $dose) : $q)
->whereHas('paciente.cidadao', fn($q) => isset($sexo) ? $q->where('sexo_id', $sexo) : $q)
->whereHas('paciente', fn($q) => $q->whereNotNull('unidade_id'))
->whereHas('paciente', fn($q) => isset($unidade) ? $q->where('unidade_id', $unidade) : $q);
break;
}
return $query;
}
private static function getQueryAtualizacao($tipoConsulta, $params) {
$periodo = $params['periodo'];
$salaVacinacao = $params['sala_vacinacao'];
$vacina = $params['vacina'];
$vacinas = isset($params['vacinas']) ? explode(', ', $params['vacinas']) : [];
$sexo = $params['sexo'];
$unidade = $params['unidade'];
$query = RegistroAtualizacao::whereBetween('data_atualizacao', [
Carbon::createFromFormat('d/m/Y', $periodo['start'])->startOfDay(),
Carbon::createFromFormat('d/m/Y', $periodo['end'])->endOfDay(),
]);
switch ($tipoConsulta) {
case 'sala':
$query;
break;
case 'vacina':
$query->where(fn ($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q);
break;
case 'dose':
$query->where(fn ($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->where(fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q->whereIn('vacina_id', $vacinas));
break;
case 'unidade':
$query->with(['paciente', 'paciente.cidadao'])
->where(fn ($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->where(fn($q) => isset($vacina) ? $q->where('vacina_id', $vacina) : $q)
->whereHas('paciente.cidadao', fn($q) => isset($sexo) ? $q->where('sexo_id', $sexo) : $q);
break;
case 'equipe':
$query->with(['paciente.cidadao'])
->where(fn ($q) => isset($salaVacinacao) ? $q->where('sala_vacinacao_id', $salaVacinacao) : $q)
->where(fn($q) => isset ($vacina) ? $q->where('vacina_id', $vacina) : $q)
->whereHas('paciente.cidadao', fn($q) => isset($sexo) ? $q->where('sexo_id', $sexo) : $q)
->whereHas('paciente', fn($q) => isset($unidade) ? $q->where('unidade_id', $unidade) : $q);
break;
}
return $query;
}
private static function getIdsPorQueries($tipoConsulta, $params) {
$preferenciaCampanha = $params['campanha'];
$tipoRegistro = $params['tipo_registro'];
$idsAplicacao = [];
$idsAtualizacao = [];
$idsCampanha = [];
$queryAplicacao = self::getQueryAplicacao($tipoConsulta, $params);
$queryCampanha = self::getQueryCampanha($tipoConsulta, $params);
$queryAtualizacao = self::getQueryAtualizacao($tipoConsulta, $params);
$campoCampanha = '';
$campoAplicacao = '';
$campoAtualizacao = '';
switch ($tipoConsulta) {
case 'sala':
$campoCampanha = 'saidaVacina.saida.sala_vacinacao_id';
$campoAplicacao = 'entradaVacina.entrada.sala_vacinacao_id';
$campoAtualizacao = 'sala_vacinacao_id';
break;
case 'vacina':
$campoCampanha = 'saidaVacina.vacina_id';
$campoAplicacao = 'entradaVacina.vacina_id';
$campoAtualizacao = 'vacina_id';
break;
case 'dose':
$campoCampanha = 'dose_id';
$campoAplicacao = 'dose_id';
$campoAtualizacao = 'dose_id';
break;
case 'unidade':
$campoCampanha = 'paciente.unidade_id';
$campoAplicacao = 'paciente.unidade_id';
$campoAtualizacao = 'paciente.unidade_id';
break;
case 'equipe':
$campoCampanha = 'aplicador_id';
$campoAplicacao = 'aplicador_id';
$campoAtualizacao = 'aplicador_id';
break;
}
if($preferenciaCampanha != PreferenciaCampanha::NAO_INCLUIR) {
$idsCampanha = $queryCampanha->get()->pluck($campoCampanha, $campoCampanha)->filter();
}
if($preferenciaCampanha != PreferenciaCampanha::MOSTRAR_EXCLUSIVAMENTE){
if($tipoRegistro != TipoRegistro::ATUALIZACAO) {
$idsAplicacao = $queryAplicacao->get()->pluck($campoAplicacao, $campoAplicacao)->filter();
}
if($tipoRegistro != TipoRegistro::APLICACAO) {
$idsAtualizacao = $queryAtualizacao->get()->pluck($campoAtualizacao, $campoAtualizacao)->filter();
}
}
return [...$idsCampanha, ...$idsAplicacao, ...$idsAtualizacao];
}
}