join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'aprazamento.created_centro_custo_id') ->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id') ->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id') ->join('cadastro_paciente AS paciente', 'paciente.id', 'aprazamento.paciente_id') ->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id') ->join('cadastro_vacina AS vacina', 'vacina.id', 'aprazamento.vacina_id') ->whereNull('aprazamento.registro_aplicacao_id') ->whereBetween('aprazamento.data_aprazamento', $params->periodo) ->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id)) ->when($params->infraestrutura_id, fn ($q, $id) => $q->where('centro_custo.infraestrutura_id', $id)) ->when(isset($params->idade['de']), fn ($q) => $q ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= {$params->idade['de']}") ) ->when(isset($params->idade['ate']), fn ($q) => $q ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= {$params->idade['ate']}") ) ->when($params->vacina_id, fn ($q, $id) => $q->where('aprazamento.vacina_id', $id)) ->select( 'unidade.nome_fantasia AS unidade_nome_fantasia', DB::raw("COALESCE(infraestrutura.nome, unidade.nome_fantasia) AS infraestrutura_nome"), 'cidadao.nome AS paciente_nome', 'cidadao.data_nascimento AS paciente_data_nascimento', DB::raw("LPAD(paciente.prontuario, 7, '0') AS paciente_prontuario"), DB::raw(VacinaService::getDescricaoRaw() . ' AS vacina_descricao'), 'aprazamento.data_aprazamento' ); self::setOrderBy($aprazamentosBuilder); $aprazamentos = $aprazamentosBuilder->get(); return compact('aprazamentos'); } private static function setOrderBy($builder) { if (is_null(request()->sortBy)) { $builder->orderBy('aprazamento.id'); return; } $columns = [ 'unidade_nome_fantasia' => 'unidade.nome_fantasia', 'infraestrutura_nome' => "COALESCE(infraestrutura.nome, unidade.nome_fantasia)", 'paciente_nome' => 'cidadao.nome', 'paciente_data_nascimento' => 'cidadao.data_nascimento', 'paciente_prontuario' => "LPAD(paciente.prontuario, 7, '0')", 'vacina_descricao' => DB::raw(VacinaService::getDescricaoRaw()), 'data_aprazamento' => 'aprazamento.data_aprazamento', ]; $column = $columns[request()->sortBy]; $direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC'; $builder->orderByRaw("{$column} {$direction}, aprazamento.id"); } public static function list() { $data = (object) [ 'form' => [], 'model' => [], ]; $params = self::getParams(); $sets = [ 'periodo' => function () use ($data, $params) { $data->model['periodo'] = ['start' => null, 'end' => null]; $params->periodo = $data->model['periodo']; }, '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']; }, 'infraestrutura' => function () use ($data, $params) { $infraestruturasData = self::getInfraestruturasData($params); $data->form['infraestruturas'] = $infraestruturasData['form']; $data->model['infraestrutura_id'] = $infraestruturasData['model']; $params->infraestrutura_id = $data->model['infraestrutura_id']; }, 'idade' => function () use ($data, $params) { $data->model['idade'] = ['de' => null, 'ate' => null]; $params->idade = $data->model['idade']; }, 'vacina' => function () use ($data) { $data->model['vacina'] = null; } ]; $firstLoad = $load = is_null(request()->load_from); foreach ($sets as $field => $set) { if ($load) { if (!$firstLoad && collect(['idade'])->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([ 'periodo', 'unidade_id', 'infraestrutura_id', 'idade', 'vacina_id', ]); if (isset($params->periodo) && !is_null($params->periodo['start']) && !is_null($params->periodo['end']) ) { $start = Carbon::createFromFormat('d/m/Y', $params->periodo['start'])->setTime(0, 0, 0); $end = Carbon::createFromFormat('d/m/Y', $params->periodo['end'])->setTime(23, 59, 59); $params->periodo['start'] = $start; $params->periodo['end'] = $end; } else { $params->periodo = null; } return $params; } private static function getUnidadesData($params) { $unidades = collect(); $id = null; if (!is_null($params->periodo)) { $unidades = DB::table('cadastro_unidade AS unidade') ->whereNull('unidade.deleted_at') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('cadastro_infraestrutura AS infraestrutura') ->whereColumn('infraestrutura.unidade_id', 'unidade.id') ->whereNull('infraestrutura.deleted_at') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('imunizacao_registro_aprazamento AS aprazamento') ->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'aprazamento.created_centro_custo_id') ->whereColumn('centro_custo.infraestrutura_id', 'infraestrutura.id') ->whereNull('aprazamento.registro_aplicacao_id') ->whereBetween('aprazamento.data_aprazamento', $params->periodo) ) ) ->select('unidade.id', 'unidade.nome_fantasia') ->orderBy('unidade.nome_fantasia') ->get(); } return ['form' => $unidades, 'model' => $id]; } private static function getInfraestruturasData($params) { $infraestruturas = collect(); $id = null; if (!is_null($params->unidade_id)) { $infraestruturas = DB::table('cadastro_infraestrutura AS infraestrutura') ->join('cadastro_unidade AS unidade', 'unidade.id', 'infraestrutura.unidade_id') ->whereNull('infraestrutura.deleted_at') ->where('infraestrutura.unidade_id', $params->unidade_id) ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('imunizacao_registro_aprazamento AS aprazamento') ->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'aprazamento.created_centro_custo_id') ->whereColumn('centro_custo.infraestrutura_id', 'infraestrutura.id') ->whereNull('aprazamento.registro_aplicacao_id') ->whereBetween('aprazamento.data_aprazamento', $params->periodo) ) ->select( 'infraestrutura.id', DB::raw("COALESCE(infraestrutura.nome, unidade.nome_fantasia) AS nome") ) ->orderByRaw("COALESCE(infraestrutura.nome, unidade.nome_fantasia)") ->get(); } return ['form' => $infraestruturas, 'model' => $id]; } public static function autocompleteVacina() { $params = self::getParams(); return DB::table('cadastro_vacina AS vacina') ->whereExists(fn ($q) => $q ->selectRaw(1) ->from('imunizacao_registro_aprazamento AS aprazamento') ->join('cadastro_centro_custo AS centro_custo', 'centro_custo.id', 'aprazamento.created_centro_custo_id') ->join('cadastro_infraestrutura AS infraestrutura', 'infraestrutura.id', 'centro_custo.infraestrutura_id') ->join('cadastro_paciente AS paciente', 'paciente.id', 'aprazamento.paciente_id') ->join('cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_id') ->whereColumn('aprazamento.vacina_id', 'vacina.id') ->whereNull('aprazamento.registro_aplicacao_id') ->whereBetween('aprazamento.data_aprazamento', $params->periodo) ->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id)) ->when($params->infraestrutura_id, fn ($q, $id) => $q->where('centro_custo.infraestrutura_id', $id)) ->when(isset($params->idade['de']), fn ($q) => $q ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) >= {$params->idade['de']}") ) ->when(isset($params->idade['ate']), fn ($q) => $q ->whereRaw("TIMESTAMPDIFF(YEAR, cidadao.data_nascimento, NOW()) <= {$params->idade['ate']}") ) ) ->select( 'vacina.id', DB::raw(VacinaService::getDescricaoRaw() . ' AS descricao') ); } public static function getPrintExportData() { $resultado = self::index(); $itens = $resultado['aprazamentos']; $itens->each(function ($item) { if ($item->paciente_data_nascimento) { $item->paciente_data_nascimento = (new Carbon($item->paciente_data_nascimento))->format('d/m/Y'); } $item->data_aprazamento = (new Carbon($item->data_aprazamento))->format('d/m/Y'); }); $unidade = request()->unidade_id ? Unidade::find(request()->unidade_id) : null; $infraestrutura = request()->infraestrutura_id ? Infraestrutura::find(request()->infraestrutura_id) : null; $vacina = request()->vacina_id ? Vacina::find(request()->vacina_id) : null; return [ 'inicio' => request()->periodo['start'], 'fim' => request()->periodo['end'], 'unidade' => $unidade->nome_fantasia ?? 'Todas', 'infraestrutura' => $infraestrutura->nome ?? 'Todos', 'idadeDe' => request()->idade['de'], 'idadeAte' => request()->idade['ate'], 'vacina' => $vacina ? VacinaService::getDescricao($vacina) : 'Todas', 'colunas' => collect(request()->selectedCols), 'itens' => $itens, ]; } }