problema con rango de fechas en un formulario

problema con rango de fechas en un formulario

by Laura Miñambres Hernando -
Number of replies: 1

Hola a todos!! escribo porque estoy desesperada porque tengo que modificar un módulo de "entrevista personal" que hizo una chica de mi facultad y no soy quien a ello. La cuestión es que el módulo muestra un formulario para que tu puedas elegir la fecha de comienzo de una entrevista y la fecha de fin de la entrevista, y luego también hay que rellenar un campo en el que tu especificas la duración de cada entrevista. Por ejemplo en el primer formualrio eliges que empeicen las entrevistas hoy y en el segundo que acaben pasado mañana y en el otro campo escribes que cada entrevista dure por ejemplo 15 minutos.

Pues la cosa es que al aceptar y guardar cambios no me deja si la fecha de fin no es la misma que la fecha de inicio, es decir, solo me deja hacer las entrevistas en el mismo dia, sino sale error, porque al poner el campo de cuanto quieres que dure cada entrevista hace unas comprobaciones y no me funciona.

Aquí os dejo el código de lo que tengo. Espero que me podais ayudar a saber com opuedo modificar esto para que me acepte distinta fecha de fin. Un saludo y gracias anticipadas!

codigo:

// Establece el límite temporal de la sesión de entrevistas y la duración de cada franja

        // Cabecera: Fecha
        $mform->addElement('header', 'date', get_string('date', 'interview'));

        // Fecha de comienzo (Día/Mes/Año/Hora/Minuto)
        $mform->addElement('date_time_selector', 'timeopen', get_string('timeopen', 'interview'));

        // Fecha de finalización (Día/Mes/Año/Hora/Minuto)
        $mform->addElement('date_time_selector', 'timeclose', get_string('timeclose', 'interview'));

        // Cabecera: Franjas horarias
        $mform->addElement('header', 'slots', get_string('slots', 'interview'));

        // Duración de cada franja
  $mform->addElement('text', 'timeslot', get_string('timeslot','interview'),'maxlength="3"');
        $mform->setType('timeslot', PARAM_INT);
        $mform->addRule('timeslot', null, 'required', null, 'client');
  $mform->setHelpButton('timeslot', array('duration', get_string('duration', 'interview'), 'interview'));

// Validación del formulario con comprobaciones de error al intentar enviar los datos
    function validation($data){

        // Para que esté todo correcto tiene que cumplirse:
        // 1. Tiempo inicio > Tiempo actual
        // 2. Tiempo cierre > Tiempo actual
        // 3. Tiempo cierre > Tiempo inicio
        // 4. Minutos por franja debe ser numérico
        // 5. Minutos por franja > 0 y distinto de vacío
        // 6. Tiempo de cierre - Tiempo de inicio >= Minutos por franja
        // 7. Duración_sesión = Duración_franja·N, siendo N entero

        // Almacena la hora de inicio de la sesión
        $a = date('H', $data['timeopen']);

        // Almacena los minutos de inicio de la sesión
        $b = date('i', $data['timeopen']);

        // Pasa todo a minutos
        $minstart = $a*60+$b;

        // Almacena la hora de finalización de la sesión
        $c = date('H', $data['timeclose']);

        // Almacena los minutos de finalización de la sesión
        $d = date('i', $data['timeclose']);

        // Pasa todo a minutos
        $minend = $c*60+$d;

        if ($data['timeopen']>=time() and $data['timeclose']>time() and $data['timeclose']>$data['timeopen'] and
            is_numeric($data['timeslot']) and $data['timeslot']>0 and
            ($minend - $minstart)>= $data['timeslot'] and
   is_int(($minend - $minstart)/$data['timeslot'])) {
            return true;

        // Establece un cuadro rodeando el tiempo de apertura e indicando que debe ser posterior a la fecha actual
        } elseif ($data['timeopen'] < time()) {
            return array('timeopen'=>get_string('timeopenfail', 'interview'));

        // Establece un cuadro rodeando el tiempo de cierre e indicando que debe ser posterior a la fecha actual
        } elseif ($data['timeclose'] <= time()) {
            return array('timeclose'=>get_string('timeclosefail', 'interview'));

        // Establece un cuadro rodeando el tiempo de cierre e indicando que debe ser posterior al tiempo de apertura
        } elseif ($data['timeclose']<= $data['timeopen']) {
            return array('timeclose'=>get_string('timefail', 'interview'));

        // Establece un cuadro rodeando la duración de la franja e indicando que debe proporcionarse un valor numérico
        } elseif (!is_numeric($data['timeslot'])) {
            return array('timeslot'=>get_string('numeric', 'interview'));

        // Establece un cuadro rodeando la duración de la franja e indicando que debe proporcionarse un valor positivo
        // y distinto de cero

        } elseif ($data['timeslot']<=0 ) {
            return array('timeslot'=>get_string('positive', 'interview'));

        // Establece un cuadro rodeando la duración de la franja e indicando que ésta debe ser menor que la
        // duración de la sesión
        } elseif ($minend - $minstart < $data['timeslot']) {
            return array('timeslot'=>get_string('timeslotfail', 'interview'));

        // Establece un cuadro rodeando la duración de la franja e indicando que debe proporcionarse un valor que encaje perfectamente
  // en la duración de la sesión

  } elseif (!is_int(($minend - $minstart)/$data['timeslot'])) {
   return array('timeslot'=>get_string('fit', 'interview'));
  }

Average of ratings: -
In reply to Laura Miñambres Hernando

Re: problema con rango de fechas en un formulario

by Iñaki Arenaza -
Picture of Desarrolladores Picture of Desarrolladores de plugins Picture of Documentadores Picture of Moderadores Picture of Moodlers de gran ayuda

Me da en la nariz que el problema está en la última comprobación. El código está mirando si el intervalo entre el momento de inicio y el momento de fin es múltiplo de la duración de las entrevistas.

Cuando usas más de un día, el código presupone que todo el tiempo entre el inicio y el fin (incluyendo las horas nocturas) se destina a entrevistas, y hace la división para ver si entran un número de entrevistas enteras. Según las fechas de inicio y fin que escojas puede que sí, o puede que no. En este segundo caso obtendrás el error.

O al menos eso es lo que sospecho leyendo el código.

Saludos. Iñaki.