private void CuOtAsExtrasLiquidAcIon_Attach(CuOtAsExtrasLiquidAcIon entity)
		{
			entity.ExtrasLiquidAcIon = this;
		}
		private void CuOtAsExtrasLiquidAcIon_Detach(CuOtAsExtrasLiquidAcIon entity)
		{
			entity.ExtrasLiquidAcIon = null;
		}
        // 2010-05-12 - JG: Esta es la primer version de los extrasliquidacion, cuando se usaba una sola tabla.
        //public int agregarExtraLiquidacionEmpleado(int idEmpleado, DateTime fecha, string descripcion, bool signoPositivo, float valor, int cantidadCuotas)
        //{
        //    ExtrasLiquidAcIonEmPleadO exliq;
        //    Table<ExtrasLiquidAcIonEmPleadO> tabla;
        //    try
        //    {
        //        tabla = database.GetTable<ExtrasLiquidAcIonEmPleadO>();

        //        int cuotaActual = 1;
        //        int idExtraARetornar = -1;
        //        DateTime mesCorrespondiente = fecha;

        //        uint proximoIdExtraEmpleado;
              
        //        List<uint> ListExtras = (from reg in tabla
        //                   where reg.IDEmpleado == idEmpleado
        //                   select reg.IDExtrasLiquidacionEmpleado).ToList<uint>();

        //        uint extras=0;
        //        if (ListExtras.Count > 0)
        //            extras = ListExtras.Max();
        //        proximoIdExtraEmpleado = (uint)extras + 1;
                
        //        // Se crea un registro nuevo por cada cuota, aumentando la cuota y el mes
        //        while (cuotaActual <= cantidadCuotas)
        //        {
        //            exliq = new ExtrasLiquidAcIonEmPleadO();

        //            exliq.IDEmpleado = (uint) idEmpleado;
        //            exliq.IDExtrasLiquidacionEmpleado = proximoIdExtraEmpleado;
        //            exliq.Fecha = mesCorrespondiente;
        //            //if (signoPositivo)
        //            //    exliq.Signo = 1;
        //            //else
        //            //    exliq.Signo = -1;
        //            exliq.Valor = valor/cantidadCuotas;
        //            //exliq.CantidadCuotas = (sbyte)cantidadCuotas;
        //            exliq.Descripcion = descripcion;
        //            //exliq.CuotaActual = (sbyte) cuotaActual;
                
        //            tabla.InsertOnSubmit(exliq);
                    
        //            if (cuotaActual == 1)  // Si es la primer cuota, todo el idextra nuevo para retornarlo
        //                idExtraARetornar = (int) exliq.IDExtrasLiquidacionEmpleado;
        //            cuotaActual++; // Aumento en uno la cuota actual
        //            mesCorrespondiente = mesCorrespondiente.AddMonths(1); // Aumento en 1 el mes correspondiente de la cuota.
        //        }

        //        database.SubmitChanges(System.Data.Linq.ConflictMode.FailOnFirstConflict);
        //        if (idExtraARetornar != -1)
        //        {
                   
        //            return idExtraARetornar;
                    
        //        }
        //        else
        //            throw new Exception("Error al crear los Extras para el empleado.");


        //    }
        //    catch (Exception ex)
        //    {
        //        throw ex;
        //    }
        //}

        public int agregarExtraLiquidacionEmpleado(int idEmpleado, DateTime fecha, string descripcion, bool signoPositivo, float valor, int cantidadCuotas, string userName, int idTipoExtraLiquidacion, TimeSpan cantHs_LlevaHs, decimal porcentaje)
        {
            Table<ExtrasLiquidAcIon> tablaExtrasLiquidacion =  null;
            Table<CuOtAsExtrasLiquidAcIon> tablaCuotas;
            int idExtraARetornar = -1;
            CuOtAsExtrasLiquidAcIon cuota;
            ExtrasLiquidAcIon el = null;
            int estado = 0;
            try
            {
                int idUsuario = (from user in database.UsUarIoS
                                 where user.UserName == userName
                                 select user.IDUsuario).Single();

                tablaExtrasLiquidacion = database.GetTable<ExtrasLiquidAcIon>();
                tablaCuotas = database.GetTable<CuOtAsExtrasLiquidAcIon>();
                DateTime mesCorrespondiente = fecha;

                el = new ExtrasLiquidAcIon();
                el.IDEmpleado = (uint) idEmpleado;
                el.Descripcion = descripcion;
                el.Signo = (signoPositivo ? (sbyte)1 : (sbyte)0);
                el.CuotaActual = 1;
                el.CantidadCuotas = (byte)cantidadCuotas;
                el.IDUsuario = idUsuario;
                el.IDTipoExtraLiquidacion = (byte)idTipoExtraLiquidacion;
                el.CantHsTipoExtraLlevaHsEnSegs = (int)cantHs_LlevaHs.TotalSeconds;
                el.Porcentaje = porcentaje;

                tablaExtrasLiquidacion.InsertOnSubmit(el);
                 
                database.SubmitChanges(System.Data.Linq.ConflictMode.FailOnFirstConflict);

                idExtraARetornar = (int)el.IDExtraLiquidacion;
                if (idExtraARetornar == -1)
                {
                    throw new Exception("Error al crear los Extras para el empleado.");
                }

                // Primer estado, al confirmar el insert del extra
                estado = 1;
                
                EntitySet<CuOtAsExtrasLiquidAcIon> set = new EntitySet<CuOtAsExtrasLiquidAcIon>();
                int numCuota = 1;
                while (numCuota <= cantidadCuotas)
                {
                    cuota = new CuOtAsExtrasLiquidAcIon();
                    cuota.Fecha = mesCorrespondiente;
                    cuota.Liquidado = 0;
                    cuota.NumeroCuota = (sbyte) numCuota;
                    numCuota++;
                    cuota.ValorCuota = valor / cantidadCuotas;
                    cuota.IDExtraLiquidacion = el.IDExtraLiquidacion;
                    cuota.ExtrasLiquidAcIon = el;
                  
                    set.Add(cuota);
                    mesCorrespondiente = mesCorrespondiente.AddMonths(1);
                }

                el.CuOtAsExtrasLiquidAcIon = set;
                
                database.SubmitChanges(System.Data.Linq.ConflictMode.FailOnFirstConflict);
                

                return idExtraARetornar;

            }
            catch (Exception ex)
            {
                if (estado == 1)
                {
                    tablaExtrasLiquidacion.DeleteOnSubmit(el);
                    database.SubmitChanges();

                }
                WriteErrorLog(ex);
                throw new Exception("Error al ingresar los extras. " + ex.Message); 
            }
            
        }