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]; } }