(object) ['agendado' => 0, 'total' => 0], 'quantidade_retorno' => (object) ['agendado' => 0, 'total' => 0], 'quantidade_total' => (object) ['agendado' => 0, 'total' => 0], ]; $periodo = [ 'start' => Carbon::createFromFormat('d/m/Y', request()->periodo['start'])->startOfDay(), 'end' => Carbon::createFromFormat('d/m/Y', request()->periodo['end'])->endOfDay(), ]; $status = DataUtil::isStringBoolean(request()->status) ? DataUtil::getBooleanValueFromStringBoolean(request()->status) : null; $jornadas = DB::table('ambulatorio_jornada as jornada') ->join('cadastro_lotacao as lotacao', 'lotacao.id', 'jornada.lotacao_id') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'lotacao.infraestrutura_id') ->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id') ->join('sigtap.ocupacao as ocupacao', 'ocupacao.id', 'lotacao.ocupacao_id') ->join('cadastro_usuario as usuario', 'usuario.id', 'lotacao.usuario_id') ->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id') ->join('cadastro_especialidade as especialidade', 'especialidade.id', 'jornada.especialidade_id') ->leftJoin('ambulatorio_jornada_situacao as situacao', 'situacao.id', 'jornada.situacao_id') ->whereBetween('jornada.data', $periodo) ->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id)) ->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('lotacao.infraestrutura_id', $id)) ->when($status, fn ($q) => $q->whereNull('jornada.situacao_id')) ->when($status === false, fn ($q) => $q->whereNotNull('jornada.situacao_id')) ->when(request()->situacao_id, fn ($q, $id) => $q->where('jornada.situacao_id', $id)) ->when(request()->ocupacao_id, fn ($q, $id) => $q->where('lotacao.ocupacao_id', $id)) ->when(request()->especialidade_id, fn ($q, $id) => $q->where('jornada.especialidade_id', $id)) ->when(request()->usuario_id, fn ($q, $id) => $q->where('lotacao.usuario_id', $id)) ->selectRaw(" jornada.data, unidade.nome_fantasia as unidade_nome_fantasia, COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura_nome, ocupacao.codigo as ocupacao_codigo, especialidade.nome as especialidade_nome, cidadao.nome as usuario_nome, DATE_FORMAT(jornada.inicio, '%H:%i') as inicio, DATE_FORMAT(jornada.fim, '%H:%i') as fim, IF(jornada.situacao_id IS NULL, 'ATIVO', 'INATIVO') as status, situacao.nome as situacao_nome, COALESCE(jornada.quantidade_consulta, 0) as quantidade_consulta_total, COALESCE(jornada.quantidade_retorno, 0) as quantidade_retorno_total ") ->addSelect([ 'quantidade_consulta_agendado' => function ($query) { $query->selectRaw('COUNT(*)') ->from('ambulatorio_agendamento as agendamento') ->whereColumn('agendamento.jornada_id', 'jornada.id') ->where('agendamento.tipo_id', AgendamentoTipo::CONSULTA) ->whereNotIn('agendamento.status_id', self::getStatusLiberamHorario()); }, 'quantidade_retorno_agendado' => function ($query) { $query->selectRaw('COUNT(*)') ->from('ambulatorio_agendamento as agendamento') ->whereColumn('agendamento.jornada_id', 'jornada.id') ->where('agendamento.tipo_id', AgendamentoTipo::RETORNO) ->whereNotIn('agendamento.status_id', self::getStatusLiberamHorario()); }, ]) ->get(); $jornadas->each(function ($jornada) use ($totalizadores) { $jornada->dia_semana = Str::ucfirst((new Carbon($jornada->data))->translatedFormat('l')); $jornada->quantidade_total_agendado = $jornada->quantidade_consulta_agendado + $jornada->quantidade_retorno_agendado; $jornada->quantidade_total_total = $jornada->quantidade_consulta_total + $jornada->quantidade_retorno_total; $totalizadores->quantidade_consulta->agendado += $jornada->quantidade_consulta_agendado; $totalizadores->quantidade_consulta->total += $jornada->quantidade_consulta_total; $totalizadores->quantidade_retorno->agendado += $jornada->quantidade_retorno_agendado; $totalizadores->quantidade_retorno->total += $jornada->quantidade_retorno_total; $totalizadores->quantidade_total->agendado += $jornada->quantidade_total_agendado; $totalizadores->quantidade_total->total += $jornada->quantidade_total_total; }); return compact('jornadas', 'totalizadores'); } private static function getStatusLiberamHorario() { return [ AgendamentoStatus::REAGENDADO_PELO_PACIENTE, AgendamentoStatus::REAGENDADO_PELO_MEDICO, AgendamentoStatus::CANCELADO_PELO_PACIENTE, AgendamentoStatus::CANCELADO_PELO_MEDICO, ]; } public static function list() { $data = (object) [ 'additionals' => [], 'form' => [], 'model' => [], ]; $params = self::getParams(); $sets = [ 'periodo' => function () use ($data) { $data->model['periodo'] = ['start' => null, 'end' => null]; }, 'unidade' => function () use ($data, $params) { $unidadesData = self::getUnidadesData($params); $data->form['unidades'] = $unidadesData['form']; $data->model['unidade_id'] = $unidadesData['model']; }, 'infraestrutura' => function () use ($data, $params) { $infraestruturasData = self::getInfraestruturasData($params); $data->form['infraestruturas'] = $infraestruturasData['form']; $data->model['infraestrutura_id'] = $infraestruturasData['model']; }, 'status' => function () use ($data, $params) { $statusData = self::getStatusData($params); $data->form['status'] = $statusData['form']; $data->model['status'] = $statusData['model']; }, 'situacao' => function () use ($data, $params) { $situacoesData = self::getSituacoesData($params); $data->form['situacoes'] = $situacoesData['form']; $data->model['situacao_id'] = $situacoesData['model']; }, 'ocupacao' => function () use ($data, $params) { $ocupacoesData = self::getOcupacoesData($params); $data->form['ocupacoes'] = $ocupacoesData['form']; $data->model['ocupacao_id'] = $ocupacoesData['model']; }, 'especialidade' => function () use ($data, $params) { $especialidadesData = self::getEspecialidadesData($params); $data->form['especialidades'] = $especialidadesData['form']; $data->model['especialidade_id'] = $especialidadesData['model']; }, 'usuario' => function () use ($data, $params) { $usuariosData = self::getUsuariosData($params); $data->form['usuarios'] = $usuariosData['form']; $data->model['usuario_id'] = $usuariosData['model']; }, ]; $load = is_null(request()->load_from); if ($load) { $data->additionals = []; } foreach ($sets as $field => $set) { if ($load) { $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 = request()->only([ 'periodo', 'unidade_id', 'infraestrutura_id', 'status', 'situacao_id', 'ocupacao_id', 'especialidade_id', 'usuario_id', ]); if (isset($params['periodo']) && !is_null($params['periodo']['start']) && !is_null($params['periodo']['end']) ) { $start = Carbon::createFromFormat('d/m/Y', $params['periodo']['start'])->startOfDay(); $end = Carbon::createFromFormat('d/m/Y', $params['periodo']['end'])->endOfDay(); $params['periodo']['start'] = $start; $params['periodo']['end'] = $end; } else { $params['periodo'] = null; } if (isset($params['status']) && DataUtil::isStringBoolean($params['status'])) { $params['status'] = DataUtil::getBooleanValueFromStringBoolean($params['status']); } return $params; } private static function getUnidadesData($params) { $unidades = collect(); $id = null; if (!is_null($params['periodo'])) { $unidades = DB::table('cadastro_unidade as unidade') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('cadastro_infraestrutura as infraestrutura') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('cadastro_lotacao as lotacao') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_jornada as jornada') ->whereColumn('jornada.lotacao_id', 'lotacao.id') ->whereBetween('jornada.data', $params['periodo']) ) ->whereColumn('lotacao.infraestrutura_id', 'infraestrutura.id') ->whereNull('lotacao.deleted_at') ) ->whereColumn('infraestrutura.unidade_id', 'unidade.id') ->whereNull('infraestrutura.deleted_at') ) ->whereNull('unidade.deleted_at') ->orderBy('unidade.nome_fantasia') ->selectRaw(" unidade.id, unidade.nome_fantasia ") ->get(); } return ['form' => $unidades, 'model' => $id]; } private static function getInfraestruturasData($params) { $infraestruturas = collect(); $id = null; if (!is_null($params['periodo']) && !is_null($params['unidade_id'])) { $infraestruturas = DB::table('cadastro_infraestrutura as infraestrutura') ->join('cadastro_unidade as unidade', 'unidade.id', 'infraestrutura.unidade_id') ->where('infraestrutura.unidade_id', $params['unidade_id']) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('cadastro_lotacao as lotacao') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_jornada as jornada') ->whereColumn('jornada.lotacao_id', 'lotacao.id') ->whereBetween('jornada.data', $params['periodo']) ) ->whereColumn('lotacao.infraestrutura_id', 'infraestrutura.id') ->whereNull('lotacao.deleted_at') ) ->whereNull('infraestrutura.deleted_at') ->whereNull('unidade.deleted_at') ->orderByRaw("COALESCE(infraestrutura.nome, unidade.nome_fantasia)") ->selectRaw(" infraestrutura.id, COALESCE(infraestrutura.nome, unidade.nome_fantasia) as nome ") ->get(); } return ['form' => $infraestruturas, 'model' => $id]; } private static function getStatusData($params) { $status = collect(); $ativo = null; if (!is_null($params['periodo'])) { $hasJornada = function ($ativo) use ($params) { return DB::table('ambulatorio_jornada as jornada') ->join('cadastro_lotacao as lotacao', 'lotacao.id', 'jornada.lotacao_id') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'lotacao.infraestrutura_id') ->whereBetween('jornada.data', $params['periodo']) ->when($params['unidade_id'], fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id)) ->when($params['infraestrutura_id'], fn ($q, $id) => $q->where('lotacao.infraestrutura_id', $id)) ->when($ativo, fn ($q) => $q->whereNull('jornada.situacao_id'), fn ($q) => $q->whereNotNull('jornada.situacao_id') ) ->whereNull('lotacao.deleted_at') ->whereNull('infraestrutura.deleted_at') ->exists(); }; if ($hasJornada(true)) { $status->push(self::getStatus(true)); } if ($hasJornada(false)) { $status->push(self::getStatus(false)); } } return ['form' => $status, 'model' => $ativo]; } public static function getStatus($ativo) { if ($ativo === null) { return null; } return collect([ (object) ['value' => true, 'text' => 'ATIVO'], (object) ['value' => false, 'text' => 'INATIVO'], ])->where('value', $ativo)->first(); } private static function getSituacoesData($params) { $situacoes = collect(); $id = null; if (!is_null($params['periodo']) && $params['status'] === false) { $situacoes = DB::table('ambulatorio_jornada_situacao as situacao') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_jornada as jornada') ->join('cadastro_lotacao as lotacao', 'lotacao.id', 'jornada.lotacao_id') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'lotacao.infraestrutura_id') ->whereColumn('jornada.situacao_id', 'situacao.id') ->whereBetween('jornada.data', $params['periodo']) ->when($params['unidade_id'], fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id)) ->when($params['infraestrutura_id'], fn ($q, $id) => $q->where('lotacao.infraestrutura_id', $id)) ->whereNull('lotacao.deleted_at') ->whereNull('infraestrutura.deleted_at') ) ->orderBy('situacao.nome') ->selectRaw(" situacao.id, situacao.nome ") ->get(); } return ['form' => $situacoes, 'model' => $id]; } private static function getOcupacoesData($params) { $ocupacoes = collect(); $id = null; if (!is_null($params['periodo'])) { $ocupacoes = DB::table('sigtap.ocupacao as ocupacao') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('cadastro_lotacao as lotacao') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'lotacao.infraestrutura_id') ->when($params['unidade_id'], fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id)) ->when($params['infraestrutura_id'], fn ($q, $id) => $q->where('lotacao.infraestrutura_id', $id)) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_jornada as jornada') ->whereColumn('jornada.lotacao_id', 'lotacao.id') ->whereBetween('jornada.data', $params['periodo']) ->when($params['status'], fn ($q) => $q->whereNull('jornada.situacao_id')) ->when($params['status'] === false, fn ($q) => $q->whereNotNull('jornada.situacao_id')) ->when($params['situacao_id'], fn ($q, $id) => $q->where('jornada.situacao_id', $id)) ) ->whereColumn('lotacao.ocupacao_id', 'ocupacao.id') ->whereNull('lotacao.deleted_at') ->whereNull('infraestrutura.deleted_at') ) ->orderByRaw("CONCAT(ocupacao.codigo, ' - ', ocupacao.nome)") ->selectRaw(" ocupacao.id, CONCAT(ocupacao.codigo, ' - ', ocupacao.nome) as descricao ") ->get(); } return ['form' => $ocupacoes, 'model' => $id]; } private static function getEspecialidadesData($params) { $especialidades = collect(); $id = null; if (!is_null($params['periodo']) && !is_null($params['ocupacao_id'])) { $especialidades = DB::table('cadastro_especialidade as especialidade') ->where('especialidade.ocupacao_id', $params['ocupacao_id']) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_jornada as jornada') ->join('cadastro_lotacao as lotacao', 'lotacao.id', 'jornada.lotacao_id') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'lotacao.infraestrutura_id') ->whereColumn('jornada.especialidade_id', 'especialidade.id') ->whereBetween('jornada.data', $params['periodo']) ->when($params['unidade_id'], fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id)) ->when($params['infraestrutura_id'], fn ($q, $id) => $q->where('lotacao.infraestrutura_id', $id)) ->when($params['status'], fn ($q) => $q->whereNull('jornada.situacao_id')) ->when($params['status'] === false, fn ($q) => $q->whereNotNull('jornada.situacao_id')) ->when($params['situacao_id'], fn ($q, $id) => $q->where('jornada.situacao_id', $id)) ->when($params['ocupacao_id'], fn ($q, $id) => $q->where('lotacao.ocupacao_id', $id)) ->whereNull('lotacao.deleted_at') ->whereNull('infraestrutura.deleted_at') ) ->orderBy('especialidade.nome') ->selectRaw(" especialidade.id, especialidade.nome ") ->get(); } return ['form' => $especialidades, 'model' => $id]; } private static function getUsuariosData($params) { $usuarios = collect(); $id = null; if (!is_null($params['periodo'])) { $usuarios = DB::table('cadastro_usuario as usuario') ->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('cadastro_lotacao as lotacao') ->join('cadastro_infraestrutura as infraestrutura', 'infraestrutura.id', 'lotacao.infraestrutura_id') ->when($params['unidade_id'], fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id)) ->when($params['infraestrutura_id'], fn ($q, $id) => $q->where('lotacao.infraestrutura_id', $id)) ->when($params['ocupacao_id'], fn ($q, $id) => $q->where('lotacao.ocupacao_id', $id)) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('ambulatorio_jornada as jornada') ->whereColumn('jornada.lotacao_id', 'lotacao.id') ->whereBetween('jornada.data', $params['periodo']) ->when($params['status'], fn ($q) => $q->whereNull('jornada.situacao_id')) ->when($params['status'] === false, fn ($q) => $q->whereNotNull('jornada.situacao_id')) ->when($params['situacao_id'], fn ($q, $id) => $q->where('jornada.situacao_id', $id)) ->when($params['especialidade_id'], fn ($q, $id) => $q->where('jornada.especialidade_id', $id)) ) ->whereColumn('lotacao.usuario_id', 'usuario.id') ->whereNull('lotacao.deleted_at') ->whereNull('infraestrutura.deleted_at') ) ->whereNull('usuario.deleted_at') ->whereNull('cidadao.deleted_at') ->orderBy('cidadao.nome') ->selectRaw(" usuario.id, cidadao.nome ") ->get(); } return ['form' => $usuarios, 'model' => $id]; } }