modelo_resultado === 'sintetico') { $totalizadores = (object) [ 'total_pacientes' => 0, 'total_sexo_masculino' => 0, 'total_sexo_feminino' => 0, 'total_sexo_indeterminado' => 0, 'total_idade_zero_doze' => 0, 'total_idade_treze_dezessete' => 0, 'total_idade_dezoito_cinquenta_nove' => 0, 'total_idade_sessenta_setenta_nove' => 0, 'total_idade_oitenta_mais' => 0, ]; $itensBuilder = DB::table('cadastro_bairro AS bairro') ->join('cadastro_logradouro AS logradouro', 'logradouro.bairro_id', 'bairro.id') ->join('cadastro_endereco AS endereco', 'endereco.logradouro_id', 'logradouro.id') ->join('cadastro_domicilio AS domicilio', 'domicilio.endereco_id', 'endereco.id') ->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id') ->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id') ->whereNull('bairro.deleted_at') ->whereNull('logradouro.deleted_at') ->whereNull('endereco.deleted_at') ->whereNull('domicilio.deleted_at') ->whereNull('cidadao.deleted_at') ->whereNull('paciente.deleted_at') ->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id)) ->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id)) ->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id)) ->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id)) ->when($params->tipo_logradouro_id, fn ($q, $id) => $q->where('logradouro.tipo_id', $id)) ->when($params->logradouro_id, fn ($q, $id) => $q->where('logradouro.id', $id)) ->when($params->paciente_id, fn ($q, $id) => $q->where('paciente.id', $id)) ->when($params->fora_area, fn ($q) => $q->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar') ->whereColumn('cadastro_domiciliar.domicilio_id', 'domicilio.id') ->where('cadastro_domiciliar.fora_area', true) ) ->orWhereNotExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar') ->whereColumn('cadastro_domiciliar.domicilio_id', 'domicilio.id') ) ), fn ($q) => $q->where(fn ($q) => $q ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar') ->join( 'atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'cadastro_domiciliar.microarea_id' ) ->whereColumn('cadastro_domiciliar.domicilio_id', 'domicilio.id') ->when($params->area_id, fn ($q, $id) => $q->where('microarea.area_id', $id)) ->when($params->microarea_id, fn ($q, $id) => $q->where('cadastro_domiciliar.microarea_id', $id)) ) ->when(is_null($params->area_id) && is_null($params->microarea_id), fn ($q) => $q ->orWhereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar') ->whereColumn('cadastro_domiciliar.domicilio_id', 'domicilio.id') ->where('cadastro_domiciliar.fora_area', true) ) ->orWhereNotExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar') ->whereColumn('cadastro_domiciliar.domicilio_id', 'domicilio.id') ) ) ) ) ->select( 'bairro.nome AS bairro_nome', DB::raw("COUNT(*) AS total_pacientes"), DB::raw("SUM(IF(cidadao.sexo_id = " . Sexo::MASCULINO . ", 1, 0)) AS total_sexo_masculino"), DB::raw("SUM(IF(cidadao.sexo_id = " . Sexo::FEMININO . ", 1, 0)) AS total_sexo_feminino"), DB::raw("SUM(IF(cidadao.sexo_id = " . Sexo::INDETERMINADO . ", 1, 0)) AS total_sexo_indeterminado"), DB::raw("SUM( IF(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= 0 AND TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= 12, 1, 0) ) AS total_idade_zero_doze"), DB::raw("SUM( IF(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= 13 AND TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= 17, 1, 0) ) AS total_idade_treze_dezessete"), DB::raw("SUM( IF(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= 18 AND TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= 59, 1, 0) ) AS total_idade_dezoito_cinquenta_nove"), DB::raw("SUM( IF(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= 60 AND TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= 79, 1, 0) ) AS total_idade_sessenta_setenta_nove"), DB::raw("SUM( IF(TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= 80, 1, 0) ) AS total_idade_oitenta_mais") ) ->groupBy( 'bairro.nome' ); self::setOrderBy($params->modelo_resultado, $itensBuilder); $itens = $itensBuilder->get(); $itens->each(function ($item) use ($totalizadores) { $totalizadores->total_pacientes += $item->total_pacientes; $totalizadores->total_sexo_masculino += $item->total_sexo_masculino; $totalizadores->total_sexo_feminino += $item->total_sexo_feminino; $totalizadores->total_sexo_indeterminado += $item->total_sexo_indeterminado; $totalizadores->total_idade_zero_doze += $item->total_idade_zero_doze; $totalizadores->total_idade_treze_dezessete += $item->total_idade_treze_dezessete; $totalizadores->total_idade_dezoito_cinquenta_nove += $item->total_idade_dezoito_cinquenta_nove; $totalizadores->total_idade_sessenta_setenta_nove += $item->total_idade_sessenta_setenta_nove; $totalizadores->total_idade_oitenta_mais += $item->total_idade_oitenta_mais; }); } else { $itensBuilder = DB::table('cadastro_paciente AS paciente') ->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id') ->join('cadastro_sexo AS sexo', 'sexo.id', 'cidadao.sexo_id') ->join('cadastro_domicilio AS domicilio', 'domicilio.id', 'cidadao.domicilio_id') ->join('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id') ->join('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id') ->join('cadastro_logradouro_tipo AS logradouro_tipo', 'logradouro_tipo.id', 'logradouro.tipo_id') ->join('cadastro_bairro AS bairro', 'bairro.id', 'logradouro.bairro_id') ->join('intranet.cadastro_municipio AS municipio', 'municipio.id', 'logradouro.municipio_id') ->join('intranet.cadastro_estado AS estado', 'estado.id', 'municipio.estado_id') ->leftJoin('cadastro_cidadao_telefone AS telefone', fn ($j) => $j ->on('telefone.cidadao_id', 'cidadao.id') ->where('telefone.id', fn ($q) => $q ->selectRaw('telefone2.id') ->from('cadastro_cidadao_telefone AS telefone2') ->whereColumn('telefone2.cidadao_id', 'cidadao.id') ->whereNull('telefone2.deleted_at') ->where('telefone2.principal', true) ->limit(1) ) ) ->leftJoin( 'atencao_basica_cadastro_domiciliar AS cadastro_domiciliar', 'cadastro_domiciliar.domicilio_id', 'domicilio.id' ) ->leftJoin( 'atencao_basica_parametrizacao_microarea AS microarea', 'microarea.id', 'cadastro_domiciliar.microarea_id' ) ->leftJoin( 'atencao_basica_parametrizacao_area AS area', 'area.id', 'microarea.area_id' ) ->leftJoin('cadastro_paciente_responsavel AS paciente_responsavel', fn ($j) => $j ->on('paciente_responsavel.paciente_id', 'paciente.id') ->whereNull('paciente_responsavel.deleted_at') ) ->leftJoin('cadastro_usuario AS usuario_responsavel', fn ($j) => $j ->on('usuario_responsavel.id', 'paciente_responsavel.responsavel_usuario_id') ->whereNull('usuario_responsavel.deleted_at') ) ->leftJoin('cadastro_cidadao AS usuario_responsavel_cidadao', fn ($j) => $j ->on('usuario_responsavel_cidadao.id', 'usuario_responsavel.cidadao_id') ->whereNull('usuario_responsavel_cidadao.deleted_at') ) ->whereNull('paciente.deleted_at') ->whereNull('cidadao.deleted_at') ->whereNull('domicilio.deleted_at') ->whereNull('endereco.deleted_at') ->whereNull('logradouro.deleted_at') ->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id)) ->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id)) ->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id)) ->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id)) ->when($params->tipo_logradouro_id, fn ($q, $id) => $q->where('logradouro.tipo_id', $id)) ->when($params->logradouro_id, fn ($q, $id) => $q->where('logradouro.id', $id)) ->when($params->paciente_id, fn ($q, $id) => $q->where('paciente.id', $id)) ->when($params->fora_area, fn ($q) => $q->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNotNull('cadastro_domiciliar.id') ->where('cadastro_domiciliar.fora_area', true) ) ->orWhereNull('cadastro_domiciliar.id') ), fn ($q) => $q->where(fn ($q) => $q ->where(fn ($q) => $q ->whereNotNull('cadastro_domiciliar.id') ->when($params->area_id, fn ($q, $id) => $q->where('microarea.area_id', $id)) ->when($params->microarea_id, fn ($q, $id) => $q->where('cadastro_domiciliar.microarea_id', $id)) ) ->when(is_null($params->area_id) && is_null($params->microarea_id), fn ($q) => $q ->orWhere(fn ($q) => $q ->where(fn ($q) => $q ->whereNotNull('cadastro_domiciliar.id') ->where('cadastro_domiciliar.fora_area', true) ) ->orWhereNull('cadastro_domiciliar.id') ) ) ) ) ->select( DB::raw("LPAD(paciente.prontuario, 7, 0) AS paciente_prontuario"), 'cidadao.cns AS paciente_cns', 'cidadao.cpf AS paciente_cpf', 'cidadao.nome AS paciente_nome', DB::raw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) AS paciente_idade"), 'sexo.descricao AS sexo_descricao', 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"), 'telefone.numero AS telefone_numero', 'area.descricao AS area', 'microarea.descricao AS microarea', 'usuario_responsavel_cidadao.nome AS usuario_responsavel_nome' ); self::setOrderBy($params->modelo_resultado, $itensBuilder); $itens = $itensBuilder->get(); $itens->each(function ($item) { $item->paciente_cns = MaskUtil::getCnsMasked($item->paciente_cns); $item->paciente_cpf = MaskUtil::getCpfMasked($item->paciente_cpf); $item->telefone_numero = MaskUtil::getPhoneMasked($item->telefone_numero); }); } return compact('itens', 'totalizadores'); } private static function setOrderBy($modeloResultado, $builder) { $columns = $modeloResultado === 'sintetico' ? [ 'bairro_nome' => 'bairro.nome', 'total_pacientes' => 'total_pacientes', 'total_sexo_masculino' => 'total_sexo_masculino', 'total_sexo_feminino' => 'total_sexo_feminino', 'total_sexo_indeterminado' => 'total_sexo_indeterminado', 'total_idade_zero_doze' => 'total_idade_zero_doze', 'total_idade_treze_dezessete' => 'total_idade_treze_dezessete', 'total_idade_dezoito_cinquenta_nove' => 'total_idade_dezoito_cinquenta_nove', 'total_idade_sessenta_setenta_nove' => 'total_idade_sessenta_setenta_nove', 'total_idade_oitenta_mais' => 'total_idade_oitenta_mais', ] : [ 'paciente_prontuario' => 'paciente.prontuario', 'paciente_cns' => 'cidadao.cns', 'paciente_cpf' => 'cidadao.cpf', 'paciente_nome' => 'cidadao.nome', 'paciente_idade' => 'paciente_idade', 'sexo_descricao' => 'sexo.descricao', 'endereco' => 'endereco', 'telefone_numero' => 'telefone.numero', 'area' => 'area.descricao', 'microarea' => 'microarea.descricao', 'usuario_responsavel_nome' => 'usuario_responsavel_cidadao.nome', ]; if (is_null(request()->sortBy)) { $builder->orderByRaw(join(', ', $columns)); return; } $column = $columns[request()->sortBy]; $direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC'; unset($columns[request()->sortBy]); $builder->orderByRaw( "{$column} {$direction}, " . join(', ', $columns) ); } public static function list() { $data = (object) [ 'form' => [], 'model' => [], ]; $params = self::getParams(); $sets = [ 'modelo_resultado' => function () use ($data, $params) { $modelosResultadoData = self::getModelosResultadoData(); $data->form['modelos_resultado'] = $modelosResultadoData['form']; $data->model['modelo_resultado'] = $modelosResultadoData['model']; $params->modelo_resultado = $data->model['modelo_resultado']; }, 'classificacao' => function () use ($data, $params) { $classificacoesData = self::getClassificacoesData(); $data->form['classificacoes'] = $classificacoesData['form']; $data->model['classificacao_id'] = $classificacoesData['model']; $params->classificacao_id = $data->model['classificacao_id']; }, 'municipio' => function () use ($data, $params) { $municipiosData = self::getMunicipiosData($params); $data->form['municipios'] = $municipiosData['form']; $data->model['municipio_id'] = $municipiosData['model']; $params->municipio_id = $data->model['municipio_id']; }, 'unidade' => function () use ($data, $params) { $unidadesData = self::getUnidadesData($params); $data->form['unidades'] = $unidadesData['form']; $data->model['unidade_id'] = $unidadesData['model']; $params->unidade_id = $data->model['unidade_id']; }, 'bairro' => function () use ($data, $params) { $bairrosData = self::getBairrosData($params); $data->form['bairros'] = $bairrosData['form']; $data->model['bairro_id'] = $bairrosData['model']; $params->bairro_id = $data->model['bairro_id']; }, 'tipo_logradouro' => function () use ($data, $params) { $tiposLogradouroData = self::getTiposLogradouroData($params); $data->form['tipos_logradouro'] = $tiposLogradouroData['form']; $data->model['tipo_logradouro_id'] = $tiposLogradouroData['model']; $params->tipo_logradouro_id = $data->model['tipo_logradouro_id']; }, 'logradouro' => function () use ($data, $params) { $data->model['logradouro'] = null; $params->logradouro_id = null; }, 'paciente' => function () use ($data, $params) { $data->model['paciente'] = null; $params->paciente_id = null; }, 'fora_area' => function () use ($data, $params) { $data->model['fora_area'] = false; $params->fora_area = false; }, 'area' => function () use ($data, $params) { $areasData = self::getAreasData($params); $data->form['areas'] = $areasData['form']; $data->model['area_id'] = $areasData['model']; $params->area_id = $data->model['area_id']; }, 'microarea' => function () use ($data, $params) { $microareasData = self::getMicroareasData($params); $data->form['microareas'] = $microareasData['form']; $data->model['microarea_id'] = $microareasData['model']; $params->microarea_id = $data->model['microarea_id']; }, ]; $firstLoad = $load = is_null(request()->load_from); foreach ($sets as $field => $set) { if ($load) { if (!$firstLoad && collect(['fora_area', 'modelo_resultado'])->contains($field)) { continue; } $set(); } else if ($field === request()->load_from) { $load = true; } } foreach ($data as $property => $itens) { if (empty($itens)) { unset($data->{$property}); } } return $data; } private static function getParams() { $params = (object) request()->only([ 'classificacao_id', 'municipio_id', 'unidade_id', 'bairro_id', 'tipo_logradouro_id', 'logradouro_id', 'paciente_id', 'area_id', 'microarea_id', 'fora_area', 'modelo_resultado', ]); if (isset($params->fora_area) && DataUtil::isStringBoolean($params->fora_area)) { $params->fora_area = DataUtil::getBooleanValueFromStringBoolean($params->fora_area); } return $params; } private static function getModelosResultadoData() { $modeloesResultado = collect([ (object) ['value' => 'analitico', 'text' => 'Analítico'], (object) ['value' => 'sintetico', 'text' => 'Sintético'], ]); return ['form' => $modeloesResultado, 'model' => 'analitico']; } private static function getClassificacoesData() { $classificacoes = DB::table('cadastro_paciente_classificacao AS classificacao') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('cadastro_paciente AS paciente') ->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id') ->whereColumn('paciente.classificacao_id', 'classificacao.id') ->whereNull('paciente.deleted_at') ->whereNull('cidadao.deleted_at') ->whereNotNull('cidadao.domicilio_id') ) ->select( 'classificacao.id', 'classificacao.descricao' ) ->orderBy('classificacao.descricao') ->get(); $id = $classificacoes->where('id', Classificacao::MUNICIPE)->isNotEmpty() ? Classificacao::MUNICIPE : null; return ['form' => $classificacoes, 'model' => $id]; } private static function getMunicipiosData($params) { $municipios = DB::table('intranet.cadastro_municipio AS municipio') ->join('intranet.cadastro_estado AS estado', 'estado.id', 'municipio.estado_id') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('cadastro_logradouro AS logradouro') ->join('cadastro_endereco AS endereco', 'endereco.logradouro_id', 'logradouro.id') ->join('cadastro_domicilio AS domicilio', 'domicilio.endereco_id', 'endereco.id') ->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id') ->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id') ->whereColumn('logradouro.municipio_id', 'municipio.id') ->whereNull('logradouro.deleted_at') ->whereNull('endereco.deleted_at') ->whereNull('domicilio.deleted_at') ->whereNull('cidadao.deleted_at') ->whereNull('paciente.deleted_at') ->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id)) ) ->select( 'municipio.id', DB::raw("CONCAT(municipio.nome, ' - ', estado.uf) AS nome") ) ->orderByRaw("CONCAT(municipio.nome, ' - ', estado.uf)") ->get(); $id = null; $municipioClienteId = Cliente::where('link', config('database.default')) ->where('sistema_id', Sistema::CONECTASUS) ->firstOrFail() ->municipio_id; if ($municipios->where('id', $municipioClienteId)->isNotEmpty()) { if ($params->classificacao_id == Classificacao::MUNICIPE || $municipios->count() === 1) { $id = $municipioClienteId; } } return ['form' => $municipios, 'model' => $id]; } private static function getUnidadesData($params) { $unidades = collect(); if ($params->modelo_resultado === 'sintetico' || ($params->modelo_resultado === 'analitico' && !is_null($params->municipio_id)) ) { $unidades = DB::table('cadastro_unidade AS unidade') ->whereNull('unidade.deleted_at') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('cadastro_paciente AS paciente') ->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id') ->join('cadastro_domicilio AS domicilio', 'domicilio.id', 'cidadao.domicilio_id') ->join('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id') ->join('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id') ->whereColumn('paciente.unidade_id', 'unidade.id') ->whereNull('paciente.deleted_at') ->whereNull('cidadao.deleted_at') ->whereNull('domicilio.deleted_at') ->whereNull('endereco.deleted_at') ->whereNull('logradouro.deleted_at') ->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id)) ->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id)) ) ->select( 'unidade.id', 'unidade.nome_fantasia' ) ->orderBy('unidade.nome_fantasia') ->get(); } return ['form' => $unidades, 'model' => null]; } private static function getBairrosData($params) { $bairros = collect(); if ($params->modelo_resultado === 'sintetico' || ($params->modelo_resultado === 'analitico' && !is_null($params->municipio_id)) ) { $bairros = DB::table('cadastro_bairro AS bairro') ->whereNull('bairro.deleted_at') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('cadastro_logradouro AS logradouro') ->join('cadastro_endereco AS endereco', 'endereco.logradouro_id', 'logradouro.id') ->join('cadastro_domicilio AS domicilio', 'domicilio.endereco_id', 'endereco.id') ->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id') ->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id') ->whereColumn('logradouro.bairro_id', 'bairro.id') ->whereNull('logradouro.deleted_at') ->whereNull('endereco.deleted_at') ->whereNull('domicilio.deleted_at') ->whereNull('cidadao.deleted_at') ->whereNull('paciente.deleted_at') ->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id)) ->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id)) ->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id)) ) ->select( 'bairro.id', 'bairro.nome' ) ->orderBy('bairro.nome') ->get(); } return ['form' => $bairros, 'model' => null]; } private static function getTiposLogradouroData($params) { $tiposLogradouro = collect(); if ($params->modelo_resultado === 'sintetico' || ($params->modelo_resultado === 'analitico' && !is_null($params->bairro_id)) ) { $tiposLogradouro = DB::table('cadastro_logradouro_tipo AS logradouro_tipo') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('cadastro_logradouro AS logradouro') ->join('cadastro_endereco AS endereco', 'endereco.logradouro_id', 'logradouro.id') ->join('cadastro_domicilio AS domicilio', 'domicilio.endereco_id', 'endereco.id') ->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id') ->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id') ->whereColumn('logradouro.tipo_id', 'logradouro_tipo.id') ->whereNull('logradouro.deleted_at') ->whereNull('endereco.deleted_at') ->whereNull('domicilio.deleted_at') ->whereNull('cidadao.deleted_at') ->whereNull('paciente.deleted_at') ->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id)) ->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id)) ->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id)) ->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id)) ) ->select( 'logradouro_tipo.id', 'logradouro_tipo.descricao' ) ->orderBy('logradouro_tipo.descricao') ->get(); } return ['form' => $tiposLogradouro, 'model' => null]; } public static function autocompleteLogradouro() { $params = self::getParams(); return DB::table('cadastro_logradouro AS logradouro') ->join('cadastro_endereco AS endereco', 'endereco.logradouro_id', 'logradouro.id') ->join('cadastro_domicilio AS domicilio', 'domicilio.endereco_id', 'endereco.id') ->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id') ->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id') ->whereNull('logradouro.deleted_at') ->whereNull('endereco.deleted_at') ->whereNull('domicilio.deleted_at') ->whereNull('cidadao.deleted_at') ->whereNull('paciente.deleted_at') ->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id)) ->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id)) ->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id)) ->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id)) ->when($params->tipo_logradouro_id, fn ($q, $id) => $q->where('logradouro.tipo_id', $id)) ->select( 'logradouro.id', 'logradouro.nome' ) ->distinct(); } 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('cadastro_domicilio AS domicilio', 'domicilio.id', 'cidadao.domicilio_id') ->join('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id') ->join('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id') ->whereNull('paciente.deleted_at') ->whereNull('cidadao.deleted_at') ->whereNull('domicilio.deleted_at') ->whereNull('endereco.deleted_at') ->whereNull('logradouro.deleted_at') ->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id)) ->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id)) ->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id)) ->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id)) ->when($params->tipo_logradouro_id, fn ($q, $id) => $q->where('logradouro.tipo_id', $id)) ->when($params->logradouro_id, fn ($q, $id) => $q->where('logradouro.id', $id)) ->select( 'paciente.id', 'cidadao.nome' ); } private static function getAreasData($params) { $areas = collect(); if (!$params->fora_area && ($params->modelo_resultado === 'sintetico' || ($params->modelo_resultado === 'analitico' && !is_null($params->bairro_id)) )) { $areas = DB::table('atencao_basica_parametrizacao_area AS area') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_parametrizacao_microarea AS microarea') ->join( 'atencao_basica_cadastro_domiciliar AS cadastro_domiciliar', 'cadastro_domiciliar.microarea_id', 'microarea.id' ) ->join('cadastro_domicilio AS domicilio', 'domicilio.id', 'cadastro_domiciliar.domicilio_id') ->join('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id') ->join('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id') ->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id') ->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id') ->whereColumn('microarea.area_id', 'area.id') ->whereNull('domicilio.deleted_at') ->whereNull('endereco.deleted_at') ->whereNull('logradouro.deleted_at') ->whereNull('cidadao.deleted_at') ->whereNull('paciente.deleted_at') ->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id)) ->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id)) ->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id)) ->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id)) ->when($params->tipo_logradouro_id, fn ($q, $id) => $q->where('logradouro.tipo_id', $id)) ->when($params->logradouro_id, fn ($q, $id) => $q->where('logradouro.id', $id)) ->when($params->paciente_id, fn ($q, $id) => $q->where('paciente.id', $id)) ) ->select( 'area.id', 'area.descricao' ) ->orderBy('area.descricao') ->get(); } return ['form' => $areas, 'model' => null]; } private static function getMicroareasData($params) { $microareas = collect(); if (!is_null($params->area_id)) { $microareas = DB::table('atencao_basica_parametrizacao_microarea AS microarea') ->where('microarea.area_id', $params->area_id) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('atencao_basica_cadastro_domiciliar AS cadastro_domiciliar') ->join('cadastro_domicilio AS domicilio', 'domicilio.id', 'cadastro_domiciliar.domicilio_id') ->join('cadastro_endereco AS endereco', 'endereco.id', 'domicilio.endereco_id') ->join('cadastro_logradouro AS logradouro', 'logradouro.id', 'endereco.logradouro_id') ->join('cadastro_cidadao AS cidadao', 'cidadao.domicilio_id', 'domicilio.id') ->join('cadastro_paciente AS paciente', 'paciente.cidadao_id', 'cidadao.id') ->whereColumn('cadastro_domiciliar.microarea_id', 'microarea.id') ->whereNull('domicilio.deleted_at') ->whereNull('endereco.deleted_at') ->whereNull('logradouro.deleted_at') ->whereNull('cidadao.deleted_at') ->whereNull('paciente.deleted_at') ->when($params->classificacao_id, fn ($q, $id) => $q->where('paciente.classificacao_id', $id)) ->when($params->municipio_id, fn ($q, $id) => $q->where('logradouro.municipio_id', $id)) ->when($params->unidade_id, fn ($q, $id) => $q->where('paciente.unidade_id', $id)) ->when($params->bairro_id, fn ($q, $id) => $q->where('logradouro.bairro_id', $id)) ->when($params->tipo_logradouro_id, fn ($q, $id) => $q->where('logradouro.tipo_id', $id)) ->when($params->logradouro_id, fn ($q, $id) => $q->where('logradouro.id', $id)) ->when($params->paciente_id, fn ($q, $id) => $q->where('paciente.id', $id)) ) ->select( 'microarea.id', 'microarea.descricao' ) ->orderBy('microarea.descricao') ->get(); } return ['form' => $microareas, 'model' => null]; } public static function getPrintExportData() { $resultado = self::index(); $itens = $resultado['itens']; $params = self::getParams(); $classificacao = is_null($params->classificacao_id) ? null : PacienteClassificacao::find($params->classificacao_id); $municipio = is_null($params->municipio_id) ? null : Municipio::find($params->municipio_id); $unidade = is_null($params->unidade_id) ? null : Unidade::find($params->unidade_id); $bairro = is_null($params->bairro_id) ? null : Bairro::find($params->bairro_id); $tipoLogradouro = is_null($params->tipo_logradouro_id) ? null : LogradouroTipo::find($params->tipo_logradouro_id); $logradouro = is_null($params->logradouro_id) ? null : Logradouro::find($params->logradouro_id); $paciente = is_null($params->paciente_id) ? null : Paciente::find($params->paciente_id); $foraArea = DataUtil::getBooleanValueFromStringBoolean($params->fora_area) ? 'SIM' : 'NÃO'; $area = is_null($params->area_id) ? null : Area::find($params->area_id); $microarea = is_null($params->microarea_id) ? null : Microarea::find($params->microarea_id); return [ 'classificacao' => $classificacao->descricao ?? 'Todas', 'municipio' => is_null($municipio) ? 'Todos' : "{$municipio->nome} - {$municipio->estado->uf}", 'unidade' => $unidade->nome_fantasia ?? 'Todas', 'bairro' => $bairro->nome ?? 'Todos', 'tipoLogradouro' => $tipoLogradouro->descricao ?? 'Todos', 'logradouro' => $logradouro->nome ?? 'Todos', 'paciente' => $paciente->cidadao->nome ?? 'Todos', 'foraArea' => $foraArea, 'area' => $area->descricao ?? 'Todas', 'microarea' => $microarea->descricao ?? 'Todas', 'colunas' => collect(request()->selectedCols), 'itens' => $itens, 'totalizadores' => $resultado['totalizadores'], 'isModeloSintetico' => $params->modelo_resultado === 'sintetico', ]; } }