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(); } }
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(); } }