public string ControlLimiteEsfuerzos(int nTarea, double nHoras, DateTime dDia, Hashtable htTareasSuperanCLE)
        {
            OpenDbConn();

            BLL.TareaIAPS TareaIAPSBLL = new BLL.TareaIAPS(cDblib);

            System.Text.StringBuilder sbEx       = new System.Text.StringBuilder();
            Models.TareaCLE           oTareaCLE  = new Models.TareaCLE();
            Models.TareaPSP           oTarea     = new Models.TareaPSP();
            Models.TareaIAPS          oTareaIAPS = new Models.TareaIAPS();

            double fHorasAcumuladas;

            ArrayList aListCorreo = new ArrayList();

            try
            {
                oTarea     = Select(nTarea);
                oTareaIAPS = TareaIAPSBLL.Select(nTarea);

                fHorasAcumuladas = (float)oTareaIAPS.nConsumidoHoras + nHoras;

                if (oTarea.t332_cle > 0 && fHorasAcumuladas > oTarea.t332_cle)
                {
                    if (oTarea.t332_tipocle == "I")
                    {
                        //Inserto registro para que el proceso nocturno avise de la situación a cada RTPT de la tarea
                        //De momento lo hago por trigger
                        //SqlDataReader dr2 = RTPT.Catalogo(oTarea.t331_idpt, null, 2, 0);
                        //while (dr2.Read())
                        //{
                        //    idRTPT = int.Parse(dr2["t314_idusuario"].ToString());
                        //    Consumo.InsertarCorreo(tr, 12, true, false, idRTPT, nTarea, null, "", oTarea.num_proyecto);
                        //}
                        //dr2.Close();
                        //dr2.Dispose();
                    }
                    else if (oTarea.t332_tipocle == "B")
                    {
                        ///Indicación de que con la imputación realizada se va a
                        ///sobrepasar el límite de esfuerzos y cortar la transacción.
                        sbEx.Append("<br />Se ha sobrepasado el límite de horas máximo permitido ");
                        sbEx.Append("para la tarea '" + oTarea.t332_idtarea.ToString() + " " + oTarea.t332_destarea);
                        sbEx.Append("'.<br />En la fecha de imputación (" + dDia.ToShortDateString() + "), el exceso es ya de " + double.Parse((fHorasAcumuladas - oTarea.t332_cle).ToString()).ToString("N") + " horas. ");
                        sbEx.Append("<br />Para poder imputar más horas a dicha tarea, ponte en contacto con el responsable de la misma.");
                    }
                    else if (oTarea.t332_tipocle == "X")
                    {
                        oTareaCLE         = new Models.TareaCLE();
                        oTareaCLE.idtarea = nTarea;
                        oTareaCLE.fecha   = dDia;
                        oTareaCLE.limite  = oTarea.t332_cle;
                        oTareaCLE.consumo = fHorasAcumuladas;

                        ArrayList lstDestinatarios = ObtenerDestinatario(nTarea);

                        ArrayList lstMails = new ArrayList();

                        foreach (Models.TareaCTIAP tareaCTIAP in lstDestinatarios)
                        {
                            lstMails.Add(GenerarCorreoSuperaETPR(tareaCTIAP.MAIL,
                                                                 tareaCTIAP.t301_idproyecto.ToString("#,###") + " " + tareaCTIAP.t301_denominacion,
                                                                 tareaCTIAP.t331_despt, tareaCTIAP.t334_desfase, tareaCTIAP.t335_desactividad,
                                                                 tareaCTIAP.t332_idtarea.ToString("#,###") + " " + tareaCTIAP.t332_destarea,
                                                                 dDia.ToString(), oTarea.t332_cle.ToString("N"), fHorasAcumuladas.ToString("N")));
                        }

                        oTareaCLE.destinatariosMail = lstMails;

                        if (htTareasSuperanCLE.ContainsKey(nTarea))
                        {
                            htTareasSuperanCLE[nTarea] = oTareaCLE;
                        }
                        else
                        {
                            htTareasSuperanCLE.Add(nTarea, oTareaCLE);
                        }
                    }
                }


                return(sbEx.ToString());
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                TareaIAPSBLL.Dispose();
            }
        }
Example #2
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();
            }
        }
        /// <summary>
        /// Obtiene un TareaIAPS a partir del id
        /// </summary>
        internal Models.TareaIAPS Select(int t332_idtarea)
        {
            Models.TareaIAPS oTareaIAPS = null;
            IDataReader      dr         = null;

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

                dr = cDblib.DataReader("SUP_TAREAIAPS", dbparams);
                if (dr.Read())
                {
                    oTareaIAPS = new Models.TareaIAPS();
                    oTareaIAPS.t332_idtarea = Convert.ToInt32(dr["t332_idtarea"]);
                    if (!Convert.IsDBNull(dr["dPrimerConsumo"]))
                    {
                        oTareaIAPS.dPrimerConsumo = Convert.ToDateTime(dr["dPrimerConsumo"]);
                    }
                    if (!Convert.IsDBNull(dr["dUltimoConsumo"]))
                    {
                        oTareaIAPS.dUltimoConsumo = Convert.ToDateTime(dr["dUltimoConsumo"]);
                    }
                    if (!Convert.IsDBNull(dr["dFinEstimado"]))
                    {
                        oTareaIAPS.dFinEstimado = Convert.ToDateTime(dr["dFinEstimado"]);
                    }
                    if (!Convert.IsDBNull(dr["nTotalEstimado"]))
                    {
                        oTareaIAPS.nTotalEstimado = Convert.ToDouble(dr["nTotalEstimado"]);
                    }
                    if (!Convert.IsDBNull(dr["nConsumidoHoras"]))
                    {
                        oTareaIAPS.nConsumidoHoras = Convert.ToDouble(dr["nConsumidoHoras"]);
                    }
                    if (!Convert.IsDBNull(dr["nConsumidoJornadas"]))
                    {
                        oTareaIAPS.nConsumidoJornadas = Convert.ToDouble(dr["nConsumidoJornadas"]);
                    }
                    if (!Convert.IsDBNull(dr["nPendienteEstimado"]))
                    {
                        oTareaIAPS.nPendienteEstimado = Convert.ToDouble(dr["nPendienteEstimado"]);
                    }
                    if (!Convert.IsDBNull(dr["nAvanceTeorico"]))
                    {
                        oTareaIAPS.nAvanceTeorico = Convert.ToInt32(dr["nAvanceTeorico"]);
                    }
                }
                return(oTareaIAPS);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (dr != null)
                {
                    if (!dr.IsClosed)
                    {
                        dr.Close();
                    }
                    dr.Dispose();
                }
            }
        }