//filtra todos los proyectos en un intervalo de fechas y busca fechas de disponibilidad de los empleados public ActionResult PeriodosDisponibles() { string usuario = System.Web.HttpContext.Current.Session["rol"] as string; string proy = System.Web.HttpContext.Current.Session["proyecto"] as string; string cedula = System.Web.HttpContext.Current.Session["cedula"] as string; ViewBag.user = usuario; List <Desocupacion> Empleados = new List <Desocupacion>(); Desocupacion p = new Desocupacion(); p.nombreED = "------------"; p.periodosyDias = "--"; p.total = "---"; //los agrego a la lista Empleados.Add(p); ViewBag.fInicio = "ninguna"; ViewBag.ffinal = "ninguna"; return(View(Empleados)); }
public ActionResult PeriodosDisponibles(DateTime Finicio, DateTime Ffinal) { string usuario = System.Web.HttpContext.Current.Session["rol"] as string; string proy = System.Web.HttpContext.Current.Session["proyecto"] as string; string cedula = System.Web.HttpContext.Current.Session["cedula"] as string; ViewBag.user = usuario; ViewBag.fInicio = Finicio; ViewBag.ffinal = Ffinal; ViewBag.lleno = true; //genere lista de objetos para mostrar luego en vista List <Desocupacion> Empleados = new List <Desocupacion>(); //codigo sql ultilizando cursores string sql = @" DECLARE @inicio date,--limite inferior iterador @final date,--limite superior iterador @Viejoinicio date,--limite inferior iterador @Viejofinal date,--limite superior iterador @diasLib int, --dias libres de iteradores @Mensaje varchar(100)--variable temporal para formar mensajes a imprimir Declare @cursorResult table (mensaje varchar(100)) DECLARE DispCur CURSOR FOR SELECT DISTINCT P.fechaInicio,P.fechaFinalizacion FROM Equipo Eq JOIN Proyecto P ON P.nombre =Eq.nombreProy_FK JOIN EmpleadoDesarrollador E ON E.cedulaED = Eq.cedulaEM_FK WHERE Eq.cedulaEM_FK = @empleado AND (0 <= DATEDIFF(Day,@fechainicio,P.fechaInicio)AND 0 >= DATEDIFF(Day,@fechafin,P.fechaFinalizacion)) --CASO QUE esta entre limites OR (0 >= DATEDIFF(Day,@fechainicio,P.fechaInicio)AND 0 >= DATEDIFF(Day,@fechafin,P.fechaFinalizacion)AND 0 < DATEDIFF(Day,@fechainicio,P.fechaFinalizacion))--limite inferior en medio de proyecto OR (0 <= DATEDIFF(Day,@fechainicio,P.fechaInicio)AND 0 <= DATEDIFF(Day,@fechafin,P.fechaFinalizacion)AND 0 >= DATEDIFF(Day,@fechafin,P.fechaInicio))--limite superior en medio de proyecto ORDER BY P.fechaInicio OPEN DispCur SET @diasLib = 0 SET @Viejoinicio =(SELECT E.fechaInicio FROM EmpleadoDesarrollador E WHERE E.cedulaED = @empleado) FETCH NEXT FROM DispCur INTO @inicio,@final IF @inicio > @fechainicio--en caso de que proyecto aun no haya iniciado en limite inferior BEGIN IF @fechainicio < @Viejoinicio --en caso de q empleado aun no haya empezado a trabajar BEGIN SET @Mensaje = CAST(@Viejoinicio AS nvarchar(10)) +' -- '+CAST(@inicio AS nvarchar(10)) +': '+ CAST(DATEDIFF(Day, @Viejoinicio,@inicio) AS nvarchar (100)) SET @diasLib = @diasLib+(DATEDIFF(Day, @Viejoinicio,@inicio)) insert into @cursorResult(mensaje) values(@Mensaje) END ELSE BEGIN SET @Mensaje = ' INICIO ' +' -- '+CAST(@inicio AS nvarchar(10)) +': '+ CAST(DATEDIFF(Day, @fechainicio,@inicio) AS nvarchar (100)) SET @diasLib = @diasLib+(DATEDIFF(Day, @fechainicio,@inicio)) insert into @cursorResult(mensaje) values(@Mensaje) END END WHILE @@fetch_status = 0 BEGIN SET @Viejoinicio = @inicio SET @Viejofinal = @final FETCH NEXT FROM DispCur INTO @inicio,@final IF @Viejoinicio = @inicio AND @final < @fechafin--si proyecto termina antes de limite superior BEGIN SET @Mensaje = CAST(@Viejofinal AS nvarchar(10)) +' -- '+' FINAL: '+' '+ CAST(DATEDIFF(Day,@Viejofinal, @fechafin) AS nvarchar (10)) SET @diasLib = @diasLib+(DATEDIFF(Day,@Viejofinal, @fechafin)) insert into @cursorResult(mensaje) values(@Mensaje) END ELSE IF @final < @fechafin--ciclo normal BEGIN SET @Mensaje = CAST(@Viejofinal AS nvarchar(10)) +' -- '+CAST(@inicio AS nvarchar(10))+': '+ CAST(DATEDIFF(Day,@Viejofinal, @inicio) AS nvarchar (10)) SET @diasLib = @diasLib+(DATEDIFF(Day,@Viejofinal, @inicio)) insert into @cursorResult(mensaje) values(@Mensaje) END ELSE IF @Viejoinicio != @inicio AND @final > @fechafin--si proyecto termina despues de limite superior BEGIN SET @Mensaje = CAST(@Viejofinal AS nvarchar(10)) +' -- '+CAST(@fechafin AS nvarchar(10))+': '+ CAST(DATEDIFF(Day,@Viejofinal, @fechafin) AS nvarchar (10)) SET @diasLib = @diasLib + (DATEDIFF(Day,@Viejofinal, @fechafin)) insert into @cursorResult(mensaje) values(@Mensaje) END END SET @Mensaje = CAST(@diaslib AS nvarchar(10)) insert into @cursorResult(mensaje) values(@Mensaje) CLOSE DispCur DEALLOCATE DispCur; select * from @cursorResult "; //genero listas de personas var personas = from emp in db.EmpleadoDesarrollador select emp; foreach (var item in personas.ToList()) { //genero parametros para sql dinamico var fechainicio = new SqlParameter("@fechainicio", Finicio.Date); var fechafin = new SqlParameter("@fechafin", Ffinal.Date); var emp_actual = new SqlParameter("@empleado", item.cedulaED); var results = db.Database.SqlQuery <string>(sql, fechainicio, fechafin, emp_actual).ToList(); string per = item.nombreED; //objeto que metere en lista Desocupacion p = new Desocupacion(); p.nombreED = item.nombreED; SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); foreach (var linea in results) { if (linea != results.LastOrDefault()) { p.periodosyDias += linea.ToString(); p.periodosyDias += System.Environment.NewLine; } } p.total = results.LastOrDefault(); //los agrego a la lista SI tienen datos if (Convert.ToInt32(p.total) > 0) { Empleados.Add(p); } } //caso de que no existan empleados en el intervalo if (Empleados.Count() == 0) { ViewBag.lleno = false; } return(View(Empleados)); }