select([ 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', 'atencao_basica_parametrizacao_equipe.id AS equipe_id', 'atencao_basica_parametrizacao_microarea.id AS microarea_id', DB::raw(" CONCAT ( CASE WHEN atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', atencao_basica_parametrizacao_area.numero_ine) ELSE '' END, CASE WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL AND atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL THEN 'Área: ' ELSE '' END, COALESCE(atencao_basica_parametrizacao_area.descricao, ''), CASE WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL AND (atencao_basica_parametrizacao_area.numero_ine IS NOT NULL OR atencao_basica_parametrizacao_area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL THEN 'Microárea: ' ELSE '' END, COALESCE(atencao_basica_parametrizacao_microarea.descricao, '') ) AS equipe_descricao "), DB::raw("COUNT(DISTINCT cadastro_paciente.id) AS denominador"), DB::raw("GROUP_CONCAT(DISTINCT(cadastro_paciente.id) SEPARATOR '#') AS pacientes"), DB::raw(" SUM( IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual abai INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = cadastro_paciente.id AND abai.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abai.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 6 MONTH) AND abai.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND ( o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' ) LIMIT 1 ), 1, 0 ) ) AS boa_pratica_a "), DB::raw(" SUM( IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual abai INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = cadastro_paciente.id AND abai.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abai.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 6 MONTH) AND abai.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abai.pressao_arterial IS NOT NULL AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_procedimento_atendimento_procedimento abpap INNER JOIN atencao_basica_procedimento_atendimento abpa ON abpa.id = abpap.procedimento_atendimento_id INNER JOIN atencao_basica_procedimento abp ON abp.id = abpa.procedimento_id INNER JOIN sigtap.ocupacao o ON o.id = abp.ocupacao_id INNER JOIN sigtap.procedimento p ON p.id = abpap.procedimento_id WHERE abpa.paciente_id = cadastro_paciente.id AND abp.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abp.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 6 MONTH) AND abp.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND p.codigo = '" . Procedimento::AFERICAO_PRESSAO_ARTERIAL . "' AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_visita_domiciliar abvd INNER JOIN sigtap.ocupacao o ON o.id = abvd.usuario_ocupacao_id WHERE abvd.paciente_id = cadastro_paciente.id AND abvd.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abvd.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 6 MONTH) AND abvd.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abvd.afericao_pa IS NOT NULL AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ), 1, 0 ) ) AS boa_pratica_b "), DB::raw(" SUM( IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual abai INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = cadastro_paciente.id AND abai.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abai.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abai.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abai.peso IS NOT NULL AND abai.altura IS NOT NULL AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_procedimento_atendimento abpa INNER JOIN atencao_basica_procedimento abp ON abp.id = abpa.procedimento_id INNER JOIN sigtap.ocupacao o ON o.id = abp.ocupacao_id WHERE abpa.paciente_id = cadastro_paciente.id AND abp.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abp.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abp.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abpa.peso IS NOT NULL AND abpa.altura IS NOT NULL AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_atividade_coletiva_participante abacp INNER JOIN atencao_basica_atividade_coletiva abac ON abac.id = abacp.atividade_coletiva_id INNER JOIN sigtap.ocupacao o ON o.id = abac.usuario_ocupacao_id WHERE abacp.paciente_id = cadastro_paciente.id AND abac.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abac.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abac.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abacp.peso IS NOT NULL AND abacp.altura IS NOT NULL AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_visita_domiciliar abvd INNER JOIN sigtap.ocupacao o ON o.id = abvd.usuario_ocupacao_id WHERE abvd.paciente_id = cadastro_paciente.id AND abvd.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abvd.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abvd.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abvd.peso IS NOT NULL AND abvd.altura IS NOT NULL AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ), 1, 0 ) ) AS boa_pratica_c "), DB::raw(" SUM( IF( ( SELECT COUNT(*) >= 2 AND TIMESTAMPDIFF ( DAY, MIN(abvd.data_usuario_responsavel), MAX(abvd.data_usuario_responsavel) ) >= 30 FROM atencao_basica_visita_domiciliar abvd INNER JOIN sigtap.ocupacao o ON o.id = abvd.usuario_ocupacao_id WHERE abvd.paciente_id = cadastro_paciente.id AND abvd.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abvd.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abvd.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND ( o.codigo = '322255' OR o.codigo = '515105' ) ), 1, 0 ) ) AS boa_pratica_d "), DB::raw(" SUM( IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual_exame_solicitado_avaliado abaies INNER JOIN atencao_basica_atendimento_individual abai on abai.id = abaies.atendimento_individual_id INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = cadastro_paciente.id AND abai.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abai.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abai.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abaies.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::HEMOGLOBINA_GLICADA . " AND ( abaies.solicitado = TRUE OR abaies.avaliado = TRUE ) AND ( o.codigo LIKE '2231%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ), 1, 0 ) ) AS boa_pratica_e "), DB::raw(" SUM( IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual_procedimento abaip INNER JOIN atencao_basica_atendimento_individual abai on abai.id = abaip.atendimento_individual_id INNER JOIN sigtap.procedimento p ON p.id = abaip.procedimento_id INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = cadastro_paciente.id AND abai.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abai.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abai.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND p.codigo = '" . Procedimento::EXAME_DO_PE_DIABETICO . "' AND ( o.codigo LIKE '2231%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2239%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' ) LIMIT 1 ), 1, 0 ) ) AS boa_pratica_f "), ]) ->join('cadastro_paciente', 'cadastro_paciente.id', 'atencao_basica_cadastro_individual.paciente_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_cadastro_individual.equipe_id') ->join('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id') ->join('atencao_basica_atendimento_individual', fn ($q) => $q ->on('atencao_basica_atendimento_individual.paciente_id', 'cadastro_paciente.id') ->where('atencao_basica_atendimento_individual.id', fn ($q) => $q ->select('atendimento_individual2.id') ->from('atencao_basica_atendimento_individual AS atendimento_individual2') ->whereColumn('atendimento_individual2.paciente_id', 'cadastro_paciente.id') ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_problema_condicao AS problema_condicao') ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'problema_condicao.ciap_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'problema_condicao.cid_id') ->whereColumn('problema_condicao.atendimento_individual_id', 'atendimento_individual2.id') ->where(fn ($q) => $q ->whereIn('ciap.codigo', self::getCiapsDiabetes()) ->orWhereIn('cid.codigo', self::getCidsDiabetes()) ) ) ->orWhereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_condicao_avaliada AS atendimento_individual_condicao_avaliada') ->whereColumn('atendimento_individual_condicao_avaliada.atendimento_individual_id', 'atendimento_individual2.id') ->where('atendimento_individual_condicao_avaliada.condicao_avaliada_id', CondicaoAvaliada::DIABETES) ) ) ->where('atendimento_individual2.data_usuario_responsavel', '<=', $params->periodo['end']->format('Y-m-d')) ->orderBy('atendimento_individual2.data_usuario_responsavel') ->limit(1) ) ) ->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id') ->leftJoin('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar', 'cadastro_domiciliar.domicilio_id', 'cadastro_cidadao.domicilio_id') ->leftJoin('cadastro_obito', fn ($j) => $j->on('cadastro_obito.cidadao_id', 'cadastro_paciente.cidadao_id')->whereNull('cadastro_obito.deleted_at')) ->whereIn('atencao_basica_parametrizacao_area.tipo_id', [AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA, AreaTipo::EQUIPE_DE_ATENCAO_PRIMARIA]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('atencao_basica_cadastro_individual.saida_cidadao_id') ->orWhere('atencao_basica_cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('atencao_basica_cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('atencao_basica_cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('cadastro_obito.obito_em') ->orWhere('cadastro_obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->when($params->unidade_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.unidade_id', $id)) ->when($params->equipe_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.id', $id)) ->when($params->sexo_id, fn ($q, $id) => $q->where('cadastro_cidadao.sexo_id', $id)) ->when($params->idade_anos_minimo || $params->idade_meses_minimo || $params->idade_dias_minimo, function ($q) use ($params) { $data = self::getIdadeCalculada( $params->idade_anos_minimo, $params->idade_meses_minimo, $params->idade_dias_minimo ); $q->where('cadastro_cidadao.data_nascimento', '<=', $data); }) ->when($params->idade_anos_maximo || $params->idade_meses_maximo || $params->idade_dias_maximo, function ($q) use ($params) { $data = self::getIdadeCalculada( $params->idade_anos_maximo, $params->idade_meses_maximo, $params->idade_dias_maximo ); $q->where('cadastro_cidadao.data_nascimento', '>=', $data); }) ->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_paciente.id', $id)) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('cadastro_cidadao.domicilio_id') ->where(fn ($sub) => $sub ->whereNull('cadastro_domiciliar.fora_area') ->orWhere('cadastro_domiciliar.fora_area', 0) )) ->groupBy([ 'nome_fantasia', 'equipe_id', 'microarea_id', 'equipe_descricao', ]) ->get() ->map(function ($query) use ($params) { $numerador = 0; $numerador += in_array('A', $params->boas_praticas) ? $query->boa_pratica_a * 20 : 0; $numerador += in_array('B', $params->boas_praticas) ? $query->boa_pratica_b * 15 : 0; $numerador += in_array('C', $params->boas_praticas) ? $query->boa_pratica_c * 15 : 0; $numerador += in_array('D', $params->boas_praticas) ? $query->boa_pratica_d * 20 : 0; $numerador += in_array('E', $params->boas_praticas) ? $query->boa_pratica_e * 15 : 0; $numerador += in_array('F', $params->boas_praticas) ? $query->boa_pratica_f * 15 : 0; $resultado = $query->denominador > 0 ? round(($numerador / ($query->denominador * 100)) * 100, 2) : null; $classificacao = null; if ($resultado !== null) { if ($resultado > 75) { $classificacao = 'Ótimo'; } else if ($resultado > 50) { $classificacao = 'Bom'; } else if ($resultado > 25) { $classificacao = 'Suficiente'; } else { $classificacao = 'Regular'; } } $percentualBoasPraticasA = in_array('A', $params->boas_praticas) && $query->denominador > 0 ? round(($query->boa_pratica_a / $query->denominador) * 100, 2) : null; $percentualBoasPraticasB = in_array('B', $params->boas_praticas) && $query->denominador > 0 ? round(($query->boa_pratica_b / $query->denominador) * 100, 2) : null; $percentualBoasPraticasC = in_array('C', $params->boas_praticas) && $query->denominador > 0 ? round(($query->boa_pratica_c / $query->denominador) * 100, 2) : null; $percentualBoasPraticasD = in_array('D', $params->boas_praticas) && $query->denominador > 0 ? round(($query->boa_pratica_d / $query->denominador) * 100, 2) : null; $percentualBoasPraticasE = in_array('E', $params->boas_praticas) && $query->denominador > 0 ? round(($query->boa_pratica_e / $query->denominador) * 100, 2) : null; $percentualBoasPraticasF = in_array('F', $params->boas_praticas) && $query->denominador > 0 ? round(($query->boa_pratica_f / $query->denominador) * 100, 2) : null; return [ 'pacientes' => explode('#', $query->pacientes), 'unidade_nome_fantasia' => $query->unidade_nome_fantasia, 'equipe_descricao' => $query->equipe_descricao, 'denominador' => $query->denominador, 'numerador' => $numerador, 'resultado' => $resultado, 'classificacao' => $classificacao, 'percentual_boas_praticas_a' => $percentualBoasPraticasA, 'percentual_boas_praticas_b' => $percentualBoasPraticasB, 'percentual_boas_praticas_c' => $percentualBoasPraticasC, 'percentual_boas_praticas_d' => $percentualBoasPraticasD, 'percentual_boas_praticas_e' => $percentualBoasPraticasE, 'percentual_boas_praticas_f' => $percentualBoasPraticasF, 'boa_pratica_a' => $query->boa_pratica_a, 'boa_pratica_b' => $query->boa_pratica_b, 'boa_pratica_c' => $query->boa_pratica_c, 'boa_pratica_d' => $query->boa_pratica_d, 'boa_pratica_e' => $query->boa_pratica_e, 'boa_pratica_f' => $query->boa_pratica_f, ]; }); $itensAgrupados = self::setOrderByAgrupados($itensAgrupados); $itensDesagrupados = collect(); if (DataUtil::getBooleanValueFromStringBoolean($params->busca_ativa)) { $itensDesagrupados = DB::table('atencao_basica_cadastro_individual') ->select([ 'atencao_basica_atendimento_individual.data_usuario_responsavel AS data_atendimento', 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw(" CONCAT ( CASE WHEN atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', atencao_basica_parametrizacao_area.numero_ine) ELSE '' END, CASE WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL AND atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL THEN 'Área: ' ELSE '' END, COALESCE(atencao_basica_parametrizacao_area.descricao, ''), CASE WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL AND (atencao_basica_parametrizacao_area.numero_ine IS NOT NULL OR atencao_basica_parametrizacao_area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL THEN 'Microárea: ' ELSE '' END, COALESCE(atencao_basica_parametrizacao_microarea.descricao, '') ) AS equipe_descricao "), DB::raw(" CASE WHEN area_domicilio.descricao IS NULL AND microarea_domicilio.descricao IS NULL THEN 'Não informada' ELSE CONCAT( 'Área: ', COALESCE(area_domicilio.descricao, 'Não informada'), ' / Microárea: ', COALESCE(microarea_domicilio.descricao, 'Não informada') ) END AS area_microarea_domicilio "), 'cadastro_cidadao.nome AS paciente_nome', 'cadastro_sexo.descricao AS paciente_sexo_descricao', 'cadastro_cidadao.data_nascimento AS paciente_data_nascimento', 'atencao_basica_parametrizacao_area.tipo_id AS area_tipo_id', DB::raw(" IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual abai INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = cadastro_paciente.id AND abai.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abai.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 6 MONTH) AND abai.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND ( o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' ) LIMIT 1 ), 1, 0 ) AS boa_pratica_a "), DB::raw(" IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual abai INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = cadastro_paciente.id AND abai.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abai.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 6 MONTH) AND abai.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abai.pressao_arterial IS NOT NULL AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_procedimento_atendimento_procedimento abpap INNER JOIN atencao_basica_procedimento_atendimento abpa ON abpa.id = abpap.procedimento_atendimento_id INNER JOIN atencao_basica_procedimento abp ON abp.id = abpa.procedimento_id INNER JOIN sigtap.ocupacao o ON o.id = abp.ocupacao_id INNER JOIN sigtap.procedimento p ON p.id = abpap.procedimento_id WHERE abpa.paciente_id = cadastro_paciente.id AND abp.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abp.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 6 MONTH) AND abp.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND p.codigo = '" . Procedimento::AFERICAO_PRESSAO_ARTERIAL . "' AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_visita_domiciliar abvd INNER JOIN sigtap.ocupacao o ON o.id = abvd.usuario_ocupacao_id WHERE abvd.paciente_id = cadastro_paciente.id AND abvd.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abvd.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 6 MONTH) AND abvd.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abvd.afericao_pa IS NOT NULL AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ), 1, 0 ) AS boa_pratica_b "), DB::raw(" IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual abai INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = cadastro_paciente.id AND abai.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abai.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abai.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abai.peso IS NOT NULL AND abai.altura IS NOT NULL AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_procedimento_atendimento abpa INNER JOIN atencao_basica_procedimento abp ON abp.id = abpa.procedimento_id INNER JOIN sigtap.ocupacao o ON o.id = abp.ocupacao_id WHERE abpa.paciente_id = cadastro_paciente.id AND abp.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abp.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abp.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abpa.peso IS NOT NULL AND abpa.altura IS NOT NULL AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_atividade_coletiva_participante abacp INNER JOIN atencao_basica_atividade_coletiva abac ON abac.id = abacp.atividade_coletiva_id INNER JOIN sigtap.ocupacao o ON o.id = abac.usuario_ocupacao_id WHERE abacp.paciente_id = cadastro_paciente.id AND abac.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abac.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abac.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abacp.peso IS NOT NULL AND abacp.altura IS NOT NULL AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_visita_domiciliar abvd INNER JOIN sigtap.ocupacao o ON o.id = abvd.usuario_ocupacao_id WHERE abvd.paciente_id = cadastro_paciente.id AND abvd.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abvd.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abvd.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abvd.peso IS NOT NULL AND abvd.altura IS NOT NULL AND ( o.codigo = '515105' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ), 1, 0 ) AS boa_pratica_c "), DB::raw(" IF( ( SELECT COUNT(*) >= 2 AND TIMESTAMPDIFF ( DAY, MIN(abvd.data_usuario_responsavel), MAX(abvd.data_usuario_responsavel) ) >= 30 FROM atencao_basica_visita_domiciliar abvd INNER JOIN sigtap.ocupacao o ON o.id = abvd.usuario_ocupacao_id WHERE abvd.paciente_id = cadastro_paciente.id AND abvd.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abvd.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abvd.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND ( o.codigo = '322255' OR o.codigo = '515105' ) ), 1, 0 ) AS boa_pratica_d "), DB::raw(" IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual_exame_solicitado_avaliado abaies INNER JOIN atencao_basica_atendimento_individual abai on abai.id = abaies.atendimento_individual_id INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = cadastro_paciente.id AND abai.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abai.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abai.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND abaies.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::HEMOGLOBINA_GLICADA . " AND ( abaies.solicitado = TRUE OR abaies.avaliado = TRUE ) AND ( o.codigo LIKE '2231%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '3222%' ) LIMIT 1 ), 1, 0 ) AS boa_pratica_e "), DB::raw(" IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual_procedimento abaip INNER JOIN atencao_basica_atendimento_individual abai on abai.id = abaip.atendimento_individual_id INNER JOIN sigtap.procedimento p ON p.id = abaip.procedimento_id INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = cadastro_paciente.id AND abai.data_usuario_responsavel >= atencao_basica_atendimento_individual.data_usuario_responsavel AND abai.data_usuario_responsavel >= DATE_SUB('" . $params->periodo['end']->format('Y-m-d') . "', INTERVAL 12 MONTH) AND abai.data_usuario_responsavel <= '" . $params->periodo['end']->format('Y-m-d') . "' AND p.codigo = '" . Procedimento::EXAME_DO_PE_DIABETICO . "' AND ( o.codigo LIKE '2231%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2235%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2239%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' ) LIMIT 1 ), 1, 0 ) AS boa_pratica_f "), ]) ->join('cadastro_paciente', 'cadastro_paciente.id', 'atencao_basica_cadastro_individual.paciente_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->join('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao.sexo_id') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_cadastro_individual.equipe_id') ->join('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'atencao_basica_parametrizacao_equipe.unidade_id') ->join('atencao_basica_atendimento_individual', fn ($q) => $q ->on('atencao_basica_atendimento_individual.paciente_id', 'cadastro_paciente.id') ->where('atencao_basica_atendimento_individual.id', fn ($q) => $q ->select('atendimento_individual2.id') ->from('atencao_basica_atendimento_individual AS atendimento_individual2') ->whereColumn('atendimento_individual2.paciente_id', 'cadastro_paciente.id') ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_problema_condicao AS problema_condicao') ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'problema_condicao.ciap_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'problema_condicao.cid_id') ->whereColumn('problema_condicao.atendimento_individual_id', 'atendimento_individual2.id') ->where(fn ($q) => $q ->whereIn('ciap.codigo', self::getCiapsDiabetes()) ->orWhereIn('cid.codigo', self::getCidsDiabetes()) ) ) ->orWhereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_condicao_avaliada AS atendimento_individual_condicao_avaliada') ->whereColumn('atendimento_individual_condicao_avaliada.atendimento_individual_id', 'atendimento_individual2.id') ->where('atendimento_individual_condicao_avaliada.condicao_avaliada_id', CondicaoAvaliada::DIABETES) ) ) ->where('atendimento_individual2.data_usuario_responsavel', '<=', $params->periodo['end']->format('Y-m-d')) ->orderBy('atendimento_individual2.data_usuario_responsavel') ->limit(1) ) ) ->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id') ->leftJoin('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar', 'cadastro_domiciliar.domicilio_id', 'cadastro_cidadao.domicilio_id') ->leftJoin('atencao_basica_parametrizacao_microarea AS microarea_domicilio', 'microarea_domicilio.id', 'cadastro_domiciliar.microarea_id') ->leftJoin('atencao_basica_parametrizacao_area AS area_domicilio', 'area_domicilio.id', 'microarea_domicilio.area_id') ->leftJoin('cadastro_obito', fn ($j) => $j->on('cadastro_obito.cidadao_id', 'cadastro_paciente.cidadao_id')->whereNull('cadastro_obito.deleted_at')) ->whereIn('atencao_basica_parametrizacao_area.tipo_id', [AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA, AreaTipo::EQUIPE_DE_ATENCAO_PRIMARIA]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('atencao_basica_cadastro_individual.saida_cidadao_id') ->orWhere('atencao_basica_cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('atencao_basica_cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('atencao_basica_cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('cadastro_obito.obito_em') ->orWhere('cadastro_obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->when($params->unidade_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.unidade_id', $id)) ->when($params->equipe_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.id', $id)) ->when($params->sexo_id, fn ($q, $id) => $q->where('cadastro_cidadao.sexo_id', $id)) ->when($params->idade_anos_minimo || $params->idade_meses_minimo || $params->idade_dias_minimo, function ($q) use ($params) { $data = self::getIdadeCalculada( $params->idade_anos_minimo, $params->idade_meses_minimo, $params->idade_dias_minimo ); $q->where('cadastro_cidadao.data_nascimento', '<=', $data); }) ->when($params->idade_anos_maximo || $params->idade_meses_maximo || $params->idade_dias_maximo, function ($q) use ($params) { $data = self::getIdadeCalculada( $params->idade_anos_maximo, $params->idade_meses_maximo, $params->idade_dias_maximo ); $q->where('cadastro_cidadao.data_nascimento', '>=', $data); }) ->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_paciente.id', $id)) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('cadastro_cidadao.domicilio_id') ->where(fn ($sub) => $sub ->whereNull('cadastro_domiciliar.fora_area') ->orWhere('cadastro_domiciliar.fora_area', 0) )) ->get() ->map(function ($query) use ($params) { $pontuacaoTotal = 0; $pontuacaoTotal += in_array('A', $params->boas_praticas) ? $query->boa_pratica_a * 20 : 0; $pontuacaoTotal += in_array('B', $params->boas_praticas) ? $query->boa_pratica_b * 15 : 0; $pontuacaoTotal += in_array('C', $params->boas_praticas) ? $query->boa_pratica_c * 15 : 0; $pontuacaoTotal += in_array('D', $params->boas_praticas) ? $query->boa_pratica_d * 20 : 0; $pontuacaoTotal += in_array('E', $params->boas_praticas) ? $query->boa_pratica_e * 15 : 0; $pontuacaoTotal += in_array('F', $params->boas_praticas) ? $query->boa_pratica_f * 15 : 0; return [ 'unidade_nome_fantasia' => $query->unidade_nome_fantasia, 'equipe_descricao' => $query->equipe_descricao, 'area_microarea_domicilio' => $query->area_microarea_domicilio, 'paciente_nome' => $query->paciente_nome, 'paciente_sexo_descricao' => $query->paciente_sexo_descricao, 'paciente_data_nascimento' => Carbon::parse($query->paciente_data_nascimento)->format('d/m/Y'), 'paciente_idade' => Carbon::parse($query->paciente_data_nascimento)->diffInYears(Carbon::parse($query->data_atendimento)), 'boa_pratica_a' => in_array('A', $params->boas_praticas) ? $query->boa_pratica_a : 0, 'boa_pratica_b' => in_array('B', $params->boas_praticas) ? $query->boa_pratica_b : 0, 'boa_pratica_c' => in_array('C', $params->boas_praticas) ? $query->boa_pratica_c : 0, 'boa_pratica_d' => in_array('D', $params->boas_praticas) ? $query->boa_pratica_d : 0, 'boa_pratica_e' => in_array('E', $params->boas_praticas) ? $query->boa_pratica_e : 0, 'boa_pratica_f' => in_array('F', $params->boas_praticas) ? $query->boa_pratica_f : 0, 'area_tipo_id' => $query->area_tipo_id, 'pontuacao_total' => $pontuacaoTotal, ]; }); $itensDesagrupados = $itensDesagrupados->filter(function ($itemAgrupado) use ($params) { foreach ($params->boas_praticas as $boaPratica) { if (!$itemAgrupado['boa_pratica_' . Str::lower($boaPratica)]) { return true; } } return false; })->values(); $itensDesagrupados = self::setOrderByDesagrupados($itensDesagrupados); } $totalizadores = [ 'pacientes' => $itensAgrupados->pluck('pacientes')->flatten()->unique()->count(), 'equipes' => $itensAgrupados->unique('equipe_id')->flatten()->count(), 'microareas' => $itensAgrupados->unique('microarea_id')->flatten()->count(), 'denominador' => $itensAgrupados->sum('denominador'), 'numerador' => $itensAgrupados->sum('numerador'), 'resultado' => $itensAgrupados->sum('numerador') > 0 && $itensAgrupados->sum('denominador') > 0 ? round(($itensAgrupados->sum('numerador') / ($itensAgrupados->sum('denominador') * 100)) * 100, 2) : 0, 'percentual_boas_praticas_a' => in_array('A', $params->boas_praticas) && $itensAgrupados->sum('boa_pratica_a') > 0 ? round(($itensAgrupados->sum('boa_pratica_a') / $itensAgrupados->sum('denominador')) * 100, 2) : 0, 'percentual_boas_praticas_b' => in_array('B', $params->boas_praticas) && $itensAgrupados->sum('boa_pratica_b') > 0 ? round(($itensAgrupados->sum('boa_pratica_b') / $itensAgrupados->sum('denominador')) * 100, 2) : 0, 'percentual_boas_praticas_c' => in_array('C', $params->boas_praticas) && $itensAgrupados->sum('boa_pratica_c') > 0 ? round(($itensAgrupados->sum('boa_pratica_c') / $itensAgrupados->sum('denominador')) * 100, 2) : 0, 'percentual_boas_praticas_d' => in_array('D', $params->boas_praticas) && $itensAgrupados->sum('boa_pratica_d') > 0 ? round(($itensAgrupados->sum('boa_pratica_d') / $itensAgrupados->sum('denominador')) * 100, 2) : 0, 'percentual_boas_praticas_e' => in_array('E', $params->boas_praticas) && $itensAgrupados->sum('boa_pratica_e') > 0 ? round(($itensAgrupados->sum('boa_pratica_e') / $itensAgrupados->sum('denominador')) * 100, 2) : 0, 'percentual_boas_praticas_f' => in_array('F', $params->boas_praticas) && $itensAgrupados->sum('boa_pratica_f') > 0 ? round(($itensAgrupados->sum('boa_pratica_f') / $itensAgrupados->sum('denominador')) * 100, 2) : 0, ]; return [ 'totalizadores' => $totalizadores, 'itens_agrupados' => $itensAgrupados, 'itens_desagrupados' => $itensDesagrupados, ]; } public static function create() { return [ 'form' => [ 'anos' => self::getAnos(), 'quadrimestres' => self::getQuadrimestres(), 'unidades' => [], 'equipes' => [], 'boas_praticas' => self::getBoasPraticas(), 'sexos' => [], ], 'model' => [ 'periodo' => ['start' => null, 'end' => null], 'ano' => null, 'quadrimestre' => null, 'unidade_id' => null, 'equipe_id' => null, 'boas_praticas' => ['A', 'B', 'C', 'D', 'E', 'F'], 'sexo_id' => null, 'idade_anos_minimo' => null, 'idade_meses_minimo' => null, 'idade_dias_minimo' => null, 'idade_anos_maximo' => null, 'idade_meses_maximo' => null, 'idade_dias_maximo' => null, 'paciente' => null, 'fora_area' => false, ], ]; } public static function list() { $params = self::getParams(); switch (request()->listar) { case 'unidades': { return [ 'unidades' => self::getUnidades($params), 'equipes' => self::getEquipes($params), 'sexos' => self::getSexos($params), ]; } case 'equipes': { return [ 'equipes' => self::getEquipes($params), 'sexos' => self::getSexos($params), ]; } } } public static function autocomplete() { $params = self::getParams(); return DB::table('cadastro_paciente') ->select([ 'cadastro_paciente.id', 'cadastro_cidadao.nome', 'cadastro_cidadao.nome_social', 'cadastro_cidadao.data_nascimento', 'cadastro_cidadao.cns', ]) ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->leftJoin('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar', 'cadastro_domiciliar.domicilio_id', 'cadastro_cidadao.domicilio_id') ->when($params->sexo_id, fn ($q, $id) => $q->where('cadastro_cidadao.sexo_id', $id)) ->when($params->idade_anos_minimo || $params->idade_meses_minimo || $params->idade_dias_minimo, function ($q) use ($params) { $data = self::getIdadeCalculada( $params->idade_anos_minimo, $params->idade_meses_minimo, $params->idade_dias_minimo ); $q->where('cadastro_cidadao.data_nascimento', '<=', $data); }) ->when($params->idade_anos_maximo || $params->idade_meses_maximo || $params->idade_dias_maximo, function ($q) use ($params) { $data = self::getIdadeCalculada( $params->idade_anos_maximo, $params->idade_meses_maximo, $params->idade_dias_maximo ); $q->where('cadastro_cidadao.data_nascimento', '>=', $data); }) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('cadastro_cidadao.domicilio_id') ->where(fn ($sub) => $sub ->whereNull('cadastro_domiciliar.fora_area') ->orWhere('cadastro_domiciliar.fora_area', 0) )) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_atendimento_individual_problema_condicao') ->join('atencao_basica_atendimento_individual', 'atencao_basica_atendimento_individual.id', 'atencao_basica_atendimento_individual_problema_condicao.atendimento_individual_id') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_individual.equipe_id') ->leftJoin('geral_ciap', 'geral_ciap.id', 'atencao_basica_atendimento_individual_problema_condicao.ciap_id') ->leftJoin('sigtap.cid', 'cid.id', 'atencao_basica_atendimento_individual_problema_condicao.cid_id') ->where('atencao_basica_atendimento_individual_problema_condicao.situacao_id', ProblemaCondicaoSituacao::ATIVO) ->where(fn ($q) => $q ->whereIn('geral_ciap.codigo', self::getCiapsDiabetes()) ->oRwhereIn('cid.codigo', self::getCidsDiabetes()) ) ->where('atencao_basica_atendimento_individual_problema_condicao.inicio', '<', $params->periodo['end']) ->where(fn ($q) => $q ->whereNull('atencao_basica_atendimento_individual_problema_condicao.fim') ->orWhere('atencao_basica_atendimento_individual_problema_condicao.fim', '>=', $params->periodo['start']) ) ->when($params->unidade_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.unidade_id', $id)) ->when($params->equipe_id, fn ($q, $id) => $q->where('atencao_basica_parametrizacao_equipe.id', $id)) ->whereColumn('atencao_basica_atendimento_individual.paciente_id', 'cadastro_paciente.id') ); } private static function getParams() { $params = (object) [ 'unidade_id' => request()->get('unidade_id'), 'equipe_id' => request()->get('equipe_id'), 'boas_praticas' => request()->get('boas_praticas', []), 'sexo_id' => request()->get('sexo_id'), 'idade_anos_minimo' => request()->get('idade_anos_minimo'), 'idade_meses_minimo' => request()->get('idade_meses_minimo'), 'idade_dias_minimo' => request()->get('idade_dias_minimo'), 'idade_anos_maximo' => request()->get('idade_anos_maximo'), 'idade_meses_maximo' => request()->get('idade_meses_maximo'), 'idade_dias_maximo' => request()->get('idade_dias_maximo'), 'paciente_id' => request()->get('paciente_id'), 'busca_ativa' => request()->get('busca_ativa'), 'fora_area' => DataUtil::getBooleanValueFromStringBoolean(request()->get('fora_area', 'false')), ]; if (is_null(request()->get('periodo')['start']) || is_null(request()->get('periodo')['end'])) { $ano = request()->get('ano'); $quadrimestre = request()->get('quadrimestre'); if ($quadrimestre == 1) { $mesInicial = 1; $mesFinal = 4; } else if ($quadrimestre == 2) { $mesInicial = 5; $mesFinal = 8; } else { $mesInicial = 9; $mesFinal = 12; } $params->periodo = [ 'start' => Carbon::create($ano, $mesInicial, 1)->setTime(0, 0, 0), 'end' => Carbon::create($ano, $mesFinal)->endOfMonth()->setTime(23, 59, 59) ]; } else { $params->periodo = [ 'start' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['start'])->setTime(0, 0, 0), 'end' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['end'])->setTime(23, 59, 59) ]; } return $params; } private static function getAnos() { $anos = []; foreach (range(Carbon::now()->year, 2020) as $ano) { $anos[] = ['value' => $ano, 'text' => $ano]; } return $anos; } private static function getQuadrimestres() { return [ ['value' => 1, 'text' => '1º Janeiro a Abril'], ['value' => 2, 'text' => '2º Maio a Agosto'], ['value' => 3, 'text' => '3º Setembro a Dezembro'], ]; } private static function getUnidades() { $params = self::getParams(); return DB::table('cadastro_unidade') ->select([ 'cadastro_unidade.id', 'cadastro_unidade.nome_fantasia', ]) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_cadastro_individual AS cadastro_individual') ->join('cadastro_paciente AS paciente', 'paciente.id', 'cadastro_individual.paciente_id') ->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id') ->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id') ->join('atencao_basica_atendimento_individual AS atendimento_individual', fn ($q) => $q ->on('atendimento_individual.paciente_id', 'paciente.id') ->where('atendimento_individual.id', fn ($q) => $q ->select('atendimento_individual2.id') ->from('atencao_basica_atendimento_individual AS atendimento_individual2') ->whereColumn('atendimento_individual2.paciente_id', 'paciente.id') ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_problema_condicao AS problema_condicao') ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'problema_condicao.ciap_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'problema_condicao.cid_id') ->whereColumn('problema_condicao.atendimento_individual_id', 'atendimento_individual2.id') ->where(fn ($q) => $q ->whereIn('ciap.codigo', self::getCiapsDiabetes()) ->orWhereIn('cid.codigo', self::getCidsDiabetes()) ) ) ->orWhereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_condicao_avaliada AS atendimento_individual_condicao_avaliada') ->whereColumn('atendimento_individual_condicao_avaliada.atendimento_individual_id', 'atendimento_individual2.id') ->where('atendimento_individual_condicao_avaliada.condicao_avaliada_id', CondicaoAvaliada::DIABETES) ) ) ->where('atendimento_individual2.data_usuario_responsavel', '<=', $params->periodo['end']->format('Y-m-d')) ->orderBy('atendimento_individual2.data_usuario_responsavel') ->limit(1) ) ) ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'paciente.cidadao_id') ->whereNull('obito.deleted_at') ) ->whereColumn('equipe.unidade_id', 'cadastro_unidade.id') ->whereIn('area.tipo_id', [AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA, AreaTipo::EQUIPE_DE_ATENCAO_PRIMARIA]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ) ->orderBy('cadastro_unidade.nome_fantasia') ->get(); } private static function getEquipes() { $params = self::getParams(); return DB::table('atencao_basica_parametrizacao_equipe AS equipe') ->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id') ->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id') ->select([ 'equipe.id AS id', DB::raw("CONCAT( CASE WHEN area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area.numero_ine) ELSE '' END, CASE WHEN area.descricao IS NOT NULL AND area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN area.descricao IS NOT NULL THEN 'Área: ' ELSE '' END, COALESCE(area.descricao, ''), CASE WHEN microarea.descricao IS NOT NULL AND (area.numero_ine IS NOT NULL OR area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN microarea.descricao IS NOT NULL THEN 'Microárea: ' ELSE '' END, COALESCE(microarea.descricao, '') ) AS descricao"), ]) ->whereIn('area.tipo_id', [AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA, AreaTipo::EQUIPE_DE_ATENCAO_PRIMARIA]) ->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id)) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_cadastro_individual AS cadastro_individual') ->join('cadastro_paciente AS paciente', 'paciente.id', 'cadastro_individual.paciente_id') ->join('atencao_basica_atendimento_individual AS atendimento_individual', fn ($q) => $q ->on('atendimento_individual.paciente_id', 'paciente.id') ->where('atendimento_individual.id', fn ($q) => $q ->select('atendimento_individual2.id') ->from('atencao_basica_atendimento_individual AS atendimento_individual2') ->whereColumn('atendimento_individual2.paciente_id', 'paciente.id') ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_problema_condicao AS problema_condicao') ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'problema_condicao.ciap_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'problema_condicao.cid_id') ->whereColumn('problema_condicao.atendimento_individual_id', 'atendimento_individual2.id') ->where(fn ($q) => $q ->whereIn('ciap.codigo', self::getCiapsDiabetes()) ->orWhereIn('cid.codigo', self::getCidsDiabetes()) ) ) ->orWhereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_condicao_avaliada AS atendimento_individual_condicao_avaliada') ->whereColumn('atendimento_individual_condicao_avaliada.atendimento_individual_id', 'atendimento_individual2.id') ->where('atendimento_individual_condicao_avaliada.condicao_avaliada_id', CondicaoAvaliada::DIABETES) ) ) ->where('atendimento_individual2.data_usuario_responsavel', '<=', $params->periodo['end']->format('Y-m-d')) ->orderBy('atendimento_individual2.data_usuario_responsavel') ->limit(1) ) ) ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'paciente.cidadao_id') ->whereNull('obito.deleted_at') ) ->whereColumn('cadastro_individual.equipe_id', 'equipe.id') ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ) ->orderBy('descricao') ->get(); } private static function getBoasPraticas() { return [ ['value' => 'A', 'text' => 'A - Consulta nos últimos 6 meses'], ['value' => 'B', 'text' => 'B - Pressão arterial nos últimos 6 meses'], ['value' => 'C', 'text' => 'C - Peso e altura nos últimos 12 meses'], ['value' => 'D', 'text' => 'D - 2 visitas domiciliares'], ['value' => 'E', 'text' => 'E - Hemoglobina glicada'], ['value' => 'F', 'text' => 'F - Avaliação dos pés'], ]; } private static function getSexos() { $params = self::getParams(); return DB::table('cadastro_sexo AS sexo') ->select( 'sexo.id', 'sexo.descricao', ) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_cadastro_individual AS cadastro_individual') ->join('cadastro_paciente AS paciente', 'paciente.id', 'cadastro_individual.paciente_id') ->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id') ->join('atencao_basica_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id') ->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id') ->join('atencao_basica_atendimento_individual AS atendimento_individual', fn ($q) => $q ->on('atendimento_individual.paciente_id', 'paciente.id') ->where('atendimento_individual.id', fn ($q) => $q ->select('atendimento_individual2.id') ->from('atencao_basica_atendimento_individual AS atendimento_individual2') ->whereColumn('atendimento_individual2.paciente_id', 'paciente.id') ->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_problema_condicao AS problema_condicao') ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'problema_condicao.ciap_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'problema_condicao.cid_id') ->whereColumn('problema_condicao.atendimento_individual_id', 'atendimento_individual2.id') ->where(fn ($q) => $q ->whereIn('ciap.codigo', self::getCiapsDiabetes()) ->orWhereIn('cid.codigo', self::getCidsDiabetes()) ) ) ->orWhereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual_condicao_avaliada AS atendimento_individual_condicao_avaliada') ->whereColumn('atendimento_individual_condicao_avaliada.atendimento_individual_id', 'atendimento_individual2.id') ->where('atendimento_individual_condicao_avaliada.condicao_avaliada_id', CondicaoAvaliada::DIABETES) ) ) ->where('atendimento_individual2.data_usuario_responsavel', '<=', $params->periodo['end']->format('Y-m-d')) ->orderBy('atendimento_individual2.data_usuario_responsavel') ->limit(1) ) ) ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'paciente.cidadao_id') ->whereNull('obito.deleted_at') ) ->whereColumn('cidadao.sexo_id', 'sexo.id') ->whereIn('area.tipo_id', [AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA, AreaTipo::EQUIPE_DE_ATENCAO_PRIMARIA]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id)) ->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id)) ) ->orderBy('sexo.descricao') ->get(); } private static function getCiapsDiabetes() { return collect([ 'T89', 'T90', ]); } private static function getCidsDiabetes() { return collect([ 'E10.0', 'E10.1', 'E10.2', 'E10.3', 'E10.4', 'E10.5', 'E10.6', 'E10.7', 'E10.8', 'E10.9', 'E11', 'E11.0', 'E11.1', 'E11.2', 'E11.3', 'E11.4', 'E11.5', 'E11.6', 'E11.7', 'E11.8', 'E11.9', 'E14', 'E14.0', 'E14.1', 'E14.2', 'E14.3', 'E14.4', 'E14.5', 'E14.6', 'E14.7', 'E14.8', 'E14.9', ]); } private static function getIdadeCalculada($anos, $meses, $dias) { $data = Carbon::now(); if ($anos) { $data->subYears($anos); } if ($meses) { $data->subMonths($meses); } if ($dias) { $data->subDays($dias); } return $data; } private static function setOrderByAgrupados($builder) { $columns = [ 'unidade_nome_fantasia' => 'unidade_nome_fantasia', 'equipe_descricao' => 'equipe_descricao', 'denominador' => 'denominador', 'numerador' => 'numerador', 'resultado' => 'resultado', 'classificacao' => 'classificacao', ]; if (is_null(request()->sort_by_agrupados)) { return $builder->sort(function ($a, $b) use ($columns) { foreach ($columns as $column) { $valA = Str::lower(Str::ascii((data_get($a, $column)))); $valB = Str::lower(Str::ascii((data_get($b, $column)))); $result = $valA <=> $valB; if ($result !== 0) { return $result; } } return 0; })->values(); } $column = $columns[request()->sort_by_agrupados] ?? null; if (!$column) { return $builder->values(); } $desc = DataUtil::getBooleanValueFromStringBoolean(request()->sort_desc_agrupados); $sorted = $builder->sort(function ($a, $b) use ($column, $desc) { $valA = Str::lower(Str::ascii(data_get($a, $column))); $valB = Str::lower(Str::ascii(data_get($b, $column))); $result = $valA <=> $valB; return $desc ? -$result : $result; }); return $sorted->values(); } private static function setOrderByDesagrupados($builder) { $columns = [ 'unidade_nome_fantasia' => 'unidade_nome_fantasia', 'equipe_descricao' => 'equipe_descricao', 'paciente_nome' => 'paciente_nome', 'paciente_sexo_descricao' => 'paciente_sexo_descricao', 'paciente_data_nascimento' => 'paciente_data_nascimento', 'paciente_idade' => 'paciente_idade', ]; if (is_null(request()->sort_by_desagrupados)) { return $builder->sort(function ($a, $b) use ($columns) { foreach ($columns as $column) { $valA = Str::lower(Str::ascii(data_get($a, $column))); $valB = Str::lower(Str::ascii(data_get($b, $column))); $result = $valA <=> $valB; if ($result !== 0) { return $result; } } return 0; })->values(); } $column = $columns[request()->sort_by_desagrupados] ?? null; if (!$column) { return $builder->values(); } $desc = DataUtil::getBooleanValueFromStringBoolean(request()->sort_desc_desagrupados); $sorted = $builder->sort(function ($a, $b) use ($column, $desc) { $valA = Str::lower(Str::ascii(data_get($a, $column))); $valB = Str::lower(Str::ascii(data_get($b, $column))); $result = $valA <=> $valB; return $desc ? -$result : $result; }); return $sorted->values(); } }