equipes; $totalizadores = $resultadoEquipes->totalizadores; $pacientes = $params->busca_ativa ? self::getResultadoPorPacientes($params) : collect(); return (object) [ 'equipes' => $equipes, 'pacientes' => $pacientes, 'totalizadores' => $totalizadores, ]; } private static function getResultadoPorEquipes(object $params) { $builderBoaPraticaA = DB::table('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('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id') ->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id') ->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'paciente.cidadao_id') ->whereNull('obito.deleted_at') ) ->select([ DB::raw("'A' AS boa_pratica"), 'unidade.nome_fantasia AS unidade_nome_fantasia', 'microarea.id AS microarea_id', 'cadastro_individual.equipe_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 (cadastro_individual.paciente_id)) AS denominador"), DB::raw("GROUP_CONCAT(DISTINCT(cadastro_individual.paciente_id) SEPARATOR '#') AS pacientes"), DB::raw("SUM( IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual abai INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = paciente.id AND abai.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 25 YEAR) AND abai.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 36 MONTH) AND abai.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 64 YEAR) AND abai.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 EXISTS ( SELECT 1 FROM atencao_basica_atendimento_individual_outro_exame abaioe INNER JOIN parametrizacao_exame pe ON pe.id = abaioe.exame_id WHERE abaioe.atendimento_individual_id = abai.id AND pe.codigo IN ( '" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DE_UTERO_PARA_EXAME_CITOPATOLOGICO . "', '" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DO_UTERO_PARA_EXAME_MOLECULAR_DE_DETECCAO_DE_HPV . "', '" . Procedimento::ENTREGA_DE_MATERIAL_OBTIDO_POR_AUTO_COLETA_PARA_EXAME_MOLECULAR_PARA_DETECCAO_DE_HPV_NO_COLO_DO_UTERO . "', '" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA . "', '" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA_RASTREAMENTO . "' ) AND (abaioe.solicitado = 1 OR abaioe.avaliado = 1) ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_procedimento_atendimento abpa INNER JOIN atencao_basica_procedimento abp ON abp.id = abpa.procedimento_id INNER JOIN sigtap.ocupacao o ON o.id = abp.ocupacao_id WHERE abpa.paciente_id = paciente.id AND abp.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 25 YEAR) AND abp.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 36 MONTH) AND abp.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 64 YEAR) AND abp.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 ( EXISTS ( SELECT 1 FROM atencao_basica_procedimento_atendimento_pequena_cirurgia abpapc WHERE abpapc.procedimento_atendimento_id = abpa.id AND abpapc.pequena_cirurgia_id = " . ProcedimentoPequenaCirurgia::COLETA_DE_CITOPATOLOGICO_DE_COLO_UTERINO . " ) OR EXISTS ( SELECT 1 FROM atencao_basica_procedimento_atendimento_procedimento abpap INNER JOIN sigtap.procedimento p ON p.id = abpap.procedimento_id WHERE abpap.procedimento_atendimento_id = abpa.id AND p.codigo IN ( '" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DE_UTERO_PARA_EXAME_CITOPATOLOGICO . "', '" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DO_UTERO_PARA_EXAME_MOLECULAR_DE_DETECCAO_DE_HPV . "', '" . Procedimento::ENTREGA_DE_MATERIAL_OBTIDO_POR_AUTO_COLETA_PARA_EXAME_MOLECULAR_PARA_DETECCAO_DE_HPV_NO_COLO_DO_UTERO . "', '" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA . "', '" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA_RASTREAMENTO . "' ) ) ) LIMIT 1 ), 1, 0 ) ) AS numerador") ]) ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 25", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 64", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->orWhere(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO) ->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO) ) ) ->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($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id)) ->when($params->has_idade_minima, fn ($q) => $q ->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada( $params->idade_minima_anos, $params->idade_minima_meses, $params->idade_minima_dias )) ) ->when($params->has_idade_maxima, fn ($q) => $q ->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada( $params->idade_maxima_anos, $params->idade_maxima_meses, $params->idade_maxima_dias )) ) ->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id)) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('domiciliar_fora_area.id') ->where(fn ($sub) => $sub ->whereNull('domiciliar_fora_area.fora_area') ->orWhere('domiciliar_fora_area.fora_area', 0) )) ->groupBy([ 'boa_pratica', 'unidade.nome_fantasia', 'microarea.id', 'cadastro_individual.equipe_id', 'equipe_descricao' ]); $builderBoaPraticaB = DB::table('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('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id') ->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id') ->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'paciente.cidadao_id') ->whereNull('obito.deleted_at') ) ->select([ DB::raw("'B' AS boa_pratica"), 'unidade.nome_fantasia AS unidade_nome_fantasia', 'microarea.id AS microarea_id', 'cadastro_individual.equipe_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 (cadastro_individual.paciente_id)) AS denominador"), DB::raw("GROUP_CONCAT(DISTINCT(cadastro_individual.paciente_id) SEPARATOR '#') AS pacientes"), DB::raw("SUM( IF( ( SELECT TRUE 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 = paciente.id AND ra.data_aplicacao >= DATE_ADD(cidadao.data_nascimento, INTERVAL 9 YEAR) AND ra.data_aplicacao <= DATE_ADD(cidadao.data_nascimento, INTERVAL 14 YEAR) AND ra.data_aplicacao <= '{$params->periodo['end']->format('Y-m-d')}' AND ( v.codigo = " . VacinaCodigo::HPV_QUADRIVALENTE . " OR v.codigo = " . VacinaCodigo::HPV_NONAVALENTE . " ) LIMIT 1 ) OR ( SELECT TRUE FROM imunizacao_registro_atualizacao ra INNER JOIN cadastro_vacina v ON v.id = ra.vacina_id WHERE ra.paciente_id = paciente.id AND ra.data_atualizacao >= DATE_ADD(cidadao.data_nascimento, INTERVAL 9 YEAR) AND ra.data_atualizacao <= DATE_ADD(cidadao.data_nascimento, INTERVAL 14 YEAR) AND ra.data_atualizacao <= '{$params->periodo['end']->format('Y-m-d')}' AND ( v.codigo = " . VacinaCodigo::HPV_QUADRIVALENTE . " OR v.codigo = " . VacinaCodigo::HPV_NONAVALENTE . " ) LIMIT 1 ), 1, 0 ) ) AS numerador") ]) ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 14", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->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($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id)) ->when($params->has_idade_minima, fn ($q) => $q ->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada( $params->idade_minima_anos, $params->idade_minima_meses, $params->idade_minima_dias )) ) ->when($params->has_idade_maxima, fn ($q) => $q ->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada( $params->idade_maxima_anos, $params->idade_maxima_meses, $params->idade_maxima_dias )) ) ->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id)) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('domiciliar_fora_area.id') ->where(fn ($sub) => $sub ->whereNull('domiciliar_fora_area.fora_area') ->orWhere('domiciliar_fora_area.fora_area', 0) )) ->groupBy([ 'boa_pratica', 'unidade.nome_fantasia', 'microarea.id', 'cadastro_individual.equipe_id', 'equipe_descricao' ]); $builderBoaPraticaC = DB::table('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('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id') ->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id') ->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'paciente.cidadao_id') ->whereNull('obito.deleted_at') ) ->select([ DB::raw("'C' AS boa_pratica"), 'unidade.nome_fantasia AS unidade_nome_fantasia', 'microarea.id AS microarea_id', 'cadastro_individual.equipe_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 (cadastro_individual.paciente_id)) AS denominador"), DB::raw("GROUP_CONCAT(DISTINCT(cadastro_individual.paciente_id) SEPARATOR '#') AS pacientes"), DB::raw("SUM( IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual abai INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = paciente.id AND abai.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 14 YEAR) AND abai.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 12 MONTH) AND abai.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 69 YEAR) AND abai.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 ( EXISTS ( SELECT 1 FROM atencao_basica_atendimento_individual_condicao_avaliada abaica WHERE abaica.atendimento_individual_id = abai.id AND abaica.condicao_avaliada_id = " . CondicaoAvaliada::SAUDE_SEXUAL_E_REPRODUTIVA . " ) OR EXISTS ( SELECT 1 FROM atencao_basica_atendimento_individual_rastreamento abair WHERE abair.atendimento_individual_id = abai.id AND abair.rastreamento_id IN ( " . Rastreamento::CANCER_COLO_UTERO . ", " . Rastreamento::CANCER_MAMA . " ) ) OR EXISTS ( SELECT 1 FROM atencao_basica_atendimento_individual_problema_condicao abaipc LEFT JOIN geral_ciap gc ON gc.id = abaipc.ciap_id LEFT JOIN sigtap.cid c ON c.id = abaipc.cid_id WHERE abaipc.atendimento_individual_id = abai.id AND ( gc.codigo IN ( 'B25', 'W02', 'W10', 'W11', 'W12', 'W13', 'W14', 'W15', 'W79', 'W82', 'X01', 'X02', 'X03', 'X04', 'X05', 'X06', 'X07', 'X08', 'X09', 'X10', 'X11', 'X12', 'X13', 'X23', 'X24', 'X82', 'X89', 'Y14' ) OR c.codigo IN ( 'N80', 'N800', 'N801', 'N802', 'N803', 'N804', 'N805', 'N806', 'N808', 'N809', 'N91', 'N910', 'N911', 'N912', 'N913', 'N914', 'N915', 'N92', 'N920', 'N921', 'N922', 'N923', 'N924', 'N925', 'N926', 'N93', 'N930', 'N938', 'N939', 'N94', 'N940', 'N941', 'N942', 'N943', 'N944', 'N945', 'N946', 'N948', 'N949', 'N95', 'N950', 'N951', 'N952', 'N953', 'N958', 'N959', 'N96', 'N97', 'N970', 'N971', 'N972', 'N973', 'N974', 'N978', 'N979', 'O03', 'O04', 'R102', 'T742', 'Y050', 'Y051', 'Y052', 'Y053', 'Y054', 'Y055', 'Y056', 'Y057', 'Y058', 'Y059', 'Z123', 'Z124', 'Z205', 'Z206', 'Z30', 'Z300', 'Z301', 'Z302', 'Z303', 'Z304', 'Z305', 'Z308', 'Z309', 'Z31', 'Z310', 'Z311', 'Z312', 'Z313', 'Z314', 'Z315', 'Z316', 'Z318', 'Z319', 'Z320', 'Z600', 'Z630', 'Z640', 'Z70', 'Z700', 'Z701', 'Z702', 'Z703', 'Z708', 'Z709', 'Z717', 'Z725' ) ) ) ) LIMIT 1 ), 1, 0 ) ) AS numerador") ]) ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 14", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->orWhere(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO) ->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO) ) ) ->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($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id)) ->when($params->has_idade_minima, fn ($q) => $q ->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada( $params->idade_minima_anos, $params->idade_minima_meses, $params->idade_minima_dias )) ) ->when($params->has_idade_maxima, fn ($q) => $q ->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada( $params->idade_maxima_anos, $params->idade_maxima_meses, $params->idade_maxima_dias )) ) ->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id)) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('domiciliar_fora_area.id') ->where(fn ($sub) => $sub ->whereNull('domiciliar_fora_area.fora_area') ->orWhere('domiciliar_fora_area.fora_area', 0) )) ->groupBy([ 'boa_pratica', 'unidade.nome_fantasia', 'microarea.id', 'cadastro_individual.equipe_id', 'equipe_descricao' ]); $builderBoaPraticaD = DB::table('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('cadastro_unidade AS unidade', 'unidade.id', 'equipe.unidade_id') ->leftJoin('atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'equipe.microarea_id') ->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'paciente.cidadao_id') ->whereNull('obito.deleted_at') ) ->select([ DB::raw("'D' AS boa_pratica"), 'unidade.nome_fantasia AS unidade_nome_fantasia', 'microarea.id AS microarea_id', 'cadastro_individual.equipe_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 (cadastro_individual.paciente_id)) AS denominador"), DB::raw("GROUP_CONCAT(DISTINCT(cadastro_individual.paciente_id) SEPARATOR '#') AS pacientes"), DB::raw("SUM( IF( ( SELECT TRUE FROM atencao_basica_atendimento_individual abai INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = paciente.id AND abai.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 50 YEAR) AND abai.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 24 MONTH) AND abai.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 69 YEAR) AND abai.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 EXISTS ( SELECT 1 FROM atencao_basica_atendimento_individual_outro_exame abaioe INNER JOIN parametrizacao_exame pe ON pe.id = abaioe.exame_id WHERE abaioe.atendimento_individual_id = abai.id AND pe.codigo IN ( '" . Procedimento::MAMOGRAFIA . "', '" . Procedimento::MAMOGRAFIA_BILATERAL_PARA_RASTREAMENTO . "' ) AND (abaioe.solicitado = 1 OR abaioe.avaliado = 1) ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_procedimento_atendimento abpa INNER JOIN atencao_basica_procedimento abp ON abp.id = abpa.procedimento_id INNER JOIN sigtap.ocupacao o ON o.id = abp.ocupacao_id WHERE abpa.paciente_id = paciente.id AND abp.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 50 YEAR) AND abp.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 24 MONTH) AND abp.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 69 YEAR) AND abp.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 EXISTS ( SELECT 1 FROM atencao_basica_procedimento_atendimento_procedimento abpap INNER JOIN sigtap.procedimento p ON p.id = abpap.procedimento_id WHERE abpap.procedimento_atendimento_id = abpa.id AND p.codigo IN ( '" . Procedimento::MAMOGRAFIA . "', '" . Procedimento::MAMOGRAFIA_BILATERAL_PARA_RASTREAMENTO . "' ) ) LIMIT 1 ), 1, 0 ) ) AS numerador") ]) ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 50", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->orWhere(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO) ->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO) ) ) ->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($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id)) ->when($params->has_idade_minima, fn ($q) => $q ->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada( $params->idade_minima_anos, $params->idade_minima_meses, $params->idade_minima_dias )) ) ->when($params->has_idade_maxima, fn ($q) => $q ->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada( $params->idade_maxima_anos, $params->idade_maxima_meses, $params->idade_maxima_dias )) ) ->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id)) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('domiciliar_fora_area.id') ->where(fn ($sub) => $sub ->whereNull('domiciliar_fora_area.fora_area') ->orWhere('domiciliar_fora_area.fora_area', 0) )) ->groupBy([ 'boa_pratica', 'unidade.nome_fantasia', 'microarea.id', 'cadastro_individual.equipe_id', 'equipe_descricao' ]); $builder = $builderBoaPraticaA ->unionAll($builderBoaPraticaB) ->unionAll($builderBoaPraticaC) ->unionAll($builderBoaPraticaD); self::setOrderByEquipe($builder); $itens = $builder->get(); $equipes = collect(); $pacientesIds = []; $microareasIds = []; $itens->each(function ($item) use (&$pacientesIds, &$microareasIds, $equipes) { $equipe = $equipes->where('equipe_id', $item->equipe_id)->first(); if (is_null($equipe)) { $equipe = (object) [ 'equipe_id' => $item->equipe_id, 'unidade_nome_fantasia' => $item->unidade_nome_fantasia, 'equipe_descricao' => $item->equipe_descricao, 'denominador_boa_pratica_a' => 0, 'denominador_boa_pratica_b' => 0, 'denominador_boa_pratica_c' => 0, 'denominador_boa_pratica_d' => 0, 'numerador_boa_pratica_a' => 0, 'numerador_boa_pratica_b' => 0, 'numerador_boa_pratica_c' => 0, 'numerador_boa_pratica_d' => 0, ]; $equipes->push($equipe); } $equipe->{'denominador_boa_pratica_' . Str::lower($item->boa_pratica)} = $item->denominador; $equipe->{'numerador_boa_pratica_' . Str::lower($item->boa_pratica)} = $item->numerador; $pacientesIds = array_merge($pacientesIds, explode('#', $item->pacientes)); if (!is_null($item->microarea_id)) { $microareasIds[] = $item->microarea_id; } }); $equipes->each(function ($equipe) use ($params) { $a = 0; $b = 0; $c = 0; $d = 0; $pontuacao = 0; if (in_array('A', $params->boas_praticas)) { $aux = $equipe->denominador_boa_pratica_a === 0 ? 0 : ($equipe->numerador_boa_pratica_a / $equipe->denominador_boa_pratica_a); $equipe->percentual_boa_pratica_a = self::round($aux * 100); $a = $aux * 20; if ($equipe->numerador_boa_pratica_a > 0) { $pontuacao += 20; } } if (in_array('B', $params->boas_praticas)) { $aux = $equipe->denominador_boa_pratica_b === 0 ? 0 : ($equipe->numerador_boa_pratica_b / $equipe->denominador_boa_pratica_b); $equipe->percentual_boa_pratica_b = self::round($aux * 100); $b = $aux * 30; if ($equipe->numerador_boa_pratica_b > 0) { $pontuacao += 30; } } if (in_array('C', $params->boas_praticas)) { $aux = $equipe->denominador_boa_pratica_c === 0 ? 0 : ($equipe->numerador_boa_pratica_c / $equipe->denominador_boa_pratica_c); $equipe->percentual_boa_pratica_c = self::round($aux * 100); $c = $aux * 30; if ($equipe->numerador_boa_pratica_c > 0) { $pontuacao += 30; } } if (in_array('D', $params->boas_praticas)) { $aux = $equipe->denominador_boa_pratica_d === 0 ? 0 : ($equipe->numerador_boa_pratica_d / $equipe->denominador_boa_pratica_d); $equipe->percentual_boa_pratica_d = self::round($aux * 100); $d = $aux * 20; if ($equipe->numerador_boa_pratica_d > 0) { $pontuacao += 20; } } $equipe->resultado = self::round($a + $b + $c + $d); $classificacao = self::getClassificacao($pontuacao); $equipe->classificacao_resultado_ordenacao = $classificacao['ordenacao']; $equipe->classificacao_resultado = $classificacao['texto']; }); $columnsSortBy = collect([ 'denominador_boa_pratica_a', 'denominador_boa_pratica_b', 'denominador_boa_pratica_c', 'denominador_boa_pratica_d', 'numerador_boa_pratica_a', 'numerador_boa_pratica_b', 'numerador_boa_pratica_c', 'numerador_boa_pratica_d', 'resultado', 'classificacao_resultado', 'percentual_boa_pratica_a', 'percentual_boa_pratica_b', 'percentual_boa_pratica_c', 'percentual_boa_pratica_d', ]); 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(); } $totalPacientes = collect($pacientesIds)->unique()->count(); $totalEquipes = $equipes->count(); $totalMicroareas = collect($microareasIds)->unique()->count(); $denominadorBoaPraticaA = $equipes->sum('denominador_boa_pratica_a'); $denominadorBoaPraticaB = $equipes->sum('denominador_boa_pratica_b'); $denominadorBoaPraticaC = $equipes->sum('denominador_boa_pratica_c'); $denominadorBoaPraticaD = $equipes->sum('denominador_boa_pratica_d'); $numeradorBoaPraticaA = $equipes->sum('numerador_boa_pratica_a'); $numeradorBoaPraticaB = $equipes->sum('numerador_boa_pratica_b'); $numeradorBoaPraticaC = $equipes->sum('numerador_boa_pratica_c'); $numeradorBoaPraticaD = $equipes->sum('numerador_boa_pratica_d'); $resultado = 0; $percentualBoaPraticaA = 0; $percentualBoaPraticaB = 0; $percentualBoaPraticaC = 0; $percentualBoaPraticaD = 0; $a = 0; $b = 0; $c = 0; $d = 0; if (in_array('A', $params->boas_praticas) && $denominadorBoaPraticaA > 0) { $aux = $numeradorBoaPraticaA / $denominadorBoaPraticaA; $percentualBoaPraticaA = self::round($aux * 100); $a = $aux * 20; } if (in_array('B', $params->boas_praticas) && $denominadorBoaPraticaB > 0) { $aux = $numeradorBoaPraticaB / $denominadorBoaPraticaB; $percentualBoaPraticaB = self::round($aux * 100); $b = $aux * 30; } if (in_array('C', $params->boas_praticas) && $denominadorBoaPraticaC > 0) { $aux = $numeradorBoaPraticaC / $denominadorBoaPraticaC; $percentualBoaPraticaC = self::round($aux * 100); $c = $aux * 30; } if (in_array('D', $params->boas_praticas) && $denominadorBoaPraticaD > 0) { $aux = $numeradorBoaPraticaD / $denominadorBoaPraticaD; $percentualBoaPraticaD = self::round($aux * 100); $d = $aux * 20; } $resultado = self::round($a + $b + $c + $d); return (object) [ 'equipes' => $equipes, 'totalizadores' => (object) [ 'total_pacientes' => $totalPacientes, 'total_equipes' => $totalEquipes, 'total_microareas' => $totalMicroareas, 'denominador_boa_pratica_a' => $denominadorBoaPraticaA, 'denominador_boa_pratica_b' => $denominadorBoaPraticaB, 'denominador_boa_pratica_c' => $denominadorBoaPraticaC, 'denominador_boa_pratica_d' => $denominadorBoaPraticaD, 'numerador_boa_pratica_a' => $numeradorBoaPraticaA, 'numerador_boa_pratica_b' => $numeradorBoaPraticaB, 'numerador_boa_pratica_c' => $numeradorBoaPraticaC, 'numerador_boa_pratica_d' => $numeradorBoaPraticaD, 'resultado' => $resultado, 'percentual_boa_pratica_a' => $percentualBoaPraticaA, 'percentual_boa_pratica_b' => $percentualBoaPraticaB, 'percentual_boa_pratica_c' => $percentualBoaPraticaC, 'percentual_boa_pratica_d' => $percentualBoaPraticaD, ], ]; } private static function getClassificacao(int $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', ]; 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) { $builderBoaPraticaA = 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_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') ->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('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id') ->leftJoin('atencao_basica_parametrizacao_microarea AS microarea_fora_area', 'microarea_fora_area.id', 'domiciliar_fora_area.microarea_id') ->leftJoin('atencao_basica_parametrizacao_area AS area_fora_area', 'area_fora_area.id', 'microarea_fora_area.area_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'cidadao.id') ->whereNull('obito.deleted_at') ) ->select([ DB::raw("'A' AS boa_pratica"), 'cadastro_individual.id AS cadastro_individual_id', '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"), 'cidadao.nome AS paciente_nome', 'sexo.id AS sexo_id', 'sexo.descricao AS sexo_descricao', 'cidadao.identidade_genero_id', 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 area_fora_area.numero_ine IS NULL AND area_fora_area.descricao IS NULL AND microarea_fora_area.descricao IS NULL THEN 'Não informada' ELSE CONCAT( CASE WHEN area_fora_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area_fora_area.numero_ine) ELSE '' END, CASE WHEN area_fora_area.descricao IS NOT NULL AND area_fora_area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN area_fora_area.descricao IS NOT NULL THEN 'Área: ' ELSE '' END, COALESCE(area_fora_area.descricao, ''), CASE WHEN microarea_fora_area.descricao IS NOT NULL AND (area_fora_area.numero_ine IS NOT NULL OR area_fora_area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN microarea_fora_area.descricao IS NOT NULL THEN 'Microárea: ' ELSE '' END, COALESCE(microarea_fora_area.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( ( SELECT TRUE FROM atencao_basica_atendimento_individual abai INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = paciente.id AND abai.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 25 YEAR) AND abai.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 36 MONTH) AND abai.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 64 YEAR) AND abai.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 EXISTS ( SELECT 1 FROM atencao_basica_atendimento_individual_outro_exame abaioe INNER JOIN parametrizacao_exame pe ON pe.id = abaioe.exame_id WHERE abaioe.atendimento_individual_id = abai.id AND pe.codigo IN ( '" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DE_UTERO_PARA_EXAME_CITOPATOLOGICO . "', '" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DO_UTERO_PARA_EXAME_MOLECULAR_DE_DETECCAO_DE_HPV . "', '" . Procedimento::ENTREGA_DE_MATERIAL_OBTIDO_POR_AUTO_COLETA_PARA_EXAME_MOLECULAR_PARA_DETECCAO_DE_HPV_NO_COLO_DO_UTERO . "', '" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA . "', '" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA_RASTREAMENTO . "' ) AND (abaioe.solicitado = 1 OR abaioe.avaliado = 1) ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_procedimento_atendimento abpa INNER JOIN atencao_basica_procedimento abp ON abp.id = abpa.procedimento_id INNER JOIN sigtap.ocupacao o ON o.id = abp.ocupacao_id WHERE abpa.paciente_id = paciente.id AND abp.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 25 YEAR) AND abp.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 36 MONTH) AND abp.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 64 YEAR) AND abp.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 ( EXISTS ( SELECT 1 FROM atencao_basica_procedimento_atendimento_pequena_cirurgia abpapc WHERE abpapc.procedimento_atendimento_id = abpa.id AND abpapc.pequena_cirurgia_id = " . ProcedimentoPequenaCirurgia::COLETA_DE_CITOPATOLOGICO_DE_COLO_UTERINO . " ) OR EXISTS ( SELECT 1 FROM atencao_basica_procedimento_atendimento_procedimento abpap INNER JOIN sigtap.procedimento p ON p.id = abpap.procedimento_id WHERE abpap.procedimento_atendimento_id = abpa.id AND p.codigo IN ( '" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DE_UTERO_PARA_EXAME_CITOPATOLOGICO . "', '" . Procedimento::COLETA_DE_MATERIAL_DO_COLO_DO_UTERO_PARA_EXAME_MOLECULAR_DE_DETECCAO_DE_HPV . "', '" . Procedimento::ENTREGA_DE_MATERIAL_OBTIDO_POR_AUTO_COLETA_PARA_EXAME_MOLECULAR_PARA_DETECCAO_DE_HPV_NO_COLO_DO_UTERO . "', '" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA . "', '" . Procedimento::EXAME_CITOPATOLOGICO_CERVICO_VAGINAL_MICROFLORA_RASTREAMENTO . "' ) ) ) LIMIT 1 ), 1, 0 ) ) AS has_boa_pratica") ]) ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 25", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 64", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->orWhere(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO) ->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO) ) ) ->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($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id)) ->when($params->has_idade_minima, fn ($q) => $q ->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada( $params->idade_minima_anos, $params->idade_minima_meses, $params->idade_minima_dias )) ) ->when($params->has_idade_maxima, fn ($q) => $q ->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada( $params->idade_maxima_anos, $params->idade_maxima_meses, $params->idade_maxima_dias )) ) ->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id)) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('domiciliar_fora_area.id') ->where(fn ($sub) => $sub ->whereNull('domiciliar_fora_area.fora_area') ->orWhere('domiciliar_fora_area.fora_area', 0) )); $builderBoaPraticaB = 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_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') ->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('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id') ->leftJoin('atencao_basica_parametrizacao_microarea AS microarea_fora_area', 'microarea_fora_area.id', 'domiciliar_fora_area.microarea_id') ->leftJoin('atencao_basica_parametrizacao_area AS area_fora_area', 'area_fora_area.id', 'microarea_fora_area.area_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'cidadao.id') ->whereNull('obito.deleted_at') ) ->select([ DB::raw("'B' AS boa_pratica"), 'cadastro_individual.id AS cadastro_individual_id', '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"), 'cidadao.nome AS paciente_nome', 'sexo.id AS sexo_id', 'sexo.descricao AS sexo_descricao', 'cidadao.identidade_genero_id', 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 area_fora_area.numero_ine IS NULL AND area_fora_area.descricao IS NULL AND microarea_fora_area.descricao IS NULL THEN 'Não informada' ELSE CONCAT( CASE WHEN area_fora_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area_fora_area.numero_ine) ELSE '' END, CASE WHEN area_fora_area.descricao IS NOT NULL AND area_fora_area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN area_fora_area.descricao IS NOT NULL THEN 'Área: ' ELSE '' END, COALESCE(area_fora_area.descricao, ''), CASE WHEN microarea_fora_area.descricao IS NOT NULL AND (area_fora_area.numero_ine IS NOT NULL OR area_fora_area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN microarea_fora_area.descricao IS NOT NULL THEN 'Microárea: ' ELSE '' END, COALESCE(microarea_fora_area.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( ( SELECT TRUE 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 = paciente.id AND ra.data_aplicacao >= DATE_ADD(cidadao.data_nascimento, INTERVAL 9 YEAR) AND ra.data_aplicacao <= DATE_ADD(cidadao.data_nascimento, INTERVAL 14 YEAR) AND ra.data_aplicacao <= '{$params->periodo['end']->format('Y-m-d')}' AND ( v.codigo = " . VacinaCodigo::HPV_QUADRIVALENTE . " OR v.codigo = " . VacinaCodigo::HPV_NONAVALENTE . " ) LIMIT 1 ) OR ( SELECT TRUE FROM imunizacao_registro_atualizacao ra INNER JOIN cadastro_vacina v ON v.id = ra.vacina_id WHERE ra.paciente_id = paciente.id AND ra.data_atualizacao >= DATE_ADD(cidadao.data_nascimento, INTERVAL 9 YEAR) AND ra.data_atualizacao <= DATE_ADD(cidadao.data_nascimento, INTERVAL 14 YEAR) AND ra.data_atualizacao <= '{$params->periodo['end']->format('Y-m-d')}' AND ( v.codigo = " . VacinaCodigo::HPV_QUADRIVALENTE . " OR v.codigo = " . VacinaCodigo::HPV_NONAVALENTE . " ) LIMIT 1 ), 1, 0 ) ) AS has_boa_pratica") ]) ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 14", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->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($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id)) ->when($params->has_idade_minima, fn ($q) => $q ->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada( $params->idade_minima_anos, $params->idade_minima_meses, $params->idade_minima_dias )) ) ->when($params->has_idade_maxima, fn ($q) => $q ->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada( $params->idade_maxima_anos, $params->idade_maxima_meses, $params->idade_maxima_dias )) ) ->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id)) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('domiciliar_fora_area.id') ->where(fn ($sub) => $sub ->whereNull('domiciliar_fora_area.fora_area') ->orWhere('domiciliar_fora_area.fora_area', 0) )); $builderBoaPraticaC = 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_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') ->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('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id') ->leftJoin('atencao_basica_parametrizacao_microarea AS microarea_fora_area', 'microarea_fora_area.id', 'domiciliar_fora_area.microarea_id') ->leftJoin('atencao_basica_parametrizacao_area AS area_fora_area', 'area_fora_area.id', 'microarea_fora_area.area_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'cidadao.id') ->whereNull('obito.deleted_at') ) ->select([ DB::raw("'C' AS boa_pratica"), 'cadastro_individual.id AS cadastro_individual_id', '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"), 'cidadao.nome AS paciente_nome', 'sexo.id AS sexo_id', 'sexo.descricao AS sexo_descricao', 'cidadao.identidade_genero_id', 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 area_fora_area.numero_ine IS NULL AND area_fora_area.descricao IS NULL AND microarea_fora_area.descricao IS NULL THEN 'Não informada' ELSE CONCAT( CASE WHEN area_fora_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area_fora_area.numero_ine) ELSE '' END, CASE WHEN area_fora_area.descricao IS NOT NULL AND area_fora_area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN area_fora_area.descricao IS NOT NULL THEN 'Área: ' ELSE '' END, COALESCE(area_fora_area.descricao, ''), CASE WHEN microarea_fora_area.descricao IS NOT NULL AND (area_fora_area.numero_ine IS NOT NULL OR area_fora_area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN microarea_fora_area.descricao IS NOT NULL THEN 'Microárea: ' ELSE '' END, COALESCE(microarea_fora_area.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( ( SELECT TRUE FROM atencao_basica_atendimento_individual abai INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = paciente.id AND abai.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 14 YEAR) AND abai.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 12 MONTH) AND abai.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 69 YEAR) AND abai.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 ( EXISTS ( SELECT 1 FROM atencao_basica_atendimento_individual_condicao_avaliada abaica WHERE abaica.atendimento_individual_id = abai.id AND abaica.condicao_avaliada_id = " . CondicaoAvaliada::SAUDE_SEXUAL_E_REPRODUTIVA . " ) OR EXISTS ( SELECT 1 FROM atencao_basica_atendimento_individual_rastreamento abair WHERE abair.atendimento_individual_id = abai.id AND abair.rastreamento_id IN ( " . Rastreamento::CANCER_COLO_UTERO . ", " . Rastreamento::CANCER_MAMA . " ) ) OR EXISTS ( SELECT 1 FROM atencao_basica_atendimento_individual_problema_condicao abaipc LEFT JOIN geral_ciap gc ON gc.id = abaipc.ciap_id LEFT JOIN sigtap.cid c ON c.id = abaipc.cid_id WHERE abaipc.atendimento_individual_id = abai.id AND ( gc.codigo IN ( 'B25', 'W02', 'W10', 'W11', 'W12', 'W13', 'W14', 'W15', 'W79', 'W82', 'X01', 'X02', 'X03', 'X04', 'X05', 'X06', 'X07', 'X08', 'X09', 'X10', 'X11', 'X12', 'X13', 'X23', 'X24', 'X82', 'X89', 'Y14' ) OR c.codigo IN ( 'N80', 'N800', 'N801', 'N802', 'N803', 'N804', 'N805', 'N806', 'N808', 'N809', 'N91', 'N910', 'N911', 'N912', 'N913', 'N914', 'N915', 'N92', 'N920', 'N921', 'N922', 'N923', 'N924', 'N925', 'N926', 'N93', 'N930', 'N938', 'N939', 'N94', 'N940', 'N941', 'N942', 'N943', 'N944', 'N945', 'N946', 'N948', 'N949', 'N95', 'N950', 'N951', 'N952', 'N953', 'N958', 'N959', 'N96', 'N97', 'N970', 'N971', 'N972', 'N973', 'N974', 'N978', 'N979', 'O03', 'O04', 'R102', 'T742', 'Y050', 'Y051', 'Y052', 'Y053', 'Y054', 'Y055', 'Y056', 'Y057', 'Y058', 'Y059', 'Z123', 'Z124', 'Z205', 'Z206', 'Z30', 'Z300', 'Z301', 'Z302', 'Z303', 'Z304', 'Z305', 'Z308', 'Z309', 'Z31', 'Z310', 'Z311', 'Z312', 'Z313', 'Z314', 'Z315', 'Z316', 'Z318', 'Z319', 'Z320', 'Z600', 'Z630', 'Z640', 'Z70', 'Z700', 'Z701', 'Z702', 'Z703', 'Z708', 'Z709', 'Z717', 'Z725' ) ) ) ) LIMIT 1 ), 1, 0 ) ) AS has_boa_pratica") ]) ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 14", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->orWhere(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO) ->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO) ) ) ->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($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id)) ->when($params->has_idade_minima, fn ($q) => $q ->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada( $params->idade_minima_anos, $params->idade_minima_meses, $params->idade_minima_dias )) ) ->when($params->has_idade_maxima, fn ($q) => $q ->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada( $params->idade_maxima_anos, $params->idade_maxima_meses, $params->idade_maxima_dias )) ) ->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id)) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('domiciliar_fora_area.id') ->where(fn ($sub) => $sub ->whereNull('domiciliar_fora_area.fora_area') ->orWhere('domiciliar_fora_area.fora_area', 0) )); $builderBoaPraticaD = 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_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') ->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('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id') ->leftJoin('atencao_basica_parametrizacao_microarea AS microarea_fora_area', 'microarea_fora_area.id', 'domiciliar_fora_area.microarea_id') ->leftJoin('atencao_basica_parametrizacao_area AS area_fora_area', 'area_fora_area.id', 'microarea_fora_area.area_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'cidadao.id') ->whereNull('obito.deleted_at') ) ->select([ DB::raw("'D' AS boa_pratica"), 'cadastro_individual.id AS cadastro_individual_id', '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"), 'cidadao.nome AS paciente_nome', 'sexo.id AS sexo_id', 'sexo.descricao AS sexo_descricao', 'cidadao.identidade_genero_id', 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 area_fora_area.numero_ine IS NULL AND area_fora_area.descricao IS NULL AND microarea_fora_area.descricao IS NULL THEN 'Não informada' ELSE CONCAT( CASE WHEN area_fora_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', area_fora_area.numero_ine) ELSE '' END, CASE WHEN area_fora_area.descricao IS NOT NULL AND area_fora_area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN area_fora_area.descricao IS NOT NULL THEN 'Área: ' ELSE '' END, COALESCE(area_fora_area.descricao, ''), CASE WHEN microarea_fora_area.descricao IS NOT NULL AND (area_fora_area.numero_ine IS NOT NULL OR area_fora_area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN microarea_fora_area.descricao IS NOT NULL THEN 'Microárea: ' ELSE '' END, COALESCE(microarea_fora_area.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( ( SELECT TRUE FROM atencao_basica_atendimento_individual abai INNER JOIN sigtap.ocupacao o ON o.id = abai.usuario_ocupacao_id WHERE abai.paciente_id = paciente.id AND abai.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 50 YEAR) AND abai.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 24 MONTH) AND abai.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 69 YEAR) AND abai.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 EXISTS ( SELECT 1 FROM atencao_basica_atendimento_individual_outro_exame abaioe INNER JOIN parametrizacao_exame pe ON pe.id = abaioe.exame_id WHERE abaioe.atendimento_individual_id = abai.id AND pe.codigo IN ( '" . Procedimento::MAMOGRAFIA . "', '" . Procedimento::MAMOGRAFIA_BILATERAL_PARA_RASTREAMENTO . "' ) AND (abaioe.solicitado = 1 OR abaioe.avaliado = 1) ) LIMIT 1 ) OR ( SELECT TRUE FROM atencao_basica_procedimento_atendimento abpa INNER JOIN atencao_basica_procedimento abp ON abp.id = abpa.procedimento_id INNER JOIN sigtap.ocupacao o ON o.id = abp.ocupacao_id WHERE abpa.paciente_id = paciente.id AND abp.data_usuario_responsavel >= DATE_ADD(cidadao.data_nascimento, INTERVAL 50 YEAR) AND abp.data_usuario_responsavel >= DATE_SUB('{$params->periodo['end']->format('Y-m-d')}', INTERVAL 24 MONTH) AND abp.data_usuario_responsavel <= DATE_ADD(cidadao.data_nascimento, INTERVAL 69 YEAR) AND abp.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 EXISTS ( SELECT 1 FROM atencao_basica_procedimento_atendimento_procedimento abpap INNER JOIN sigtap.procedimento p ON p.id = abpap.procedimento_id WHERE abpap.procedimento_atendimento_id = abpa.id AND p.codigo IN ( '" . Procedimento::MAMOGRAFIA . "', '" . Procedimento::MAMOGRAFIA_BILATERAL_PARA_RASTREAMENTO . "' ) ) LIMIT 1 ), 1, 0 ) ) AS has_boa_pratica") ]) ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 50", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->orWhere(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO) ->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO) ) ) ->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($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id)) ->when($params->has_idade_minima, fn ($q) => $q ->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada( $params->idade_minima_anos, $params->idade_minima_meses, $params->idade_minima_dias )) ) ->when($params->has_idade_maxima, fn ($q) => $q ->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada( $params->idade_maxima_anos, $params->idade_maxima_meses, $params->idade_maxima_dias )) ) ->when($params->paciente_id, fn ($q, $id) => $q->where('cadastro_individual.paciente_id', $id)) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('domiciliar_fora_area.id') ->where(fn ($sub) => $sub ->whereNull('domiciliar_fora_area.fora_area') ->orWhere('domiciliar_fora_area.fora_area', 0) )); $builder = $builderBoaPraticaA ->unionAll($builderBoaPraticaB) ->unionAll($builderBoaPraticaC) ->unionAll($builderBoaPraticaD); self::setOrderByPaciente($builder); $itens = $builder->get(); $pacientes = collect(); $itens->each(function ($item) use ($pacientes) { $paciente = $pacientes->where('cadastro_individual_id', $item->cadastro_individual_id)->first(); if (is_null($paciente)) { $idadeAnos = AgeService::getAge(Carbon::create($item->data_nascimento)->toDate())->years; $boaPraticaAAplica = $idadeAnos >= 25 && $idadeAnos <= 64 && ( ($item->sexo_id === SujeitoAtencaoSexo::FEMININO && ( is_null($item->identidade_genero_id) || $item->identidade_genero_id !== IdentidadeGenero::MULHER_TRANSGENERO ) ) || ($item->sexo_id === SujeitoAtencaoSexo::MASCULINO && $item->identidade_genero_id === IdentidadeGenero::HOMEM_TRANSGENERO) ); $boaPraticaBAplica = $idadeAnos >= 9 && $idadeAnos <= 14 && ( ($item->sexo_id === SujeitoAtencaoSexo::FEMININO && ( is_null($item->identidade_genero_id) || $item->identidade_genero_id !== IdentidadeGenero::MULHER_TRANSGENERO ) ) ); $boaPraticaCAplica = $idadeAnos >= 14 && $idadeAnos <= 69 && ( ($item->sexo_id === SujeitoAtencaoSexo::FEMININO && ( is_null($item->identidade_genero_id) || $item->identidade_genero_id !== IdentidadeGenero::MULHER_TRANSGENERO ) ) || ($item->sexo_id === SujeitoAtencaoSexo::MASCULINO && $item->identidade_genero_id === IdentidadeGenero::HOMEM_TRANSGENERO) ); $boaPraticaDAplica = $idadeAnos >= 50 && $idadeAnos <= 69 && ( ($item->sexo_id === SujeitoAtencaoSexo::FEMININO && ( is_null($item->identidade_genero_id) || $item->identidade_genero_id !== IdentidadeGenero::MULHER_TRANSGENERO ) ) || ($item->sexo_id === SujeitoAtencaoSexo::MASCULINO && $item->identidade_genero_id === IdentidadeGenero::HOMEM_TRANSGENERO) ); $paciente = (object) [ 'cadastro_individual_id' => $item->cadastro_individual_id, 'unidade_nome_fantasia' => $item->unidade_nome_fantasia, 'equipe_descricao' => $item->equipe_descricao, 'paciente_nome' => $item->paciente_nome, 'sexo_descricao' => $item->sexo_descricao, 'microarea_descricao' => $item->microarea_descricao, 'area_microarea_domicilio' => $item->area_microarea_domicilio, 'usuario_cadastro_nome' => $item->usuario_cadastro_nome, 'data_nascimento' => $item->data_nascimento, 'telefone_principal' => $item->telefone_principal, 'endereco' => $item->endereco, 'boa_pratica_a' => false, 'boa_pratica_b' => false, 'boa_pratica_c' => false, 'boa_pratica_d' => false, 'boa_pratica_a_aplica' => $boaPraticaAAplica, 'boa_pratica_b_aplica' => $boaPraticaBAplica, 'boa_pratica_c_aplica' => $boaPraticaCAplica, 'boa_pratica_d_aplica' => $boaPraticaDAplica, ]; $pacientes->push($paciente); } $paciente->{'boa_pratica_' . Str::lower($item->boa_pratica)} = (bool) $item->has_boa_pratica; }); $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->pontuacao_total = 0; if (in_array('A', $params->boas_praticas) && $paciente->boa_pratica_a) $paciente->pontuacao_total += 20; if (in_array('B', $params->boas_praticas) && $paciente->boa_pratica_b) $paciente->pontuacao_total += 30; if (in_array('C', $params->boas_praticas) && $paciente->boa_pratica_c) $paciente->pontuacao_total += 30; if (in_array('D', $params->boas_praticas) && $paciente->boa_pratica_d) $paciente->pontuacao_total += 20; if (!$paciente->boa_pratica_a_aplica) $paciente->boa_pratica_a = true; if (!$paciente->boa_pratica_b_aplica) $paciente->boa_pratica_b = true; if (!$paciente->boa_pratica_c_aplica) $paciente->boa_pratica_c = true; if (!$paciente->boa_pratica_d_aplica) $paciente->boa_pratica_d = true; }); $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' => 'paciente_nome', 'sexo_descricao' => 'sexo_descricao', 'idade' => 'data_nascimento', 'microarea_descricao' => 'microarea_descricao', 'area_microarea_domicilio' => 'area_microarea_domicilio', 'usuario_cadastro_nome' => 'usuario_cadastro_nome', 'data_nascimento' => 'data_nascimento', 'telefone_principal' => 'telefone_principal', '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' => [], 'identidades_genero' => [], ], 'model' => [ 'periodo' => ['start' => null, 'end' => null], 'quadrimestre_ano' => null, 'quadrimestre' => null, 'unidade_id' => null, 'equipe_id' => null, 'boas_praticas' => $boasPraticas->pluck('value')->toArray(), 'sexo_id' => null, 'identidade_genero_id' => null, 'idade_minima_anos' => null, 'idade_minima_meses' => null, 'idade_minima_dias' => null, 'idade_maxima_anos' => null, 'idade_maxima_meses' => null, 'idade_maxima_dias' => null, 'paciente' => null, 'busca_ativa' => false, '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), 'identidades_genero' => self::getIdentidadesGenero($params), ]; } case 'equipes': { return [ 'equipes' => self::getEquipes($params), 'sexos' => self::getSexos($params), 'identidades_genero' => self::getIdentidadesGenero($params), ]; } case 'sexos': { return [ 'sexos' => self::getSexos($params), 'identidades_genero' => self::getIdentidadesGenero($params), ]; } case 'identidades_genero': { return [ 'identidades_genero' => self::getIdentidadesGenero($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', []), 'sexo_id' => request()->get('sexo_id'), 'identidade_genero_id' => request()->get('identidade_genero_id'), 'idade_minima_anos' => request()->get('idade_minima_anos'), 'idade_minima_meses' => request()->get('idade_minima_meses'), 'idade_minima_dias' => request()->get('idade_minima_dias'), 'idade_maxima_anos' => request()->get('idade_maxima_anos'), 'idade_maxima_meses' => request()->get('idade_maxima_meses'), 'idade_maxima_dias' => request()->get('idade_maxima_dias'), 'paciente_id' => request()->get('paciente_id'), 'busca_ativa' => DataUtil::getBooleanValueFromStringBoolean(request()->get('busca_ativa', 'false')), '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) ]; } $params->has_idade_minima = !is_null($params->idade_minima_anos) || !is_null($params->idade_minima_meses) || !is_null($params->idade_minima_dias); $params->has_idade_maxima = !is_null($params->idade_maxima_anos) || !is_null($params->idade_maxima_meses) || !is_null($params->idade_maxima_dias); 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(object $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('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') ->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()) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->orWhere(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO) ->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO) ) ) ) ->orderBy('unidade.nome_fantasia') ->get(); } private static function getEquipes(object $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('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_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') ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->orWhere(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO) ->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO) ) ) ) ->orderBy('descricao') ->get(); } private static function getBoasPraticas() { return collect([ (object) ['value' => 'A', 'text' => 'A - Rastreamento de câncer do colo do útero'], (object) ['value' => 'B', 'text' => 'B - Vacina HPV'], (object) ['value' => 'C', 'text' => 'C - Atendimento em saúde sexual e reprodutiva'], (object) ['value' => 'D', 'text' => 'D - Rastreamento de câncer de mama'], ]); } private static function getSexos(object $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') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'paciente.cidadao_id') ->whereNull('obito.deleted_at') ) ->whereColumn('cidadao.sexo_id', 'sexo.id') ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->orWhere(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO) ->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO) ) ) ->when($params->unidade_id, fn ($q, $id) => $q->where('equipe.unidade_id', $id)) ->when($params->equipe_id, fn ($q, $id) => $q->where('cadastro_individual.equipe_id', $id)) ) ->orderBy('sexo.descricao') ->get(); } private static function getIdentidadesGenero(object $params) { return DB::table('cadastro_identidade_genero AS identidade_genero') ->select([ 'identidade_genero.id', 'identidade_genero.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') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'paciente.cidadao_id') ->whereNull('obito.deleted_at') ) ->whereColumn('cidadao.identidade_genero_id', 'identidade_genero.id') ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->orWhere(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO) ->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO) ) ) ->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)) ) ->orderBy('identidade_genero.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_parametrizacao_equipe AS equipe', 'equipe.id', 'cadastro_individual.equipe_id') ->join('atencao_basica_parametrizacao_area AS area', 'area.id', 'equipe.area_id') ->leftJoin('atencao_basica_cadastro_domiciliar AS domiciliar_fora_area', 'domiciliar_fora_area.domicilio_id', 'cidadao.domicilio_id') ->leftJoin('cadastro_obito AS obito', fn ($j) => $j ->on('obito.cidadao_id', 'paciente.cidadao_id') ->whereNull('obito.deleted_at') ) ->select([ 'paciente.id', 'cidadao.nome' ]) ->whereIn('area.tipo_id', self::getTiposEquipes()) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) >= 9", [$params->periodo['end']->format('Y-m-d')]) ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, ?) <= 69", [$params->periodo['start']->format('Y-m-d')]) ->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNull('cadastro_individual.saida_cidadao_id') ->orWhere('cadastro_individual.saida_cidadao_id', '<>', SaidaCidadao::MUDANCA_DE_TERRITORIO) ) ->orWhere(fn ($q) => $q ->where('cadastro_individual.saida_cidadao_id', SaidaCidadao::MUDANCA_DE_TERRITORIO) ->where('cadastro_individual.motivo_saida_data', '>', $params->periodo['end']->format('Y-m-d')) ) ) ->where(fn ($q) => $q ->whereNull('obito.obito_em') ->orWhere('obito.obito_em', '>', $params->periodo['end']->format('Y-m-d H:i:s')) ) ->where(fn ($q) => $q ->where(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::FEMININO) ->where(fn ($q) => $q ->whereNull('cidadao.identidade_genero_id') ->orWhere('cidadao.identidade_genero_id', '<>', IdentidadeGenero::MULHER_TRANSGENERO) ) ) ->orWhere(fn ($q) => $q ->where('cidadao.sexo_id', SujeitoAtencaoSexo::MASCULINO) ->where('cidadao.identidade_genero_id', IdentidadeGenero::HOMEM_TRANSGENERO) ) ) ->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($params->identidade_genero_id, fn ($q, $id) => $q->where('cidadao.identidade_genero_id', $id)) ->when($params->has_idade_minima, fn ($q) => $q ->where('cidadao.data_nascimento', '<=', self::getIdadeCalculada( $params->idade_minima_anos, $params->idade_minima_meses, $params->idade_minima_dias )) ) ->when($params->has_idade_maxima, fn ($q) => $q ->where('cidadao.data_nascimento', '>=', self::getIdadeCalculada( $params->idade_maxima_anos, $params->idade_maxima_meses, $params->idade_maxima_dias )) ) ->when(!$params->fora_area, fn ($q) => $q ->whereNotNull('domiciliar_fora_area.id') ->where(fn ($sub) => $sub ->whereNull('domiciliar_fora_area.fora_area') ->orWhere('domiciliar_fora_area.fora_area', 0) )) ->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'; $identidadeGenero = request()->identidade_genero_id ? SujeitoAtencaoIdentidadeGenero::findOrFail(request()->identidade_genero_id)->descricao : 'Todas'; $paciente = request()->paciente_id ? Paciente::findOrFail(request()->paciente_id)->cidadao->nome : ''; $isBuscaAtiva = DataUtil::isStringTrue(request()->busca_ativa); $isForaArea = DataUtil::isStringTrue(request()->fora_area); 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, 'foraArea' => $isForaArea ? 'Sim' : 'Não', 'sexo' => $sexo, 'identidadeGenero' => $identidadeGenero, 'idadeMinimaAnos' => request()->idade_minima_anos, 'idadeMinimaMeses' => request()->idade_minima_meses, 'idadeMinimaDias' => request()->idade_minima_dias, 'idadeMaximaAnos' => request()->idade_maxima_anos, 'idadeMaximaMeses' => request()->idade_maxima_meses, 'idadeMaximaDias' => request()->idade_maxima_dias, 'paciente' => $paciente, 'equipes' => $data->equipes, 'pacientes' => $data->pacientes, 'totalizadores' => $data->totalizadores, 'colunasEquipes' => collect(request()->colunas_equipes), '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 getIdadeCalculada($anos = null, $meses = null, $dias = null) { $data = Carbon::now(); if (!is_null($anos)) { $data->subYears($anos); } if (!is_null($meses)) { $data->subMonths($meses); } if (!is_null($dias)) { $data->subDays($dias); } return $data; } }