Sistema Gestión de Citas Parte 8: CRUD Médicos - BITácora de Software

Bitacora de software: Programación web, programación de escritorio, programación de servicios, configuración de servidores, IIS, lenguajes de programación C++, C#, PHP, trinity core, unity, jquery, arduino, etc.

 

sábado, 17 de noviembre de 2018

Sistema Gestión de Citas Parte 8: CRUD Médicos

Continuando con el sistema de gestión de citas, ahora explicaré la construcción del CRUD de médicos, el cual es el mas extenso de los 3 CRUD realizados hasta el momento. Sin nada más que agregar vamos al tutorial en si :).
Imagen 1: Tabla medicos (cabecera) y medicos_especialidades (detalle).

Procedimientos Almacenados

Listar todos los médicos (sólo activos). Obtener un médico en especifico. Registrar un médico. Editar un médico. Listar todas las especialidades que tienen un médico (activas e inactivas). Registrar una especialidad asignada a un médico. Editar una especialidad asignada a un médico, como la tabla MEDICOS_ESPECIALIDADES tiene un PK (ID), hago uso de ese campo para actualizar el registro.

Capa de Datos

En la capa de datos tenemos que agregar la clase MedicoDAL y MedicoEspecialidadDAL. Estas clases contendrán los respectivos llamados a los procedimientos almacenados para el crud de médicos.
Imagen 2: Nuevas clases agregadas en la capa de datos.(Fuente propia)

Contenido de la clase MedicoDAL: Contenido de la clase MedicoEspecialidadDAL:

Capa Lógica de Negocio

Respecto a esta clase, lo más resaltante es lo siguiente:
  • Función Valida: Internamente invoca a la función ListarMedicos (línea 54) que devuelve el listado de médicos registrados activos, a dicha lista se le aplica linq para filtrar aquellos médicos que tengan el mismo DNI e ID distinto del médico a registrar o modificar, si se obtiene un registro que cumpla esas condiciones (línea 55) entonces quiere decir que el DNI ya fue asignado a otro médico por lo que se le notifica por medio del un mensaje de error (línea 56). Por otro lado, se tiene la validación de la lista de especialidades (línea 62) del médico, esta lista debe contar con al menos 1 registro, en caso no tenga datos asignado se mostrará un mensaje de error (línea 98). Si la lista de especialidades cuenta con registros, por cada registro de la lista (línea 66) se valida que el objeto contenga un ID (línea 70) y nombre (línea 75), además que dicha especialidad no se repita en la lista (línea 86).
  • Función GrabarMedico: Esta función contiene un bloque transaccional para la inserción del detalle por médico (lista de especialidades) realizando un registro a la vez, en caso exista un error se realizará un rollback a todas las operaciones. Lo primero a realizar es la acción de validación del objeto (línea 127) una vez pase esta validación lo que continua es verificar su ID, si dicho ID contiene el valor -1 esto significa que es un registro nuevo por lo que se procede a registrar los datos del médico en la base de datos (línea 133), la función GrabarMedico devuelve el ID del registro insertado en la base de datos, en caso este valor devuelto es mayor a 0 quiere decir que el registro se realizó correctamente, luego se procederá con el registro de la lista de especialidades del médico recorriendo la lista de especialidades (línea 136), registrando la relación del médico - especialidad a través de la función GrabarEspecialidadDeMedico (línea 138), esta función recibe como parámetro los datos de especialidad, el ID del médico y el nombre del usuario que realiza la acción. Una vez registrado todo correctamente (línea 146), se procede a finalizar todas las operaciones (línea 149).
    Por otro lado, si el ID del objeto es diferente a -1 quiere decir que es un médico que ya se encuentra registrado en la base de datos, por lo que se realiza la acción de modificar (línea 164).
    La función EditarMedico devuelve true cuando la modificación se realizó correctamente. A continuación, se procede a registrar/modificar la lista de especialidades del médico, al igual que con el bloque de registrar médico aquí se valida el ID de la relación médico - especialidad (OJO el campo Id es el PK que identifica la relación del médico con la especialidad, mientras que el campo EspecialidadId contiene el ID de la especialidad), si el ID de la relación es 0, significa que es una relación que fue agregada recientemente al médico por lo que se debe registrar en la base de datos (línea 170), caso contrario se modificar los datos de la relación (línea 172).
    Finalmente una vez que se registró todo correctamente (línea 180) se procede a finalizar todas las operaciones (línea 183).

Capa Presentación: Controlador

En la presentación agregamos el controlador Medico e invocamos las funciones de la capa lógica de negocio.

Capa Presentación: Vista

Agregamos la vista Index desde el controlador Medico.
Imagen 2: Agregar vista. (Fuente propia)

Imagen 3: Creación de vista Index. (Fuente propia)

A continuación, insertamos el siguiente código a la vista.

Capa Presentación: Funcionalidad JS

Creamos el archivo MantenedorMedicos.js en la ruta App_CodeJS/Medicos.
Imagen 4: archivo MantenedorMedicos.js
el código del archivo es:

Todo el código esta contenido dentro de una función anónima, la cuál contiene siete variables: medico, EliminarFilaSeleccionada, indiceEspecialidad, medicoIdEliminar, listaEspecialidades, listaEspecialidadesEliminadas y model, a continuación se describe la información que almacena cada variable:
  • medico: sirve para contener la información que se enviará y/o traerá del médico a registrar/editar.
  • EliminarFilaSeleccionada: contiene la información de la especialidad que se desea eliminar al momento de pulsar sobre el icono eliminar que tiene cada fila de la tabla lista de especialidades del médico.
  • indiceEspecialidad: sirve para identificar la última fila en la lista de especialidades ya que cada vez que se agrega una especialidad al médico se genera dinámicamente la caja de texto el cuál contiene una función de autocompletar.
  • medicoIdEliminar: sirve para identificar a qué médico se desea eliminar al momento de pulsar sobre el icono eliminar que tendrá cada fila de la tabla donde se lista los médicos.
  • listaEspecialidades: contiene la información de las especialidades que conoce el médico.
  • listaEspecialidadesEliminadas: contiene la lista de especialidades que fueron eliminadas del médico, esta información se almacena en memoria porque la eliminación lógica (actualización de estados en la base de datos) se realiza cuando el usuario presiona el botón guardar.
  • model: contiene las funciones que permiten interactuar al usuario con la vista.

Las funciones que contiene model,  son las siguiente:

  1. ConfigurarGrilla: Esta función permite asignar la cantidad de columnas que tendrá el data grid y sus respectivos campos.
  2. RecogerDatosFormulario: Esta función recoge los datos escritos en el formulario modal y lo inserta dentro de la variable médico.
  3. CargarLista: invoca a la función "ListarMedicos" del controlador y carga la información en el data grid.
  4. LimpiarDatosFormulario: Limpia los valores ingresados en los controles de la ventana modal.
  5. Guardar: Invoca a la función RecogerDatosFormulario y luego envía la información del médico a la función "GrabarMedico", al final la función retornará un objeto del tipo RespuestaSistema el cual contiene la propiedad Correcto, si esa propiedad es devuelta en true, entonces quiere decir que se ha grabado o modificado con éxito el médico.
  6. Nuevo: Invoca a la función LimpiarDatosFormulario y muestra el modal para ingresar la información del médico.
  7. Cancelar: Oculta el modal de médico.
  8. EliminarMedico: Muestra el modal de pregunta para eliminar el médico y asigna el id del médico a eliminar a la variable global medicoIdEliminar.
  9. Eliminar: envía el id del médico a eliminar mediante la función "EliminarMedico" del controlador medico, la función retornará un objeto del tipo RespuestaSistema el cual contiene la propiedad Correcto, si esa propiedad es devuelta en true, entonces quiere decir que se ha eliminado con éxito el médico.
  10. CancelarEliminarMedico: reinicia el valor de la variable medicoIdEliminar a 0 y cierra el modal para eliminar el médico.
  11. Obtener: Recibe como parámetro el id del médico a buscar, luego invoca a la función "ObtenerMedico" y carga la información del médico encontrado.
  12. LimpiarListaEspecialidad: Genera la primera fila de la tabla que contiene el listado de especialidades del médico. (ahora que lo pienso debí asignar otro nombre a dicha función :P)
  13. AgregarEspecialidad: Agrega una fila a la tabla que contiene el listado de especialidades del médico.
  14. ImprimirListaEspecialidades: Dibuja las filas y controles html de la tabla que contiene el listado de especialidades del médico.
  15. AutocompletarEspecialidad: esta función permite mostrar una lista con las especialidades que coinciden con el texto ingresado en la caja de texto que invoca a la función. Esta función tiene dos parámetros de entrada el primero es "control" que hace referencia al textbox que invoca la función y el segundo parámetro es "fila" que hace referencia a la posición (tr) del textbox en la tabla. La lista se arma dependiendo de los valores que devuelva la función "BuscarEspecialidad" del controlador medico.
  16. EliminarFilaEspecialidad: esta función elimina una fila de la tabla que contien el listado de especialidades del médico, internamente realiza una verificación si especialidad vinculada al médico no tiene un ID de base de datos elimina dicha fila sin pedir confirmación, en caso contrario abre un modal que solicita la confirmación de la acción de eliminar.
  17. OrdenarCorrelativo: esta función es invocada cuando se elimina una fila de la tabla especialidades y sirve para ordenar los números de la columna de "N°".
  18. OrdenarControlesEspecialidades: esta función renombra los identificadores de los textbox de la tabla especialidades porque cada textbox debe tener un nombre único, recuerden que cada vez que se agrega una nueva fila esta dibuja el textbox con un identificador único a la vez que se le asigna el evento AutocompletarEspecialidad.
  19. EliminarEspecialidad: obtiene la información de la fila a eliminar de la tabla especialidad y la almacena en la variable listaEspecialidadesEliminadas, luego elimina la fila y cierra el modal de confirmación.
  20. CancelarEliminarEspecialidad: Oculta el modal de confirmación de acción eliminar especialidad.
  21. MarcarMenu: Sirve para mantener seleccionado las opciones en el menú principal del sistema.
  22. Inicio: Invoca a función MarcarMenu, asigna las funciones a los eventos de los botones, crea el modal del médico, configura la grilla, obtiene la información de los médicos registrados y finalmente muestra el contenido de la página.
Imagen 5: Listado de médicos. (Fuente propia)


Imagen 6: Modificar médico. (Fuente propia)


Imagen 7: Mensaje de alerta al momento de ingresar un médico con DNI ya existente en la base de datos. (Fuente propia)

Imagen 8: Mensaje de confirmación para la acción eliminar. (Fuente propia)


Imagen 9: Mensaje de éxito para la acción de eliminar. (Fuente propia)

[Descargar Código Fuente / Download Source Code]

No hay comentarios:

Publicar un comentario