equipes; $totalizadores = $resultadoEquipes->totalizadores; $pacientes = $params->busca_ativa ? self::getResultadoPorPacientes($params) : collect(); return (object) [ 'equipes' => $equipes, 'pacientes' => $pacientes, 'totalizadores' => $totalizadores, ]; } private static function getResultadoPorEquipes($params) { $equipesBuilder = DB::table('cadastro_paciente AS paciente') ->join('atencao_basica_cadastro_individual AS cadastro_individual', 'cadastro_individual.paciente_id', '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('problema_condicao.situacao_id', ProblemaCondicaoSituacao::ATIVO) ->whereNull('problema_condicao.problema_condicao_anterior_id') ->where(fn ($q) => $q ->whereIn('ciap.codigo', self::getCiapsGestacao()) ->orWhereIn('cid.codigo', self::getCidsGestacao()) ) ) ->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') ->whereIn('atendimento_individual_condicao_avaliada.condicao_avaliada_id',[ CondicaoAvaliada::PRE_NATAL, CondicaoAvaliada::PUERICULTURA, CondicaoAvaliada::PUERPERIO_ATE_42_DIAS ]) ) ) ->whereNotNull('atendimento_individual2.data_ultima_menstruacao') ->where('atendimento_individual2.data_ultima_menstruacao', '<=', $params->periodo['end']) ->orderBy('atendimento_individual2.data_usuario_responsavel') ->limit(1) ) ) ->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('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id') ->join( 'atencao_basica_atendimento_individual_problema_condicao AS problema_condicao', 'problema_condicao.atendimento_individual_id', 'atendimento_individual.id' ) ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'problema_condicao.ciap_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'problema_condicao.cid_id') ->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id') ->leftJoin('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar', 'cadastro_domiciliar.domicilio_id', 'cidadao.domicilio_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'cidadao.id') ->whereNull('obito.deleted_at') ) ->select([ 'unidade.nome_fantasia AS unidade_nome_fantasia', 'microarea.id AS microarea_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 equipe_descricao"), DB::raw("COUNT(DISTINCT (atendimento_individual.paciente_id)) AS denominador"), DB::raw("GROUP_CONCAT(DISTINCT(atendimento_individual.paciente_id) SEPARATOR '#') AS pacientes"), DB::raw("SUM( IF(EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id INNER JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 84 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' ) AND p.codigo IN ( '" . Procedimento::CONSULTA_DE_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_PRIMARIA_EXCETO_MEDICO . "', '" . Procedimento::CONSULTA_MEDICA_EM_ATENCAO_PRIMARIA . "', '" . Procedimento::CONSULTA_PRE_NATAL . "', '" . Procedimento::CONSULTA_ATENDIMENTO_DOMICILIAR . "', '" . Procedimento::TELECONSULTA_NA_ATENCAO_PRIMARIA . "' ) ), 1, 0) ) AS quantidade_boa_pratica_a"), DB::raw("SUM( IF(( SELECT COUNT(DISTINCT (ai.id)) FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id INNER JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' ) AND p.codigo IN ( '" . Procedimento::CONSULTA_DE_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_PRIMARIA_EXCETO_MEDICO . "', '" . Procedimento::CONSULTA_MEDICA_EM_ATENCAO_PRIMARIA . "', '" . Procedimento::CONSULTA_PRE_NATAL . "', '" . Procedimento::CONSULTA_ATENDIMENTO_DOMICILIAR . "', '" . Procedimento::TELECONSULTA_NA_ATENCAO_PRIMARIA . "' ) ) >= 7, 1, 0) ) AS quantidade_boa_pratica_b"), DB::raw("SUM( IF(( ( SELECT COUNT(DISTINCT (ai.id)) FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ai.pressao_arterial IS NOT NULL OR p.codigo = '" . Procedimento::AFERICAO_PRESSAO_ARTERIAL . "' ) ) + ( SELECT COUNT(DISTINCT (pa.id)) FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( pa.afericao_pa IS NOT NULL OR proc.codigo = '" . Procedimento::AFERICAO_PRESSAO_ARTERIAL . "' ) ) + ( SELECT COUNT(vd.id) FROM atencao_basica_visita_domiciliar AS vd INNER JOIN sigtap.ocupacao AS o ON o.id = vd.usuario_ocupacao_id INNER JOIN atencao_basica_parametrizacao_equipe e ON e.id = vd.equipe_id INNER JOIN atencao_basica_parametrizacao_area a ON a.id = e.area_id WHERE a.tipo_id = " . AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA . " AND vd.paciente_id = atendimento_individual.paciente_id AND vd.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND vd.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND vd.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND vd.afericao_pa IS NOT NULL ) ) >= 7, 1, 0) ) AS quantidade_boa_pratica_c"), DB::raw("SUM( IF(( ( SELECT COUNT(ai.id) FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( (ai.peso IS NOT NULL AND ai.altura IS NOT NULL) OR EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual_procedimento AS aip INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE aip.atendimento_individual_id = ai.id AND p.codigo = '" . Procedimento::AVALIACAO_ANTROPOMETRICA . "' ) OR ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual_procedimento AS aip INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE aip.atendimento_individual_id = ai.id AND p.codigo = '" . Procedimento::MEDICAO_DE_PESO . "' ) AND EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual_procedimento AS aip INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE aip.atendimento_individual_id = ai.id AND p.codigo = '" . Procedimento::MEDICAO_DE_ALTURA . "' ) ) ) ) + ( SELECT COUNT(pa.id) FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( (pa.peso IS NOT NULL AND pa.altura IS NOT NULL) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento_procedimento AS pap INNER JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id WHERE pap.procedimento_atendimento_id = pa.id AND proc.codigo = '" . Procedimento::AVALIACAO_ANTROPOMETRICA . "' ) OR ( EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento_procedimento AS pap INNER JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id WHERE pap.procedimento_atendimento_id = pa.id AND proc.codigo = '" . Procedimento::MEDICAO_DE_PESO . "' ) AND EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento_procedimento AS pap INNER JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id WHERE pap.procedimento_atendimento_id = pa.id AND proc.codigo = '" . Procedimento::MEDICAO_DE_ALTURA . "' ) ) ) ) + ( SELECT COUNT(vd.id) FROM atencao_basica_visita_domiciliar AS vd INNER JOIN sigtap.ocupacao AS o ON o.id = vd.usuario_ocupacao_id INNER JOIN atencao_basica_parametrizacao_equipe e ON e.id = vd.equipe_id INNER JOIN atencao_basica_parametrizacao_area a ON a.id = e.area_id WHERE a.tipo_id = " . AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA . " AND vd.paciente_id = atendimento_individual.paciente_id AND vd.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND vd.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND vd.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND vd.peso IS NOT NULL AND vd.altura IS NOT NULL ) ) >= 7, 1, 0) ) AS quantidade_boa_pratica_d"), DB::raw("SUM( IF(( SELECT COUNT(*) FROM atencao_basica_visita_domiciliar AS vd INNER JOIN sigtap.ocupacao AS o ON o.id = vd.usuario_ocupacao_id INNER JOIN atencao_basica_parametrizacao_equipe e ON e.id = vd.equipe_id INNER JOIN atencao_basica_parametrizacao_area a ON a.id = e.area_id WHERE a.tipo_id = " . AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA . " AND vd.paciente_id = atendimento_individual.paciente_id AND vd.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND vd.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND vd.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND vd.data_usuario_responsavel >= ( SELECT ai.data_usuario_responsavel FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id INNER JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' ) AND p.codigo IN ( '" . Procedimento::CONSULTA_DE_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_PRIMARIA_EXCETO_MEDICO . "', '" . Procedimento::CONSULTA_MEDICA_EM_ATENCAO_PRIMARIA . "', '" . Procedimento::CONSULTA_PRE_NATAL . "', '" . Procedimento::CONSULTA_ATENDIMENTO_DOMICILIAR . "', '" . Procedimento::TELECONSULTA_NA_ATENCAO_PRIMARIA . "' ) GROUP BY ai.id ORDER BY ai.data_usuario_responsavel LIMIT 1 ) AND ( o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) ) >= 3, 1, 0) ) AS quantidade_boa_pratica_e"), DB::raw("SUM( IF(EXISTS( SELECT 1 FROM imunizacao_registro_aplicacao ra INNER JOIN imunizacao_entrada_vacina ev ON ev.id = ra.entrada_vacina_id INNER JOIN cadastro_vacina v ON v.id = ev.vacina_id WHERE ra.paciente_id = atendimento_individual.paciente_id AND ra.data_aplicacao >= atendimento_individual.data_ultima_menstruacao AND ra.data_aplicacao <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ra.data_aplicacao <= '{$params->periodo['end']->format('Y-m-d')}' AND ra.data_aplicacao > DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 133 DAY) AND v.codigo = " . VacinaCodigo::D_TPA_ADULTO . " ) OR EXISTS( SELECT 1 FROM imunizacao_registro_atualizacao ra INNER JOIN cadastro_vacina v ON v.id = ra.vacina_id WHERE ra.paciente_id = atendimento_individual.paciente_id AND ra.data_atualizacao >= atendimento_individual.data_ultima_menstruacao AND ra.data_atualizacao <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ra.data_atualizacao <= '{$params->periodo['end']->format('Y-m-d')}' AND ra.data_atualizacao > DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 133 DAY) AND v.codigo = " . VacinaCodigo::D_TPA_ADULTO . " ), 1, 0) ) AS quantidade_boa_pratica_f"), DB::raw("SUM( IF(( ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id LEFT JOIN atencao_basica_atendimento_individual_exame_solicitado_avaliado esv ON esv.atendimento_individual_id = ai.id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ( esv.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::SOROLOGIA_DE_SIFILIS . " AND esv.avaliado = 1 ) OR p.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS . "', '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS_NA_GESTANTE_OU_PAI_PARCEIRO . "', '" . Procedimento::TESTE_RAPIDO_TREPONEMICO_SIFILIS_EM_GESTANTE . "', '" . Procedimento::TESTE_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS_EM_GESTANTE . "' ) ) ) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id LEFT JOIN atencao_basica_procedimento_atendimento_teste_rapido tr ON tr.procedimento_atendimento_id = pa.id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND p.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( tr.teste_rapido_id = " . TesteRapido::SIFILIS . " OR proc.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS . "', '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS_NA_GESTANTE_OU_PAI_PARCEIRO . "', '" . Procedimento::TESTE_RAPIDO_TREPONEMICO_SIFILIS_EM_GESTANTE . "', '" . Procedimento::TESTE_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS_EM_GESTANTE . "' ) ) ) ) AND ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id LEFT JOIN atencao_basica_atendimento_individual_exame_solicitado_avaliado esv ON esv.atendimento_individual_id = ai.id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ( esv.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::SOROLOGIA_PARA_HIV . " AND esv.avaliado = 1 ) OR p.codigo IN ( '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_HIV_NA_GESTANTE_OU_PAI_PARCEIRO . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_ANTICORPOS_ANTI_HIV_EM_GESTANTE . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_INFECCAO_PELO_HIV . "', '". Procedimento::DETECCAO_RAPIDA_DA_CARGA_VIRAL_DO_HIV . "', '". Procedimento::QUANTIFICACAO_DA_CARGA_VIRAL_DO_HIV_RNA . "' ) ) ) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id LEFT JOIN atencao_basica_procedimento_atendimento_teste_rapido tr ON tr.procedimento_atendimento_id = pa.id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND p.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( tr.teste_rapido_id = " . TesteRapido::HIV . " OR proc.codigo IN ( '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_HIV_NA_GESTANTE_OU_PAI_PARCEIRO . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_ANTICORPOS_ANTI_HIV_EM_GESTANTE . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_INFECCAO_PELO_HIV . "', '". Procedimento::DETECCAO_RAPIDA_DA_CARGA_VIRAL_DO_HIV . "', '". Procedimento::QUANTIFICACAO_DA_CARGA_VIRAL_DO_HIV_RNA . "' ) ) ) ) AND ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id LEFT JOIN atencao_basica_atendimento_individual_exame_solicitado_avaliado esv ON esv.atendimento_individual_id = ai.id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ( esv.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::HEPATITE_B . " AND esv.avaliado = 1 ) OR p.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_INFECCAO_PELO_HBV . "', '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DO_ANTIGENO_DE_SUPERFICIE_DO_VIRUS_DA_HEPATITE_B_H_BS_AG_EM_GESTANTE . "', '" . Procedimento::PESQUISA_DE_ANTICORPOS_IG_G_E_IG_M_CONTRA_O_ANTIGENO_CENTRAL_DO_VIRUS_DA_HEPATITE_B_ANTI_HBC_TOTAL . "', '" . Procedimento::PESQUISA_DE_ANTIGENO_DE_SUPERFICIE_DO_VIRUS_DA_HEPATITE_B_H_BS_AG . "', '" . Procedimento::IDENTIFICACAO_DO_VIRUS_DA_HEPATITE_B_POR_PCR_QUANTITATIVO . "' ) ) ) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id LEFT JOIN atencao_basica_procedimento_atendimento_teste_rapido tr ON tr.procedimento_atendimento_id = pa.id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND p.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( tr.teste_rapido_id = " . TesteRapido::HEPATITE_B . " OR proc.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_INFECCAO_PELO_HBV . "', '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DO_ANTIGENO_DE_SUPERFICIE_DO_VIRUS_DA_HEPATITE_B_H_BS_AG_EM_GESTANTE . "', '" . Procedimento::PESQUISA_DE_ANTICORPOS_IG_G_E_IG_M_CONTRA_O_ANTIGENO_CENTRAL_DO_VIRUS_DA_HEPATITE_B_ANTI_HBC_TOTAL . "', '" . Procedimento::PESQUISA_DE_ANTIGENO_DE_SUPERFICIE_DO_VIRUS_DA_HEPATITE_B_H_BS_AG . "', '" . Procedimento::IDENTIFICACAO_DO_VIRUS_DA_HEPATITE_B_POR_PCR_QUANTITATIVO . "' ) ) ) ) AND ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id LEFT JOIN atencao_basica_atendimento_individual_exame_solicitado_avaliado esv ON esv.atendimento_individual_id = ai.id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ( esv.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::HEPATITE_C . " AND esv.avaliado = 1 ) OR p.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_HEPATITE_C . "', '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_ANTICORPOS_CONTRA_O_VIRUS_DA_HEPATITE_C_EM_GESTANTE . "', '" . Procedimento::DETECCAO_DE_RNA_DO_VIRUS_DA_HEPATITE_C_QUALITATIVO . "', '" . Procedimento::PESQUISA_DE_ANTICORPOS_CONTRA_O_VIRUS_DA_HEPATITE_C_ANTI_HCV . "' ) ) ) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id LEFT JOIN atencao_basica_procedimento_atendimento_teste_rapido tr ON tr.procedimento_atendimento_id = pa.id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND p.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( tr.teste_rapido_id = " . TesteRapido::HEPATITE_C . " OR proc.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_HEPATITE_C . "', '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_ANTICORPOS_CONTRA_O_VIRUS_DA_HEPATITE_C_EM_GESTANTE . "', '" . Procedimento::DETECCAO_DE_RNA_DO_VIRUS_DA_HEPATITE_C_QUALITATIVO . "', '" . Procedimento::PESQUISA_DE_ANTICORPOS_CONTRA_O_VIRUS_DA_HEPATITE_C_ANTI_HCV . "' ) ) ) ) ), 1, 0) ) AS quantidade_boa_pratica_g"), DB::raw("SUM( IF(( ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id LEFT JOIN atencao_basica_atendimento_individual_exame_solicitado_avaliado esv ON esv.atendimento_individual_id = ai.id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel > DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 182 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ( esv.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::SOROLOGIA_DE_SIFILIS . " AND esv.avaliado = 1 ) OR p.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS . "', '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS_NA_GESTANTE_OU_PAI_PARCEIRO . "', '" . Procedimento::TESTE_RAPIDO_TREPONEMICO_SIFILIS_EM_GESTANTE . "', '" . Procedimento::TESTE_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS_EM_GESTANTE . "' ) ) ) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id LEFT JOIN atencao_basica_procedimento_atendimento_teste_rapido tr ON tr.procedimento_atendimento_id = pa.id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND p.data_usuario_responsavel > DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 182 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( tr.teste_rapido_id = " . TesteRapido::SIFILIS . " OR proc.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS . "', '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS_NA_GESTANTE_OU_PAI_PARCEIRO . "', '" . Procedimento::TESTE_RAPIDO_TREPONEMICO_SIFILIS_EM_GESTANTE . "', '" . Procedimento::TESTE_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS_EM_GESTANTE . "' ) ) ) ) AND ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id LEFT JOIN atencao_basica_atendimento_individual_exame_solicitado_avaliado esv ON esv.atendimento_individual_id = ai.id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel > DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 182 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ( esv.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::SOROLOGIA_PARA_HIV . " AND esv.avaliado = 1 ) OR p.codigo IN ( '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_HIV_NA_GESTANTE_OU_PAI_PARCEIRO . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_ANTICORPOS_ANTI_HIV_EM_GESTANTE . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_INFECCAO_PELO_HIV . "', '". Procedimento::DETECCAO_RAPIDA_DA_CARGA_VIRAL_DO_HIV . "', '". Procedimento::QUANTIFICACAO_DA_CARGA_VIRAL_DO_HIV_RNA . "' ) ) ) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id LEFT JOIN atencao_basica_procedimento_atendimento_teste_rapido tr ON tr.procedimento_atendimento_id = pa.id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND p.data_usuario_responsavel > DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 182 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( tr.teste_rapido_id = " . TesteRapido::HIV . " OR proc.codigo IN ( '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_HIV_NA_GESTANTE_OU_PAI_PARCEIRO . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_ANTICORPOS_ANTI_HIV_EM_GESTANTE . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_INFECCAO_PELO_HIV . "', '". Procedimento::DETECCAO_RAPIDA_DA_CARGA_VIRAL_DO_HIV . "', '". Procedimento::QUANTIFICACAO_DA_CARGA_VIRAL_DO_HIV_RNA . "' ) ) ) ) ), 1, 0) ) AS quantidade_boa_pratica_h"), DB::raw("SUM( IF(EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id INNER JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel > COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' ) AND p.codigo IN ( '" . Procedimento::CONSULTA_DE_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_PRIMARIA_EXCETO_MEDICO . "', '" . Procedimento::CONSULTA_MEDICA_EM_ATENCAO_PRIMARIA . "', '" . Procedimento::CONSULTA_PUERPERAL . "', '" . Procedimento::CONSULTA_ATENDIMENTO_DOMICILIAR . "', '" . Procedimento::TELECONSULTA_NA_ATENCAO_PRIMARIA . "' ) ), 1, 0) ) AS quantidade_boa_pratica_i"), DB::raw("SUM( IF(EXISTS( SELECT 1 FROM atencao_basica_visita_domiciliar AS vd INNER JOIN sigtap.ocupacao AS o ON o.id = vd.usuario_ocupacao_id INNER JOIN atencao_basica_parametrizacao_equipe e ON e.id = vd.equipe_id INNER JOIN atencao_basica_parametrizacao_area a ON a.id = e.area_id WHERE a.tipo_id = " . AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA . " AND vd.paciente_id = atendimento_individual.paciente_id AND vd.data_usuario_responsavel > COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND vd.data_usuario_responsavel <= DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) AND vd.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) ), 1, 0) ) AS quantidade_boa_pratica_j"), DB::raw("SUM( IF(EXISTS( SELECT 1 FROM atencao_basica_atendimento_odontologico AS ao INNER JOIN sigtap.ocupacao AS o ON o.id = ao.ocupacao_id WHERE ao.paciente_id = atendimento_individual.paciente_id AND ao.data_atendimento >= atendimento_individual.data_ultima_menstruacao AND ao.data_atendimento <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ao.data_atendimento <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2232%' OR o.codigo LIKE '3224%' ) ), 1, 0) ) AS quantidade_boa_pratica_k"), ]) ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereNull('problema_condicao.problema_condicao_anterior_id') ->whereNotNull('atendimento_individual.data_ultima_menstruacao') ->where('atendimento_individual.data_ultima_menstruacao', '<=', $params->periodo['end']) ->whereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) >= ?", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->whereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) < cadastro_individual.motivo_saida_data") ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) < obito.obito_em") ) ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual AS ai') ->join('atencao_basica_atendimento_individual_problema_condicao AS pc', 'pc.atendimento_individual_id', 'ai.id') ->leftJoin('geral_ciap AS gc', 'gc.id', 'pc.ciap_id') ->leftJoin('sigtap.cid AS sc', 'sc.id', 'pc.cid_id') ->whereColumn('ai.paciente_id', 'atendimento_individual.paciente_id') ->where(fn ($q) => $q ->whereIn('gc.codigo', self::getCiapsEncerramGestacao()) ->orWhereIn('sc.codigo', self::getCidsEncerramGestacao()) ) ->whereColumn('ai.data_usuario_responsavel', '>=', 'atendimento_individual.data_ultima_menstruacao') ->whereRaw("ai.data_usuario_responsavel <= (COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)))") ) ->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)) ->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id)) ->when(!is_null($params->idade_minima), fn ($q) => $q ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, CURRENT_DATE) >= ?", [$params->idade_minima])) ->when(!is_null($params->idade_maxima), fn ($q) => $q ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, CURRENT_DATE) <= ?", [$params->idade_maxima])) ->when($params->paciente_id, fn ($q, $id) => $q->where('atendimento_individual.paciente_id', $id)) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('cadastro_domiciliar.id') ->where(fn ($sub) => $sub ->whereNull('cadastro_domiciliar.fora_area') ->orWhere('cadastro_domiciliar.fora_area', 0) )) ->groupBy( 'unidade.nome_fantasia', 'microarea.id', 'equipe_descricao' ); self::setOrderByEquipe($equipesBuilder); $equipes = $equipesBuilder->get(); $pacientesIds = []; $microareasIds = []; $equipes->each(function ($equipe) use (&$pacientesIds, &$microareasIds, $params) { $equipe->numerador = 0; $pontuacao = 0; if (in_array('A', $params->boas_praticas)) { $equipe->numerador += $equipe->quantidade_boa_pratica_a * 10; $equipe->boa_pratica_a = self::round(($equipe->quantidade_boa_pratica_a / $equipe->denominador) * 100); if ($equipe->quantidade_boa_pratica_a > 0) { $pontuacao += 10; } } if (in_array('B', $params->boas_praticas)) { $equipe->numerador += $equipe->quantidade_boa_pratica_b * 9; $equipe->boa_pratica_b = self::round(($equipe->quantidade_boa_pratica_b / $equipe->denominador) * 100); if ($equipe->quantidade_boa_pratica_b > 0) { $pontuacao += 9; } } if (in_array('C', $params->boas_praticas)) { $equipe->numerador += $equipe->quantidade_boa_pratica_c * 9; $equipe->boa_pratica_c = self::round(($equipe->quantidade_boa_pratica_c / $equipe->denominador) * 100); if ($equipe->quantidade_boa_pratica_c > 0) { $pontuacao += 9; } } if (in_array('D', $params->boas_praticas)) { $equipe->numerador += $equipe->quantidade_boa_pratica_d * 9; $equipe->boa_pratica_d = self::round(($equipe->quantidade_boa_pratica_d / $equipe->denominador) * 100); if ($equipe->quantidade_boa_pratica_d > 0) { $pontuacao += 9; } } if (in_array('E', $params->boas_praticas)) { $equipe->numerador += $equipe->quantidade_boa_pratica_e * 9; $equipe->boa_pratica_e = self::round(($equipe->quantidade_boa_pratica_e / $equipe->denominador) * 100); if ($equipe->quantidade_boa_pratica_e > 0) { $pontuacao += 9; } } if (in_array('F', $params->boas_praticas)) { $equipe->numerador += $equipe->quantidade_boa_pratica_f * 9; $equipe->boa_pratica_f = self::round(($equipe->quantidade_boa_pratica_f / $equipe->denominador) * 100); if ($equipe->quantidade_boa_pratica_f > 0) { $pontuacao += 9; } } if (in_array('G', $params->boas_praticas)) { $equipe->numerador += $equipe->quantidade_boa_pratica_g * 9; $equipe->boa_pratica_g = self::round(($equipe->quantidade_boa_pratica_g / $equipe->denominador) * 100); if ($equipe->quantidade_boa_pratica_g > 0) { $pontuacao += 9; } } if (in_array('H', $params->boas_praticas)) { $equipe->numerador += $equipe->quantidade_boa_pratica_h * 9; $equipe->boa_pratica_h = self::round(($equipe->quantidade_boa_pratica_h / $equipe->denominador) * 100); if ($equipe->quantidade_boa_pratica_h > 0) { $pontuacao += 9; } } if (in_array('I', $params->boas_praticas)) { $equipe->numerador += $equipe->quantidade_boa_pratica_i * 9; $equipe->boa_pratica_i = self::round(($equipe->quantidade_boa_pratica_i / $equipe->denominador) * 100); if ($equipe->quantidade_boa_pratica_i > 0) { $pontuacao += 9; } } if (in_array('J', $params->boas_praticas)) { $equipe->numerador += $equipe->quantidade_boa_pratica_j * 9; $equipe->boa_pratica_j = self::round(($equipe->quantidade_boa_pratica_j / $equipe->denominador) * 100); if ($equipe->quantidade_boa_pratica_j > 0) { $pontuacao += 9; } } if (in_array('K', $params->boas_praticas)) { $equipe->numerador += $equipe->quantidade_boa_pratica_k * 9; $equipe->boa_pratica_k = self::round(($equipe->quantidade_boa_pratica_k / $equipe->denominador) * 100); if ($equipe->quantidade_boa_pratica_k > 0) { $pontuacao += 9; } } $equipe->resultado = self::round(($equipe->numerador / ($equipe->denominador * 100)) * 100); $classificacao = self::getClassificacao($pontuacao); $equipe->classificacao_resultado_ordenacao = $classificacao['ordenacao']; $equipe->classificacao_resultado = $classificacao['texto']; $pacientesIds = array_merge($pacientesIds, explode('#', $equipe->pacientes)); if (!is_null($equipe->microarea_id)) { $microareasIds[] = $equipe->microarea_id; } unset($equipe->pacientes, $equipe->microarea_id); }); $columnsSortBy = collect([ 'numerador', 'resultado', 'classificacao_resultado', 'boa_pratica_a', 'boa_pratica_b', 'boa_pratica_c', 'boa_pratica_d', 'boa_pratica_e', 'boa_pratica_f', 'boa_pratica_g', 'boa_pratica_h', 'boa_pratica_i', 'boa_pratica_j', 'boa_pratica_k', ]); if ($columnsSortBy->contains(request()->equipe_sort_by)) { $sortBy = request()->equipe_sort_by === 'classificacao_resultado' ? 'classificacao_resultado_ordenacao' : request()->equipe_sort_by; $equipes = (DataUtil::getBooleanValueFromStringBoolean(request()->equipe_sort_desc) ? $equipes->sortByDesc($sortBy) : $equipes->sortBy($sortBy) )->values(); } $denominador = $totalPacientes = collect($pacientesIds)->unique()->count(); $totalEquipes = $equipes->count(); $totalMicroareas = collect($microareasIds)->unique()->count(); $numerador = $equipes->sum('numerador'); $resultado = 0; $boaPraticaA = 0; $boaPraticaB = 0; $boaPraticaC = 0; $boaPraticaD = 0; $boaPraticaE = 0; $boaPraticaF = 0; $boaPraticaG = 0; $boaPraticaH = 0; $boaPraticaI = 0; $boaPraticaJ = 0; $boaPraticaK = 0; if ($denominador > 0) { $resultado = self::round(($numerador / ($denominador * 100)) * 100); if (in_array('A', $params->boas_praticas)) { $boaPraticaA = self::round(($equipes->sum('quantidade_boa_pratica_a') / $denominador) * 100); } if (in_array('B', $params->boas_praticas)) { $boaPraticaB = self::round(($equipes->sum('quantidade_boa_pratica_b') / $denominador) * 100); } if (in_array('C', $params->boas_praticas)) { $boaPraticaC = self::round(($equipes->sum('quantidade_boa_pratica_c') / $denominador) * 100); } if (in_array('D', $params->boas_praticas)) { $boaPraticaD = self::round(($equipes->sum('quantidade_boa_pratica_d') / $denominador) * 100); } if (in_array('E', $params->boas_praticas)) { $boaPraticaE = self::round(($equipes->sum('quantidade_boa_pratica_e') / $denominador) * 100); } if (in_array('F', $params->boas_praticas)) { $boaPraticaF = self::round(($equipes->sum('quantidade_boa_pratica_f') / $denominador) * 100); } if (in_array('G', $params->boas_praticas)) { $boaPraticaG = self::round(($equipes->sum('quantidade_boa_pratica_g') / $denominador) * 100); } if (in_array('H', $params->boas_praticas)) { $boaPraticaH = self::round(($equipes->sum('quantidade_boa_pratica_h') / $denominador) * 100); } if (in_array('I', $params->boas_praticas)) { $boaPraticaI = self::round(($equipes->sum('quantidade_boa_pratica_i') / $denominador) * 100); } if (in_array('J', $params->boas_praticas)) { $boaPraticaJ = self::round(($equipes->sum('quantidade_boa_pratica_j') / $denominador) * 100); } if (in_array('K', $params->boas_praticas)) { $boaPraticaK = self::round(($equipes->sum('quantidade_boa_pratica_k') / $denominador) * 100); } } return (object) [ 'equipes' => $equipes, 'totalizadores' => (object) [ 'total_pacientes' => $totalPacientes, 'total_equipes' => $totalEquipes, 'total_microareas' => $totalMicroareas, 'denominador' => $denominador, 'numerador' => $numerador, 'resultado' => $resultado, 'boa_pratica_a' => $boaPraticaA, 'boa_pratica_b' => $boaPraticaB, 'boa_pratica_c' => $boaPraticaC, 'boa_pratica_d' => $boaPraticaD, 'boa_pratica_e' => $boaPraticaE, 'boa_pratica_f' => $boaPraticaF, 'boa_pratica_g' => $boaPraticaG, 'boa_pratica_h' => $boaPraticaH, 'boa_pratica_i' => $boaPraticaI, 'boa_pratica_j' => $boaPraticaJ, 'boa_pratica_k' => $boaPraticaK, ], ]; } private static function getClassificacao($pontuacao) { if ($pontuacao > 75 && $pontuacao <= 100) { return ['ordenacao' => 'otimo', 'texto' => 'Ótimo']; } else if ($pontuacao > 50 && $pontuacao <= 75) { return ['ordenacao' => 'bom', 'texto' => 'Bom']; } else if ($pontuacao > 25 && $pontuacao <= 50) { return ['ordenacao' => 'suficiente', 'texto' => 'Suficiente']; } return ['ordenacao' => 'regular', 'texto' => 'Regular']; } private static function setOrderByEquipe($builder) { $columns = [ 'unidade_nome_fantasia' => 'unidade.nome_fantasia', 'equipe_descricao' => 'equipe_descricao', 'denominador' => 'denominador', ]; if (is_null(request()->equipe_sort_by) || !isset($columns[request()->equipe_sort_by])) { $builder->orderByRaw(join(', ', $columns)); return; } $column = $columns[request()->equipe_sort_by]; $direction = DataUtil::getBooleanValueFromStringBoolean(request()->equipe_sort_desc) ? 'DESC' : 'ASC'; unset($columns[request()->equipe_sort_by]); $builder->orderByRaw("{$column} {$direction}, " . join(', ', $columns)); } private static function getResultadoPorPacientes($params) { $pacientesBuilder = DB::table('cadastro_paciente as paciente') ->join('cadastro_cidadao as cidadao', 'cidadao.id', 'paciente.cidadao_id') ->join('atencao_basica_cadastro_individual AS cadastro_individual', 'cadastro_individual.paciente_id', '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('problema_condicao.situacao_id', ProblemaCondicaoSituacao::ATIVO) ->whereNull('problema_condicao.problema_condicao_anterior_id') ->where(fn ($q) => $q ->whereIn('ciap.codigo', self::getCiapsGestacao()) ->orWhereIn('cid.codigo', self::getCidsGestacao()) ) ) ->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') ->whereIn('atendimento_individual_condicao_avaliada.condicao_avaliada_id',[ CondicaoAvaliada::PRE_NATAL, CondicaoAvaliada::PUERICULTURA, CondicaoAvaliada::PUERPERIO_ATE_42_DIAS ]) ) ) ->whereNotNull('atendimento_individual2.data_ultima_menstruacao') ->where('atendimento_individual2.data_ultima_menstruacao', '<=', $params->periodo['end']) ->orderBy('atendimento_individual2.data_usuario_responsavel') ->limit(1) ) ) ->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('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id') ->join( 'atencao_basica_atendimento_individual_problema_condicao AS problema_condicao', 'problema_condicao.atendimento_individual_id', 'atendimento_individual.id' ) ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'problema_condicao.ciap_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'problema_condicao.cid_id') ->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id') ->leftJoin('cadastro_sexo AS sexo', 'sexo.id', 'cidadao.sexo_id') ->leftJoin('cadastro_cidadao_telefone AS telefone', fn ($j) => $j ->on('telefone.cidadao_id', 'cidadao.id') ->where('telefone.id', fn ($q) => $q ->select('telefone2.id') ->from('cadastro_cidadao_telefone AS telefone2') ->whereColumn('telefone2.cidadao_id', 'cidadao.id') ->where('telefone2.principal', true) ->limit(1) ) ) ->leftJoin('cadastro_domicilio AS domicilio', 'domicilio.id', 'cidadao.domicilio_id') ->leftJoin('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id') ->leftJoin('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id') ->leftJoin('cadastro_logradouro_tipo AS logradouro_tipo', 'logradouro_tipo.id', 'logradouro.tipo_id') ->leftJoin('cadastro_bairro AS bairro', 'bairro.id', 'logradouro.bairro_id') ->leftJoin('intranet.cadastro_municipio AS municipio', 'municipio.id', 'logradouro.municipio_id') ->leftJoin('intranet.cadastro_estado AS estado', 'estado.id', 'municipio.estado_id') ->leftJoin('cadastro_paciente_responsavel AS paciente_responsavel', 'paciente_responsavel.paciente_id', 'paciente.id') ->leftJoin('cadastro_usuario AS usuario_responsavel', 'usuario_responsavel.id', 'paciente_responsavel.responsavel_usuario_id') ->leftJoin('cadastro_cidadao AS cidadao_responsavel', 'cidadao_responsavel.id', 'usuario_responsavel.cidadao_id') ->leftJoin('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar', 'cadastro_domiciliar.domicilio_id', 'domicilio.id') ->leftJoin('atencao_basica_parametrizacao_microarea AS cadastro_domiciliar_microarea', 'cadastro_domiciliar_microarea.id', 'cadastro_domiciliar.microarea_id') ->leftJoin('atencao_basica_parametrizacao_area AS cadastro_domiciliar_area', 'cadastro_domiciliar_area.id', 'cadastro_domiciliar_microarea.area_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'cidadao.id') ->whereNull('obito.deleted_at') ) ->select( 'unidade.nome_fantasia AS unidade_nome_fantasia', 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 equipe_descricao"), 'area.tipo_id AS area_tipo_id', 'cidadao.nome AS paciente_nome', 'sexo.descricao AS sexo_descricao', DB::raw("CONCAT( CASE WHEN cadastro_domiciliar_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', cadastro_domiciliar_area.numero_ine) ELSE '' END, CASE WHEN cadastro_domiciliar_area.descricao IS NOT NULL AND cadastro_domiciliar_area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN cadastro_domiciliar_area.descricao IS NOT NULL THEN 'Área: ' ELSE '' END, COALESCE(cadastro_domiciliar_area.descricao, ''), CASE WHEN cadastro_domiciliar_microarea.descricao IS NOT NULL AND (cadastro_domiciliar_area.numero_ine IS NOT NULL OR cadastro_domiciliar_area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN cadastro_domiciliar_microarea.descricao IS NOT NULL THEN 'Microárea: ' ELSE '' END, COALESCE(cadastro_domiciliar_microarea.descricao, '') ) AS microarea_descricao"), DB::raw(" CASE WHEN cadastro_domiciliar_area.numero_ine IS NULL AND cadastro_domiciliar_area.descricao IS NULL AND cadastro_domiciliar_microarea.descricao IS NULL THEN 'Não informada' ELSE CONCAT( CASE WHEN cadastro_domiciliar_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', cadastro_domiciliar_area.numero_ine) ELSE '' END, CASE WHEN cadastro_domiciliar_area.descricao IS NOT NULL AND cadastro_domiciliar_area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN cadastro_domiciliar_area.descricao IS NOT NULL THEN 'Área: ' ELSE '' END, COALESCE(cadastro_domiciliar_area.descricao, ''), CASE WHEN cadastro_domiciliar_microarea.descricao IS NOT NULL AND (cadastro_domiciliar_area.numero_ine IS NOT NULL OR cadastro_domiciliar_area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN cadastro_domiciliar_microarea.descricao IS NOT NULL THEN 'Microárea: ' ELSE '' END, COALESCE(cadastro_domiciliar_microarea.descricao, '') ) END AS area_microarea_domicilio "), 'cidadao_responsavel.nome AS usuario_cadastro_nome', 'cidadao.data_nascimento', 'telefone.numero AS telefone_principal', DB::raw("CONCAT( logradouro_tipo.descricao, ' ', logradouro.nome, ', ', IF(endereco.numero IS NULL, 'S/N', endereco.numero), ' - ', bairro.nome, ', ', municipio.nome, ' - ', estado.uf ) AS endereco"), DB::raw("( IF(EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id INNER JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 84 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' ) AND p.codigo IN ( '" . Procedimento::CONSULTA_DE_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_PRIMARIA_EXCETO_MEDICO . "', '" . Procedimento::CONSULTA_MEDICA_EM_ATENCAO_PRIMARIA . "', '" . Procedimento::CONSULTA_PRE_NATAL . "', '" . Procedimento::CONSULTA_ATENDIMENTO_DOMICILIAR . "', '" . Procedimento::TELECONSULTA_NA_ATENCAO_PRIMARIA . "' ) ), 1, 0) ) AS boa_pratica_a"), DB::raw("( IF(( SELECT COUNT(DISTINCT (ai.id)) FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id INNER JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' ) AND p.codigo IN ( '" . Procedimento::CONSULTA_DE_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_PRIMARIA_EXCETO_MEDICO . "', '" . Procedimento::CONSULTA_MEDICA_EM_ATENCAO_PRIMARIA . "', '" . Procedimento::CONSULTA_PRE_NATAL . "', '" . Procedimento::CONSULTA_ATENDIMENTO_DOMICILIAR . "', '" . Procedimento::TELECONSULTA_NA_ATENCAO_PRIMARIA . "' ) ) >= 7, 1, 0) ) AS boa_pratica_b"), DB::raw("( IF(( ( SELECT COUNT(DISTINCT (ai.id)) FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ai.pressao_arterial IS NOT NULL OR p.codigo = '" . Procedimento::AFERICAO_PRESSAO_ARTERIAL . "' ) ) + ( SELECT COUNT(DISTINCT (pa.id)) FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( pa.afericao_pa IS NOT NULL OR proc.codigo = '" . Procedimento::AFERICAO_PRESSAO_ARTERIAL . "' ) ) + ( SELECT COUNT(vd.id) FROM atencao_basica_visita_domiciliar AS vd INNER JOIN sigtap.ocupacao AS o ON o.id = vd.usuario_ocupacao_id INNER JOIN atencao_basica_parametrizacao_equipe e ON e.id = vd.equipe_id INNER JOIN atencao_basica_parametrizacao_area a ON a.id = e.area_id WHERE a.tipo_id = " . AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA . " AND vd.paciente_id = atendimento_individual.paciente_id AND vd.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND vd.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND vd.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND vd.afericao_pa IS NOT NULL ) ) >= 7, 1, 0) ) AS boa_pratica_c"), DB::raw("( IF(( ( SELECT COUNT(ai.id) FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( (ai.peso IS NOT NULL AND ai.altura IS NOT NULL) OR EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual_procedimento AS aip INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE aip.atendimento_individual_id = ai.id AND p.codigo = '" . Procedimento::AVALIACAO_ANTROPOMETRICA . "' ) OR ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual_procedimento AS aip INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE aip.atendimento_individual_id = ai.id AND p.codigo = '" . Procedimento::MEDICAO_DE_PESO . "' ) AND EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual_procedimento AS aip INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE aip.atendimento_individual_id = ai.id AND p.codigo = '" . Procedimento::MEDICAO_DE_ALTURA . "' ) ) ) ) + ( SELECT COUNT(pa.id) FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( (pa.peso IS NOT NULL AND pa.altura IS NOT NULL) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento_procedimento AS pap INNER JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id WHERE pap.procedimento_atendimento_id = pa.id AND proc.codigo = '" . Procedimento::AVALIACAO_ANTROPOMETRICA . "' ) OR ( EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento_procedimento AS pap INNER JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id WHERE pap.procedimento_atendimento_id = pa.id AND proc.codigo = '" . Procedimento::MEDICAO_DE_PESO . "' ) AND EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento_procedimento AS pap INNER JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id WHERE pap.procedimento_atendimento_id = pa.id AND proc.codigo = '" . Procedimento::MEDICAO_DE_ALTURA . "' ) ) ) ) + ( SELECT COUNT(vd.id) FROM atencao_basica_visita_domiciliar AS vd INNER JOIN sigtap.ocupacao AS o ON o.id = vd.usuario_ocupacao_id INNER JOIN atencao_basica_parametrizacao_equipe e ON e.id = vd.equipe_id INNER JOIN atencao_basica_parametrizacao_area a ON a.id = e.area_id WHERE a.tipo_id = " . AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA . " AND vd.paciente_id = atendimento_individual.paciente_id AND vd.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND vd.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND vd.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND vd.peso IS NOT NULL AND vd.altura IS NOT NULL ) ) >= 7, 1, 0) ) AS boa_pratica_d"), DB::raw("( IF(( SELECT COUNT(*) FROM atencao_basica_visita_domiciliar AS vd INNER JOIN sigtap.ocupacao AS o ON o.id = vd.usuario_ocupacao_id INNER JOIN atencao_basica_parametrizacao_equipe e ON e.id = vd.equipe_id INNER JOIN atencao_basica_parametrizacao_area a ON a.id = e.area_id WHERE a.tipo_id = " . AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA . " AND vd.paciente_id = atendimento_individual.paciente_id AND vd.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND vd.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND vd.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND vd.data_usuario_responsavel >= ( SELECT ai.data_usuario_responsavel FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id INNER JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' ) AND p.codigo IN ( '" . Procedimento::CONSULTA_DE_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_PRIMARIA_EXCETO_MEDICO . "', '" . Procedimento::CONSULTA_MEDICA_EM_ATENCAO_PRIMARIA . "', '" . Procedimento::CONSULTA_PRE_NATAL . "', '" . Procedimento::CONSULTA_ATENDIMENTO_DOMICILIAR . "', '" . Procedimento::TELECONSULTA_NA_ATENCAO_PRIMARIA . "' ) GROUP BY ai.id ORDER BY ai.data_usuario_responsavel LIMIT 1 ) AND ( o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) ) >= 3, 1, 0) ) AS boa_pratica_e"), DB::raw("( IF(EXISTS( SELECT 1 FROM imunizacao_registro_aplicacao ra INNER JOIN imunizacao_entrada_vacina ev ON ev.id = ra.entrada_vacina_id INNER JOIN cadastro_vacina v ON v.id = ev.vacina_id WHERE ra.paciente_id = atendimento_individual.paciente_id AND ra.data_aplicacao >= atendimento_individual.data_ultima_menstruacao AND ra.data_aplicacao <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ra.data_aplicacao <= '{$params->periodo['end']->format('Y-m-d')}' AND ra.data_aplicacao > DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 133 DAY) AND v.codigo = " . VacinaCodigo::D_TPA_ADULTO . " ) OR EXISTS( SELECT 1 FROM imunizacao_registro_atualizacao ra INNER JOIN cadastro_vacina v ON v.id = ra.vacina_id WHERE ra.paciente_id = atendimento_individual.paciente_id AND ra.data_atualizacao >= atendimento_individual.data_ultima_menstruacao AND ra.data_atualizacao <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ra.data_atualizacao <= '{$params->periodo['end']->format('Y-m-d')}' AND ra.data_atualizacao > DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 133 DAY) AND v.codigo = " . VacinaCodigo::D_TPA_ADULTO . " ), 1, 0) ) AS boa_pratica_f"), DB::raw("( IF(( ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id LEFT JOIN atencao_basica_atendimento_individual_exame_solicitado_avaliado esv ON esv.atendimento_individual_id = ai.id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ( esv.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::SOROLOGIA_DE_SIFILIS . " AND esv.avaliado = 1 ) OR p.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS . "', '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS_NA_GESTANTE_OU_PAI_PARCEIRO . "', '" . Procedimento::TESTE_RAPIDO_TREPONEMICO_SIFILIS_EM_GESTANTE . "', '" . Procedimento::TESTE_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS_EM_GESTANTE . "' ) ) ) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id LEFT JOIN atencao_basica_procedimento_atendimento_teste_rapido tr ON tr.procedimento_atendimento_id = pa.id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND p.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( tr.teste_rapido_id = " . TesteRapido::SIFILIS . " OR proc.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS . "', '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS_NA_GESTANTE_OU_PAI_PARCEIRO . "', '" . Procedimento::TESTE_RAPIDO_TREPONEMICO_SIFILIS_EM_GESTANTE . "', '" . Procedimento::TESTE_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS_EM_GESTANTE . "' ) ) ) ) AND ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id LEFT JOIN atencao_basica_atendimento_individual_exame_solicitado_avaliado esv ON esv.atendimento_individual_id = ai.id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ( esv.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::SOROLOGIA_PARA_HIV . " AND esv.avaliado = 1 ) OR p.codigo IN ( '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_HIV_NA_GESTANTE_OU_PAI_PARCEIRO . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_ANTICORPOS_ANTI_HIV_EM_GESTANTE . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_INFECCAO_PELO_HIV . "', '". Procedimento::DETECCAO_RAPIDA_DA_CARGA_VIRAL_DO_HIV . "', '". Procedimento::QUANTIFICACAO_DA_CARGA_VIRAL_DO_HIV_RNA . "' ) ) ) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id LEFT JOIN atencao_basica_procedimento_atendimento_teste_rapido tr ON tr.procedimento_atendimento_id = pa.id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND p.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( tr.teste_rapido_id = " . TesteRapido::HIV . " OR proc.codigo IN ( '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_HIV_NA_GESTANTE_OU_PAI_PARCEIRO . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_ANTICORPOS_ANTI_HIV_EM_GESTANTE . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_INFECCAO_PELO_HIV . "', '". Procedimento::DETECCAO_RAPIDA_DA_CARGA_VIRAL_DO_HIV . "', '". Procedimento::QUANTIFICACAO_DA_CARGA_VIRAL_DO_HIV_RNA . "' ) ) ) ) AND ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id LEFT JOIN atencao_basica_atendimento_individual_exame_solicitado_avaliado esv ON esv.atendimento_individual_id = ai.id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ( esv.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::HEPATITE_B . " AND esv.avaliado = 1 ) OR p.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_INFECCAO_PELO_HBV . "', '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DO_ANTIGENO_DE_SUPERFICIE_DO_VIRUS_DA_HEPATITE_B_H_BS_AG_EM_GESTANTE . "', '" . Procedimento::PESQUISA_DE_ANTICORPOS_IG_G_E_IG_M_CONTRA_O_ANTIGENO_CENTRAL_DO_VIRUS_DA_HEPATITE_B_ANTI_HBC_TOTAL . "', '" . Procedimento::PESQUISA_DE_ANTIGENO_DE_SUPERFICIE_DO_VIRUS_DA_HEPATITE_B_H_BS_AG . "', '" . Procedimento::IDENTIFICACAO_DO_VIRUS_DA_HEPATITE_B_POR_PCR_QUANTITATIVO . "' ) ) ) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id LEFT JOIN atencao_basica_procedimento_atendimento_teste_rapido tr ON tr.procedimento_atendimento_id = pa.id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND p.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( tr.teste_rapido_id = " . TesteRapido::HEPATITE_B . " OR proc.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_INFECCAO_PELO_HBV . "', '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DO_ANTIGENO_DE_SUPERFICIE_DO_VIRUS_DA_HEPATITE_B_H_BS_AG_EM_GESTANTE . "', '" . Procedimento::PESQUISA_DE_ANTICORPOS_IG_G_E_IG_M_CONTRA_O_ANTIGENO_CENTRAL_DO_VIRUS_DA_HEPATITE_B_ANTI_HBC_TOTAL . "', '" . Procedimento::PESQUISA_DE_ANTIGENO_DE_SUPERFICIE_DO_VIRUS_DA_HEPATITE_B_H_BS_AG . "', '" . Procedimento::IDENTIFICACAO_DO_VIRUS_DA_HEPATITE_B_POR_PCR_QUANTITATIVO . "' ) ) ) ) AND ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id LEFT JOIN atencao_basica_atendimento_individual_exame_solicitado_avaliado esv ON esv.atendimento_individual_id = ai.id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ( esv.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::HEPATITE_C . " AND esv.avaliado = 1 ) OR p.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_HEPATITE_C . "', '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_ANTICORPOS_CONTRA_O_VIRUS_DA_HEPATITE_C_EM_GESTANTE . "', '" . Procedimento::DETECCAO_DE_RNA_DO_VIRUS_DA_HEPATITE_C_QUALITATIVO . "', '" . Procedimento::PESQUISA_DE_ANTICORPOS_CONTRA_O_VIRUS_DA_HEPATITE_C_ANTI_HCV . "' ) ) ) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id LEFT JOIN atencao_basica_procedimento_atendimento_teste_rapido tr ON tr.procedimento_atendimento_id = pa.id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND p.data_usuario_responsavel <= DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 91 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( tr.teste_rapido_id = " . TesteRapido::HEPATITE_C . " OR proc.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_HEPATITE_C . "', '" . Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_ANTICORPOS_CONTRA_O_VIRUS_DA_HEPATITE_C_EM_GESTANTE . "', '" . Procedimento::DETECCAO_DE_RNA_DO_VIRUS_DA_HEPATITE_C_QUALITATIVO . "', '" . Procedimento::PESQUISA_DE_ANTICORPOS_CONTRA_O_VIRUS_DA_HEPATITE_C_ANTI_HCV . "' ) ) ) ) ), 1, 0) ) AS boa_pratica_g"), DB::raw("( IF(( ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id LEFT JOIN atencao_basica_atendimento_individual_exame_solicitado_avaliado esv ON esv.atendimento_individual_id = ai.id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel > DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 182 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ( esv.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::SOROLOGIA_DE_SIFILIS . " AND esv.avaliado = 1 ) OR p.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS . "', '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS_NA_GESTANTE_OU_PAI_PARCEIRO . "', '" . Procedimento::TESTE_RAPIDO_TREPONEMICO_SIFILIS_EM_GESTANTE . "', '" . Procedimento::TESTE_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS_EM_GESTANTE . "' ) ) ) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id LEFT JOIN atencao_basica_procedimento_atendimento_teste_rapido tr ON tr.procedimento_atendimento_id = pa.id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND p.data_usuario_responsavel > DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 182 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( tr.teste_rapido_id = " . TesteRapido::SIFILIS . " OR proc.codigo IN ( '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS . "', '" . Procedimento::TESTE_RAPIDO_PARA_SIFILIS_NA_GESTANTE_OU_PAI_PARCEIRO . "', '" . Procedimento::TESTE_RAPIDO_TREPONEMICO_SIFILIS_EM_GESTANTE . "', '" . Procedimento::TESTE_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS . "', '" . Procedimento::TESTE_NAO_TREPONEMICO_PARA_DETECCAO_DE_SIFILIS_EM_GESTANTE . "' ) ) ) ) AND ( EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id LEFT JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id LEFT JOIN sigtap.procedimento p ON p.id = aip.procedimento_id LEFT JOIN atencao_basica_atendimento_individual_exame_solicitado_avaliado esv ON esv.atendimento_individual_id = ai.id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND ai.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ai.data_usuario_responsavel > DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 182 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( ( esv.exame_solicitado_avaliado_id = " . ExameSolicitadoAvaliado::SOROLOGIA_PARA_HIV . " AND esv.avaliado = 1 ) OR p.codigo IN ( '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_HIV_NA_GESTANTE_OU_PAI_PARCEIRO . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_ANTICORPOS_ANTI_HIV_EM_GESTANTE . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_INFECCAO_PELO_HIV . "', '". Procedimento::DETECCAO_RAPIDA_DA_CARGA_VIRAL_DO_HIV . "', '". Procedimento::QUANTIFICACAO_DA_CARGA_VIRAL_DO_HIV_RNA . "' ) ) ) OR EXISTS( SELECT 1 FROM atencao_basica_procedimento_atendimento AS pa INNER JOIN atencao_basica_procedimento p ON p.id = pa.procedimento_id INNER JOIN sigtap.ocupacao AS o ON o.id = p.ocupacao_id LEFT JOIN atencao_basica_procedimento_atendimento_procedimento AS pap ON pap.procedimento_atendimento_id = pa.id LEFT JOIN sigtap.procedimento proc ON proc.id = pap.procedimento_id LEFT JOIN atencao_basica_procedimento_atendimento_teste_rapido tr ON tr.procedimento_atendimento_id = pa.id WHERE pa.atendimento_individual_id IS NULL AND pa.paciente_id = atendimento_individual.paciente_id AND p.data_usuario_responsavel >= atendimento_individual.data_ultima_menstruacao AND p.data_usuario_responsavel <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND p.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND p.data_usuario_responsavel > DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 182 DAY) AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' OR o.codigo LIKE '2232%' OR o.codigo LIKE '2234%' OR o.codigo LIKE '2236%' OR o.codigo LIKE '2238%' OR o.codigo LIKE '2237%' OR o.codigo LIKE '2241%' OR o.codigo LIKE '3222%' OR o.codigo LIKE '2239%' OR o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) AND ( tr.teste_rapido_id = " . TesteRapido::HIV . " OR proc.codigo IN ( '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_HIV_NA_GESTANTE_OU_PAI_PARCEIRO . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_ANTICORPOS_ANTI_HIV_EM_GESTANTE . "', '". Procedimento::TESTE_RAPIDO_PARA_DETECCAO_DE_INFECCAO_PELO_HIV . "', '". Procedimento::DETECCAO_RAPIDA_DA_CARGA_VIRAL_DO_HIV . "', '". Procedimento::QUANTIFICACAO_DA_CARGA_VIRAL_DO_HIV_RNA . "' ) ) ) ) ), 1, 0) ) AS boa_pratica_h"), DB::raw("( IF(EXISTS( SELECT 1 FROM atencao_basica_atendimento_individual AS ai INNER JOIN sigtap.ocupacao AS o ON o.id = ai.usuario_ocupacao_id INNER JOIN atencao_basica_atendimento_individual_procedimento AS aip ON aip.atendimento_individual_id = ai.id INNER JOIN sigtap.procedimento p ON p.id = aip.procedimento_id WHERE ai.paciente_id = atendimento_individual.paciente_id AND ai.data_usuario_responsavel > COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ai.data_usuario_responsavel <= DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) AND ai.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2235%' OR o.codigo LIKE '2231%' OR o.codigo LIKE '2251%' OR o.codigo LIKE '2252%' OR o.codigo LIKE '2253%' ) AND p.codigo IN ( '" . Procedimento::CONSULTA_DE_PROFISSIONAIS_DE_NIVEL_SUPERIOR_NA_ATENCAO_PRIMARIA_EXCETO_MEDICO . "', '" . Procedimento::CONSULTA_MEDICA_EM_ATENCAO_PRIMARIA . "', '" . Procedimento::CONSULTA_PUERPERAL . "', '" . Procedimento::CONSULTA_ATENDIMENTO_DOMICILIAR . "', '" . Procedimento::TELECONSULTA_NA_ATENCAO_PRIMARIA . "' ) ), 1, 0) ) AS boa_pratica_i"), DB::raw("( IF(EXISTS( SELECT 1 FROM atencao_basica_visita_domiciliar AS vd INNER JOIN sigtap.ocupacao AS o ON o.id = vd.usuario_ocupacao_id INNER JOIN atencao_basica_parametrizacao_equipe e ON e.id = vd.equipe_id INNER JOIN atencao_basica_parametrizacao_area a ON a.id = e.area_id WHERE a.tipo_id = " . AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA . " AND vd.paciente_id = atendimento_individual.paciente_id AND vd.data_usuario_responsavel > COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND vd.data_usuario_responsavel <= DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) AND vd.data_usuario_responsavel <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo = '" . Ocupacao::AGENTE_COMUNITARIO_DE_SAUDE . "' OR o.codigo = '" . Ocupacao::TECNICO_EM_AGENTE_COMUNITARIO_DE_SAUDE . "' ) ), 1, 0) ) AS boa_pratica_j"), DB::raw("( IF(EXISTS( SELECT 1 FROM atencao_basica_atendimento_odontologico AS ao INNER JOIN sigtap.ocupacao AS o ON o.id = ao.ocupacao_id WHERE ao.paciente_id = atendimento_individual.paciente_id AND ao.data_atendimento >= atendimento_individual.data_ultima_menstruacao AND ao.data_atendimento <= COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)) AND ao.data_atendimento <= '{$params->periodo['end']->format('Y-m-d')}' AND ( o.codigo LIKE '2232%' OR o.codigo LIKE '3224%' ) ), 1, 0) ) AS boa_pratica_k") ) ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereNull('problema_condicao.problema_condicao_anterior_id') ->whereNotNull('atendimento_individual.data_ultima_menstruacao') ->where('atendimento_individual.data_ultima_menstruacao', '<=', $params->periodo['end']) ->whereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) >= ?", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->whereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) < cadastro_individual.motivo_saida_data") ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) < obito.obito_em") ) ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual AS ai') ->join('atencao_basica_atendimento_individual_problema_condicao AS pc', 'pc.atendimento_individual_id', 'ai.id') ->leftJoin('geral_ciap AS gc', 'gc.id', 'pc.ciap_id') ->leftJoin('sigtap.cid AS sc', 'sc.id', 'pc.cid_id') ->whereColumn('ai.paciente_id', 'atendimento_individual.paciente_id') ->where(fn ($q) => $q ->whereIn('gc.codigo', self::getCiapsEncerramGestacao()) ->orWhereIn('sc.codigo', self::getCidsEncerramGestacao()) ) ->whereColumn('ai.data_usuario_responsavel', '>=', 'atendimento_individual.data_ultima_menstruacao') ->whereRaw("ai.data_usuario_responsavel <= (COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)))") ) ->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)) ->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id)) ->when(!is_null($params->idade_minima), fn ($q) => $q ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, CURRENT_DATE) >= ?", [$params->idade_minima])) ->when(!is_null($params->idade_maxima), fn ($q) => $q ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, CURRENT_DATE) <= ?", [$params->idade_maxima])) ->when($params->paciente_id, fn ($q, $id) => $q->where('atendimento_individual.paciente_id', $id)) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('cadastro_domiciliar.id') ->where(fn ($sub) => $sub ->whereNull('cadastro_domiciliar.fora_area') ->orWhere('cadastro_domiciliar.fora_area', 0) )) ->groupBy('atendimento_individual.id'); self::setOrderByPaciente($pacientesBuilder); $pacientes = $pacientesBuilder->get(); $pacientes->each(function ($paciente) use ($params) { $paciente->idade = $paciente->data_nascimento ? AgeService::getFormattedAge(Carbon::create($paciente->data_nascimento)->toDate()) : null; if ($paciente->telefone_principal) { $paciente->telefone_principal = MaskUtil::getPhoneMasked($paciente->telefone_principal); } $paciente->boa_pratica_a = (bool) $paciente->boa_pratica_a; $paciente->boa_pratica_b = (bool) $paciente->boa_pratica_b; $paciente->boa_pratica_c = (bool) $paciente->boa_pratica_c; $paciente->boa_pratica_d = (bool) $paciente->boa_pratica_d; $paciente->boa_pratica_e = (bool) $paciente->boa_pratica_e; $paciente->boa_pratica_f = (bool) $paciente->boa_pratica_f; $paciente->boa_pratica_g = (bool) $paciente->boa_pratica_g; $paciente->boa_pratica_h = (bool) $paciente->boa_pratica_h; $paciente->boa_pratica_i = (bool) $paciente->boa_pratica_i; $paciente->boa_pratica_j = (bool) $paciente->boa_pratica_j; $paciente->boa_pratica_k = (bool) $paciente->boa_pratica_k; $paciente->pontuacao_total = 0; if (in_array('A', $params->boas_praticas) && $paciente->boa_pratica_a) $paciente->pontuacao_total += 10; if (in_array('B', $params->boas_praticas) && $paciente->boa_pratica_b) $paciente->pontuacao_total += 9; if (in_array('C', $params->boas_praticas) && $paciente->boa_pratica_c) $paciente->pontuacao_total += 9; if (in_array('D', $params->boas_praticas) && $paciente->boa_pratica_d) $paciente->pontuacao_total += 9; if (in_array('E', $params->boas_praticas) && $paciente->boa_pratica_e) $paciente->pontuacao_total += 9; if (in_array('F', $params->boas_praticas) && $paciente->boa_pratica_f) $paciente->pontuacao_total += 9; if (in_array('G', $params->boas_praticas) && $paciente->boa_pratica_g) $paciente->pontuacao_total += 9; if (in_array('H', $params->boas_praticas) && $paciente->boa_pratica_h) $paciente->pontuacao_total += 9; if (in_array('I', $params->boas_praticas) && $paciente->boa_pratica_i) $paciente->pontuacao_total += 9; if (in_array('J', $params->boas_praticas) && $paciente->boa_pratica_j) $paciente->pontuacao_total += 9; if (in_array('K', $params->boas_praticas) && $paciente->boa_pratica_k) $paciente->pontuacao_total += 9; }); $pacientes = $pacientes->filter(function ($paciente) use ($params) { foreach ($params->boas_praticas as $boaPratica) { if (!$paciente->{'boa_pratica_' . Str::lower($boaPratica)}) { return true; } } return false; })->values(); $columnsSortBy = collect([ 'pontuacao_total' ]); if ($columnsSortBy->contains(request()->paciente_sort_by)) { $pacientes = (DataUtil::getBooleanValueFromStringBoolean(request()->paciente_sort_desc) ? $pacientes->sortByDesc(request()->paciente_sort_by) : $pacientes->sortBy(request()->paciente_sort_by) )->values(); } return $pacientes; } private static function setOrderByPaciente($builder) { $columns = [ 'unidade_nome_fantasia' => 'unidade.nome_fantasia', 'equipe_descricao' => 'equipe_descricao', 'paciente_nome' => 'cidadao.nome', 'sexo_descricao' => 'sexo.descricao', 'idade' => 'cidadao.data_nascimento', 'microarea_descricao' => 'microarea_descricao', 'area_microarea_domicilio' => 'area_microarea_domicilio', 'usuario_cadastro_nome' => 'cidadao_responsavel.nome', 'data_nascimento' => 'cidadao.data_nascimento', 'telefone_principal' => 'telefone.numero', 'endereco' => 'endereco', ]; if (is_null(request()->paciente_sort_by) || !isset($columns[request()->paciente_sort_by])) { $builder->orderByRaw(join(', ', $columns)); return; } $column = $columns[request()->paciente_sort_by]; $sortDesc = DataUtil::getBooleanValueFromStringBoolean(request()->paciente_sort_desc); if (request()->paciente_sort_by === 'idade') { $sortDesc = !$sortDesc; } $direction = $sortDesc ? 'DESC' : 'ASC'; unset($columns[request()->paciente_sort_by]); $builder->orderByRaw("{$column} {$direction}, " . join(', ', $columns)); } private static function round($value) { if (fmod($value, 1) === 0.0) { return $value; } return round($value, 2); } public static function create() { $boasPraticas = self::getBoasPraticas(); return [ 'additionals' => [ 'data_atual' => Carbon::now()->format('d/m/Y'), ], 'form' => [ 'quadrimestres_anos' => self::getQuadrimestres(), 'unidades' => [], 'equipes' => [], 'boas_praticas' => $boasPraticas, 'sexos' => [], ], 'model' => [ 'periodo' => ['start' => null, 'end' => null], 'quadrimestre_ano' => null, 'quadrimestre' => null, 'unidade_id' => null, 'equipe_id' => null, 'boas_praticas' => $boasPraticas->pluck('value')->toArray(), 'busca_ativa' => false, 'sexo_id' => null, 'idade_minima' => null, 'idade_maxima' => 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), ]; } case 'sexos': { return [ 'sexos' => self::getSexos($params), ]; } } } private static function getParams() { $params = (object) [ 'unidade_id' => request()->get('unidade_id'), 'equipe_id' => request()->get('equipe_id'), 'boas_praticas' => request()->get('boas_praticas', []), 'busca_ativa' => DataUtil::getBooleanValueFromStringBoolean(request()->get('busca_ativa', 'false')), 'sexo_id' => request()->get('sexo_id'), 'idade_minima' => request()->get('idade_minima'), 'idade_maxima' => request()->get('idade_maxima'), 'paciente_id' => request()->get('paciente_id'), 'fora_area' => DataUtil::getBooleanValueFromStringBoolean(request()->get('fora_area', 'false')), ]; if (is_null(request()->get('periodo'))) { $ano = request()->get('quadrimestre_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 getQuadrimestres() { $anos = collect(); $anoInicial = 2020; $anoAtual = Carbon::now()->year; $mesAtual = Carbon::now()->month; $ano = $anoAtual; while ($ano >= $anoInicial) { for ($i = 1; $i <= 3; $i++) { $meses = null; if ($i === 1) { $meses = 'Janeiro - Abril'; } else if ($i === 2) { $meses = 'Maio - Agosto'; } else { $meses = 'Setembro - Dezembro'; } if ($ano === $anoAtual && ( ($i === 2 && $mesAtual <= 4) || ($i === 3 && $mesAtual <= 8) )) { continue; } $anoQuadrimenstre = $anos->firstWhere('value', $ano); if (is_null($anoQuadrimenstre)) { $anoQuadrimenstre = (object) [ 'value' => $ano, 'text' => $ano, 'quadrimestres' => collect(), ]; $anos->push($anoQuadrimenstre); } $anoQuadrimenstre->quadrimestres->push((object) [ 'value' => $i, 'text' => "{$i}º ({$meses})" ]); } $ano--; } return $anos; } private static function getUnidades($params) { return DB::table('cadastro_unidade AS unidade') ->select([ 'unidade.id', '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('problema_condicao.situacao_id', ProblemaCondicaoSituacao::ATIVO) ->whereNull('problema_condicao.problema_condicao_anterior_id') ->where(fn ($q) => $q ->whereIn('ciap.codigo', self::getCiapsGestacao()) ->orWhereIn('cid.codigo', self::getCidsGestacao()) ) ) ->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') ->whereIn('atendimento_individual_condicao_avaliada.condicao_avaliada_id',[ CondicaoAvaliada::PRE_NATAL, CondicaoAvaliada::PUERICULTURA, CondicaoAvaliada::PUERPERIO_ATE_42_DIAS ]) ) ) ->whereNotNull('atendimento_individual2.data_ultima_menstruacao') ->where('atendimento_individual2.data_ultima_menstruacao', '<=', $params->periodo['end']) ->orderBy('atendimento_individual2.data_usuario_responsavel') ->limit(1) ) ) ->join( 'atencao_basica_atendimento_individual_problema_condicao AS problema_condicao', 'problema_condicao.atendimento_individual_id', 'atendimento_individual.id' ) ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'problema_condicao.ciap_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'problema_condicao.cid_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'paciente.cidadao_id') ->whereNull('obito.deleted_at') ) ->whereColumn('equipe.unidade_id', 'unidade.id') ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereNull('problema_condicao.problema_condicao_anterior_id') ->whereNotNull('atendimento_individual.data_ultima_menstruacao') ->where('atendimento_individual.data_ultima_menstruacao', '<=', $params->periodo['end']) ->whereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) >= ?", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->whereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) < cadastro_individual.motivo_saida_data") ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) < obito.obito_em") ) ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual AS ai') ->join('atencao_basica_atendimento_individual_problema_condicao AS pc', 'pc.atendimento_individual_id', 'ai.id') ->leftJoin('geral_ciap AS gc', 'gc.id', 'pc.ciap_id') ->leftJoin('sigtap.cid AS sc', 'sc.id', 'pc.cid_id') ->whereColumn('ai.paciente_id', 'atendimento_individual.paciente_id') ->where(fn ($q) => $q ->whereIn('gc.codigo', self::getCiapsEncerramGestacao()) ->orWhereIn('sc.codigo', self::getCidsEncerramGestacao()) ) ->whereColumn('ai.data_usuario_responsavel', '>=', 'atendimento_individual.data_ultima_menstruacao') ->whereRaw("ai.data_usuario_responsavel <= (COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)))") ) ) ->orderBy('unidade.nome_fantasia') ->get(); } private static function getEquipes($params) { 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', self::getTiposEquipes()) ->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('problema_condicao.situacao_id', ProblemaCondicaoSituacao::ATIVO) ->whereNull('problema_condicao.problema_condicao_anterior_id') ->where(fn ($q) => $q ->whereIn('ciap.codigo', self::getCiapsGestacao()) ->orWhereIn('cid.codigo', self::getCidsGestacao()) ) ) ->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') ->whereIn('atendimento_individual_condicao_avaliada.condicao_avaliada_id',[ CondicaoAvaliada::PRE_NATAL, CondicaoAvaliada::PUERICULTURA, CondicaoAvaliada::PUERPERIO_ATE_42_DIAS ]) ) ) ->whereNotNull('atendimento_individual2.data_ultima_menstruacao') ->where('atendimento_individual2.data_ultima_menstruacao', '<=', $params->periodo['end']) ->orderBy('atendimento_individual2.data_usuario_responsavel') ->limit(1) ) ) ->join( 'atencao_basica_atendimento_individual_problema_condicao AS problema_condicao', 'problema_condicao.atendimento_individual_id', 'atendimento_individual.id' ) ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'problema_condicao.ciap_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'problema_condicao.cid_id') ->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') ->whereNull('problema_condicao.problema_condicao_anterior_id') ->whereNotNull('atendimento_individual.data_ultima_menstruacao') ->where('atendimento_individual.data_ultima_menstruacao', '<=', $params->periodo['end']) ->whereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) >= ?", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->whereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) < cadastro_individual.motivo_saida_data") ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) < obito.obito_em") ) ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual AS ai') ->join('atencao_basica_atendimento_individual_problema_condicao AS pc', 'pc.atendimento_individual_id', 'ai.id') ->leftJoin('geral_ciap AS gc', 'gc.id', 'pc.ciap_id') ->leftJoin('sigtap.cid AS sc', 'sc.id', 'pc.cid_id') ->whereColumn('ai.paciente_id', 'atendimento_individual.paciente_id') ->where(fn ($q) => $q ->whereIn('gc.codigo', self::getCiapsEncerramGestacao()) ->orWhereIn('sc.codigo', self::getCidsEncerramGestacao()) ) ->whereColumn('ai.data_usuario_responsavel', '>=', 'atendimento_individual.data_ultima_menstruacao') ->whereRaw("ai.data_usuario_responsavel <= (COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)))") ) ) ->orderBy('descricao') ->get(); } private static function getBoasPraticas() { return collect([ (object) ['value' => 'A', 'text' => 'A - 1ª consulta até 12 semanas'], (object) ['value' => 'B', 'text' => 'B - 7 consultas no pré-natal'], (object) ['value' => 'C', 'text' => 'C - 7 aferições de pressão arterial'], (object) ['value' => 'D', 'text' => 'D - 7 registros simultâneos de peso e altura'], (object) ['value' => 'E', 'text' => 'E - 3 visitas domiciliares após 1ª consulta'], (object) ['value' => 'F', 'text' => 'F - dTpa a partir da 20ª semana'], (object) ['value' => 'G', 'text' => 'G - exames/testes do 1º trimestre'], (object) ['value' => 'H', 'text' => 'H - exames/testes do 3º trimestre'], (object) ['value' => 'I', 'text' => 'I - consulta no puerpério'], (object) ['value' => 'J', 'text' => 'J - visita domiciliar no puerpério'], (object) ['value' => 'K', 'text' => 'K - atividade de saúde bucal na gestação'], ]); } private static function getSexos($params) { 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('problema_condicao.situacao_id', ProblemaCondicaoSituacao::ATIVO) ->whereNull('problema_condicao.problema_condicao_anterior_id') ->where(fn ($q) => $q ->whereIn('ciap.codigo', self::getCiapsGestacao()) ->orWhereIn('cid.codigo', self::getCidsGestacao()) ) ) ->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') ->whereIn('atendimento_individual_condicao_avaliada.condicao_avaliada_id',[ CondicaoAvaliada::PRE_NATAL, CondicaoAvaliada::PUERICULTURA, CondicaoAvaliada::PUERPERIO_ATE_42_DIAS ]) ) ) ->whereNotNull('atendimento_individual2.data_ultima_menstruacao') ->where('atendimento_individual2.data_ultima_menstruacao', '<=', $params->periodo['end']) ->orderBy('atendimento_individual2.data_usuario_responsavel') ->limit(1) ) ) ->join( 'atencao_basica_atendimento_individual_problema_condicao AS problema_condicao', 'problema_condicao.atendimento_individual_id', 'atendimento_individual.id' ) ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'problema_condicao.ciap_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'problema_condicao.cid_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'cidadao.id') ->whereNull('obito.deleted_at') ) ->whereColumn('cidadao.sexo_id', 'sexo.id') ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereNull('problema_condicao.problema_condicao_anterior_id') ->whereNotNull('atendimento_individual.data_ultima_menstruacao') ->where('atendimento_individual.data_ultima_menstruacao', '<=', $params->periodo['end']) ->whereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) >= ?", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->whereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) < cadastro_individual.motivo_saida_data") ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) < obito.obito_em") ) ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual AS ai') ->join('atencao_basica_atendimento_individual_problema_condicao AS pc', 'pc.atendimento_individual_id', 'ai.id') ->leftJoin('geral_ciap AS gc', 'gc.id', 'pc.ciap_id') ->leftJoin('sigtap.cid AS sc', 'sc.id', 'pc.cid_id') ->whereColumn('ai.paciente_id', 'atendimento_individual.paciente_id') ->where(fn ($q) => $q ->whereIn('gc.codigo', self::getCiapsEncerramGestacao()) ->orWhereIn('sc.codigo', self::getCidsEncerramGestacao()) ) ->whereColumn('ai.data_usuario_responsavel', '>=', 'atendimento_individual.data_ultima_menstruacao') ->whereRaw("ai.data_usuario_responsavel <= (COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)))") ) ->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id)) ->when($params->equipe_id, fn ($q, $id) => $q->where('atendimento_individual.equipe_id', $id)) ) ->orderBy('sexo.descricao') ->get(); } public static function autocompletePaciente() { $params = self::getParams(); return DB::table('cadastro_paciente as paciente') ->join('cadastro_cidadao as cidadao', 'cidadao.id', 'paciente.cidadao_id') ->join('atencao_basica_cadastro_individual AS cadastro_individual', 'cadastro_individual.paciente_id', '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('problema_condicao.situacao_id', ProblemaCondicaoSituacao::ATIVO) ->whereNull('problema_condicao.problema_condicao_anterior_id') ->where(fn ($q) => $q ->whereIn('ciap.codigo', self::getCiapsGestacao()) ->orWhereIn('cid.codigo', self::getCidsGestacao()) ) ) ->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') ->whereIn('atendimento_individual_condicao_avaliada.condicao_avaliada_id',[ CondicaoAvaliada::PRE_NATAL, CondicaoAvaliada::PUERICULTURA, CondicaoAvaliada::PUERPERIO_ATE_42_DIAS ]) ) ) ->whereNotNull('atendimento_individual2.data_ultima_menstruacao') ->where('atendimento_individual2.data_ultima_menstruacao', '<=', $params->periodo['end']) ->orderBy('atendimento_individual2.data_usuario_responsavel') ->limit(1) ) ) ->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_problema_condicao AS problema_condicao', 'problema_condicao.atendimento_individual_id', 'atendimento_individual.id' ) ->leftJoin('geral_ciap AS ciap', 'ciap.id', 'problema_condicao.ciap_id') ->leftJoin('sigtap.cid AS cid', 'cid.id', 'problema_condicao.cid_id') ->leftJoin('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar', 'cadastro_domiciliar.domicilio_id', 'cidadao.domicilio_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'cidadao.id') ->whereNull('obito.deleted_at') ) ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereNull('problema_condicao.problema_condicao_anterior_id') ->whereNotNull('atendimento_individual.data_ultima_menstruacao') ->where('atendimento_individual.data_ultima_menstruacao', '<=', $params->periodo['end']) ->whereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) >= ?", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->whereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) < cadastro_individual.motivo_saida_data") ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhereRaw("DATE_ADD( COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)), INTERVAL 42 DAY ) < obito.obito_em") ) ->whereNotExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_atendimento_individual AS ai') ->join('atencao_basica_atendimento_individual_problema_condicao AS pc', 'pc.atendimento_individual_id', 'ai.id') ->leftJoin('geral_ciap AS gc', 'gc.id', 'pc.ciap_id') ->leftJoin('sigtap.cid AS sc', 'sc.id', 'pc.cid_id') ->whereColumn('ai.paciente_id', 'atendimento_individual.paciente_id') ->where(fn ($q) => $q ->whereIn('gc.codigo', self::getCiapsEncerramGestacao()) ->orWhereIn('sc.codigo', self::getCidsEncerramGestacao()) ) ->whereColumn('ai.data_usuario_responsavel', '>=', 'atendimento_individual.data_ultima_menstruacao') ->whereRaw("ai.data_usuario_responsavel <= (COALESCE(( SELECT pc.fim FROM atencao_basica_atendimento_individual_problema_condicao pc WHERE pc.problema_condicao_inicial_id = problema_condicao.id AND pc.situacao_id = " . ProblemaCondicaoSituacao::RESOLVIDO . " LIMIT 1 ), DATE_ADD(atendimento_individual.data_ultima_menstruacao, INTERVAL 294 DAY)))") ) ->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)) ->when($params->sexo_id, fn ($q, $id) => $q->where('cidadao.sexo_id', $id)) ->when(!is_null($params->idade_minima), fn ($q) => $q ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, CURRENT_DATE) >= ?", [$params->idade_minima])) ->when(!is_null($params->idade_maxima), fn ($q) => $q ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, CURRENT_DATE) <= ?", [$params->idade_maxima])) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('cadastro_domiciliar.id') ->where(fn ($sub) => $sub ->whereNull('cadastro_domiciliar.fora_area') ->orWhere('cadastro_domiciliar.fora_area', 0) )) ->select( 'paciente.id', 'cidadao.nome' ) ->distinct(); } public static function getPrintExportData() { $data = self::index(); $data->pacientes->each(function ($paciente) { if (!is_null($paciente->data_nascimento)) { $paciente->data_nascimento = Carbon::create($paciente->data_nascimento)->format('d/m/Y'); } }); $quadrimestre = ''; if (request()->quadrimestre == 1) { $quadrimestre = "1º (Janeiro - Abril)"; } else if (request()->quadrimestre == 2) { $quadrimestre = "2º (Maio - Agosto)"; } else if (request()->quadrimestre == 3) { $quadrimestre = "3º (Setembro - Dezembro)"; } $unidade = request()->unidade_id ? Unidade::findOrFail(request()->unidade_id)->nome_fantasia : 'Todas'; $equipe = 'Todas'; if (request()->equipe_id) { $equipeModel = Equipe::findOrFail(request()->equipe_id); $equipe = ''; if (!is_null($equipeModel->area->numero_ine)) { $equipe .= "INE: {$equipeModel->area->numero_ine}"; } if (!is_null($equipeModel->area->descricao) && !is_null($equipeModel->area->numero_ine)) { $equipe .= ' - Área: '; } else if (!is_null($equipeModel->area->descricao)) { $equipe .= 'Área: '; } if (!is_null($equipeModel->area->descricao)) { $equipe .= $equipeModel->area->descricao; } if (isset($equipeModel->microarea->descricao) && (!is_null($equipeModel->area->numero_ine) || !is_null($equipeModel->area->descricao)) ) { $equipe .= ' - Microárea: '; } else if (isset($equipeModel->microarea->descricao)) { $equipe .= 'Microárea: '; } if (isset($equipeModel->microarea->descricao)) { $equipe .= $equipeModel->microarea->descricao; } } $boasPraticas = 'Todas'; if (count(request()->boas_praticas) === 1) { $boasPraticas = self::getBoasPraticas()->where('value', request()->boas_praticas[0])->first()->text; } else if (count(request()->boas_praticas) < self::getBoasPraticas()->count()) { $boasPraticas = count(request()->boas_praticas) . ' selecionadas'; } $sexo = request()->sexo_id ? Sexo::findOrFail(request()->sexo_id)->descricao : 'Todos'; $paciente = request()->paciente_id ? Paciente::findOrFail(request()->paciente_id)->cidadao->nome : ''; $isBuscaAtiva = DataUtil::isStringTrue(request()->busca_ativa); return [ 'periodoDe' => request()->periodo['start'] ?? '', 'periodoAte' => request()->periodo['end'] ?? '', 'quadrimestreAno' => request()->quadrimestre_ano, 'quadrimestre' => $quadrimestre, 'unidade' => $unidade, 'equipe' => $equipe, 'boasPraticas' => $boasPraticas, 'buscaAtiva' => $isBuscaAtiva ? 'Sim' : 'Não', 'isBuscaAtiva' => $isBuscaAtiva, 'sexo' => $sexo, 'idadeMinima' => request()->idade_minima, 'idadeMaxima' => request()->idade_maxima, 'paciente' => $paciente, 'equipes' => $data->equipes, 'pacientes' => $data->pacientes, 'totalizadores' => $data->totalizadores, 'colunasPacientes' => collect(request()->colunas_pacientes), 'boasPraticasSelecionadas' => collect(request()->boas_praticas) ]; } private static function getTiposEquipes() { return [ AreaTipo::EQUIPE_DE_SAUDE_DA_FAMILIA, AreaTipo::EQUIPE_DE_ATENCAO_PRIMARIA, ]; } private static function getCiapsGestacao() { return [ 'W78', 'W79', 'W81', 'W84', 'W85', ]; } private static function getCidsGestacao() { return [ 'O11', 'O120', 'O121', 'O122', 'O13', 'O140', 'O141', 'O149', 'O150', 'O151', 'O159', 'O16', 'O200', 'O208', 'O209', 'O210', 'O211', 'O212', 'O218', 'O219', 'O220', 'O221', 'O222', 'O223', 'O224', 'O225', 'O228', 'O229', 'O230', 'O231', 'O232', 'O233', 'O234', 'O235', 'O239', 'O299', 'O300', 'O301', 'O302', 'O308', 'O309', 'O311', 'O312', 'O318', 'O320', 'O321', 'O322', 'O323', 'O324', 'O325', 'O326', 'O328', 'O329', 'O330', 'O331', 'O332', 'O333', 'O334', 'O335', 'O336', 'O337', 'O338', 'O752', 'O753', 'O990', 'O991', 'O992', 'O993', 'O994', 'O240', 'O241', 'O242', 'O243', 'O244', 'O249', 'O25', 'O260', 'O261', 'O263', 'O264', 'O265', 'O268', 'O269', 'O280', 'O281', 'O282', 'O283', 'O284', 'O285', 'O288', 'O289', 'O290', 'O291', 'O292', 'O293', 'O294', 'O295', 'O296', 'O298', 'O339', 'O340', 'O341', 'O342', 'O343', 'O344', 'O345', 'O346', 'O347', 'O348', 'O349', 'O350', 'O351', 'O352', 'O353', 'O354', 'O355', 'O356', 'O357', 'O358', 'O359', 'O360', 'O361', 'O362', 'O363', 'O365', 'O366', 'O367', 'O368', 'O369', 'O40', 'O410', 'O411', 'O418', 'O419', 'O430', 'O431', 'O438', 'O439', 'O440', 'O441', 'O460', 'O468', 'O469', 'O470', 'O471', 'O479', 'O48', 'O995', 'O996', 'O997', 'Z640', 'O10', 'O12', 'O14', 'O15', 'O20', 'O21', 'O22', 'O23', 'O24', 'O26', 'O28', 'O29', 'O30', 'O31', 'O32', 'O33', 'O34', 'O35', 'O36', 'O41', 'O43', 'O44', 'O46', 'O47', 'O98', 'Z34', 'Z35', 'Z36', 'Z321', 'Z33', 'Z340', 'Z348', 'Z349', 'Z350', 'Z351', 'Z352', 'Z353', 'Z354', 'Z357', 'Z358', 'Z359', ]; } private static function getCiapsEncerramGestacao() { return ['W82', 'W83']; } private static function getCidsEncerramGestacao() { return ['O02', 'O021', 'O03', 'O04', 'O05', 'O06', 'Z303']; } }