예제 #1
0
        ///// <summary>
        ///// Inserta un UsuarioProyectoSubNodo
        ///// </summary>
        //internal int Insert(Models.UsuarioProyectoSubNodo oUsuarioProyectoSubNodo)
        //{
        //    try
        //    {
        //        SqlParameter[] dbparams = new SqlParameter[8] {
        //            Param(enumDBFields.t305_idproyectosubnodo, oUsuarioProyectoSubNodo.t305_idproyectosubnodo),
        //            Param(enumDBFields.t314_idusuario, oUsuarioProyectoSubNodo.t314_idusuario),
        //            Param(enumDBFields.t330_costecon, oUsuarioProyectoSubNodo.t330_costecon),
        //            Param(enumDBFields.t330_costerep, oUsuarioProyectoSubNodo.t330_costerep),
        //            Param(enumDBFields.t330_deriva, oUsuarioProyectoSubNodo.t330_deriva),
        //            Param(enumDBFields.t330_falta, oUsuarioProyectoSubNodo.t330_falta),
        //            Param(enumDBFields.t330_fbaja, oUsuarioProyectoSubNodo.t330_fbaja),
        //            Param(enumDBFields.t333_idperfilproy, oUsuarioProyectoSubNodo.t333_idperfilproy)
        //        };

        //        return (int)cDblib.Execute("_UsuarioProyectoSubNodo_INS", dbparams);
        //    }
        //    catch (Exception ex)
        //    {
        //        throw ex;
        //    }
        //}

        /// <summary>
        /// Obtiene un UsuarioProyectoSubNodo a partir del id
        /// </summary>
        internal Models.UsuarioProyectoSubNodo Select(int t305_idproyectosubnodo, int t314_idusuario)
        {
            Models.UsuarioProyectoSubNodo oUsuarioProyectoSubNodo = null;
            IDataReader dr = null;

            try
            {
                SqlParameter[] dbparams = new SqlParameter[2] {
                    Param(enumDBFields.t305_idproyectosubnodo, t305_idproyectosubnodo),
                    Param(enumDBFields.t314_idusuario, t314_idusuario)
                };

                dr = cDblib.DataReader("SUP_USUARIOPROYECTOSUBNODO_S", dbparams);
                if (dr.Read())
                {
                    oUsuarioProyectoSubNodo = new Models.UsuarioProyectoSubNodo();
                    oUsuarioProyectoSubNodo.t305_idproyectosubnodo = t305_idproyectosubnodo;
                    oUsuarioProyectoSubNodo.t314_idusuario         = t314_idusuario;
                    oUsuarioProyectoSubNodo.t330_costecon          = Convert.ToDecimal(dr["t330_costecon"]);
                    oUsuarioProyectoSubNodo.t330_costerep          = Convert.ToDecimal(dr["t330_costerep"]);
                    oUsuarioProyectoSubNodo.t330_deriva            = Convert.ToBoolean(dr["t330_deriva"]);
                    oUsuarioProyectoSubNodo.t330_falta             = Convert.ToDateTime(dr["t330_falta"]);
                    if (!Convert.IsDBNull(dr["t330_fbaja"]))
                    {
                        oUsuarioProyectoSubNodo.t330_fbaja = Convert.ToDateTime(dr["t330_fbaja"]);
                    }
                    if (!Convert.IsDBNull(dr["t333_idperfilproy"]))
                    {
                        oUsuarioProyectoSubNodo.t333_idperfilproy = Convert.ToInt32(dr["t333_idperfilproy"]);
                    }
                }
                return(oUsuarioProyectoSubNodo);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    if (!dr.IsClosed)
                    {
                        dr.Close();
                    }
                    dr.Dispose();
                }
            }
        }
예제 #2
0
        ///// <summary>
        ///// Actualiza un UsuarioProyectoSubNodo a partir del id
        ///// </summary>
        //internal int Update(Models.UsuarioProyectoSubNodo oUsuarioProyectoSubNodo)
        //{
        //    try
        //    {
        //        SqlParameter[] dbparams = new SqlParameter[8] {
        //            Param(enumDBFields.t305_idproyectosubnodo, oUsuarioProyectoSubNodo.t305_idproyectosubnodo),
        //            Param(enumDBFields.t314_idusuario, oUsuarioProyectoSubNodo.t314_idusuario),
        //            Param(enumDBFields.t330_costecon, oUsuarioProyectoSubNodo.t330_costecon),
        //            Param(enumDBFields.t330_costerep, oUsuarioProyectoSubNodo.t330_costerep),
        //            Param(enumDBFields.t330_deriva, oUsuarioProyectoSubNodo.t330_deriva),
        //            Param(enumDBFields.t330_falta, oUsuarioProyectoSubNodo.t330_falta),
        //            Param(enumDBFields.t330_fbaja, oUsuarioProyectoSubNodo.t330_fbaja),
        //            Param(enumDBFields.t333_idperfilproy, oUsuarioProyectoSubNodo.t333_idperfilproy)
        //        };

        //        return (int)cDblib.Execute("_UsuarioProyectoSubNodo_UPD", dbparams);
        //    }
        //    catch (Exception ex)
        //    {
        //        throw ex;
        //    }
        //}

        ///// <summary>
        ///// Elimina un UsuarioProyectoSubNodo a partir del id
        ///// </summary>
        //internal int Delete()
        //{
        //    try
        //    {


        //        return (int)cDblib.Execute("_UsuarioProyectoSubNodo_DEL", dbparams);
        //    }
        //    catch (Exception ex)
        //    {
        //        throw ex;
        //    }
        //}

        /// <summary>
        /// Obtiene los proyectos y las fechas de alta y baja para un usuario
        /// </summary>
        internal List <Models.UsuarioProyectoSubNodo> CatalogoProyectosGasvi(int t314_idusuario)
        {
            Models.UsuarioProyectoSubNodo        oUsuarioProyectoSubNodo = null;
            List <Models.UsuarioProyectoSubNodo> lst = new List <Models.UsuarioProyectoSubNodo>();
            IDataReader dr = null;

            try
            {
                SqlParameter[] dbparams = new SqlParameter[1] {
                    Param(enumDBFields.t314_idusuario, t314_idusuario)
                };

                dr = cDblib.DataReader("GVT_GETFECHASUSUARIOPSN_CAT", dbparams);
                while (dr.Read())
                {
                    oUsuarioProyectoSubNodo = new Models.UsuarioProyectoSubNodo();
                    oUsuarioProyectoSubNodo.t305_idproyectosubnodo = Convert.ToInt32(dr["t305_idproyectosubnodo"]);
                    oUsuarioProyectoSubNodo.t330_falta             = Convert.ToDateTime(dr["t330_falta"]);
                    if (!Convert.IsDBNull(dr["t330_fbaja"]))
                    {
                        oUsuarioProyectoSubNodo.t330_fbaja = Convert.ToDateTime(dr["t330_fbaja"]);
                    }
                    lst.Add(oUsuarioProyectoSubNodo);
                }
                return(lst);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    if (!dr.IsClosed)
                    {
                        dr.Close();
                    }
                    dr.Dispose();
                }
            }
        }
예제 #3
0
        public Models.Usuario Grabar(int idCalendario, int idUser, int idUserEntrada, string sCodRed, int iUMC_IAP,
                                     string sNombreEmpleado, string sNombreEmpleadoEntrada,
                                     bool bJornadaReducida, double nHorasRed, DateTime?dDesdeRed, DateTime?dHastaRed,
                                     int nTarea, int nOpcion, DateTime dUDR, DateTime dDesde, DateTime dHasta,
                                     int nModo, bool bFestivos, bool bFinalizado, double nHoras, string obsImputacion,
                                     string obsTecnico, double nETE, DateTime?dFFE, bool bObligaest, int nPSN)
        {
            bool   bErrorControlado = false, bAvisadoCLE = false;
            string sMsg = "", sRes = "Grabación correcta.";
            //int iImputacionGrabada = 0;
            ArrayList aListCorreo    = new ArrayList();
            ArrayList aListCorreoCLE = new ArrayList();

            Hashtable htTareasSuperanCLE = new Hashtable();

            Guid methodOwnerID = new Guid("a0491cb0-f8b0-40bf-bf29-9073bd561995");

            OpenDbConn();

            if (cDblib.Transaction.ownerID.Equals(new Guid()))
            {
                cDblib.beginTransaction(methodOwnerID);
            }

            //BLL.Usuario bUsuario = new BLL.Usuario(cDblib);
            Models.Usuario cUsuario = new Models.Usuario();

            BLL.TareaPSP    bTareaPSP = new BLL.TareaPSP(cDblib);
            Models.TareaPSP oTarea    = new Models.TareaPSP();

            BLL.TareaIAPS    bTareaIAP = new BLL.TareaIAPS(cDblib);
            Models.TareaIAPS oTareaIAP = new Models.TareaIAPS();

            BLL.Calendario    bCalendario = new BLL.Calendario(cDblib);
            Models.Calendario oCal        = new Models.Calendario();

            BLL.DesgloseCalendario           bDesgloseCalendario = new BLL.DesgloseCalendario(cDblib);
            List <Models.DesgloseCalendario> lstDiasCal          = new List <Models.DesgloseCalendario>();

            BLL.UsuarioProyectoSubNodo    bUsuarioPSN = new BLL.UsuarioProyectoSubNodo(cDblib);
            Models.UsuarioProyectoSubNodo oUPSN       = new Models.UsuarioProyectoSubNodo();

            BLL.ConsumoIAP    bConsumoIAP = new BLL.ConsumoIAP(cDblib);
            Models.ConsumoIAP oConsumoIAP = new Models.ConsumoIAP();

            BLL.EstimacionIAP bEst = new BLL.EstimacionIAP(cDblib);

            try
            {
                cUsuario = ObtenerRecurso(sCodRed, idUser);
                oCal     = bCalendario.getCalendario(idCalendario, dDesde.Year);

                int nDifDias = IB.SUPER.Shared.Fechas.DateDiff("day", dDesde, dHasta);

                #region Sustitución, si procede, de los datos existentes, por lo que se elimina lo que hubiera imputado en el rango de fechas indicado.
                if (nModo == 1)
                {//Modo sustitucion -> Borra todas las imputaciones en el rango de fechas
                    BLL.ConsumoIAP bConsumo = new BLL.ConsumoIAP(cDblib);
                    bConsumo.DeleteRango(idUser, dDesde, dHasta);
                    //DAL.ConsumoIAP cConsumoIAP = new DAL.ConsumoIAP(cDblib);
                    //int result = cConsumoIAP.DeleteRango(idUser, dDesde, dHasta);
                }
                else
                {//Modo acumulación -> Borra todas las imputaciones a una tarea determinada en el rango de fechas
                    BLL.ConsumoIAP bConsumo = new BLL.ConsumoIAP(cDblib);
                    bConsumo.DeleteTareaRango(idUser, nTarea, dDesde, dHasta);
                    //DAL.ConsumoIAP cConsumoIAP = new DAL.ConsumoIAP(cDblib);
                    //int result = cConsumoIAP.DeleteTareaRango(idUser, nTarea, dDesde, dHasta);
                }
                #endregion

                #region Obtención de datos relacionados con la tarea
                oTarea = bTareaPSP.Select(nTarea);

                //Obtener los datos de la tarea a la que se va a imputar.
                oTareaIAP = bTareaIAP.Select(nTarea);

                //Obtención de las horas estándar y festivos del rango de fechas.
                //Calendario oCalendario = obtenerDatosHorarios(tr, dDesde, dHasta);
                lstDiasCal = bDesgloseCalendario.ObtenerHorasRango(idCalendario, dDesde, dHasta);

                //Obtener las fechas de inicio y final de la asociación del recurso al proyecto.
                //USUARIOPROYECTOSUBNODO oUPSN = USUARIOPROYECTOSUBNODO.Select(tr, nPSN, (int)Session["UsuarioActual"]);
                oUPSN = bUsuarioPSN.Select(nPSN, idUser);

                DateTime dAltaProy = oUPSN.t330_falta;
                //DateTime dBajaProy = (oUPSN.t330_fbaja.HasValue) ? oUPSN.t330_fbaja : null;
                DateTime?dBajaProy = null;
                if (oUPSN.t330_fbaja != null)
                {
                    dBajaProy = oUPSN.t330_fbaja;
                }

                if (dAltaProy == DateTime.Parse("01/01/1900"))
                {
                    //bErrorControlado = true;
                    //throw (new ValidationException("¡Denegado!<br />No existe fecha de alta en el proyecto."));
                    throw (new Exception("¡Denegado!<br />No existe fecha de alta en el proyecto."));
                    //sMsg += "\nNo existe fecha de alta en el proyecto.";
                }
                #endregion
                #region Control mes cerrado IAP
                if (IB.SUPER.Shared.Fechas.FechaAAnnomes(dDesde) <= iUMC_IAP)
                {
                    //bErrorControlado = true;
                    //throw (new ValidationException("¡Denegado!<br />La fecha de imputación (" + dDesde.ToShortDateString() + ") pertenece a un mes IAP cerrado. Último mes cerrado IAP (" + Fechas.AnnomesAFechaDescLarga((int)HttpContext.Current.Session["UMC_IAP"]) + ")."));
                    throw (new Exception("¡Denegado!<br />La fecha de imputación (" + dDesde.ToShortDateString() + ") pertenece a un mes IAP cerrado. Último mes cerrado IAP (" + IB.SUPER.Shared.Fechas.AnnomesAFechaDescLarga(iUMC_IAP) + ")."));
                }
                #endregion
                #region Control de fechas
                if ((dDesde < dAltaProy) || (dBajaProy != null && dHasta > dBajaProy))
                {
                    //bErrorControlado = true;
                    //throw (new ValidationException("¡Denegado!<br />El periodo de imputación seleccionado se encuentra en parte o totalmente fuera de su asignación al proyecto."));
                    throw (new Exception("¡Denegado!<br />El periodo de imputación seleccionado se encuentra en parte o totalmente fuera de su asignación al proyecto."));
                }
                if ((dDesde < oTarea.t332_fiv) || (oTarea.t332_ffv != null && dHasta > oTarea.t332_ffv))
                {
                    //bErrorControlado = true;
                    //throw (new ValidationException("¡Denegado!<br />El periodo de imputación seleccionado se encuentra en parte o totalmente fuera del periodo de vigencia la tarea."));
                    throw (new Exception("¡Denegado!<br />El periodo de imputación seleccionado se encuentra en parte o totalmente fuera del periodo de vigencia la tarea."));
                }
                #endregion

                #region Control de huecos
                //if (tipoImp != "1")
                //{//El control de huecos se hace desde cliente
                //    if ((bool)HttpContext.Current.Session["CONTROLHUECOS"])
                //    {
                //        ///Controlar si entre el último día imputado (f_ult_imputac) y el primer día de imputación hay días laborables.
                //        if (existenHuecos(oCal, dDesde))
                //        {
                //            //bErrorControlado = true;
                //            throw (new ValidationException("¡Denegado!<br />Se ha detectado que entre el último día reportado y la fecha inicio imputación existen huecos."));
                //            //sMsg += "\nSe ha detectado que entre el último día reportado y la fecha inicio imputación existen huecos.";
                //        }
                //    }
                //}
                #endregion

                #region Imputación de las horas indicadas en cada uno de los días del intervalo
                bool     bFestAux = false;
                DateTime dDiaAux;
                float    nHorasDia = 0, fHorasAcumuladas = (float)oTareaIAP.nConsumidoHoras;
                double   nJornadas        = 0;
                bool     ultimaImputacion = false;
                for (int i = 0; i <= nDifDias; i++)
                {
                    if (i == nDifDias)
                    {
                        ultimaImputacion = true;
                    }
                    bFestAux = false;
                    dDiaAux  = dDesde.AddDays(i);

                    #region Control día laborable y no festivo
                    foreach (Models.DesgloseCalendario oDia in lstDiasCal)
                    {
                        if (oDia.t067_dia == dDiaAux)
                        {
                            nHorasDia = oDia.t067_horas;
                            if (nOpcion == 1 || nOpcion == 2 || nHorasDia == 0)
                            {
                                nJornadas = 1;
                            }
                            else
                            {
                                nJornadas = nHoras / nHorasDia;
                            }
                            //Festivo
                            if (oDia.t067_festivo == 1)
                            {
                                bFestAux = true;
                                break;
                            }
                            //No laborable
                            switch (oDia.t067_dia.DayOfWeek)
                            {
                            case DayOfWeek.Monday:
                                if (oCal.t066_semlabL == 0)
                                {
                                    bFestAux = true;
                                }
                                break;

                            case DayOfWeek.Tuesday:
                                if (oCal.t066_semlabM == 0)
                                {
                                    bFestAux = true;
                                }
                                break;

                            case DayOfWeek.Wednesday:
                                if (oCal.t066_semlabX == 0)
                                {
                                    bFestAux = true;
                                }
                                break;

                            case DayOfWeek.Thursday:
                                if (oCal.t066_semlabJ == 0)
                                {
                                    bFestAux = true;
                                }
                                break;

                            case DayOfWeek.Friday:
                                if (oCal.t066_semlabV == 0)
                                {
                                    bFestAux = true;
                                }
                                break;

                            case DayOfWeek.Saturday:
                                if (oCal.t066_semlabS == 0)
                                {
                                    bFestAux = true;
                                }
                                break;

                            case DayOfWeek.Sunday:
                                if (oCal.t066_semlabD == 0)
                                {
                                    bFestAux = true;
                                }
                                break;
                            }
                            //if (bFestAux)
                            break;
                        }
                    }
                    if (!bFestAux)
                    {
                        ///Control de jornada reducida.
                        if (bJornadaReducida)
                        {
                            if (dDiaAux >= dDesdeRed && dDiaAux <= dHastaRed)
                            {
                                nHorasDia = float.Parse(nHorasRed.ToString());
                                if (nOpcion == 3)
                                {
                                    nJornadas = nHoras / nHorasRed;
                                }
                                else
                                {
                                    nJornadas = 1;
                                }
                            }
                        }
                        #region Comprobacion de horas laborables
                        if (nHorasDia == 0)
                        {
                            bErrorControlado = true;
                            sMsg            += "<br />Hay un error en el calendario. El número de horas laborables es cero para el día " + dDiaAux.ToShortDateString();
                            //throw (new ValidationException(sMsg));
                            throw (new Exception(sMsg));
                        }
                        if (nJornadas == 0)
                        {
                            bErrorControlado = true;
                            sMsg            += "<br />Hay un error en el calendario. El número de horas laborables es cero para el día " + dDiaAux.ToShortDateString();
                            //throw (new ValidationException(sMsg));
                            throw (new Exception(sMsg));
                        }
                        #endregion
                    }
                    #endregion
                    #region Imputar
                    if (nOpcion == 1 || nOpcion == 2)
                    {//En estas opciones el modo es siempre sustitución
                        #region Imputar jornada
                        //Ahora, si el día es laborable y no festivo, insert de las horas estándar.
                        if (!bFestAux)
                        {
                            #region Controlar CLE de la tarea
                            fHorasAcumuladas += nHorasDia;

                            if (oTarea.t332_cle > 0 && fHorasAcumuladas > oTarea.t332_cle)
                            {
                                sMsg = bTareaPSP.ControlLimiteEsfuerzos(nTarea, nHorasDia, dDiaAux, htTareasSuperanCLE);
                                if (sMsg != "")
                                {
                                    bErrorControlado = true;
                                    throw (new Exception(sMsg));
                                }
                            }

                            #endregion
                            #region Imputar
                            oConsumoIAP.t332_idtarea         = nTarea;
                            oConsumoIAP.t314_idusuario       = idUser;
                            oConsumoIAP.t314_idusuario_modif = idUserEntrada;
                            oConsumoIAP.t337_comentario      = obsImputacion;
                            oConsumoIAP.t337_esfuerzo        = nHorasDia;
                            oConsumoIAP.t337_esfuerzoenjor   = nJornadas;
                            oConsumoIAP.t337_fecha           = dDiaAux;
                            oConsumoIAP.t337_fecmodif        = DateTime.Now;
                            //La propia Insert está también comprobando su puede grabar en función del CLE
                            bConsumoIAP.Insert(oConsumoIAP);
                            //DAL.ConsumoIAP cConsumoIAP = new DAL.ConsumoIAP(cDblib);
                            //cConsumoIAP.Insert(oConsumoIAP);

                            //if (iImputacionGrabada == 1) {
                            ControlTraspasoIAP(idUser, idUserEntrada, sNombreEmpleadoEntrada, nTarea, dDiaAux, nHorasDia, sNombreEmpleado, aListCorreo);
                            //}
                            //else
                            //{//No ha podido grabar porque excede el CLE y es bloqueante
                            //    if (!bAvisadoCLE)
                            //    {
                            //        sMsg += "<br />Se ha sobrepasado el límite de horas máximo permitido ";
                            //        sMsg += "para la tarea '" + oTarea.t332_idtarea.ToString() + " " + oTarea.t332_destarea + "'.<br />En la fecha de imputación (" + dDiaAux.ToShortDateString() + "), el exceso es ya de " + double.Parse((fHorasAcumuladas - oTarea.t332_cle).ToString()).ToString("N") + " horas. ";
                            //        sMsg += "<br />Para poder imputar más horas a dicha tarea, ponte en contacto con el responsable de la misma.";
                            //        bErrorControlado = true;
                            //        bAvisadoCLE = true;
                            //    }
                            //}

                            #endregion
                        }
                        #endregion
                    }
                    else //nOpcion == 3
                    {
                        #region Imputar x horas
                        if (nModo == 1) //Modo sustitución (ya se ha borrado lo que hubiera).
                        {
                            #region Insertar imputacion
                            if (bFestivos || (!bFestivos && !bFestAux))
                            {
                                #region Controlar CLE de la tarea
                                fHorasAcumuladas += (float)nHoras;

                                if (oTarea.t332_cle > 0 && fHorasAcumuladas > oTarea.t332_cle)
                                {
                                    sMsg        = bTareaPSP.ControlLimiteEsfuerzos(nTarea, nHoras, dDiaAux, htTareasSuperanCLE);
                                    bAvisadoCLE = true;
                                    if (sMsg != "")
                                    {
                                        bErrorControlado = true;
                                        throw (new Exception(sMsg));
                                    }
                                }

                                #endregion
                                #region Imputar
                                oConsumoIAP.t332_idtarea         = nTarea;
                                oConsumoIAP.t314_idusuario       = idUser;
                                oConsumoIAP.t314_idusuario_modif = idUserEntrada;
                                oConsumoIAP.t337_comentario      = obsImputacion;
                                oConsumoIAP.t337_esfuerzo        = (float)nHoras;
                                oConsumoIAP.t337_esfuerzoenjor   = nJornadas;
                                oConsumoIAP.t337_fecha           = dDiaAux;
                                oConsumoIAP.t337_fecmodif        = DateTime.Now;

                                bConsumoIAP.Insert(oConsumoIAP);
                                //DAL.ConsumoIAP cConsumoIAP = new DAL.ConsumoIAP(cDblib);
                                //cConsumoIAP.Insert(oConsumoIAP);

                                //if (iImputacionGrabada == 1)
                                //{
                                ControlTraspasoIAP(idUser, idUserEntrada, sNombreEmpleadoEntrada, nTarea, dDiaAux, (float)nHoras, sNombreEmpleado, aListCorreo);
                                //}
                                //else
                                //{
                                //    if (!bAvisadoCLE)
                                //    {
                                //        sMsg += "<br />Se ha sobrepasado el límite de horas máximo permitido ";
                                //        sMsg += "para la tarea '" + oTarea.t332_idtarea.ToString() + " " + oTarea.t332_destarea + "'.<br />En la fecha de imputación (" + dDiaAux.ToShortDateString() + ") ya el exceso es de " + double.Parse((oTareaIAP.nConsumidoHoras + nHoras - oTarea.t332_cle).ToString()).ToString("N") + " horas. ";
                                //        sMsg += "<br />Para poder imputar más horas a dicha tarea, pongase en contacto con el responsable de la misma.";
                                //        bErrorControlado = true;
                                //        bAvisadoCLE = true;
                                //    }
                                //}
                                #endregion
                            }
                            #endregion
                        }
                        else //Modo acumulación
                        {
                            #region Acumular imputación
                            if (bFestivos || (!bFestivos && !bFestAux))
                            {
                                //Obtener el sumatorio de las imputaciones en otras tareas (en la actual ya las hemos borrado).
                                Models.ConsumoIAP oConsumoIAP_Aux = new Models.ConsumoIAP();
                                oConsumoIAP_Aux = bConsumoIAP.SelectFecha(idUser, dDiaAux);

                                double nImpDia = oConsumoIAP_Aux.t337_esfuerzo;  //Consumos totales del día de otras tareas.
                                //double nImpDiaTarea = oConsumo.nHorasDiaTarea;   //Consumos de la tarea en el día.

                                double nTotalHoras = nHoras + nImpDia; // +nImpDiaTarea;
                                double nTotalTarea = nHoras;           // +nImpDiaTarea;
                                if (nHorasDia == 0)
                                {
                                    nJornadas = 1;
                                }
                                else
                                {
                                    nJornadas = nTotalTarea / nHorasDia;
                                }
                                if (nTotalHoras > 24)
                                {
                                    bErrorControlado = true;
                                    //throw (new Exception("Las imputaciones del día " + dDiaAux.ToShortDateString() + " superan las 24h."));
                                    sMsg += "<br />Las imputaciones del día " + dDiaAux.ToShortDateString() + " superan las 24h.";
                                }
                                ///Delete e insert. No se hace una update, porque puede que no haya consumo que actualizar.
                                bConsumoIAP.Delete(nTarea, idUser, dDiaAux);
                                //DAL.ConsumoIAP cConsumoIAP = new DAL.ConsumoIAP(cDblib);
                                //int result = cConsumoIAP.Delete(nTarea, idUser, dDiaAux);

                                #region Controlar CLE de la tarea
                                fHorasAcumuladas += (float)nHoras;

                                if (oTarea.t332_cle > 0 && fHorasAcumuladas > oTarea.t332_cle)
                                {
                                    sMsg = bTareaPSP.ControlLimiteEsfuerzos(nTarea, nHorasDia, dDiaAux, htTareasSuperanCLE);

                                    if (sMsg != "")
                                    {
                                        bErrorControlado = true;
                                        throw (new Exception(sMsg));
                                    }
                                }

                                #endregion
                                #region Imputar
                                oConsumoIAP.t332_idtarea         = nTarea;
                                oConsumoIAP.t314_idusuario       = idUser;
                                oConsumoIAP.t314_idusuario_modif = idUserEntrada;
                                oConsumoIAP.t337_comentario      = obsImputacion;
                                oConsumoIAP.t337_esfuerzo        = (float)nHoras;
                                oConsumoIAP.t337_esfuerzoenjor   = nJornadas;
                                oConsumoIAP.t337_fecha           = dDiaAux;
                                oConsumoIAP.t337_fecmodif        = DateTime.Now;

                                bConsumoIAP.Insert(oConsumoIAP);
                                //DAL.ConsumoIAP cConsumoIAP = new DAL.ConsumoIAP(cDblib);
                                //iImputacionGrabada = cConsumoIAP.Insert(oConsumoIAP);
                                //cConsumoIAP.Insert(oConsumoIAP);
                                //if (iImputacionGrabada == 1)
                                ControlTraspasoIAP(idUser, idUserEntrada, sNombreEmpleadoEntrada, nTarea, dDiaAux, (float)nHoras, sNombreEmpleado, aListCorreo);
                                //else
                                //{
                                //    if (!bAvisadoCLE)
                                //    {
                                //        sMsg += "<br />Se ha sobrepasado el límite de horas máximo permitido ";
                                //        sMsg += "para la tarea '" + oTarea.t332_idtarea.ToString() + " " + oTarea.t332_destarea + "'. En la fecha de imputación (" + dDiaAux.ToShortDateString() + ") ya el exceso es de " + double.Parse((oTareaIAP.nConsumidoHoras + nHoras - oTarea.t332_cle).ToString()).ToString("N") + " horas. ";
                                //        sMsg += "Para poder imputar más horas a dicha tarea, pongase en contacto con el responsable de la misma.";
                                //        bErrorControlado = true;
                                //        bAvisadoCLE = true;
                                //    }
                                //}
                                #endregion
                            }
                            #endregion
                        }
                        #endregion
                    }
                    #endregion
                }
                #endregion

                #region Actualización de estimaciones y finalización.
                if (bObligaest)
                {
                    double            nHorasTotales = 0;
                    DateTime          dFecMax       = DateTime.Parse("01/01/1900");
                    Models.ConsumoIAP oConsMax      = new Models.ConsumoIAP();

                    oConsMax = bConsumoIAP.SelectAcumulados(idUser, nTarea);
                    //DAL.ConsumoIAP cConsumoIAP = new DAL.ConsumoIAP(cDblib);
                    //oConsMax = cConsumoIAP.SelectAcumulados(idUser, nTarea);


                    nHorasTotales = oConsMax.t337_esfuerzo;
                    dFecMax       = oConsMax.t337_fecha;

                    if (nHorasTotales > nETE)
                    {
                        //sRes += "<br />Se han imputado más horas de las estimadas, por lo que se ha actualizado dicha estimación.";
                        nETE = nHorasTotales; //Para actualizar la estimación.
                    }
                    if (dFecMax > dFFE)
                    {
                        //sRes += "<br />Se ha realizado alguna imputación en una fecha posterior a la estimada, por lo que se ha actualizado dicha estimación.";
                        dFFE = dFecMax; //Para actualizar la estimación.
                    }
                }
                Models.EstimacionIAP oEst = new Models.EstimacionIAP();
                oEst.t314_idusuario  = idUser;
                oEst.t332_idtarea    = nTarea;
                oEst.t336_ffe        = dFFE;
                oEst.t336_ete        = nETE;
                oEst.t336_comentario = obsTecnico;
                oEst.t336_completado = bFinalizado;

                //BLL.EstimacionIAP bEst = new BLL.EstimacionIAP();
                bEst.Update(oEst);
                //DAL.EstimacionIAP cEstimacionIAP = new DAL.EstimacionIAP(cDblib);
                //cEstimacionIAP.Update(oEst);

                //if (bFinalizado)
                //{
                //    Models.TareaRecursos oTarRec = new Models.TareaRecursos();
                //    oTarRec.t314_idusuario = idUser;
                //    oTarRec.t332_idtarea = nTarea;
                //    oTarRec.t336_completado = bFinalizado;
                //    BLL.TareaRecursos bTarRec = new BLL.TareaRecursos();
                //    //TareaRecurso.FinalizarLaborEnTarea(tr, idUser, nTarea, bFinalizado);
                //    bTarRec.SetFinalizacion(oTarRec);
                //}
                #endregion

                if (bErrorControlado)
                {
                    throw new Exception("¡Denegado!<br />" + sMsg);
                }

                cUsuario.aListCorreo = aListCorreo;

                if (cDblib.Transaction.ownerID.Equals(methodOwnerID))
                {
                    cDblib.commitTransaction(methodOwnerID);
                }

                try
                {
                    if (htTareasSuperanCLE.Count > 0)
                    {
                        foreach (int idTarea in htTareasSuperanCLE.Keys)
                        {
                            aListCorreoCLE = (ArrayList)((Models.TareaCLE)htTareasSuperanCLE[idTarea]).destinatariosMail;
                            if (aListCorreoCLE.Count > 0)
                            {
                                SUPERANTIGUO.Capa_Negocio.Correo.EnviarCorreos(aListCorreoCLE);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    IB.SUPER.Shared.LogError.LogearError("Error al enviar el mail de control de límite de esfuerzo", ex);
                }

                return(cUsuario);
            }


            catch (Exception ex)
            {
                //rollback
                if (cDblib.Transaction.ownerID.Equals(methodOwnerID))
                {
                    cDblib.rollbackTransaction(methodOwnerID);
                }

                //throw ex;
                if (bErrorControlado)
                {
                    sRes = sMsg;
                }
                else
                {
                    sRes = ex.Message;// System.Uri.EscapeDataString(ex.Message);
                }
                throw new Exception(sRes);
            }
            finally
            {
                //bUsuario.Dispose();
                bTareaPSP.Dispose();
                bTareaIAP.Dispose();
                bCalendario.Dispose();
                bDesgloseCalendario.Dispose();
                bUsuarioPSN.Dispose();
                bConsumoIAP.Dispose();
                bEst.Dispose();
            }
        }