Entrada 7: Fin de las correciones... ojala

 Bitácora de Sesión

Fecha: 02/06/2026

Inicio: [13:00] | Fin: [15:00] || Total: [3 horas]

Presente: Matías Benavides Sandoval

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

¿QUÉ HICIMOS HOY?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Se aclararon dudas del modelo: Empleado.idUsuario 1:1, PlanillaSemanal con 3 columnas de horas (Ordinarias/ExtraNormal/ExtraDoble), Comprobante.Tipo sin definir, Mes.NumJueves 4-5, TipoDeduccion.Valor siempre REAL, DeduccionXMes.MontoTotal precalculado al cierre, y el manejo de Feriado/extras dobles aún no lo había hecho.

Se reescribió SQL/SCRIPTS/Tablas.sql en formato SSMS con las 20 tablas.

Se validó todo el script contra localhost\SQLEXPRESS: 20 tablas, 22 FKs, trigger dispara correctamente con un INSERT de prueba (1 obligatoria → 1 fila DeduccionEmpleado; 2 obligatorias → 2 filas; EsObligatoria=0 ignorada).

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

PROBLEMAS DETECTADOS Y CÓMO SE RESOLVIERON

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Problema: el trigger anterior estaba pensado para una jerarquía de 5 tablas de deducciones (DeduccionXLEy, DeduccionXPorcentaje, DeduccionXMontoFijo, etc.).

Causa: el modelo unifica todas las deducciones en una sola TipoDeduccion con flags EsObligatoria/EsPorcentual, y en una sola DeduccionEmpleado.

Solución: se reescribió el trigger para que haga cross-join de INSERT con TipoDeduccion WHERE EsObligatoria=1, copiando td.Valor a DeduccionEmpleado.MontoFijo (sea % o monto fijo, el SP decide luego cómo aplicarlo).

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

DUDAS Y DIVERGENCIAS DE CRITERIO

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Sigue pendiente decidir el comportamiento del SP de procesamiento de asistencia cuando una MarcaAsistencia no tiene un HorarioJornada asignado para esa semana: ¿se trata como fuera de jornada (todo el tiempo es extra), se rechaza, o se registra sin generar MovHoras?.

Sigue pendiente definir la estructura final del XML de carga de catálogos y del XML de operación. sp_CargarCatalogosXML sigue como scaffold en SQL/SCRIPTS/CargarDatosXML.sql.

Sigue pendiente el mecanismo de generación del PDF del Comprobante: la columna PlanillaSemanal.Comprobante es VARBINARY(MAX) NULL, pero ningún SP la llena todavía. Decidir si se genera desde SQL Server, desde el backend.

Sigue abierta la decisión de cómo distinguir en la UI si una MarcaAsistencia cayó en domingo o feriado, ya que el PDF pide mostrar los movimientos por día pero no cómo se etiquetan los días especiales.

Se confirmó que el modelo de 20 tablas es estable y no debería requerir más cambios estructurales durante el resto del proyecto: las reglas de horas (ordinarias, extras 1.5x, extras dobles 2x en domingo/feriado), la regla "una asistencia hasta 3 movimientos", semana viernes→jueves, deducciones porcentuales/fijas, asignación automática de obligatorias y trazabilidad completa.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

AVANCE DEL CÓDIGO

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

USE [PlanillaDB]
GO
/****** Object:  Table [dbo].[BitacoraEvento]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[BitacoraEvento](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [idTipoEvento] [int] NOT NULL,
    [idUsuario] [int] NOT NULL,
    [PostTime] [datetime] NOT NULL,
    [IpPostIn] [varchar](64) NOT NULL,
    [Descripcion] [nvarchar](512) NOT NULL,
CONSTRAINT [PK_BitacoraEvento] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[DBError]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[DBError](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [UserName] [nvarchar](64) NOT NULL,
    [Number] [int] NOT NULL,
    [State] [int] NOT NULL,
    [Severity] [int] NOT NULL,
    [Line] [int] NOT NULL,
    [Procedure] [nvarchar](128) NOT NULL,
    [Message] [nvarchar](512) NOT NULL,
    [DateTime] [datetime] NOT NULL,
CONSTRAINT [PK_DBError] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[DeduccionEmpleado]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[DeduccionEmpleado](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [idEmpleado] [int] NOT NULL,
    [idTipoDeduccion] [int] NOT NULL,
    [MontoFijo] [decimal](10, 2) NOT NULL,
    [FechaInicio] [date] NOT NULL,
    [FechaFin] [date] NOT NULL,
CONSTRAINT [PK_DeduccionEmpleado] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[DeduccionXMes]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[DeduccionXMes](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [idPlanillaMensual] [int] NOT NULL,
    [idTipoDeduccion] [int] NOT NULL,
    [MontoTotal] [decimal](10, 2) NOT NULL,
CONSTRAINT [PK_DeduccionXMes] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Empleado]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Empleado](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [idPuesto] [int] NOT NULL,
    [idUsuario] [int] NOT NULL,
    [ValorDocumento] [varchar](32) NOT NULL,
    [Nombre] [varchar](128) NOT NULL,
    [CuentaBancaria] [varchar](32) NOT NULL,
    [FechaContratacion] [date] NOT NULL,
    [Activo] [bit] NOT NULL,
CONSTRAINT [PK_Empleado] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Feriado]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Feriado](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Nombre] [varchar](128) NOT NULL,
    [Fecha] [date] NOT NULL,
CONSTRAINT [PK_Feriado] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[HorarioJornada]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[HorarioJornada](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [idEmpleado] [int] NOT NULL,
    [idSemana] [int] NOT NULL,
    [idTipoJornada] [int] NOT NULL,
CONSTRAINT [PK_HorarioJornada] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[MarcaAsistencia]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MarcaAsistencia](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [idEmpleado] [int] NOT NULL,
    [Fecha] [date] NOT NULL,
    [HoraEntrada] [datetime] NOT NULL,
    [HoraSalida] [datetime] NOT NULL,
CONSTRAINT [PK_MarcaAsistencia] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Mes]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Mes](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [FechaInicio] [date] NOT NULL,
    [FechaFin] [date] NOT NULL,
    [NumJueves] [tinyint] NOT NULL,
CONSTRAINT [PK_Mes] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[MovHoras]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MovHoras](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [QHoras] [int] NOT NULL,
    [idAsistencia] [int] NOT NULL,
    [idTipoMov] [int] NOT NULL,
CONSTRAINT [PK_MovHoras] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[MovPlanilla]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MovPlanilla](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [idPlanillaSemanal] [int] NOT NULL,
    [idTipoMovimiento] [int] NOT NULL,
    [Monto] [decimal](10, 2) NOT NULL,
    [NuevoSaldo] [decimal](10, 2) NOT NULL,
CONSTRAINT [PK_MovPlanilla] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[PlanillaMensual]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[PlanillaMensual](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [idEmpleado] [int] NOT NULL,
    [idMes] [int] NOT NULL,
    [SalarioBruto] [decimal](10, 2) NOT NULL,
    [TotalDeducciones] [decimal](10, 2) NOT NULL,
    [SalarioNeto] [decimal](10, 2) NOT NULL,
CONSTRAINT [PK_PlanillaMensual] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[PlanillaSemanal]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[PlanillaSemanal](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [idEmpleado] [int] NOT NULL,
    [idSemana] [int] NOT NULL,
    [SalarioBruto] [decimal](10, 2) NOT NULL,
    [TotalDeducciones] [decimal](10, 2) NOT NULL,
    [SalarioNeto] [decimal](10, 2) NOT NULL,
    [Comprobante] [varbinary](max) NULL,
CONSTRAINT [PK_PlanillaSemanal] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Puesto]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Puesto](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Nombre] [varchar](128) NOT NULL,
    [SalarioXHora] [decimal](10, 2) NOT NULL,
CONSTRAINT [PK_Puesto] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Semana]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Semana](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [idMes] [int] NOT NULL,
    [FechaInicio] [date] NOT NULL,
    [FechaFin] [date] NOT NULL,
CONSTRAINT [PK_Semana] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[TipoDeduccion]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TipoDeduccion](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Nombre] [varchar](128) NOT NULL,
    [EsObligatoria] [bit] NOT NULL,
    [EsPorcentual] [bit] NOT NULL,
    [Valor] [decimal](8, 4) NOT NULL,
    [idTipoMovimiento] [int] NOT NULL,
CONSTRAINT [PK_TipoDeduccion] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[TipoEvento]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TipoEvento](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Nombre] [varchar](64) NOT NULL,
CONSTRAINT [PK_TipoEvento] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[TipoJornada]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TipoJornada](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Nombre] [varchar](64) NOT NULL,
    [HoraInicio] [time](0) NOT NULL,
    [HoraFin] [time](0) NOT NULL,
CONSTRAINT [PK_TipoJornada] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[TipoMovimiento]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TipoMovimiento](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Nombre] [varchar](64) NOT NULL,
    [Accion] [char](1) NOT NULL,
CONSTRAINT [PK_TipoMovimiento] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Usuario]    Script Date: 6/2/2026 12:00:00 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Usuario](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [Username] [varchar](64) NOT NULL,
    [PasswordHash] [varchar](64) NOT NULL,
    [Tipo] [varchar](2) NOT NULL,
CONSTRAINT [PK_Usuario] PRIMARY KEY CLUSTERED
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[BitacoraEvento]  WITH CHECK ADD  CONSTRAINT [FK_BitacoraEvento_TipoEvento] FOREIGN KEY([idTipoEvento])
REFERENCES [dbo].[TipoEvento] ([id])
GO
ALTER TABLE [dbo].[BitacoraEvento] CHECK CONSTRAINT [FK_BitacoraEvento_TipoEvento]
GO
ALTER TABLE [dbo].[BitacoraEvento]  WITH CHECK ADD  CONSTRAINT [FK_BitacoraEvento_Usuario] FOREIGN KEY([idUsuario])
REFERENCES [dbo].[Usuario] ([id])
GO
ALTER TABLE [dbo].[BitacoraEvento] CHECK CONSTRAINT [FK_BitacoraEvento_Usuario]
GO
ALTER TABLE [dbo].[DeduccionEmpleado]  WITH CHECK ADD  CONSTRAINT [FK_DeduccionEmpleado_Empleado] FOREIGN KEY([idEmpleado])
REFERENCES [dbo].[Empleado] ([id])
GO
ALTER TABLE [dbo].[DeduccionEmpleado] CHECK CONSTRAINT [FK_DeduccionEmpleado_Empleado]
GO
ALTER TABLE [dbo].[DeduccionEmpleado]  WITH CHECK ADD  CONSTRAINT [FK_DeduccionEmpleado_TipoDeduccion] FOREIGN KEY([idTipoDeduccion])
REFERENCES [dbo].[TipoDeduccion] ([id])
GO
ALTER TABLE [dbo].[DeduccionEmpleado] CHECK CONSTRAINT [FK_DeduccionEmpleado_TipoDeduccion]
GO
ALTER TABLE [dbo].[DeduccionXMes]  WITH CHECK ADD  CONSTRAINT [FK_DeduccionXMes_PlanillaMensual] FOREIGN KEY([idPlanillaMensual])
REFERENCES [dbo].[PlanillaMensual] ([id])
GO
ALTER TABLE [dbo].[DeduccionXMes] CHECK CONSTRAINT [FK_DeduccionXMes_PlanillaMensual]
GO
ALTER TABLE [dbo].[DeduccionXMes]  WITH CHECK ADD  CONSTRAINT [FK_DeduccionXMes_TipoDeduccion] FOREIGN KEY([idTipoDeduccion])
REFERENCES [dbo].[TipoDeduccion] ([id])
GO
ALTER TABLE [dbo].[DeduccionXMes] CHECK CONSTRAINT [FK_DeduccionXMes_TipoDeduccion]
GO
ALTER TABLE [dbo].[Empleado]  WITH CHECK ADD  CONSTRAINT [FK_Empleado_Puesto] FOREIGN KEY([idPuesto])
REFERENCES [dbo].[Puesto] ([id])
GO
ALTER TABLE [dbo].[Empleado] CHECK CONSTRAINT [FK_Empleado_Puesto]
GO
ALTER TABLE [dbo].[Empleado]  WITH CHECK ADD  CONSTRAINT [FK_Empleado_Usuario] FOREIGN KEY([idUsuario])
REFERENCES [dbo].[Usuario] ([id])
GO
ALTER TABLE [dbo].[Empleado] CHECK CONSTRAINT [FK_Empleado_Usuario]
GO
ALTER TABLE [dbo].[HorarioJornada]  WITH CHECK ADD  CONSTRAINT [FK_HorarioJornada_Empleado] FOREIGN KEY([idEmpleado])
REFERENCES [dbo].[Empleado] ([id])
GO
ALTER TABLE [dbo].[HorarioJornada] CHECK CONSTRAINT [FK_HorarioJornada_Empleado]
GO
ALTER TABLE [dbo].[HorarioJornada]  WITH CHECK ADD  CONSTRAINT [FK_HorarioJornada_Semana] FOREIGN KEY([idSemana])
REFERENCES [dbo].[Semana] ([id])
GO
ALTER TABLE [dbo].[HorarioJornada] CHECK CONSTRAINT [FK_HorarioJornada_Semana]
GO
ALTER TABLE [dbo].[HorarioJornada]  WITH CHECK ADD  CONSTRAINT [FK_HorarioJornada_TipoJornada] FOREIGN KEY([idTipoJornada])
REFERENCES [dbo].[TipoJornada] ([id])
GO
ALTER TABLE [dbo].[HorarioJornada] CHECK CONSTRAINT [FK_HorarioJornada_TipoJornada]
GO
ALTER TABLE [dbo].[MarcaAsistencia]  WITH CHECK ADD  CONSTRAINT [FK_MarcaAsistencia_Empleado] FOREIGN KEY([idEmpleado])
REFERENCES [dbo].[Empleado] ([id])
GO
ALTER TABLE [dbo].[MarcaAsistencia] CHECK CONSTRAINT [FK_MarcaAsistencia_Empleado]
GO
ALTER TABLE [dbo].[MovHoras]  WITH CHECK ADD  CONSTRAINT [FK_MovHoras_MarcaAsistencia] FOREIGN KEY([idAsistencia])
REFERENCES [dbo].[MarcaAsistencia] ([id])
GO
ALTER TABLE [dbo].[MovHoras] CHECK CONSTRAINT [FK_MovHoras_MarcaAsistencia]
GO
ALTER TABLE [dbo].[MovHoras]  WITH CHECK ADD  CONSTRAINT [FK_MovHoras_TipoMovimiento] FOREIGN KEY([idTipoMov])
REFERENCES [dbo].[TipoMovimiento] ([id])
GO
ALTER TABLE [dbo].[MovHoras] CHECK CONSTRAINT [FK_MovHoras_TipoMovimiento]
GO
ALTER TABLE [dbo].[MovPlanilla]  WITH CHECK ADD  CONSTRAINT [FK_MovPlanilla_PlanillaSemanal] FOREIGN KEY([idPlanillaSemanal])
REFERENCES [dbo].[PlanillaSemanal] ([id])
GO
ALTER TABLE [dbo].[MovPlanilla] CHECK CONSTRAINT [FK_MovPlanilla_PlanillaSemanal]
GO
ALTER TABLE [dbo].[MovPlanilla]  WITH CHECK ADD  CONSTRAINT [FK_MovPlanilla_TipoMovimiento] FOREIGN KEY([idTipoMovimiento])
REFERENCES [dbo].[TipoMovimiento] ([id])
GO
ALTER TABLE [dbo].[MovPlanilla] CHECK CONSTRAINT [FK_MovPlanilla_TipoMovimiento]
GO
ALTER TABLE [dbo].[PlanillaMensual]  WITH CHECK ADD  CONSTRAINT [FK_PlanillaMensual_Empleado] FOREIGN KEY([idEmpleado])
REFERENCES [dbo].[Empleado] ([id])
GO
ALTER TABLE [dbo].[PlanillaMensual] CHECK CONSTRAINT [FK_PlanillaMensual_Empleado]
GO
ALTER TABLE [dbo].[PlanillaMensual]  WITH CHECK ADD  CONSTRAINT [FK_PlanillaMensual_Mes] FOREIGN KEY([idMes])
REFERENCES [dbo].[Mes] ([id])
GO
ALTER TABLE [dbo].[PlanillaMensual] CHECK CONSTRAINT [FK_PlanillaMensual_Mes]
GO
ALTER TABLE [dbo].[PlanillaSemanal]  WITH CHECK ADD  CONSTRAINT [FK_PlanillaSemanal_Empleado] FOREIGN KEY([idEmpleado])
REFERENCES [dbo].[Empleado] ([id])
GO
ALTER TABLE [dbo].[PlanillaSemanal] CHECK CONSTRAINT [FK_PlanillaSemanal_Empleado]
GO
ALTER TABLE [dbo].[PlanillaSemanal]  WITH CHECK ADD  CONSTRAINT [FK_PlanillaSemanal_Semana] FOREIGN KEY([idSemana])
REFERENCES [dbo].[Semana] ([id])
GO
ALTER TABLE [dbo].[PlanillaSemanal] CHECK CONSTRAINT [FK_PlanillaSemanal_Semana]
GO
ALTER TABLE [dbo].[Semana]  WITH CHECK ADD  CONSTRAINT [FK_Semana_Mes] FOREIGN KEY([idMes])
REFERENCES [dbo].[Mes] ([id])
GO
ALTER TABLE [dbo].[Semana] CHECK CONSTRAINT [FK_Semana_Mes]
GO
ALTER TABLE [dbo].[TipoDeduccion]  WITH CHECK ADD  CONSTRAINT [FK_TipoDeduccion_TipoMovimiento] FOREIGN KEY([idTipoMovimiento])
REFERENCES [dbo].[TipoMovimiento] ([id])
GO
ALTER TABLE [dbo].[TipoDeduccion] CHECK CONSTRAINT [FK_TipoDeduccion_TipoMovimiento]
GO


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

MORALEJAS / BUENAS PRÁCTICAS

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Cuando un compañero ya tiene un modelo en curso, adoptarlo como guía y justificar cada desviación contra el spec (con página y sección citadas) es más rápido y más defendible que rehacerlo desde cero..

Mantener la bitácora de sesión al día (en vez de escribirla toda al final) ayuda a no perder el rastro de problemas y decisiones; en esta sesión se retrasó la actualización hasta el final por instrucción del usuario, pero en general conviene hacerlo al cerrar cada bloque de trabajo,

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

PRÓXIMA SESIÓN: ¿QUÉ SIGUE?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Definir el XML de carga de catálogos y reemplazar el scaffold de sp_CargarCatalogosXML con la implementación real, idempotente con WHERE NOT EXISTS o MERGE.

Decidir el comportamiento de MarcaAsistencia sin HorarioJornada y documentarlo en AGENTS.md §7 antes de implementar sp_ProcesarAsistencia.

Implementar los SPs en el orden de AGENTS.md §5, empezando por sp_Login/sp_Logout y sp_GetError (este último con dependencia de DBError y Error, revisar si la tabla Error sigue siendo necesaria en el modelo final).

Definir el mecanismo de generación del PDF del Comprobante y el SP que lo asigna a PlanillaSemanal.Comprobante (VARBINARY MAX NULL).

(Pendiente desde la sesión anterior) Clonar los SPs base desde Tarea2-BD y adaptarlos a PlanillaDB: sp_GetError, sp_Login, sp_Logout, sp_InsertarEmpleado, sp_GetEmpleados, sp_GetEmpleadoById, sp_UpdateEmpleado, sp_DeleteEmpleado.

Comentarios