3.4.05. Registro de empresas - diezMalena/api_FCTFiller GitHub Wiki
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.
El proceso de registro de empresas se divide en cinco fases diferenciadas:
- Datos de la empresa
- Ubicación del centro de trabajo
- Datos del representante legal
- Asignación de ciclos
- 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.
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ónonCheckboxChange($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 variablefamiliaSelected
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.
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 elControladorGenerico
y accesible desde la ruta/check_duplicado/{elemento}.{campo}={valor}
.Este método comprueba en la tablapublic function checkDuplicate(string $elemento, string $campo, string $valor)
$elemento
si ya hay un registro que, en un$campo
presente un$valor
dado. Haciendo la comprobación mediante unCOUNT
, devuelvetrue
si hay duplicidad yfalse
si no la hay. - En el cliente contamos con los métodos
checkDato
: uno enRegistroEmpresaService
, 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)" />
Al perder el foco sobre el// En el service public checkDatos(elemento: string, campo: string, valor: string | number) // En el component public checkDato(elemento: string, campo: string, event: any): void
<input>
, se llama al método dle componente, que recibe elelemento
y elcampo
que se deben comprobar, así como el valor mediante elevento
. 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 elFormControl
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:
- 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, };
- En el servicio, contamos con el método
enviarDatos(datos: object)
, que hace una llamada a la API mediante la ruta/addDatosEmpresa
- En la API, contamos con el método
addDatosEmpresa(Request $req)
, localizado en elControladorTutorFCT
. En este método se siguen varios pasos:- Se crea un registro en la tabla de empresas
- Se crea otro en la tabla de trabajadores, para el representante legal
- 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. - Se registra la asignación de ciclos a empresas (
empresa_grupo
en la BBDD), mediante el métodoasignarCiclosEmpresa($idEmpresa, $codCiclos)
. Este método elimina todas las asignaciones asociadas a la empresa en cuestión y registra la recibida.