lunes, 25 de noviembre de 2019

Reflexion Final

Reflexión: Austin Hakanson

Al comenzar a realizar este proyecto final, el proceso fue diferente a los anteriores en donde la mayor parte del tiempo se pasaba buscando información en internet sobre cómo funciona T-SQL, los diferentes tipos de sentencias, objetos (Stored procederes, triggers, funciones, vistas, etc.) para poder implementar lo que se solicitaba en la tarea así como las buenas prácticas de programación que ya para esta tarea se vuelven más naturales.  En esta ocasión me podía concentrar más en la lógica del programa y pude sentir la diferencia entre la primera tarea programada y esta en cuanto a conocimiento sobre diseño de bases de datos y sobre la programación en SQL. 

No obstante, en este proyecto aprendí bastantes cosas nuevas. Algunas sentencias nuevas que se implementaron incluyen el uso de CASES en la sentencia SELECT para escoger entre varios valores calculados cuál asignar a un campo determinado, la creación de funciones escalares para hacer cálculos personalizados repetitivos específicos, un uso más riguroso de los JOIN para mantener integridad referencial y relacionar todas las tablas del modelo con el fin de hacer actualizaciones e inserciones de datos masivas (sin iteración) que es algo distinto a lo aplicado en las tares programadas anteriores, aprendí más sobre el manejo de fechas y las operaciones que se pueden realizar con ellas (DATEDIFF, DATEADD, EOMONTH, CONVERT, etc) para satisfacer requerimientos muy específicos para cualquier modelo de negocios. 

En cuanto a organización, en este tarea programada la disciplina fue total, se llevó un registro de todas las horas trabajadas por medio de un bloc de notas que luego se publicaba en este blog. En otras palabras, se aplicó el concepto de bitácora de manera adecuada. También se implementó correctamente el uso de GitHub, aprendí a realizar los salvamentos de versiones desde consola, para mantener un control de versiones de todas las tablas, stored procederes, triggers y funciones de la base de datos, una práctica que considero muy enriquecedora ya que será útil en futuros proyectos y en el entorno laboral para realizar trabajo en equipo. En este proyecto se practicó tener un branch por cada miembro y un master final.

Reflexión: Antony

El SQL ha sido un lenguaje más que interesante, incluso todavía cuando ya iba como por la mitad del periodo del curso no pensé que SQL tuviera tantas aplicaciones y herramientas para llevar a cabo tareas tan diversas.
Este proyecto fue muy curioso, porque fue prácticamente algo así como la suma de los conocimientos de las tres anteriores tareas programadas, ya que con ellas fue que verdaderamente aprendimos mucho de lo que nos podía ofrecer SQL y distintas estrategias para utilizar las herramientas que ofrece el lenguaje, además se aprendió programación que aunque no se aplicó para este proyecto final, ya llevamos el conocimiento para poder hacer una aplicación web que se conecte con nuestra base de datos y podamos utilizar la información que almacenemos en esta.
Además este proyecto tuvo la particularidad de que al ser casi que finales del semestre nos permitió reunirnos más para trabajar en grupo lo cual si bien está bastante bonito prácticamente se trabaja en una sola computadora ya que como no se tiene un servidor donde los dos trabajemos con exactamente la misma base de datos entonces es más fácil trabajar en una sola computadora a tener que estar creando archivos enviándolos y pegándolos en la base de datos, esto al menos para el momento de trabajar reunidos ya a distancia por supuesto no hay de otra

Horas totales trabajadas: 30 h

Trabajo del 25 de noviembre

Hora Inicio: 6:54 a.m

Responsables: Austin Hakanson

Actividades: 

- Se descubre que no es necesario el uso de un case en el select de @Pagos del día porque si el DATEDIFF() entre la hora final de la jornada y la hora de salida de la asistencia es 0, al multiplicar se anule cualquier salario por horas extra. Estos son los estatutos viejos:

-- Caso para horas extra regulares
CASE WHEN DATEDIFF(HOUR,TJ.HoraFin, A.HoraSalida) > 0
THEN SPH.Salario * DATEDIFF(HOUR,A.HoraEntrada, A.HoraSalida) + SPH.Salario * DATEDIFF(HOUR,TJ.HoraFin,A.HoraSalida) * 1.5 
-- Caso para horas ordinarias
ELSE SPH.Salario * DATEDIFF(HOUR,A.HoraEntrada, A.HoraSalida) END

Este es el nuevo:

SPH.Salario * DATEDIFF(HOUR,A.HoraEntrada, A.HoraSalida) + SPH.Salario * DATEDIFF(HOUR,TJ.HoraFin,A.HoraSalida) * 1.5

- Se registran en los movimientos de planilla los pagos por horas ordinarias y horas extraordinarias. Se utiliza CAST() por primera vez para convertir el numero de horas extra a varchar y agregarlo a la descripción de pago de horas extra. https://www.c-sharpcorner.com/blogs/convert-integer-to-string-in-sql-server

- Se modifica la tabla crédito para que siga el modelo de agregación visto en clase. También se añade la tabla de deducción que no se había agregado para crear la especialización por herencia de movimiento planilla en movimientos de crédito y de deducción.

- Se corrigen algunos errores al registrar movimientos de planilla como que el salario base se pague siempre y que por aparte se agreguen la horas extra, antes si tenía horas extra solo agregaba estas.

- Se agrego la tabla credito a Reiniciar tablas y se inicia la especialización de los movimientos de planilla en credito.

- Hay un problema al seleccionar los movimientos de planilla que deben ingresarse en crédito.

Hora pausa: 9:42 a.m
Hora reanuda: 10:38 a.m

Actividades:

- Se corrige el problema para agregar créditos con herencia de movimientos de planilla, código resultante:

- Se realizan pruebas para determinar el numero entre el cual hay que dividir las deducciones para ser aplicadas semanalmente

DECLARE @fecha date = '2017-05-30'
DECLARE @fechaActual date = '2017-06-27'
DECLARE @UltimoViernesDelMes datetime = dbo.ObtenerUltimoDiaDelMes(@fechaActual,'friday')
SELECT CAST(@UltimoViernesDelMes as date)
DECLARE @Semanas int
SET @Semanas = DATEDIFF(WEEK,@fecha, @UltimoViernesDelMes)
SELECT @Semanas

- Pausa: 11:41 a.m
- Hora reanudación: 12:22 a.m

Actividades:

- Se corrigió un error con el cálculo de los meses, ahora sí terminan en el último viernes del mes. 

- Se hizo la función para calcular la diferencia de horas bien (tomando el caso de la media noche)

- Se logran hacer las deducciones cada semana. Las porcentuales y las fijas (para estas se divide entre el numero de semanas en el mes)

- Se toma todo el trabajo de ayer y hoy sobre el procesamiento de pagos y deducciones y se escribe en un stored procedure encapsulado en try-catch y un transation.



Hora Fin: 4:40 p.m

Horas totales: 8:09 h

domingo, 24 de noviembre de 2019

Actividades del día 24 de noviembre

Hora Inicio: 7:30 a.m

Responsables: Austin Hakanson

Actividades:

- Se empiezan a hacer los estatutos sql para hacer los cálculos de salario

Pausa: 8:28 a.m
Reanudación: 8:34 a.m

Actividades:

- Se utiliza por primera vez el estatuto case en un select  para especificar si se tiene que pagar horas extra o no.
Resultado:

SELECT E.Nombre, P.Puesto, TJ.Nombre, A.HoraEntrada, A.HoraSalida, SPH.Salario as SalarioPorHora, 
  CASE WHEN DATEDIFF(HOUR,TJ.HoraFin, A.HoraSalida) > 0 THEN SPH.Salario * DATEDIFF(HOUR,A.HoraEntrada, A.HoraSalida) + SPH.Salario * DATEDIFF(HOUR,TJ.HoraFin,A.HoraSalida) * 1.5 
ELSE SPH.Salario * DATEDIFF(HOUR,A.HoraEntrada, A.HoraSalida) END AS SalarioDeLaSemana
FROM Asistencia A
INNER JOIN Jornada J ON J.Id = A.IdJornada
INNER JOIN Empleado E ON E.Id = J.IdEmpleado
INNER JOIN Puesto P ON P.Id = E.IdPuesto
INNER JOIN TipoJornada TJ ON TJ.Id = J.IdTipoJornada
INNER JOIN SalarioPorHora SPH ON SPH.IdPuesto = P.Id and SPH.IdTipoJornada = TJ.Id
GROUP BY E.Nombre, P.Puesto, TJ.Nombre, A.HoraEntrada, A.HoraSalida, SPH.Salario, TJ.HoraFin

Hora Pausa: 9:10 a.m
Hora Reanudación: 10:50 a.m

Actividades:

- Se calcula el horario total a la semana por empleado, ya se suman tanto las horas ordinarias como las extraordinarias.
- Se decide que se tiene que agregar la tabla mes para identificar las planillas mensuales, también se simplifica el stored porcedure para agregar semanas, se piensa en crear un trigger que inicialice la primer planilla mensual y semanal de un usuario al ser contratado.

Hora Pausa: 12:51 p.m
Hora Reanudación: 3:27 p.m

Actividades: 

- Se busca en internet una solución para obtener el ultimo viernes de cada mes y se encuentran 2 soluciones: Una se encontró en un blog donde hay una una función escalar que utiliza los campos vacíos de la tabla master..spt_values para guardar los dias del año y luego en una condición where determina con DATENAME() si es viernes o cualquier día que se desee. Finalmente se agrupan por mes. La segunda solución era crear una tabla calendario y hacer un proceso similar, teniendo una tabla de números auxiliar. Al final se tomó la primera solución porque es más concisa.

- Se crea el sp para agregar meses

- Se crea un trigger para otorgar una planilla mensual y una planilla semanal cuando se contrata a un empleado. Se iniciativa con salarios en 0.

- Se crea una funcion para obtener el id de la semana para la planilla semanal

Hora Pausa: 7:00 p.m
Hora Reanudación: 11:16 p.m

Actividades: 

- Se continua con el desarrollo del pago de los usuarios.
- Se termina la inserción del pago en planilla semanal

Hora Fin: 11:47 p.m

Horas Totales: 7:33 h


Avance sobre el proyecto

Hora Inicio: 12:19 p.m

Pausa: 1:02 p.m
Reanuda: 1:19 p.m

Responsables: Austin Hakanson

Actividades:

- Se hace el sp para agregar nuevas jornadas para los empleados
- Se corrige el sp para agregar las semanas
- Se creo el tipo de variable tabla TipoJornada

Hora Pausa: 2:20 p.m
Hora Reanuda: 4:12 p.m

Actividades:

- Se insertan los movimientos de planilla para las deducciones que se había olvidado agregar.
- Se cambia el diseño de herencia de tipo de deducciones. Se agrega un foreign key en las tablas hijas que referencias a la tabla padre.

Hora Fin: 4:42 p.m

Horas Totales: 2:13 h



sábado, 23 de noviembre de 2019

Trabajo sobre la simulación

Responsables: Austin Hakanson

Hora Inicio: 10:38 p.m
Pausa: 12:04 p.m
Reanudacion: 12:37 p.m
Actividades:
- Se crean las clases tipo tabla Deducciones y Asistencias
- Se termino  el sp para insertar los empleados y asignarles una jornada
- Se agrega el sp para insertar las deducciones de un empleado
- Se inicia el sp para insertar los nuevos tipos de jornada para cada empleado.
- Se llaman los sp anteriores durante la simulación, pasando un xml como parámetro para hacer las inserciones de forma masiva. Se aplican las buenas practicas (begin try, transacción, errores negativos, nomenclatura ordenada).
- Se hicieron cambios sobre el modelo, esta es la imagen del diagrama más actual:



Hora Fin: 3:27 a.m

Total de horas: 5,4 h (Efectivas estimadas 3h)
326 min


viernes, 22 de noviembre de 2019

Trabajo sobre la simulacion

Hora Inicio: 5:03 p.m

Responsables: Austin Hakanson

Actividades:

- Hubo dificultades para entender como hacer la agregación de jornadas para un empleado, pero revisando modelos vistos anteriormente en el curso y repasando la materia se logro avanzar.

- Se crea un nuevo tipo tabla para pasar por parámetro a un stored procedure una tabla de datos. https://codingsight.com/passing-data-table-as-parameter-to-stored-procedures/



Hora Fin: 7:43 p.m (Horas efectivas: 1:30 h)

Segunda reunión de trabajo (ACTUALIZAR)

Hora de Inicio: 12:00 p.m

Responsables: Austin Hakanson y Antony Artavia

Actividades

- Se agregaron estatutos SQL para insertar los SalarioXHora y las Deducciones en el stored procedure SP_CargarDatos
- Se creo el stored procedure para agregar semanas durante la simulación
- Se inicio el stored procedure para agregar empleados.
- Se realizó todo un análisis de cómo se debía hacer el proceso de simulación lo cual llevó a varios cambios en el modelo de la base de datos, de modo que se realizaran correctamente los stored procedure necesarios. Por ejemplo, inicialmente se tenían foreign keys a de jornada, aguinaldo y asistencia en la tabla de empleado. Sin embargo, luego se pensó que era mejor que el id de empleado se pusiera como un FK en las tablas mencionadas puesto a que para crear una jornada o registrar una asistencia se necesita primero tener creado al empleado. Los cambios efectuados se ven reflejados en la nueva versión del modelo:


- Se revisó el modelo físico hasta el momento.

Hora Final: 2:40 p.m

Horas Totales: 2:40 h