3.4.05. Registro de empresas - diezMalena/api_FCTFiller GitHub Wiki

Planteamiento

El registro de empresas está planteado, por el momento, para que se haga desde un perfil de profesorado. Es el primer paso del proceso de la Formación en Centros de Trabajo (FCT), que da lugar a que el centro y la empresa puedan elaborar un convenio o acuerdo.

El registro de empresas se gestiona en el cliente en el componente RegistroEmpresaComponent, del módulo DataManagement, y es accesible para todo el profesorado. En la API, se maneja en el ControladorTutorFCT, ubicado entre los controladores docentes.

Fases

El proceso de registro de empresas se divide en cinco fases diferenciadas:

  1. Datos de la empresa
  2. Ubicación del centro de trabajo
  3. Datos del representante legal
  4. Asignación de ciclos
  5. Resumen y finalización

Para poder gestionar el avance de las fases del registro, se creó en el cliente la clase FaseForm con la siguiente información:

public index: number // El número de la fase
public nombre: string // El nombre de la fase
public abreviatura: string // El nombre abreviado (para interfaces más reducidas)
public accesible: boolean // Indica si esa fase está disponible

Los métodos con los que cuenta la clase son:

public activar(): void // Activa la fase
public desactivar(): void // Desactiva la fase
public isCompleted(faseActual: number): boolean // Indica si la fase está completada
public isActual(faseActual: number): boolean // Indica si la fase es la actual
public getClass(faseActual: number): string // Devuelve una cadena de texto con la class aplicable al elemento del breadcrumb según la fase actual

El componente de registro, por tanto, va a contar con variables y métodos encargados de la gestión de fases:

// Variables
public fases: Array<FaseForm> // Vector de fases, con la primera fase inicializada como activa
public faseActual: number // Índice de la fase actual, inicializado a 1. Controla, entre otras cosas, la vista que se muestra
// Métodos
public inicializarFases(): void // Inicializa las fases del formulario y activa la primera
public nextFase(): void // Incrementa en 1 la fase actual y la activa
public cambiarFase(i: number): void // Cambia la fase actual al valor que se le pasa sólo si es accesible

Las fases controlarán qué vista se muestra y la apariencia de los elementos del breadcrumb, de forma que sólo se muestre el formulario correspondiente a la fase actual en la parte principal de la interfaz. Para avanzar de fase, el usuario deberá introducir los datos correctamente; y podrá acceder a otras fases siempre y cuando hayan sido previamente completadas.

Asignación de ciclos

La fase de asignación de ciclos merece especial mención, ya que es el único formulario que se sale de la estructura típica (introducción de datos, validación y guardado).

El componente de registro cuenta con las siguientes variables a tener en cuenta:

public familias!: FamiliaProfesional[]; // Descargado del servidor, permite el filtrado de grupos
public grupos?: Grupo[]; // Descargado del servidor
public familiaSelected?: number; // Índice de la familia seleccionada, para el filtrado de grupos

Dentro del cada grupo, encontramos otro array de familias profesionales, de forma que se pueda implementar el filtrado.

Esta vista consta de tres partes:

  • Panel de grupos: en esta sección se muestran los grupos del componente, filtrados por la familia profesional seleccionada (ver filtrarGrupos(familia: number)). Cada checkbox, al cambiar su estado, llama a la función onCheckboxChange($event), que actualiza las checkboxes marcadas en el formulario.
  • Filtros: la parte superior de la vista ofrece al usuario la posibilidad de seleccionar una familia profesional (el nivel formativo está en desarrollo) para filtrar los ciclos. Al seleccionar una familia profesional, se invoca a cambiarFamilia($event), que cambia la variable familiaSelected del componente. Esta variable es la que recibe el método mencionado anteriormente, filtrarGrupos(familia: number), permitiendo el cambio en el panel de grupos.
  • Panel de selección: sobre el panel de grupos se sitúa una barra de ciclos seleccionados, que simplemente muestra, también en checkboxes, los ciclos seleccionados y guardados en los datos del formulario. Cada checkbox tiene los mismos métodos que en el panel de grupos. Esta parte cuenta con un botón "Limpiar selección" que reinicia el formulario.

Al validar el formulario, los datos se almacenan en variables del componente para ser enviados junto al resto al servidor.

Validación y envío de los datos

El componente de registro de empresas consta de cuatro formularios independientes con validación propia, uno por fase. Cada uno de estos formularios es un FormGroup construido mediante FormBuilder, que utiliza las herramientas de FormControl y los Validators para prevenir al usuario de introducir datos incorrectos. Al hacerse submit de cada formulario, no se envían los datos al servidor, sino que se almacenan en la variable correspondiente para ser tratada y enviada en la última fase del registro.

Dado que no se envían datos al servidor hasta el final, quedaría por validar la no-duplicidad de los datos sensibles para las bases de datos (claves primarias y únicas). Desde el punto de vista de la usabilidad, no sería aceptable que se avisase de la duplicidad de los campos sólo al final del registro, ya que el usuario tendría que retroceder varios pasos y volver a finalizar el usuario. Para evitarlo, se desarrolló un método simple en cliente y otro en servidor, gestionados mediante GET:

  • En el servidor contamos con el método checkDuplicate, localizado en el ControladorGenerico y accesible desde la ruta /check_duplicado/{elemento}.{campo}={valor}.
    public function checkDuplicate(string $elemento, string $campo, string $valor)
    Este método comprueba en la tabla $elemento si ya hay un registro que, en un $campo presente un $valor dado. Haciendo la comprobación mediante un COUNT, devuelve true si hay duplicidad y false si no la hay.
  • En el cliente contamos con los métodos checkDato: uno en RegistroEmpresaService, que simplemente hace la petición al servidor; y otro en el componente.
    <input type="text" class="form-control" id="cif" formControlName="cif" placeholder="00000000X" (blur)="checkDato('empresa', 'cif', $event)" />
    // En el service
    public checkDatos(elemento: string, campo: string, valor: string | number)
    // En el component
    public checkDato(elemento: string, campo: string, event: any): void
    Al perder el foco sobre el <input>, se llama al método dle componente, que recibe el elemento y el campo que se deben comprobar, así como el valor mediante el evento. El método del service concatena las variables para formar la ruta que se ha especificado en la API. Si hay duplicidad de datos, se establece un nuevo error, duplicate, en el FormControl correspondiente, impidiendo el submit del formulario y accionando en el template el mensaje de error:
    this.empresa.controls[campo].setErrors({ duplicate: true });

El envío de datos al servidor se hace mediante un POST del cliente al servidor, en el que se envían los datos encapsulados en un JSON. El proceso consta de tres métodos:

  1. En el componente, contamos con el método finalizarRegistro(), que encapsula los datos ya guardados y los envía al método del servicio:
    var datos = {
        empresa: this.datosEmpresa,
        representante: this.datosRepresentante,
        ciclos: this.datosCiclos.cod_ciclos_selected,
        dni: this.storage.getUser()?.dni,
    };
  2. En el servicio, contamos con el método enviarDatos(datos: object), que hace una llamada a la API mediante la ruta /addDatosEmpresa
  3. En la API, contamos con el método addDatosEmpresa(Request $req), localizado en el ControladorTutorFCT. En este método se siguen varios pasos:
    1. Se crea un registro en la tabla de empresas
    2. Se crea otro en la tabla de trabajadores, para el representante legal
    3. Se registra al representante legal como responsable de centro de trabajo, en la tabla rol_trabajador_asignado. De esta forma, no será necesario registrar un responsable de cara a la asignación de alumnos a empresas.
    4. Se registra la asignación de ciclos a empresas (empresa_grupo en la BBDD), mediante el método asignarCiclosEmpresa($idEmpresa, $codCiclos). Este método elimina todas las asignaciones asociadas a la empresa en cuestión y registra la recibida.
⚠️ **GitHub.com Fallback** ⚠️