format('d/m/Y'); $anoAtual = Carbon::now()->year; return [ "form" => [ "competencias" => [ "anos" => [], "meses" => [] ], "unidades" => [], "profissionais" => [], "locaisAtendimento" => [], "sexos" => self::getSexos(), "hipertensos" => self::getOptionsBoolean(), "gestantes" => self::getOptionsBoolean(), "diabeticos" => self::getOptionsBoolean(), "condicoesAvaliadas" => self::getCondicoesAvaliadas(), "doencasTransmissiveis" => self::getDoencasTransmissiveis(), "rastreamentos" => self::getRastreamentos(), "vacinas" => self::getOptionsBoolean(), "aleitamentosMaterno" => self::getAleitamentosMaterno(), ], "model" => [ "competencia" => [ "ano" => $anoAtual, "mes" => null ], "unidade" => null, "profissional" => null, "localAtendimento" => null, "prontuario" => null, "idadeMinima" => null, "idadeMaxima" => null, "sexo" => null, "hipertenso" => null, "gestante" => null, "diabetico" => null, "condicaoAvaliada" => null, "doencaTransmissivel" => null, "rastreamento" => null, "vacina" => null, "aleitamentoMaterno" => null, 'ciap2' => null, 'cid' => null, ], "data_atual" => $dataAtual ]; } public static function list() { $params = request()->all(); $tipoListagem = $params['listar']; switch ($tipoListagem) { case 'ano': return self::getAnosCompetencia(); case 'mes': return self::getMesesCompetencia($params['competencia']['ano']); case 'unidade': return self::getUnidades($params); case 'profissional': return self::getProfissionais($params); case 'localAtendimento': return self::getLocaisAtendimento($params); default: return response()->json(["error" => "Informe o tipo de listagem através do listar"], Response::HTTP_NOT_ACCEPTABLE); } } public static function search() { $params = request()->all(); $ano = $params['competencia']['ano']; $mes = $params['competencia']['mes']; $unidade = $params['unidade']; $prontuario = $params['prontuario']; $idadeMinima = $params['idade_minima']; $idadeMaxima = $params['idade_maxima']; $sexo = $params['sexo']; $profissional = $params['profissional']; $hipertenso = $params['hipertenso']; $condicaoAvaliadaParametro = $params['condicao_avaliada']; $doencaTransmissivel = $params['doenca_transmissivel']; $rastreamento = $params['rastreamento']; $ciap2 = $params['ciap2']; $cid = $params['cid']; $diabetico = $params['diabetico']; $gestante = $params['gestante']; $aleitamentoMaterno = $params['aleitamento_materno']; $localAtendimento = $params['local_atendimento']; $vacina = $params['vacina']; $totalizadores = [ "unidades" => [], "profissionais" => [], "locaisAtendimento" => [], ]; $registros = DB::table('atencao_basica_atendimento_individual') ->select( 'atencao_basica_atendimento_individual.id as atendimento_individual_id', 'atencao_basica_atendimento_individual.paciente_id as paciente_id', DB::raw("DATE_FORMAT(atencao_basica_atendimento_individual.data_usuario_responsavel, '%d/%m/%Y') AS data"), 'cadastro_unidade.id as unidade_id', 'cadastro_unidade.nome_fantasia as unidade', 'cidadao_paciente.nome as paciente', 'cadastro_paciente.prontuario as prontuario', DB::raw("DATE_FORMAT(cidadao_paciente.data_nascimento, '%d/%m/%Y') AS data_nascimento"), 'cadastro_sexo.descricao as sexo', 'cidadao_usuario.nome as profissional', 'atencao_basica_cadastro_individual.hipertensao as hipertenso', 'atencao_basica_cadastro_individual.diabetes as diabetico', 'atencao_basica_cadastro_individual.gestante as gestante', 'atencao_basica_cadastro_aleitamento_materno.descricao as aleitamento_materno', 'atencao_basica_local_atendimento.descricao as local_atendimento', 'atencao_basica_atendimento_individual.vacinacao as vacina', DB::raw(" ( SELECT GROUP_CONCAT(c.descricao SEPARATOR '#') FROM atencao_basica_atendimento_individual_problema_condicao pc INNER JOIN geral_ciap c ON c.id = pc.ciap_id WHERE pc.atendimento_individual_id = atencao_basica_atendimento_individual.id ) AS ciap "), DB::raw(" ( SELECT GROUP_CONCAT(c.nome SEPARATOR '#') FROM atencao_basica_atendimento_individual_problema_condicao pc INNER JOIN sigtap.cid c ON c.id = pc.cid_id WHERE pc.atendimento_individual_id = atencao_basica_atendimento_individual.id ) AS cid ") ) ->whereYear('atencao_basica_atendimento_individual.data_usuario_responsavel', $ano) ->whereMonth('atencao_basica_atendimento_individual.data_usuario_responsavel', $mes) ->where(fn($q) => isset($unidade) ? $q->where('cadastro_unidade.id', $unidade) : $q) ->where(fn($q) => isset($prontuario) ? $q->where('cadastro_paciente.prontuario', $prontuario) : $q) ->where(fn($q) => isset($sexo) ? $q->where('cidadao_paciente.sexo_id', $sexo) : $q) ->where(fn($q) => isset($profissional) ? $q->where('cadastro_usuario.id', $profissional) : $q) ->where(fn($q) => isset($hipertenso) ? $q->where('atencao_basica_cadastro_individual.hipertensao', DataUtil::getBooleanValueFromStringBoolean($hipertenso)) : $q) ->where(fn($q) => isset($diabetico) ? $q->where('atencao_basica_cadastro_individual.diabetes', DataUtil::getBooleanValueFromStringBoolean($diabetico)) : $q) ->where(fn($q) => isset($gestante) ? $q->where('atencao_basica_cadastro_individual.gestante', DataUtil::getBooleanValueFromStringBoolean($gestante)) : $q) ->where(fn($q) => isset($aleitamentoMaterno) ? $q->where('atencao_basica_atendimento_individual.aleitamento_materno_id', $aleitamentoMaterno) : $q) ->where(fn($q) => isset($localAtendimento) ? $q->where('atencao_basica_atendimento_individual.local_atendimento_id', $localAtendimento) : $q) ->where(fn($q) => isset($vacina) ? $q->where('atencao_basica_atendimento_individual.vacinacao', DataUtil::getBooleanValueFromStringBoolean($vacina)) : $q) ->where(fn($q) => isset($ciap2) ? $q->whereExists(function($query) use ($ciap2) { $query->select(DB::raw(1)) ->from('atencao_basica_atendimento_individual_problema_condicao') ->whereRaw('atencao_basica_atendimento_individual_problema_condicao.atendimento_individual_id = atencao_basica_atendimento_individual.id') ->where('atencao_basica_atendimento_individual_problema_condicao.ciap_id', $ciap2['id']); }) : $q ) ->where(fn($q) => isset($cid) ? $q->whereExists(function($query) use ($cid) { $query->select(DB::raw(1)) ->from('atencao_basica_atendimento_individual_problema_condicao') ->whereRaw('atencao_basica_atendimento_individual_problema_condicao.atendimento_individual_id = atencao_basica_atendimento_individual.id') ->where('atencao_basica_atendimento_individual_problema_condicao.cid_id', $cid['id']); }) : $q ) ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_individual.equipe_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id') ->join('cadastro_paciente', 'cadastro_paciente.id', 'atencao_basica_atendimento_individual.paciente_id') ->join('cadastro_cidadao as cidadao_paciente', 'cidadao_paciente.id', 'cadastro_paciente.cidadao_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'atencao_basica_atendimento_individual.usuario_id') ->join('cadastro_cidadao as cidadao_usuario', 'cidadao_usuario.id', 'cadastro_usuario.cidadao_id') ->join('cadastro_sexo', 'cadastro_sexo.id', 'cidadao_paciente.sexo_id') ->leftJoin('atencao_basica_cadastro_individual', 'atencao_basica_cadastro_individual.paciente_id', 'atencao_basica_atendimento_individual.paciente_id') ->leftJoin('atencao_basica_cadastro_aleitamento_materno', 'atencao_basica_cadastro_aleitamento_materno.id', 'atencao_basica_atendimento_individual.aleitamento_materno_id') ->join('atencao_basica_local_atendimento', 'atencao_basica_local_atendimento.id', 'atencao_basica_atendimento_individual.local_atendimento_id') ->get(); $registros = $registros->map(function($item) use ($idadeMinima, $idadeMaxima) { $idade = self::getIdadeCalculada($item->data_nascimento); $item->ciap = collect(explode('#', $item->ciap))->filter(); $item->cid = collect(explode('#', $item->cid))->filter(); if (isset($idadeMinima) && ($idade->y < $idadeMinima)) { return null; } if (isset($idadeMaxima) && ($idade->y > $idadeMaxima)) { return null; } $item->idade = "{$idade->y} (A) {$idade->m} (M) {$idade->d} (D)"; $item->hipertenso = self::getValorBoleano($item->hipertenso); $item->diabetico = self::getValorBoleano($item->diabetico); $item->gestante = self::getValorBoleano($item->gestante); $item->vacina = self::getValorBoleano($item->vacina); $item->condicaoAvaliada = $item->ciap->merge($item->cid); return $item; })->filter(); $idsAtendimentoIndividual = $registros->pluck('atendimento_individual_id'); $condicoes = self::getCondicoesDoencasRastreamentosOutros($params, $idsAtendimentoIndividual,); $registros = $registros->map(function($item) use($condicoes, $condicaoAvaliadaParametro, $doencaTransmissivel, $rastreamento, &$totalizadores) { $condicoesFiltradas = $condicoes->where('atendimento_individual_id', $item->atendimento_individual_id); $unidadeId = $item->unidade_id; $exibirRegistroComCondicaoAvaliada = isset($condicaoAvaliadaParametro) ? $condicoesFiltradas->contains('condicao_avaliada_id', $condicaoAvaliadaParametro['id']) : true; $exibirRegistroComDoencaTransmissivel = isset($doencaTransmissivel) ? $condicoesFiltradas->contains('doenca_transmissivel_id', $doencaTransmissivel['id']) : true; $exibirRegistroComRastreamento = isset($rastreamento) ? $condicoesFiltradas->contains('rastreamento_id', $rastreamento['id']) : true; if(in_array(false, [$exibirRegistroComCondicaoAvaliada, $exibirRegistroComDoencaTransmissivel, $exibirRegistroComRastreamento])) { return null; } if (!isset($totalizadores['unidades'][$unidadeId])) { $totalizadores['unidades'][$unidadeId] = 1; } else { $totalizadores['unidades'][$unidadeId]++; } if (!isset($totalizadores['profissionais'][$item->profissional])) { $totalizadores['profissionais'][$item->profissional] = 1; } else { $totalizadores['profissionais'][$item->profissional]++; } if (!isset($totalizadores['locaisAtendimento'][$item->local_atendimento])) { $totalizadores['locaisAtendimento'][$item->local_atendimento] = 1; } else { $totalizadores['locaisAtendimento'][$item->local_atendimento]++; } $item->condicaoAvaliada = $item->condicaoAvaliada->merge($condicoesFiltradas->pluck('descricao')); $item->condicaoAvaliada = $item->condicaoAvaliada->isNotEmpty() ? $item->condicaoAvaliada->implode(', ') : '-'; return $item; })->filter(); return [ "registros" => [...$registros], "totalizadores" => [ "registros" => count($registros), "unidades" => count($totalizadores["unidades"]), "profissionais" => count($totalizadores["profissionais"]), "locaisAtendimento" => count($totalizadores["locaisAtendimento"]), ] ]; } private static function getSexos() { return DB::table('cadastro_sexo') ->orderBy('descricao') ->get(); } private static function getCondicoesDoencasRastreamentosOutros($params, $idsAtendimentoIndividual) { $registros = collect([]); $condicoesAvaliadas = DB::table('atencao_basica_atendimento_individual_condicao_avaliada') ->select( 'atencao_basica_atendimento_individual.id as atendimento_individual_id', 'atencao_basica_cadastro_condicao_avaliada.descricao', 'atencao_basica_atendimento_individual_condicao_avaliada.condicao_avaliada_id', ) ->whereIn('atencao_basica_atendimento_individual.id', $idsAtendimentoIndividual) ->leftJoin('atencao_basica_cadastro_condicao_avaliada', 'atencao_basica_cadastro_condicao_avaliada.id', 'atencao_basica_atendimento_individual_condicao_avaliada.condicao_avaliada_id') ->leftJoin('atencao_basica_atendimento_individual', 'atencao_basica_atendimento_individual.id', 'atencao_basica_atendimento_individual_condicao_avaliada.atendimento_individual_id') ->get(); $doencasTransmissiveis = DB::table('atencao_basica_atendimento_individual_doenca_transmissivel') ->select( 'atencao_basica_atendimento_individual.id as atendimento_individual_id', 'atencao_basica_cadastro_doenca_transmissivel.descricao', 'atencao_basica_atendimento_individual_doenca_transmissivel.doenca_transmissivel_id' ) ->whereIn('atencao_basica_atendimento_individual.id', $idsAtendimentoIndividual) ->leftJoin('atencao_basica_cadastro_doenca_transmissivel', 'atencao_basica_cadastro_doenca_transmissivel.id', 'atencao_basica_atendimento_individual_doenca_transmissivel.doenca_transmissivel_id') ->leftJoin('atencao_basica_atendimento_individual', 'atencao_basica_atendimento_individual.id', 'atencao_basica_atendimento_individual_doenca_transmissivel.atendimento_individual_id') ->get(); $rastreamentos = DB::table('atencao_basica_atendimento_individual_rastreamento') ->select( 'atencao_basica_atendimento_individual.id as atendimento_individual_id', 'atencao_basica_cadastro_rastreamento.descricao', 'atencao_basica_atendimento_individual_rastreamento.rastreamento_id' ) ->whereIn('atencao_basica_atendimento_individual.id', $idsAtendimentoIndividual) ->leftJoin('atencao_basica_cadastro_rastreamento', 'atencao_basica_cadastro_rastreamento.id', 'atencao_basica_atendimento_individual_rastreamento.rastreamento_id') ->leftJoin('atencao_basica_atendimento_individual', 'atencao_basica_atendimento_individual.id', 'atencao_basica_atendimento_individual_rastreamento.atendimento_individual_id') ->get(); $registros->push(...$condicoesAvaliadas, ...$doencasTransmissiveis, ...$rastreamentos); return $registros; } private static function getIdadeCalculada($dataNascimento) { $dataNascimento = Carbon::createFromFormat('d/m/Y', $dataNascimento); $dataAtual = Carbon::now(); return $dataAtual->diff($dataNascimento); } private static function getValorBoleano($valor) { if(!isset($valor)) { return '-'; } return $valor ? 'Sim' : 'Não'; } private static function getOptionsBoolean() { return [ [ "descricao" => "Sim", "valor" => true, ], [ "descricao" => "Não", "valor" => false, ], ]; } private static function getCondicoesAvaliadas() { return DB::table('atencao_basica_cadastro_condicao_avaliada') ->orderBy('descricao') ->get(); } private static function getDoencasTransmissiveis() { return DB::table('atencao_basica_cadastro_doenca_transmissivel') ->orderBy('descricao') ->get(); } private static function getRastreamentos() { return DB::table('atencao_basica_cadastro_rastreamento') ->orderBy('descricao') ->get(); } private static function getAleitamentosMaterno() { return DB::table('atencao_basica_cadastro_aleitamento_materno') ->orderBy('descricao') ->get(); } private static function getAnosCompetencia() { $anosAtendimento = DB::table('atencao_basica_atendimento_individual') ->selectRaw('YEAR(data_usuario_responsavel) as ano') ->distinct('ano') ->pluck('ano') ->filter(); return $anosAtendimento; } private static function getMesesCompetencia($ano) { $meses = []; $registros = DB::table('atencao_basica_atendimento_individual') ->selectRaw('MONTH(data_usuario_responsavel) as mes') ->whereYear('data_usuario_responsavel', $ano) ->distinct('mes') ->pluck('mes') ->filter(); foreach ($registros as $mes) { $meses[] = $mes; } return $meses; } private static function getUnidades($params) { return DB::table('atencao_basica_atendimento_individual') ->select( 'cadastro_unidade.id as id', 'cadastro_unidade.nome_fantasia as descricao' ) ->whereYear('data_usuario_responsavel', $params['competencia']['ano']) ->whereMonth('data_usuario_responsavel', $params['competencia']['mes']) ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_individual.equipe_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id') ->distinct('cadastro_unidade.id') ->orderBy('descricao') ->get(); } private static function getProfissionais($params) { $unidade = $params['unidade']; return DB::table('atencao_basica_atendimento_individual') ->select( 'atencao_basica_atendimento_individual.usuario_id as id', 'cadastro_cidadao.nome as descricao' ) ->whereYear('data_usuario_responsavel', $params['competencia']['ano']) ->whereMonth('data_usuario_responsavel', $params['competencia']['mes']) ->where(fn($q) => isset($unidade) ? $q->where('cadastro_unidade.id', $unidade) : $q) ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_individual.equipe_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'atencao_basica_atendimento_individual.usuario_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->groupBy('id') ->orderBy('descricao') ->get(); } private static function getLocaisAtendimento($params) { $unidade = $params['unidade']; $profissional = $params['profissional']; return DB::table('atencao_basica_atendimento_individual') ->select( 'atencao_basica_atendimento_individual.local_atendimento_id as id', 'atencao_basica_local_atendimento.descricao as descricao', ) ->whereYear('data_usuario_responsavel', $params['competencia']['ano']) ->whereMonth('data_usuario_responsavel', $params['competencia']['mes']) ->where(fn($q) => isset($unidade) ? $q->where('cadastro_unidade.id', $unidade) : $q) ->where(fn($q) => isset($profissional) ? $q->where('usuario_id', $profissional) : $q) ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_individual.equipe_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id') ->join('atencao_basica_local_atendimento', 'atencao_basica_local_atendimento.id', 'atencao_basica_atendimento_individual.local_atendimento_id') ->groupBy('id') ->orderBy('descricao') ->get(); } }