select([ DB::raw("DATE_FORMAT(atencao_basica_atendimento_domiciliar.data, '%d/%m/%Y') AS data_atendimento"), 'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw("COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome"), 'cadastro_cidadao_usuario.nome AS usuario_nome', DB::raw(" CONCAT( CASE WHEN atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', atencao_basica_parametrizacao_area.numero_ine) ELSE '' END, CASE WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL AND atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL THEN 'Área: ' ELSE '' END, COALESCE(atencao_basica_parametrizacao_area.descricao, ''), CASE WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL AND (atencao_basica_parametrizacao_area.numero_ine IS NOT NULL OR atencao_basica_parametrizacao_area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL THEN 'Microárea: ' ELSE '' END, COALESCE(atencao_basica_parametrizacao_microarea.descricao, '') ) AS equipe_descricao "), 'atencao_basica_cadastro_modalidade_atencao_domiciliar.id AS modalidade_id', 'atencao_basica_cadastro_modalidade_atencao_domiciliar.descricao AS modalidade_descricao', 'cadastro_paciente.id AS paciente_id', 'cadastro_cidadao_paciente.nome AS paciente_nome', 'cadastro_sexo.descricao AS paciente_sexo', DB::raw("TIMESTAMPDIFF(YEAR, cadastro_cidadao_paciente.data_nascimento, CURRENT_DATE) AS paciente_idade"), DB::raw("DATE_FORMAT(cadastro_cidadao_paciente.data_nascimento, '%d/%m/%Y') AS paciente_data_nascimento"), DB::raw("DATE_FORMAT(cadastro_paciente.updated_at, '%d/%m/%Y') AS data_ultima_atualizacao_cadastro_paciente"), DB::raw(" CASE WHEN ((SELECT cadastro_paciente_desatualizado_quantidade_dias FROM cadastro_parametrizacao LIMIT 1) IS NOT NULL) AND (SELECT cadastro_paciente_desatualizado_quantidade_dias FROM cadastro_parametrizacao LIMIT 1) < TIMESTAMPDIFF(DAY, cadastro_paciente.updated_at, CURRENT_TIMESTAMP) THEN TIMESTAMPDIFF(DAY, cadastro_paciente.updated_at, CURRENT_TIMESTAMP) - COALESCE((SELECT cadastro_paciente_desatualizado_quantidade_dias FROM cadastro_parametrizacao LIMIT 1), 0) ELSE 0 END AS quantidade_dias_cadastro_paciente_desatualizado "), 'ocupacao.codigo AS ocupacao_codigo', 'ocupacao.nome AS ocupacao_nome', DB::raw(" CASE WHEN ( SELECT TRUE FROM atencao_basica_avaliacao WHERE atencao_basica_avaliacao.paciente_id = cadastro_paciente.id LIMIT 1 ) THEN 'Sim' ELSE 'Não' END AS avaliacao_elegibilidade "), ]) ->join('atencao_basica_atendimento_domiciliar', 'atencao_basica_atendimento_domiciliar.id', 'atencao_basica_atendimento_domiciliar_atendimento.atendimento_domiciliar_id') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_domiciliar.equipe_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id') ->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id') ->join('cadastro_usuario', 'cadastro_usuario.id', 'atencao_basica_atendimento_domiciliar.usuario_id') ->join('cadastro_cidadao AS cadastro_cidadao_usuario', 'cadastro_cidadao_usuario.id', 'cadastro_usuario.cidadao_id') ->join('atencao_basica_cadastro_modalidade_atencao_domiciliar', 'atencao_basica_cadastro_modalidade_atencao_domiciliar.id', 'atencao_basica_atendimento_domiciliar_atendimento.modalidade_id') ->join('sigtap.ocupacao', 'ocupacao.id', 'atencao_basica_atendimento_domiciliar.ocupacao_id') ->join('cadastro_paciente', 'cadastro_paciente.id', 'atencao_basica_atendimento_domiciliar_atendimento.paciente_id') ->join('cadastro_cidadao AS cadastro_cidadao_paciente', 'cadastro_cidadao_paciente.id', 'cadastro_paciente.cidadao_id') ->join('cadastro_sexo', 'cadastro_sexo.id', 'cadastro_cidadao_paciente.sexo_id') ->leftJoin('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id') ->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id') ->whereBetween('atencao_basica_atendimento_domiciliar.data', $params->periodo) ->when($params->unidade_id, fn ($q) => $q->where('cadastro_unidade.id', $params->unidade_id)) ->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id)) ->when($params->usuario_id, fn ($q) => $q->where('cadastro_usuario.id', $params->usuario_id)) ->when($params->turno_id, fn ($q) => $q->where('atencao_basica_atendimento_domiciliar_atendimento.turno_id', $params->turno_id)) ->when($params->ocupacao_id, fn ($q) => $q->where('ocupacao.id', $params->ocupacao_id)) ->when($params->equipe_id, fn ($q) => $q->where('atencao_basica_parametrizacao_equipe.id', $params->equipe_id)) ->when($params->modalidade_id, fn ($q) => $q->where('atencao_basica_cadastro_modalidade_atencao_domiciliar.id', $params->modalidade_id)); self::setOrderBy($itens); $itens = $itens->get(); return [ 'itens' => $itens, 'totalizadores' => [ 'total_atendimentos' => $itens->count(), 'total_pacientes_atendidos' => $itens->pluck('paciente_id')->unique()->count(), 'total_modalidades' => [ 'AD_1' => $itens->where('modalidade_id', Modalidade::AD_1)->count(), 'AD_2' => $itens->where('modalidade_id', Modalidade::AD_2)->count(), 'AD_3' => $itens->where('modalidade_id', Modalidade::AD_3)->count(), ], ], ]; } public static function create() { return [ 'form' => [ 'unidades' => [], 'infraestruturas' => [], 'usuarios' => [], 'turnos' => [], 'ocupacoes' => [], 'equipes' => [], 'modalidades' => [], ], 'model' => [ 'periodo' => ['start' => null, 'end' => null], 'unidade_id' => null, 'infraestrutura_id' => null, 'usuario_id' => null, 'turno_id' => null, 'ocupacao_id' => null, 'equipe_id' => null, 'modalidade_id' => null, ], ]; } public static function list() { $params = self::getParams(); switch (request()->listar) { case 'unidades': { return [ 'unidades' => self::getUnidades($params), 'infraestruturas' => self::getInfraestruturas($params), 'usuarios' => self::getUsuarios($params), 'turnos' => self::getTurnos($params), 'ocupacoes' => self::getOcupacoes($params), 'equipes' => self::getEquipes($params), 'modalidades' => self::getModalidades($params), ]; } case 'infraestruturas': { return [ 'infraestruturas' => self::getInfraestruturas($params), 'usuarios' => self::getUsuarios($params), 'turnos' => self::getTurnos($params), 'ocupacoes' => self::getOcupacoes($params), 'equipes' => self::getEquipes($params), 'modalidades' => self::getModalidades($params), ]; } case 'usuarios': { return [ 'usuarios' => self::getUsuarios($params), 'turnos' => self::getTurnos($params), 'ocupacoes' => self::getOcupacoes($params), 'equipes' => self::getEquipes($params), 'modalidades' => self::getModalidades($params), ]; } case 'turnos': { return [ 'turnos' => self::getTurnos($params), 'ocupacoes' => self::getOcupacoes($params), 'equipes' => self::getEquipes($params), 'modalidades' => self::getModalidades($params), ]; } case 'ocupacoes': { return [ 'ocupacoes' => self::getOcupacoes($params), 'equipes' => self::getEquipes($params), 'modalidades' => self::getModalidades($params), ]; } case 'equipes': { return [ 'equipes' => self::getEquipes($params), 'modalidades' => self::getModalidades($params), ]; } case 'modalidades': { return [ 'modalidades' => self::getModalidades($params), ]; } } } 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'), 'usuario_id' => request()->get('usuario_id'), 'turno_id' => request()->get('turno_id'), 'ocupacao_id' => request()->get('ocupacao_id'), 'equipe_id' => request()->get('equipe_id'), 'modalidade_id' => request()->get('modalidade_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_atendimento_domiciliar_atendimento') ->join('atencao_basica_atendimento_domiciliar', 'atencao_basica_atendimento_domiciliar.id', 'atencao_basica_atendimento_domiciliar_atendimento.atendimento_domiciliar_id') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_domiciliar.equipe_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id') ->whereBetween('atencao_basica_atendimento_domiciliar.data', $params->periodo) ->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id') ) ->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) => $q->where('cadastro_unidade.id', $params->unidade_id)) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_atendimento_domiciliar_atendimento') ->join('atencao_basica_atendimento_domiciliar', 'atencao_basica_atendimento_domiciliar.id', 'atencao_basica_atendimento_domiciliar_atendimento.atendimento_domiciliar_id') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_domiciliar.equipe_id') ->whereBetween('atencao_basica_atendimento_domiciliar.data', $params->periodo) ->whereColumn('atencao_basica_parametrizacao_equipe.infraestrutura_id', 'cadastro_infraestrutura.id') ) ->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)') ->get(); } private static function getUsuarios($params) { return DB::table('cadastro_usuario') ->select([ 'cadastro_usuario.id', 'cadastro_cidadao.nome', ]) ->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id') ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_atendimento_domiciliar_atendimento') ->join('atencao_basica_atendimento_domiciliar', 'atencao_basica_atendimento_domiciliar.id', 'atencao_basica_atendimento_domiciliar_atendimento.atendimento_domiciliar_id') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_domiciliar.equipe_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id') ->whereBetween('atencao_basica_atendimento_domiciliar.data', $params->periodo) ->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)) ->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id)) ->when($params->equipe_id, fn ($q) => $q->where('atencao_basica_parametrizacao_equipe.id', $params->equipe_id)) ->whereColumn('atencao_basica_atendimento_domiciliar.usuario_id', 'cadastro_usuario.id') ) ->orderBy('cadastro_cidadao.nome') ->get(); } private static function getTurnos($params) { return DB::table('atencao_basica_cadastro_turno') ->select([ 'atencao_basica_cadastro_turno.id', 'atencao_basica_cadastro_turno.descricao', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_atendimento_domiciliar_atendimento') ->join('atencao_basica_atendimento_domiciliar', 'atencao_basica_atendimento_domiciliar.id', 'atencao_basica_atendimento_domiciliar_atendimento.atendimento_domiciliar_id') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_domiciliar.equipe_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id') ->whereBetween('atencao_basica_atendimento_domiciliar.data', $params->periodo) ->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)) ->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id)) ->when($params->equipe_id, fn ($q) => $q->where('atencao_basica_parametrizacao_equipe.id', $params->equipe_id)) ->whereColumn('atencao_basica_atendimento_domiciliar_atendimento.turno_id', 'atencao_basica_cadastro_turno.id') ) ->orderBy('atencao_basica_cadastro_turno.descricao') ->get(); } private static function getOcupacoes($params) { return DB::table('sigtap.ocupacao') ->select([ 'ocupacao.id', 'ocupacao.nome', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_atendimento_domiciliar_atendimento') ->join('atencao_basica_atendimento_domiciliar', 'atencao_basica_atendimento_domiciliar.id', 'atencao_basica_atendimento_domiciliar_atendimento.atendimento_domiciliar_id') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_domiciliar.equipe_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id') ->whereBetween('atencao_basica_atendimento_domiciliar.data', $params->periodo) ->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)) ->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id)) ->when($params->usuario_id, fn ($q) => $q->where('atencao_basica_atendimento_domiciliar.usuario_id', $params->usuario_id)) ->when($params->turno_id, fn ($q) => $q->where('atencao_basica_atendimento_domiciliar_atendimento.turno_id', $params->turno_id)) ->whereColumn('atencao_basica_atendimento_domiciliar.ocupacao_id', 'ocupacao.id') ) ->orderBy('ocupacao.nome') ->get(); } private static function getEquipes($params) { return DB::table('atencao_basica_parametrizacao_equipe') ->select([ 'atencao_basica_parametrizacao_equipe.id AS id', DB::raw(" CONCAT( CASE WHEN atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', atencao_basica_parametrizacao_area.numero_ine) ELSE 'INE: Não informado' END, CASE WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL AND atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL THEN 'Área: ' ELSE ' - Área: Não informada' END, COALESCE(atencao_basica_parametrizacao_area.descricao, ''), CASE WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL AND (atencao_basica_parametrizacao_area.numero_ine IS NOT NULL OR atencao_basica_parametrizacao_area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL THEN 'Microárea: ' ELSE ' - Microárea: Não informada' END, COALESCE(atencao_basica_parametrizacao_microarea.descricao, '') ) AS descricao "), ]) ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id') ->leftJoin('atencao_basica_parametrizacao_area', 'atencao_basica_parametrizacao_area.id', 'atencao_basica_parametrizacao_equipe.area_id') ->leftJoin('atencao_basica_parametrizacao_microarea', 'atencao_basica_parametrizacao_microarea.id', 'atencao_basica_parametrizacao_equipe.microarea_id') ->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)) ->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id)) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_atendimento_domiciliar_atendimento') ->join('atencao_basica_atendimento_domiciliar', 'atencao_basica_atendimento_domiciliar.id', 'atencao_basica_atendimento_domiciliar_atendimento.atendimento_domiciliar_id') ->whereBetween('atencao_basica_atendimento_domiciliar.data', $params->periodo) ->when($params->usuario_id, fn ($q) => $q->where('atencao_basica_atendimento_domiciliar.usuario_id', $params->usuario_id)) ->when($params->turno_id, fn ($q) => $q->where('atencao_basica_atendimento_domiciliar_atendimento.turno_id', $params->turno_id)) ->when($params->ocupacao_id, fn ($q) => $q->where('atencao_basica_atendimento_domiciliar.ocupacao_id', $params->ocupacao_id)) ->whereColumn('atencao_basica_atendimento_domiciliar.equipe_id', 'atencao_basica_parametrizacao_equipe.id') ) ->orderByRaw(" CONCAT( CASE WHEN atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN CONCAT('INE: ', atencao_basica_parametrizacao_area.numero_ine) ELSE '' END, CASE WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL AND atencao_basica_parametrizacao_area.numero_ine IS NOT NULL THEN ' - Área: ' WHEN atencao_basica_parametrizacao_area.descricao IS NOT NULL THEN 'Área: ' ELSE '' END, COALESCE(atencao_basica_parametrizacao_area.descricao, ''), CASE WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL AND (atencao_basica_parametrizacao_area.numero_ine IS NOT NULL OR atencao_basica_parametrizacao_area.descricao IS NOT NULL) THEN ' - Microárea: ' WHEN atencao_basica_parametrizacao_microarea.descricao IS NOT NULL THEN 'Microárea: ' ELSE '' END, COALESCE(atencao_basica_parametrizacao_microarea.descricao, '') ) ") ->get(); } private static function getModalidades($params) { return DB::table('atencao_basica_cadastro_modalidade_atencao_domiciliar') ->select([ 'atencao_basica_cadastro_modalidade_atencao_domiciliar.id', 'atencao_basica_cadastro_modalidade_atencao_domiciliar.descricao', ]) ->whereExists(fn ($q) => $q ->select(DB::raw(1)) ->from('atencao_basica_atendimento_domiciliar_atendimento') ->join('atencao_basica_atendimento_domiciliar', 'atencao_basica_atendimento_domiciliar.id', 'atencao_basica_atendimento_domiciliar_atendimento.atendimento_domiciliar_id') ->join('atencao_basica_parametrizacao_equipe', 'atencao_basica_parametrizacao_equipe.id', 'atencao_basica_atendimento_domiciliar.equipe_id') ->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'atencao_basica_parametrizacao_equipe.infraestrutura_id') ->whereBetween('atencao_basica_atendimento_domiciliar.data', $params->periodo) ->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)) ->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id)) ->when($params->usuario_id, fn ($q) => $q->where('atencao_basica_atendimento_domiciliar.usuario_id', $params->usuario_id)) ->when($params->turno_id, fn ($q) => $q->where('atencao_basica_atendimento_domiciliar_atendimento.turno_id', $params->turno_id)) ->when($params->ocupacao_id, fn ($q) => $q->where('atencao_basica_atendimento_domiciliar.ocupacao_id', $params->ocupacao_id)) ->when($params->equipe_id, fn ($q) => $q->where('atencao_basica_parametrizacao_equipe.id', $params->equipe_id)) ->whereColumn('atencao_basica_atendimento_domiciliar_atendimento.modalidade_id', 'atencao_basica_cadastro_modalidade_atencao_domiciliar.id') ) ->orderBy('atencao_basica_cadastro_modalidade_atencao_domiciliar.descricao') ->get(); } private static function setOrderBy($builder) { $columns = [ 'data_atendimento' => 'data_atendimento', 'unidade_nome_fantasia' => 'unidade_nome_fantasia', 'infraestrutura_nome' => 'infraestrutura_nome', 'usuario_nome' => 'usuario_nome', 'equipe_descricao' => 'equipe_descricao', 'modalidade_descricao' => 'modalidade_descricao', 'paciente_nome' => 'paciente_nome', 'paciente_sexo' => 'paciente_sexo', 'paciente_idade' => 'paciente_idade', 'paciente_data_nascimento' => 'paciente_data_nascimento', 'data_ultima_atualizacao_cadastro_paciente' => 'data_ultima_atualizacao_cadastro_paciente', 'quantidade_dias_cadastro_paciente_desatualizado' => 'quantidade_dias_cadastro_paciente_desatualizado', 'ocupacao_codigo' => 'ocupacao_codigo', 'ocupacao_nome' => 'ocupacao_nome', 'avaliacao_elegibilidade' => 'avaliacao_elegibilidade', ]; if (is_null(request()->sort_by)) { $builder->orderByRaw(join(', ', $columns)); return; } $column = $columns[request()->sort_by]; $direction = DataUtil::getBooleanValueFromStringBoolean(request()->sort_desc) ? 'DESC' : 'ASC'; unset($columns[request()->sort_by]); $builder->orderByRaw("{$column} {$direction}, " . join(', ', $columns)); } }