select([ 'visita.data_usuario_responsavel AS data', 'paciente.id AS paciente_id', 'cidadao.nome AS paciente_nome', 'paciente.prontuario AS paciente_prontuario', DB::raw(" CONCAT( logradouro_tipo.descricao, ' ', logradouro.nome, ', ', COALESCE(endereco.numero, ''), ' ', bairro.nome, ' - CEP ', logradouro.cep, ' - ', municipio.nome, ' - ', estado.uf ) AS paciente_endereco "), 'cidadao_usuario.nome AS usuario_nome', 'area.descricao AS area_descricao', 'microarea.descricao AS microarea_descricao', 'desfecho.id AS desfecho_id', 'desfecho.descricao AS desfecho_descricao', DB::raw('COUNT(DISTINCT residente.id) AS residentes'), DB::raw('MAX(CASE WHEN info_social.id IS NOT NULL THEN responsavel.nome END) AS responsavel_familiar'), ]) ->join('atencao_basica_parametrizacao_equipe as equipe', 'equipe.id', '=', 'visita.equipe_id') ->join('atencao_basica_parametrizacao_area as area', 'area.id', '=', 'equipe.area_id') ->join('cadastro_paciente as paciente', 'paciente.id', '=', 'visita.paciente_id') ->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') ->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') ->join('cadastro_usuario as usuario', 'usuario.id', '=', 'visita.usuario_id') ->join('cadastro_cidadao as cidadao_usuario', 'cidadao_usuario.id', '=', 'usuario.cidadao_id') ->leftJoin('atencao_basica_parametrizacao_microarea as microarea', 'microarea.id', '=', 'equipe.microarea_id') ->leftJoin('atencao_basica_cadastro_desfecho as desfecho', 'desfecho.id', '=', 'visita.desfecho_id') ->leftJoin('cadastro_cidadao as residente', function ($join) { $join->on('residente.domicilio_id', '=', 'cidadao.domicilio_id') ->whereNull('residente.deleted_at'); }) ->leftJoin('cadastro_cidadao as responsavel', function ($join) { $join->on('responsavel.domicilio_id', '=', 'cidadao.domicilio_id') ->whereNull('responsavel.deleted_at'); }) ->leftJoin('cadastro_paciente as paciente_responsavel', 'paciente_responsavel.cidadao_id', '=', 'responsavel.id') ->leftJoin('cadastro_paciente_informacao_social as info_social', function ($join) { $join->on('info_social.paciente_id', '=', 'paciente_responsavel.id') ->where('info_social.responsavel', true); }) ->whereBetween('visita.data_usuario_responsavel', $params->periodo) ->when($params->unidade_id, fn($q, $v) => $q->where('equipe.unidade_id', $v)) ->when($params->infraestrutura_id, fn($q, $v) => $q->where('equipe.infraestrutura_id', $v)) ->when($params->area_id, fn($q, $v) => $q->where('equipe.area_id', $v)) ->when($params->microarea_id, fn($q, $v) => $q->where('equipe.microarea_id', $v)) ->when($params->usuario_id, fn($q, $v) => $q->where('visita.usuario_id', $v)) ->when($params->paciente_id, fn($q, $v) => $q->where('visita.paciente_id', $v)) ->when($params->domicilio_id, fn($q, $v) => $q->where('cidadao.domicilio_id', $v)) ->when($params->endereco_numero, fn($q, $v) => $q->where('endereco.numero', $v)) ->when($params->desfecho_id, fn($q, $v) => $q->where('desfecho.id', $v)) ->groupBy('visita.id'); self::setOrderBy($visitas); $itens = $visitas->get(); $totalizadores = [ 'quantidade_visitas_realizadas' => $itens->where('desfecho_id', Desfecho::VISITA_REALIZADA)->count(), 'quantidade_ausencias' => $itens->where('desfecho_id', Desfecho::AUSENTE)->count(), 'quantidade_recusas' => $itens->where('desfecho_id', Desfecho::VISITA_RECUSADA)->count(), 'quantidade_visitas_registradas' => $itens->count(), 'quantidade_pacientes_atendidos' => $itens->pluck('paciente_id')->unique()->count(), ]; return [ 'itens' => $itens, 'totalizadores' => $totalizadores, ]; } public static function create() { return [ 'form' => [ 'unidades' => [], 'infraestruturas' => [], 'areas' => [], 'microareas' => [], 'usuarios' => [], 'domicilios' => [], 'desfechos' => [], ], 'model' => [ 'periodo' => ['start' => null, 'end' => null], 'unidade_id' => null, 'infraestrutura_id' => null, 'area_id' => null, 'microarea_id' => null, 'usuario_id' => null, 'paciente' => null, 'domicilio_id' => null, 'endereco_numero' => null, 'desfecho_id' => null, ], ]; } public static function list() { $params = self::getParams(); switch (request()->listar) { case 'unidades': { return [ 'unidades' => self::getUnidades($params), 'infraestruturas' => self::getInfraestruturas($params), 'areas' => self::getAreas($params), 'microareas' => self::getMicroareas($params), 'usuarios' => self::getUsuarios($params), 'domicilios' => self::getDomicilios($params), 'desfechos' => self::getDesfechos($params), ]; } case 'infraestruturas': { return [ 'infraestruturas' => self::getInfraestruturas($params), 'areas' => self::getAreas($params), 'microareas' => self::getMicroareas($params), 'usuarios' => self::getUsuarios($params), 'domicilios' => self::getDomicilios($params), 'desfechos' => self::getDesfechos($params), ]; } case 'areas': { return [ 'areas' => self::getAreas($params), 'microareas' => self::getMicroareas($params), 'usuarios' => self::getUsuarios($params), 'domicilios' => self::getDomicilios($params), 'desfechos' => self::getDesfechos($params), ]; } case 'microareas': { return [ 'microareas' => self::getMicroareas($params), 'usuarios' => self::getUsuarios($params), 'domicilios' => self::getDomicilios($params), 'desfechos' => self::getDesfechos($params), ]; } case 'usuarios': { return [ 'usuarios' => self::getUsuarios($params), 'domicilios' => self::getDomicilios($params), 'desfechos' => self::getDesfechos($params), ]; } case 'domicilios': { return [ 'domicilios' => self::getDomicilios($params), 'desfechos' => self::getDesfechos($params), ]; } case 'desfechos': { return [ 'desfechos' => self::getDesfechos($params), ]; } } } public static function autocomplete() { $params = self::getParams(); return DB::table('cadastro_paciente') ->select([ 'cadastro_paciente.id', 'cadastro_cidadao.nome', 'cadastro_cidadao.data_nascimento', 'cadastro_cidadao.cns', 'cadastro_paciente.prontuario', ]) ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_visita_domiciliar') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_visita_domiciliar.equipe_id') ->whereColumn('atencao_basica_visita_domiciliar.paciente_id', 'cadastro_paciente.id') ->whereBetween('atencao_basica_visita_domiciliar.data_usuario_responsavel', $params->periodo) ->when($params->unidade_id, fn ($q, $unidadeId) => $q->where('atencao_basica_parametrizacao_equipe.unidade_id', $unidadeId)) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', $infraestruturaId)) ->when($params->area_id, fn ($q, $areaId) => $q->where('atencao_basica_parametrizacao_equipe.area_id', $areaId)) ->when($params->microarea_id, fn ($q, $microareaId) => $q->where('atencao_basica_parametrizacao_equipe.microarea_id', $microareaId)) ->when($params->usuario_id, fn ($q, $usuarioId) => $q->where('atencao_basica_visita_domiciliar.usuario_id', $usuarioId)) ) ->orderBy('cadastro_cidadao.nome'); } private static function getParams() { return (object) [ '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) ], 'unidade_id' => request()->get('unidade_id'), 'infraestrutura_id' => request()->get('infraestrutura_id'), 'area_id' => request()->get('area_id'), 'microarea_id' => request()->get('microarea_id'), 'usuario_id' => request()->get('usuario_id'), 'paciente_id' => request()->get('paciente_id'), 'domicilio_id' => request()->get('domicilio_id'), 'endereco_numero' => request()->get('endereco_numero'), 'desfecho_id' => request()->get('desfecho_id'), ]; } private static function getUnidades($params) { return DB::table('cadastro_unidade') ->select([ 'cadastro_unidade.id', 'cadastro_unidade.nome_fantasia', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_visita_domiciliar') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_visita_domiciliar.equipe_id') ->whereColumn('atencao_basica_parametrizacao_equipe.unidade_id', 'cadastro_unidade.id') ->whereBetween('atencao_basica_visita_domiciliar.data_usuario_responsavel', $params->periodo) ) ->orderBy('cadastro_unidade.nome_fantasia') ->get(); } private static function getInfraestruturas($params) { return DB::table('cadastro_infraestrutura') ->select([ 'cadastro_infraestrutura.id', DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS nome"), ]) ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->when($params->unidade_id, fn ($q, $unidadeId) => $q->where('cadastro_infraestrutura.unidade_id', $unidadeId)) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_visita_domiciliar') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_visita_domiciliar.equipe_id') ->whereColumn('atencao_basica_parametrizacao_equipe.infraestrutura_id', 'cadastro_infraestrutura.id') ->whereBetween('atencao_basica_visita_domiciliar.data_usuario_responsavel', $params->periodo) ) ->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)') ->get(); } private static function getAreas($params) { return DB::table('atencao_basica_parametrizacao_area') ->select([ 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_area.descricao', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_visita_domiciliar') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_visita_domiciliar.equipe_id') ->whereColumn('atencao_basica_parametrizacao_equipe.area_id', 'atencao_basica_parametrizacao_area.id') ->whereBetween('atencao_basica_visita_domiciliar.data_usuario_responsavel', $params->periodo) ->when($params->unidade_id, fn ($q, $unidadeId) => $q->where('atencao_basica_parametrizacao_equipe.unidade_id', $unidadeId)) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', $infraestruturaId)) ) ->orderBy('atencao_basica_parametrizacao_area.id') ->get(); } private static function getMicroareas($params) { return DB::table('atencao_basica_parametrizacao_microarea') ->select([ 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_microarea.descricao', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_visita_domiciliar') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_visita_domiciliar.equipe_id') ->whereColumn('atencao_basica_parametrizacao_equipe.microarea_id', 'atencao_basica_parametrizacao_microarea.id') ->whereBetween('atencao_basica_visita_domiciliar.data_usuario_responsavel', $params->periodo) ->when($params->unidade_id, fn ($q, $unidadeId) => $q->where('atencao_basica_parametrizacao_equipe.unidade_id', $unidadeId)) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', $infraestruturaId)) ->when($params->area_id, fn ($q, $areaId) => $q->where('atencao_basica_parametrizacao_equipe.area_id', $areaId)) ) ->orderBy('atencao_basica_parametrizacao_microarea.id') ->get(); } private static function getUsuarios($params) { return DB::table('cadastro_usuario') ->select([ 'cadastro_usuario.id', 'cadastro_cidadao.nome AS nome', ]) ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_visita_domiciliar') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_visita_domiciliar.equipe_id') ->whereColumn('atencao_basica_visita_domiciliar.usuario_id', 'cadastro_usuario.id') ->whereBetween('atencao_basica_visita_domiciliar.data_usuario_responsavel', $params->periodo) ->when($params->unidade_id, fn ($q, $unidadeId) => $q->where('atencao_basica_parametrizacao_equipe.unidade_id', $unidadeId)) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', $infraestruturaId)) ->when($params->area_id, fn ($q, $areaId) => $q->where('atencao_basica_parametrizacao_equipe.area_id', $areaId)) ->when($params->microarea_id, fn ($q, $microareaId) => $q->where('atencao_basica_parametrizacao_equipe.microarea_id', $microareaId)) ) ->orderBy('cadastro_cidadao.nome') ->get(); } private static function getDomicilios($params) { return DB::table('cadastro_domicilio') ->select([ 'cadastro_domicilio.id', DB::raw(" CONCAT( cadastro_logradouro_tipo.descricao, ' ', cadastro_logradouro.nome, ' ', cadastro_bairro.nome, ' - CEP ', cadastro_logradouro.cep, ' - ', intranet.cadastro_municipio.nome, ' - ', intranet.cadastro_estado.uf ) AS descricao "), ]) ->join('cadastro_endereco', 'cadastro_endereco.id', 'cadastro_domicilio.endereco_id') ->join('cadastro_logradouro', 'cadastro_logradouro.id', 'cadastro_endereco.logradouro_id') ->join('cadastro_logradouro_tipo', 'cadastro_logradouro.tipo_id', 'cadastro_logradouro_tipo.id') ->join('cadastro_bairro', 'cadastro_bairro.id', 'cadastro_logradouro.bairro_id') ->join('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_logradouro.municipio_id') ->join('intranet.cadastro_estado', 'cadastro_estado.id', 'intranet.cadastro_municipio.estado_id') ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('cadastro_paciente') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->join('atencao_basica_visita_domiciliar', 'atencao_basica_visita_domiciliar.paciente_id', 'cadastro_paciente.id') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_visita_domiciliar.equipe_id') ->whereColumn('cadastro_cidadao.domicilio_id', 'cadastro_domicilio.id') ->whereBetween('atencao_basica_visita_domiciliar.data_usuario_responsavel', $params->periodo) ->when($params->unidade_id, fn ($q, $unidadeId) => $q->where('atencao_basica_parametrizacao_equipe.unidade_id', $unidadeId)) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', $infraestruturaId)) ->when($params->area_id, fn ($q, $areaId) => $q->where('atencao_basica_parametrizacao_equipe.area_id', $areaId)) ->when($params->microarea_id, fn ($q, $microareaId) => $q->where('atencao_basica_parametrizacao_equipe.microarea_id', $microareaId)) ->when($params->usuario_id, fn ($q, $usuarioId) => $q->where('atencao_basica_visita_domiciliar.usuario_id', $usuarioId)) ->when($params->paciente_id, fn ($q, $pacienteId) => $q->where('atencao_basica_visita_domiciliar.paciente_id', $pacienteId)) ) ->orderByRaw(" CONCAT( cadastro_logradouro_tipo.descricao, ' ', cadastro_logradouro.nome, ' ', cadastro_bairro.nome, ' - CEP ', cadastro_logradouro.cep, ' - ', intranet.cadastro_municipio.nome, ' - ', intranet.cadastro_estado.uf ) ") ->get(); } private static function getDesfechos($params) { return DB::table('atencao_basica_cadastro_desfecho') ->select([ 'atencao_basica_cadastro_desfecho.id', 'atencao_basica_cadastro_desfecho.descricao', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_visita_domiciliar') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_visita_domiciliar.equipe_id') ->join('cadastro_paciente', 'cadastro_paciente.id', 'atencao_basica_visita_domiciliar.paciente_id') ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id') ->join('cadastro_domicilio', 'cadastro_domicilio.id', 'cadastro_cidadao.domicilio_id') ->join('cadastro_endereco', 'cadastro_endereco.id', 'cadastro_domicilio.endereco_id') ->whereColumn('atencao_basica_visita_domiciliar.desfecho_id', 'atencao_basica_cadastro_desfecho.id') ->whereBetween('atencao_basica_visita_domiciliar.data_usuario_responsavel', $params->periodo) ->when($params->unidade_id, fn ($q, $unidadeId) => $q->where('atencao_basica_parametrizacao_equipe.unidade_id', $unidadeId)) ->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('atencao_basica_parametrizacao_equipe.infraestrutura_id', $infraestruturaId)) ->when($params->area_id, fn ($q, $areaId) => $q->where('atencao_basica_parametrizacao_equipe.area_id', $areaId)) ->when($params->microarea_id, fn ($q, $microareaId) => $q->where('atencao_basica_parametrizacao_equipe.microarea_id', $microareaId)) ->when($params->usuario_id, fn ($q, $usuarioId) => $q->where('atencao_basica_visita_domiciliar.usuario_id', $usuarioId)) ->when($params->paciente_id, fn ($q, $pacienteId) => $q->where('atencao_basica_visita_domiciliar.paciente_id', $pacienteId)) ->when($params->domicilio_id, fn ($q, $domicilioId) => $q->where('cadastro_cidadao.domicilio_id', $domicilioId)) ->when($params->endereco_numero, fn ($q, $enderecoNumero) => $q->where('cadastro_endereco.numero', $enderecoNumero)) ) ->orderBy('atencao_basica_cadastro_desfecho.descricao') ->get(); } private static function setOrderBy($visitas) { $sortBy = request()->sort_by; if (!$sortBy) { return; } $columns = [ 'data' => 'visita.data_usuario_responsavel', 'paciente_nome' => 'cidadao.nome', 'paciente_prontuario' => 'paciente.prontuario', 'paciente_endereco' => " CONCAT( logradouro_tipo.descricao, ' ', logradouro.nome, ' ', bairro.nome, ' - CEP ', logradouro.cep, ' - ', municipio.nome, ' - ', estado.uf ) ", 'usuario_nome' => 'cidadao_usuario.nome', 'area' => 'equipe.area_id', 'microarea' => 'equipe.microarea_id', 'desfecho_descricao' => 'desfecho.descricao', ]; if (!isset($columns[$sortBy])) { return; } $column = $columns[$sortBy]; $direction = DataUtil::getBooleanValueFromStringBoolean( request()->sort_desc ) ? 'DESC' : 'ASC'; $visitas->orderByRaw("{$column} {$direction}"); } }