3.4.08 Carga de datos maestros a través de CSV - diezMalena/api_FCTFiller GitHub Wiki

Introducción

A esta vista tendrán acceso los directores de los centros educativos así como la jefatura de estudios. Servirá para cargar los datos maestros de la aplicación, obtenidos mediante los ficheros CSV que pueden descargarse desde la plataforma Delphos Papás.

Consta de 4 áreas dónde se podrán arrastrar los ficheros para subirlos o hacer click en ellas, apareciendo un cuadro de diálogo que sólo permitirá elegir ficheros con extensión .csv

A la hora de descargar estos ficheros de la plataforma Delphos Papás, se debe elegir descargar con un formato que esté separado mediante tabulaciones. La aplicación no está preparada para tratar .csv separados por comas, por puntos y coma o por otros separadores.

Subida de ficheros

La Request que llega al servidor (a través de la llamada a la ruta API api/recibirCSV [post]) contiene el fichero como cadena en formato base64 y el nombre de la caja a la que se ha subido el fichero, así como el DNI de la persona que ha realizado esta acción.

Tratamiento de los ficheros

El tratamiento de la información y la gestión de errores se realiza de forma exclusiva en la parte servidora. Como constantes se definen en arrays las cabeceras de los ficheros .csv y el orden de procesamiento de los mismos (en una primera ejecución, es necesaria seguir este orden para evitar registros huérfanos)

#region Declaración de constantes
const CABECERA_ALUMNOS = ["ALUMNO", "APELLIDOS", "NOMBRE", "SEXO", "DNI", "NIE", "FECHA_NACIMIENTO", "LOCALIDAD_NACIMIENTO", "PROVINCIA_NACIMIENTO", "NOMBRE_CORRESPONDENCIA", "DOMICILIO", "LOCALIDAD", "PROVINCIA", "TELEFONO", "MOVIL", "CODIGO_POSTAL", "TUTOR1", "DNI_TUTOR1", "TUTOR2", "DNI_TUTOR2", "PAIS", "NACIONALIDAD", "EMAIL_ALUMNO", "EMAIL_TUTOR2", "EMAIL_TUTOR1", "TELEFONOTUTOR1", "TELEFONOTUTOR2", "MOVILTUTOR1", "MOVILTUTOR2", "APELLIDO1", "APELLIDO2", "TIPODOM", "NTUTOR1", "NTUTOR2", "NSS"];
const CABECERA_MATRICULAS = ["ALUMNO", "APELLIDOS", "NOMBRE", "MATRICULA", "ETAPA", "ANNO", "TIPO", "ESTUDIOS", "GRUPO", "REPETIDOR", "FECHAMATRICULA", "CENTRO", "PROCEDENCIA", "ESTADOMATRICULA", "FECHARESMATRICULA", "NUM_EXP_CENTRO", "PROGRAMA_2"];
const CABECERA_PROFESORES = ["CODIGO", "APELLIDOS", "NOMBRE", "NRP", "DNI", "ABREVIATURA", "FECHA_NACIMIENTO", "SEXO", "TITULO", "DOMICILIO", "LOCALIDAD", "CODIGO_POSTAL", "PROVINCIA", "TELEFONO_RP", "ESPECIALIDAD", "CUERPO", "DEPARTAMENTO", "FECHA_ALTA_CENTRO", "FECHA_BAJA_CENTRO", "EMAIL", "TELEFONO"];
const CABECERA_UNIDADES = ["ANNO", "GRUPO", "ESTUDIO", "CURSO", "TUTOR"];
const ORDEN_PROCESAMIENTO = ['profesores', 'alumnos', 'unidades', 'matriculas'];
#endregion

Para tratar los archivos e introducir los datos en el sistema, se realiza el siguiente procedimiento:

  1. Se recorre el array ORDEN_PROCESAMIENTO y se comprueba si existe en la Request un nombre de caja con el nombre de la iteración en curso. Si no existe, se pasa al siguiente.

  2. Si existe el nombre en la iteración, se guarda el fichero en la carpeta tmp/csv. Una vez guardado, se comprueba la integridad del fichero

$this->comprobarFichero($nombreCaja, $nombreFichero);

Este método realiza una llamada al método comprobarExtension($nombreFichero, $extensionAComprobar) que verifica que el fichero es uno con extensión .csv. Si no es así, devuelve false; true en caso contrario. Tras realizar esta comprobación, se verifica mediante la función comprobarLineasFichero($nombreCaja) que todas las líneas del documento coinciden en longitud con su vector de cabecera. Si no es así, devuelve false; true en caso contrario.

El método comprobarFichero devuelve 0 en caso de que haya pasado todas las validaciones y en caso contrario, devuelve un mensaje con la primera validación que ha fallado.

  1. Si no se han pasado todas las validaciones anteriores, se detiene la carga de este fichero en concreto, informando en un mensaje de los errores ocurridos y se pasa al siguiente fichero. Si todo ha salido bien, se pasa a cargar los datos en la BBDD.
$this->procesarFicheroABBDD($nombreCaja, $request->dni);

El método procesarFicheroABBDD es intermediario de las funciones finales que insertarán los datos en la BBDD:

public function procesarFicheroABBDD($nombreCaja, $DNILogueado)
{
    $resultado = false;
    switch ($nombreCaja) {
         case 'alumnos':
            $resultado = $this->procesarFicheroABBDDAlumnos($nombreCaja);
            break;
        case 'matriculas':
            $resultado =  $this->procesarFicheroABBDDMatriculas($nombreCaja, $DNILogueado);
            break;
        case 'profesores':
            $resultado =  $this->procesarFicheroABBDDProfesores($nombreCaja, $DNILogueado);
            break;
        case 'unidades':
            $resultado =  $this->procesarFicheroABBDDUnidades($nombreCaja, $DNILogueado);
            break;
        default:
            $resultado =  'Error';
            break;
    }
     return $resultado;
}

Cada uno de los métodos a los que llama esta función intermedia inserta los datos en las tablas correspondientes:

  • procesarFicheroABBDDMatriculas inserta en tablas Alumnos y User.
  • procesarFicheroABBDDMatriculas inserta en tabla Matricula
  • procesarFicheroABBDDProfesores inserta en tablas Profesores, User y RolProfesorAsignado
  • procesarFicheroABBDDUnidades inserta en tablas OfertaGrupo y Tutoria
  1. El procesamiento que se realiza en las funciones finales es muy similar entre ellas:
  • Se lee el fichero línea por línea.
  • Se guarda en un array la línea que se ha dividido mediante el método explode por tabulaciones.
  • Se obtiene el índice en la cabecera del campo que deseamos obtener y consultamos en la línea del fichero la posición obtenida.
  • Se limpia la cadena de posibles espacios al inicio y al final de los ficheros y otros símbolos problemáticos.
  • Se guarda el campo en la base de datos.