public function validate($data) { //$this->data = $data; //return false; //formatear fechas if (!empty($data['fEvento'])) { $date = DateTime::createFromFormat('d-m-Y', $data['fEvento']); $data['fEvento'] = $date->format('Y-m-d'); } if (!empty($data['fInicio'])) { $date = DateTime::createFromFormat('d-m-Y', $data['fInicio']); $data['fInicio'] = $date->format('Y-m-d'); } if (!empty($data['fFin'])) { $date = DateTime::createFromFormat('d-m-Y', $data['fFin']); $data['fFin'] = $date->format('Y-m-d'); } //mensages //req1: alumno solo pueden reservar entre firstMonday y lastFriday (por implementar) if (Auth::user()->isUser()) { setlocale(LC_ALL, 'es_ES@euro', 'es_ES', 'esp'); $this->messages['fInicio.req1'] = '<br />Puedes reservar entre el <strong>' . strftime('%A, %d de %B de %Y', sgrCalendario::fristMonday()) . '</strong> y el <strong>' . strftime('%A, %d de %B de %Y', sgrCalendario::lastFriday()) . '</strong><br />'; } if (Auth::user()->isAvanceUser()) { setlocale(LC_ALL, 'es_ES@euro', 'es_ES', 'esp'); $this->messages['fInicio.req5'] = 'Puedes reservar a partir del <strong>' . strftime('%A, %d de %B de %Y', sgrCalendario::fristMonday()) . '</strong><br />'; } if (Auth::user()->isTecnico()) { setlocale(LC_ALL, 'es_ES@euro', 'es_ES', 'esp'); $tsToday = strtotime('today'); $this->messages['fInicio.req6'] = 'Puedes reservar a partir del <strong>' . strftime('%A, %d de %B de %Y', $tsToday) . '</strong><br />'; } if (isset($data['dias']) && in_array('6', $data['dias'])) { $this->messages['dias.req4'] = $this->messages['dias.req4'] . " No se puede reservar en <strong>sábado</strong><br />"; } if (isset($data['dias']) && in_array('0', $data['dias'])) { $this->messages['dias.req4'] = $this->messages['dias.req4'] . " No se puede reservar en <strong>domingo</strong><br />"; } if (!empty($data['fFin'])) { $this->messages['fFin.datefincurso'] = 'Las reservas deben de finalizar dentro del curso académico actual. (Fecha limite: ' . date('d-m-Y', strtotime(Config::get('options.fin_cursoAcademico'))) . ')'; } if (!empty($data['fInicio'])) { $this->messages['fInicio.dateiniciocurso'] = 'No es posible realizar reservas hasta que se finalice la carga del POD: fecha prevista a partir del día ' . date('d-m-Y', strtotime(Config::get('options.inicio_gestiondesatendida'))); } if (!empty($data['reservarParaUvus'])) { $this->messages['reservarParaUvus.existeuvus'] = 'Usuario "' . $data['reservarParaUvus'] . '" no registrado.'; } //fin mensages // make a new validator object $v = Validator::make($data, $this->rules, $this->messages); //requisito: reserva para otro usuario -> debe de existir en la Base de Datos if (!empty($data['reservarParaUvus'])) { $v->sometimes('reservarParaUvus', 'existeuvus', function ($data) { if (User::where('username', '=', $data['reservarParaUvus'])->count() == 0) { return true; } }); } //requisito: alumnos no pueden reservar dos recurso a la misma hora, mismo día if (!empty($data['fEvento']) && !empty($data['hFin']) && !empty($data['hInicio'])) { $v->sometimes('fEvento', 'reservaunica', function ($data) { if (Auth::user()->capacidad == '1') { //setlocale(LC_ALL,'es_ES@euro','es_ES','esp'); //determinar si tiene reserva en otro recurso con misma fechaEvento, horainicio y horafin solapadas. $id_recurso = Recurso::find($data['id_recurso'])->id; $where = " (( horaInicio <= '" . $data['hInicio'] . "' and horaFin >= '" . $data['hFin'] . "' ) "; $where .= " or ( horaFin > '" . $data['hFin'] . "' and horaInicio < '" . $data['hFin'] . "')"; $where .= " or ( horaInicio > '" . $data['hInicio'] . "' and horaInicio < '" . $data['hFin'] . "')"; $where .= " or horaFin < '" . $data['hFin'] . "' and horaFin > '" . $data['hInicio'] . "')"; $where .= " and recurso_id != " . $id_recurso; $numEventosOtroRecurso = Evento::where('user_id', '=', Auth::user()->id)->where('fechaEvento', '=', date('Y-m-d', strtotime($data['fEvento'])))->whereRaw($where)->count(); if ($numEventosOtroRecurso > 0) { return true; } } }); } //req1: alumno solo pueden reservar entre firstMonday y lastFriday if (!empty($data['fInicio']) && strtotime($data['fInicio']) != false) { $v->sometimes('fInicio', 'req1', function ($data) { if (Auth::user()->isUser()) { if (sgrCalendario::fristMonday() > strtotime($data['fInicio']) || sgrCalendario::lastFriday() < strtotime($data['fInicio'])) { return true; } } }); } //req2: alumno supera el máximo de horas a la semana (12) // empty($data['action'] -> solo se comprueba en la reserva nueva (add) if (!empty($data['hFin']) && !empty($data['hInicio']) && empty($data['action'])) { $v->sometimes('hFin', 'req2', function ($data) { if (Auth::user()->isUser()) { $nh = Auth::user()->numHorasReservadas(); //Número de horas ya reservadas $nh2 = sgrDate::diffHours($data['hInicio'], $data['hFin']); //números de horas que se quiere reservar $maximo = Config::get('options.max_horas'); $credito = $maximo - $nh; //número de horas que aún puede el alumno reservar if ($credito < $nh2) { return true; } } }); } //deshabilitado if (isset($data['id_recurso']) && $data['id_recurso'] != 0) { $v->sometimes('titulo', 'deshabilitado', function ($data) { if (1 == Recurso::findOrFail($data['id_recurso'])->disabled) { return true; } }); } //req3: if (isset($data['fInicio']) && strtotime($data['fInicio']) != false && isset($data['dias'])) { $v->sometimes('titulo', 'req3', function ($data) { $idrecurso = $data['id_recurso']; $recurso = Recurso::findOrFail($idrecurso); $sgrRecurso = RecursoFactory::getRecursoInstance($recurso->tipo); $sgrRecurso->setRecurso($recurso); $excluyeId = ''; if (isset($data['idSerie'])) { $excluyeId = $data['idSerie']; } return $sgrRecurso->recursoOcupado($data, $excluyeId); }); } //req4: Sábados y domingos no se puede reservar if (isset($data['dias'])) { $v->sometimes('dias', 'req4', function ($data) { $dias = $data['dias']; // 0 = domingo, 6 = sábado if (in_array('0', $dias) || in_array('6', $dias)) { return true; } }); } //Req5: // --> alumnos y pdi (capacidades 1 y 2): solo pueden reservar a partir de firstmonday if (!empty($data['fInicio']) && strtotime($data['fInicio']) != false) { $v->sometimes('fInicio', 'req5', function ($data) { if (Auth::user()->isAvanceUser()) { if (sgrCalendario::fristMonday() > strtotime($data['fInicio'])) { return true; } } }); } //Req6: // --> técnicos (capacidad 3, 4 y 5): reservas a partir del día de hoy (para mañana) if (!empty($data['fInicio']) && strtotime($data['fInicio']) != false) { $v->sometimes('fInicio', 'req6', function ($data) { if (Auth::user()->isTecnico()) { if (strtotime('today') > strtotime($data['fInicio'])) { return true; } } }); } //after: fInicio & fFin > today if (!empty($data['fInicio']) && strtotime($data['fInicio']) != false) { $intFinicio = strtotime($data['fInicio']); $intNow = strtotime('now'); $intDiaAnterior = strtotime('-1 day', $intFinicio); //fecha posterior al día actual $v->sometimes('fInicio', 'after:' . date('d-m-Y', $intDiaAnterior), function ($data) { return true; }); //fecha fin mayor o igual que fecha inicio => mayor que el día anterior a fecha inicio if ($data['repetir'] == 'CS') { $v->sometimes('fFin', 'required|date|date_format:Y-m-d|after:' . date('d-m-Y', $intDiaAnterior), function ($data) { return true; }); } } //after:hinicio < hfin if (!empty($data['hInicio'])) { $aHini = explode(':', $data['hInicio']); $timehorainicio = mktime($aHini[0], $aHini[1]); $v->sometimes('hFin', 'required|date_format:H:i|after:' . date('H:i', $timehorainicio), function ($data) { return true; }); } // requisito: reservas debe finalizar dentro del curso académico actual (Restringido a todos los usuarios menos a los validadores) if (!empty($data['fFin']) && !empty($data['repetir']) && !Auth::user()->isValidador()) { $v->sometimes('fFin', 'datefincurso', function ($data) { $fechaFinCurso = Config::get('options.fin_cursoAcademico'); $fechaMaximaEvento = $data['fEvento']; if ($data['repetir'] == 'CS') { $fechaMaximaEvento = $data['fFin']; } //Reptición cada semana if (strtotime($fechaMaximaEvento) > strtotime($fechaFinCurso)) { return true; } }); } // requisito dateiniciocurso: lasreservas debe de ser posteriores a la fecha de inicio curso actual (Restringido a usuarios alumnos, pdi, administradores y tecnicos) if (!empty($data['fInicio']) && !Auth::user()->isValidador() && !Auth::user()->isAdmin()) { $v->sometimes('fInicio', 'dateiniciocurso', function ($data) { $hoy = strtotime('today'); $diaInicio = strtotime(Config::get('options.inicio_gestiondesatendida')); if ($diaInicio > $hoy) { return true; } }); } // check for failure if ($v->fails()) { $this->errors = $v->messages()->toArray(); return false; } $this->data = $data; //return false; // validation pass return true; }
/** * Implementa requisito: usuarios del perfil alumno (capacidad = 1) pueden reservar como másimo 12 horas a la semana. * * @param void * @return $nh int Número de horas reservadas por el usuario logueado en la semana reservable inmediatemente siguiente a la actual (perfil alumno) */ public function numHorasReservadas() { $nh = 0; $fristMonday = sgrCalendario::fristMonday(); //devuelve timestamp $lastFriday = sgrCalendario::lastFriday(); //devuelve timestamp $fm = date('Y-m-d', $fristMonday); //formato para la consulta sql (fechaIni en Inglés) $lf = date('Y-m-d', $lastFriday); //formato para la consulta sql (fechaFin en Inglés) $events = $this->userEvents()->where('fechaEvento', '>=', $fm)->where('fechaEvento', '<=', $lf)->get(); foreach ($events as $key => $event) { $nh = $nh + sgrDate::diffHours($event->horaInicio, $event->horaFin); } return $nh; }