private Dictionary <int, double> GetCargaPorHora(RepeaterItemPedido item)
        {
            var total = item.Pedido.Cantidad + item.Pedido.CantidadAjuste;
            var carga = GetCarga(item.Pedido);

            var inicio = GetInicioActividad(item.Pedido.BocaDeCarga);
            var fin    = GetFinActividad(item.Pedido.BocaDeCarga);
            var enObra = item.Pedido.FechaEnObra.ToDisplayDateTime().TimeOfDay;

            var values = new Dictionary <int, double>();

            for (var i = inicio; i <= fin; i = i.Add(TimeSpan.FromHours(1)))
            {
                values.Add(Convert.ToInt32(i.Hours), 0);
            }

            var proxima = enObra;

            for (var i = proxima; total > 0; i = i.Add(TimeSpan.FromMinutes(item.Pedido.Frecuencia)))
            {
                var cantidad = Math.Min(total, carga);
                total -= cantidad;
                if (values.ContainsKey(Convert.ToInt32(i.Hours)))
                {
                    values[Convert.ToInt32(i.Hours)] += cantidad;
                }
            }

            return(values);
        }
        private void GenerarPedido(RepeaterItemPedido item)
        {
            using (var transaction = SmartTransaction.BeginTransaction())
            {
                try
                {
                    GenerarTickets(item);

                    transaction.Commit();

                    Search();
                }
                catch (Exception ex)
                {
                    try
                    {
                        transaction.Rollback();
                    }
                    catch
                    {
                        ShowError(ex);
                    }
                    ShowError(ex);
                }
            }
        }
Example #3
0
        protected void BoundFooter(RepeaterItemPedido item)
        {
            const string cell = "<td class=\"number {1}\">{0}</td>";

            var boca           = DAOFactory.BocaDeCargaDAO.FindById(cbBocaDeCarga.Selected);
            var inicio         = GetInicioActividad(boca);
            var fin            = GetFinActividad(boca);
            var tiempoPromedio = Convert.ToInt32(_tiempoCiclos.Sum() / CantidadTotal);
            var prev           = 0;

            item.lblCantidad.Text    = CantidadTotal.ToString("0.00");
            item.lblTiempoCiclo.Text = FormatTimeSpan(TimeSpan.FromMinutes(tiempoPromedio));

            for (var i = inicio; i <= fin; i = i.Add(TimeSpan.FromHours(1)))
            {
                var hora = Convert.ToInt32(i.Hours);
                var val  = _volumenPorHora.ContainsKey(hora) ? _volumenPorHora[hora] : 0;
                var mix  = (int)Math.Ceiling(1.0 * val / Carga);
                var equi = Math.Round((prev + mix) * tiempoPromedio / TiempoReferencia);

                item.litHoras.Text  += string.Format(cell, val > 0 ? val.ToString() : "", val > boca.Rendimiento ? "total_mal" : "total_ok");
                item.litHoras2.Text += string.Format(cell, mix > 0 ? mix.ToString() : "", "");
                item.litHoras3.Text += string.Format(cell, equi > 0 ? equi.ToString() : "", equi > CantidadMixers ? "total_mal" : "total_ok");

                prev = mix;
            }
        }
        private void CambiarHoraCarga(RepeaterItemPedido item)
        {
            try
            {
                ValidateEmpty(item.DtHoraCarga.SelectedDate, "HORA_CARGA");

                var pedido = DAOFactory.PedidoDAO.FindById(item.Id);
                if (pedido.Estado != Pedido.Estados.Pendiente)
                {
                    return;
                }
                pedido.HoraCarga = item.DtHoraCarga.SelectedDate != null?item.DtHoraCarga.SelectedDate.Value.ToDataBaseDateTime() : DateTime.MinValue;

                if (pedido.HoraCarga > pedido.FechaEnObra)
                {
                    pedido.FechaEnObra = pedido.HoraCarga;
                }

                DAOFactory.PedidoDAO.SaveOrUpdate(pedido);
                Search();
            }
            catch (Exception ex)
            {
                ShowError(ex);
            }
        }
        protected override void ExportToCsv()
        {
            var separator = Usuario.CsvSeparator;

            var sb = new StringBuilder();

            sb.Append(GetLine(CultureManager.GetMenu(ToolBar.VariableName)));
            sb.Append(GetLine(DateTime.UtcNow.ToDisplayDateTime().ToString("dd/MM/yyyy HH:mm")));
            sb.Append(GetLine());
            sb.Append(GetLine(CultureManager.GetEntity("PARENTI01"), cbEmpresa.SelectedItem.Text));
            sb.Append(GetLine(CultureManager.GetEntity("PARENTI02"), cbLinea.SelectedItem.Text));
            sb.Append(GetLine(CultureManager.GetEntity("BOCADECARGA"), cbBocaDeCarga.SelectedItem.Text));
            sb.Append(GetLine(CultureManager.GetEntity("PARENTI63"), cbProducto.SelectedItem.Text));
            sb.Append(GetLine(CultureManager.GetLabel("DIA"), dtDia.SelectedDate.Value.ToString("dd/MM/yyyy")));
            sb.Append(GetLine(CultureManager.GetLabel("PROGRAMACION_CARGA_MAXIMA"), txtCargaMaxima.Text));
            sb.Append(GetLine(CultureManager.GetLabel("PROGRAMACION_CANTIDAD_MIXERS"), txtCantidadMixers.Text));
            sb.Append(GetLine());

            var bocas = cbBocaDeCarga.Selected > 0
                ? new List <BocaDeCarga> {
                DAOFactory.BocaDeCargaDAO.FindById(cbBocaDeCarga.Selected)
            }
                : DAOFactory.BocaDeCargaDAO.GetList(new[] { cbEmpresa.Selected }, new[] { cbLinea.Selected });

            var inicio = bocas.Min(boca => GetInicioActividad(boca));
            var fin    = bocas.Max(boca => GetFinActividad(boca));

            sb.Append(string.Join(separator.ToString(), CsvHeader));
            for (var i = inicio; i <= fin; i = i.Add(TimeSpan.FromHours(1)))
            {
                sb.Append(string.Concat(separator, FormatTimeSpan(i)));
            }
            sb.Append(GetLine());

            foreach (RepeaterItem r in repPedidos.Items)
            {
                var item = new RepeaterItemPedido(r);

                if (r.ItemType != ListItemType.Item && r.ItemType != ListItemType.AlternatingItem)
                {
                    continue;
                }
                sb.Append(GetLine(string.Join(separator.ToString(), item.GetCsvLine())));
            }
            sb.Append((string)hidCsvFooter.Value);
            sb.Append(GetLine());

            Session["CSV_EXPORT"]    = sb.ToString();
            Session["CSV_FILE_NAME"] = "programacion";

            OpenWin(string.Concat(ApplicationPath, "Common/exportCSV.aspx"), CultureManager.GetSystemMessage("EXPORT_CSV_DATA"));
        }
Example #6
0
        protected void BoundHeader(RepeaterItemPedido item)
        {
            const string cell = "<th class=\"hora\">{0}</th>";

            var boca   = DAOFactory.BocaDeCargaDAO.FindById(cbBocaDeCarga.Selected);
            var inicio = GetInicioActividad(boca);
            var fin    = GetFinActividad(boca);

            for (var i = inicio; i <= fin; i = i.Add(TimeSpan.FromHours(1)))
            {
                item.litHoras.Text += string.Format(cell, FormatTimeSpan(i));
            }
        }
        protected void RepPedidos_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            var item = new RepeaterItemPedido(e.Item);

            switch (e.CommandName)
            {
            case "CambiarEnObra": CambiarEnObra(item); break;

            case "CambiarHoraCarga": CambiarHoraCarga(item); break;

            case "GenerarTickets": GenerarPedido(item); break;

            case "GenerarTodo": GenerarTodos(); break;
            }
        }
        protected void BoundHeader(RepeaterItemPedido item)
        {
            const string cell = "<th class=\"hora\">{0}</th>";

            var bocas = cbBocaDeCarga.Selected > 0
                ? new List <BocaDeCarga> {
                DAOFactory.BocaDeCargaDAO.FindById(cbBocaDeCarga.Selected)
            }
                : DAOFactory.BocaDeCargaDAO.GetList(new[] { cbEmpresa.Selected }, new[] { cbLinea.Selected });

            var inicio = bocas.Min(boca => GetInicioActividad(boca));
            var fin    = bocas.Max(boca => GetFinActividad(boca));

            for (var i = inicio; i <= fin; i = i.Add(TimeSpan.FromHours(1)))
            {
                item.LitHoras.Text += string.Format(cell, FormatTimeSpan(i));
            }
        }
Example #9
0
        private Dictionary <int, double> GetCargaPorHora(RepeaterItemPedido item)
        {
            var total = item.Pedido.Cantidad + item.Pedido.CantidadAjuste;
            var carga = item.Pedido.CargaViaje;

            var inicio = GetInicioActividad(item.Pedido.BocaDeCarga);
            var fin    = GetFinActividad(item.Pedido.BocaDeCarga);
            var enObra = item.Pedido.FechaEnObra.ToDisplayDateTime().TimeOfDay;

            var entregado = 0.0;
            var values    = new Dictionary <int, double>();

            for (var i = inicio; i <= fin; i = i.Add(TimeSpan.FromHours(1)))
            {
                var val = 0.0;

                if (i.Hours < enObra.Hours)
                {
                    val = 0;
                }
                else if (entregado == total)
                {
                    val = 0;
                }
                else if (total < carga)
                {
                    val = total;
                }
                else if (entregado < total)
                {
                    var val1 = Math.Ceiling(60.0 / item.Pedido.Frecuencia) * carga;
                    var val2 = total - entregado;
                    val = Math.Min(val1, val2);
                }

                values.Add(Convert.ToInt32(i.Hours), val);
                entregado += val;
            }
            return(values);
        }
        private void CambiarEnObra(RepeaterItemPedido item)
        {
            try
            {
                ValidateEmpty(item.DtEnObra.SelectedDate, "FECHA_EN_OBRA");

                var pedido = DAOFactory.PedidoDAO.FindById(item.Id);
                var dif    = pedido.FechaEnObra - pedido.HoraCarga;

                if (pedido.Estado != Pedido.Estados.Pendiente)
                {
                    return;
                }
                pedido.FechaEnObra = item.DtEnObra.SelectedDate != null?item.DtEnObra.SelectedDate.Value.ToDataBaseDateTime() : DateTime.MinValue;

                pedido.HoraCarga = pedido.FechaEnObra.Add(-dif);
                DAOFactory.PedidoDAO.SaveOrUpdate(pedido);
                Search();
            }
            catch (Exception ex)
            {
                ShowError(ex);
            }
        }
        private void GenerarTickets(RepeaterItemPedido item)
        {
            var pedido = DAOFactory.PedidoDAO.FindById(item.Id);

            if (pedido.Estado != Pedido.Estados.Pendiente)
            {
                return;
            }

            var    cantidad = pedido.Cantidad + pedido.CantidadAjuste;
            double carga    = GetCarga(pedido);

            var estados = DAOFactory.EstadoDAO.GetByPlanta(pedido.Linea.Id);
            var total   = estados.Sum(e => Convert.ToInt32(e.Deltatime));

            if (total == 0)
            {
                total = pedido.TiempoCiclo;
            }

            if (!estados.Any(e => e.EsPuntoDeControl == Estado.Evento.LlegaAObra))
            {
                ThrowError("PROGRAMACION_NO_OBRA");
            }

            var indexEnObra =
                estados.IndexOf(estados.First(e => e.EsPuntoDeControl == Estado.Evento.LlegaAObra));

            var deltas =
                estados.Select(
                    e =>
                    Convert.ToInt32(((e.Deltatime == 0 ? total / estados.Count : e.Deltatime) * pedido.TiempoCiclo * 1.0) /
                                    total)).ToList();
            var minutos        = Convert.ToInt32(deltas.Where((e, i) => i < indexEnObra).Sum());
            var inicioServicio = pedido.FechaEnObra.AddMinutes(-minutos);

            var ticketCount = 1;

            for (var entregado = 0.0; entregado < cantidad; entregado += carga)
            {
                if (entregado + carga > cantidad)
                {
                    carga = cantidad - entregado;
                }

                var ticket = new Ticket
                {
                    CantidadCarga       = carga.ToString(),
                    CantidadCargaReal   = "0",
                    CantidadPedido      = cantidad.ToString(),
                    Cliente             = pedido.Cliente,
                    Codigo              = pedido.Codigo + "-" + ticketCount.ToString().PadLeft(2, '0'),
                    CodigoProducto      = pedido.Producto != null ? pedido.Producto.Codigo : "",
                    CumulativeQty       = (entregado + carga).ToString(),
                    DescripcionProducto = pedido.Producto != null ? pedido.Producto.Descripcion : "",
                    Empresa             = pedido.BocaDeCarga.Linea != null ? pedido.BocaDeCarga.Linea.Empresa : null,
                    Linea         = pedido.BocaDeCarga.Linea,
                    BaseDestino   = pedido.BocaDeCarga.Linea,
                    Estado        = Ticket.Estados.Pendiente,
                    FechaTicket   = inicioServicio,
                    Pedido        = pedido,
                    PuntoEntrega  = pedido.PuntoEntrega,
                    SourceFile    = "Programacion",
                    SourceStation = "WEB",
                    Unidad        = "m3",
                    UserField1    = string.Empty,
                    UserField2    = string.Empty,
                    UserField3    = string.Empty,
                    OrdenDiario   = DAOFactory.TicketDAO.FindNextOrdenDiario(pedido.BocaDeCarga.Linea != null ? pedido.BocaDeCarga.Linea.Empresa.Id : -1, pedido.BocaDeCarga.Linea != null ? pedido.BocaDeCarga.Linea.Id : -1, inicioServicio),
                    ASincronizar  = true
                };

                var minutosTranscurridos = 0;

                for (int i = 0; i < estados.Count; i++)
                {
                    var estado  = estados[i];
                    var detalle = new DetalleTicket
                    {
                        Ticket          = ticket,
                        EstadoLogistico = estado,
                        Programado      = inicioServicio.AddMinutes(minutosTranscurridos)
                    };
                    ticket.Detalles.Add(detalle);
                    minutosTranscurridos += deltas[i];
                }

                inicioServicio = inicioServicio.Add(TimeSpan.FromMinutes(pedido.Frecuencia));
                ticketCount++;

                DAOFactory.TicketDAO.SaveOrUpdate(ticket);
            }

            pedido.Estado = Pedido.Estados.EnCurso;
            DAOFactory.PedidoDAO.SaveOrUpdate(pedido);
        }
        protected void BoundFooter(RepeaterItemPedido item)
        {
            const string cell = "<td class=\"number {1}\">{0}</td>";

            var rendimientoExcedido = false;
            var mixersExcedidos     = false;

            var carga = GetCarga(item.Pedido);
            var bocas = cbBocaDeCarga.Selected > 0
                ? new List <BocaDeCarga> {
                DAOFactory.BocaDeCargaDAO.FindById(cbBocaDeCarga.Selected)
            }
                : DAOFactory.BocaDeCargaDAO.GetList(new[] { cbEmpresa.Selected }, new[] { cbLinea.Selected });

            var inicio      = bocas.Min(boca => GetInicioActividad(boca));
            var fin         = bocas.Max(boca => GetFinActividad(boca));
            var rendimiento = bocas.Sum(boca => boca.Rendimiento);

            var tiempoPromedio = Convert.ToInt32(_tiempoCiclos.Sum() / CantidadTotal);
            var prev           = 0;

            item.LblCantidad.Text               = CantidadTotal.ToString("0.00");
            item.LblTiempoCiclo.Text            = FormatTimeSpan(TimeSpan.FromMinutes(tiempoPromedio));
            item.BtGenerarTickets.OnClientClick = string.Format("return confirm('{0}');", CultureManager.GetSystemMessage("CONFIRM_OPERATION"));


            var csv1 = new List <string>();
            var csv2 = new List <string>();
            var csv3 = new List <string>();

            for (var i = inicio; i <= fin; i = i.Add(TimeSpan.FromHours(1)))
            {
                var hora = Convert.ToInt32(i.Hours);
                var val  = _volumenPorHora.ContainsKey(hora) ? _volumenPorHora[hora] : 0;
                var mix  = (int)Math.Ceiling(1.0 * val / carga);
                var equi = Math.Round((prev + mix) * tiempoPromedio / TiempoReferencia);

                var toShow1 = val > 0 ? val.ToString() : "";
                var toShow2 = mix > 0 ? mix.ToString() : "";
                var toShow3 = equi > 0 ? equi.ToString() : "";
                item.LitHoras.Text  += string.Format(cell, toShow1, val > rendimiento ? "total_mal" : "total_ok");
                item.LitHoras2.Text += string.Format(cell, toShow2, "");
                item.LitHoras3.Text += string.Format(cell, toShow3, equi > CantidadMixers ? "total_mal" : "total_ok");

                csv1.Add(toShow1);
                csv2.Add(toShow2);
                csv3.Add(toShow3);

                rendimientoExcedido |= val > rendimiento;
                mixersExcedidos     |= equi > CantidadMixers;
                prev = mix;
            }

            if (rendimientoExcedido || mixersExcedidos)
            {
                foreach (RepeaterItem itm in repPedidos.Items)
                {
                    var it = new RepeaterItemPedido(itm)
                    {
                        BtGenerarTickets = { Enabled = false, OnClientClick = string.Empty }
                    };
                }
                item.BtGenerarTickets.Enabled       = false;
                item.BtGenerarTickets.OnClientClick = string.Empty;
            }
            if (rendimientoExcedido || mixersExcedidos || !_algunoPendiente)
            {
                item.BtGenerarTickets.Enabled       = false;
                item.BtGenerarTickets.OnClientClick = string.Empty;
            }

            var row1 = new[] {
                string.Empty,                                         //codigo
                string.Empty,                                         // hora de carga
                string.Empty,                                         // hora en obra
                string.Empty,                                         // boca de carga
                string.Empty,                                         // cliente
                string.Empty,                                         // punto de entrega
                string.Empty,                                         // contacto
                string.Empty,                                         // observacion
                string.Empty,                                         // nro bomba
                string.Empty,                                         // is minimixer
                CultureManager.GetLabel("TOTAL"),                     //producto
                item.LblCantidad.Text,                                // cantidad pedido
                item.LblTiempoCiclo.Text,                             // Tiempo de ciclo
                string.Empty,                                         // frecuencia
                CultureManager.GetLabel("PROGRAMACION_VOLUMEN_HORA"), // moviles necesarios
                string.Join(";", csv1.ToArray())                      // valores dinamicos
            };
            var row2 = new[] {
                string.Empty,                                        //codigo
                string.Empty,                                        // hora de carga
                string.Empty,                                        // hora en obra
                string.Empty,                                        // boca de carga
                string.Empty,                                        // cliente
                string.Empty,                                        // punto de entrega
                string.Empty,                                        // contacto
                string.Empty,                                        // observacion
                string.Empty,                                        // nro bomba
                string.Empty,                                        // is minimixer
                string.Empty,                                        //producto
                string.Empty,                                        // cantidad pedido
                string.Empty,                                        // Tiempo de ciclo
                string.Empty,                                        // frecuencia
                CultureManager.GetLabel("PROGRAMACION_MIXERS_HORA"), // moviles necesarios
                string.Join(";", csv2.ToArray())                     // valores dinamicos
            };
            var row3 = new[] {
                string.Empty,                                                //codigo
                string.Empty,                                                // hora de carga
                string.Empty,                                                // hora en obra
                string.Empty,                                                // boca de carga
                string.Empty,                                                // cliente
                string.Empty,                                                // punto de entrega
                string.Empty,                                                // contacto
                string.Empty,                                                // observacion
                string.Empty,                                                // nro bomba
                string.Empty,                                                // is minimixer
                string.Empty,                                                //producto
                string.Empty,                                                // cantidad pedido
                string.Empty,                                                // Tiempo de ciclo
                string.Empty,                                                // frecuencia
                CultureManager.GetLabel("PROGRAMACION_MIXERS_EQUIVALENTES"), // moviles necesarios
                string.Join(";", csv3.ToArray())                             // valores dinamicos
            };

            hidCsvFooter.Value = string.Join(";", row1) + "\n" + string.Join(";", row3) + "\n" + string.Join(";", row3) + "\n";
        }
        protected void BoundItem(RepeaterItemPedido item)
        {
            const string cell = "<td class=\"number\">{0}</td>";

            var carga             = GetCarga(item.Pedido);
            var cantidad          = item.Pedido.Cantidad + item.Pedido.CantidadAjuste;
            var movilesNecesarios = Math.Ceiling(Math.Min(cantidad / carga, item.Pedido.TiempoCiclo * 1.0 / item.Pedido.Frecuencia));

            item.LblPedido.Text = item.Pedido.Codigo;
            item.LblPedido.Attributes.Add("id", item.Pedido.Id.ToString());
            item.LblHoraCarga.Text = item.Pedido.HoraCarga.ToDisplayDateTime().ToString("HH:mm");
            item.LblHoraCarga.Attributes.Add("estado", item.Pedido.Estado == Pedido.Estados.Pendiente ? "0" : "1");
            item.LblEnObra.Text = item.Pedido.FechaEnObra.ToDisplayDateTime().ToString("HH:mm");
            item.LblEnObra.Attributes.Add("estado", item.Pedido.Estado == Pedido.Estados.Pendiente ? "0" : "1");
            item.DtEnObra.SelectedDate     = item.Pedido.FechaEnObra.ToDisplayDateTime();
            item.DtHoraCarga.SelectedDate  = item.Pedido.HoraCarga.ToDisplayDateTime();
            item.LblBocaDeCarga.Text       = EscapeChars(item.Pedido.BocaDeCarga.Descripcion);
            item.LblCliente.Text           = EscapeChars(item.Pedido.Cliente.Descripcion);
            item.LblPuntoEntrega.Text      = EscapeChars(item.Pedido.PuntoEntrega.Descripcion);
            item.LblContacto.Text          = EscapeChars(item.Pedido.Contacto);
            item.LblObservacion.Text       = EscapeChars(item.Pedido.Observacion);
            item.LblProducto.Text          = EscapeChars(item.Pedido.Producto != null ? item.Pedido.Producto.Descripcion : "");
            item.LblCantidad.Text          = cantidad.ToString("0.00");
            item.LblBomba.Text             = item.Pedido.NumeroBomba;
            item.LblEsMinimixer.Text       = item.Pedido.EsMinimixer ? CultureManager.GetLabel("SI") : CultureManager.GetLabel("NO");
            item.LblTiempoCiclo.Text       = FormatTimeSpan(TimeSpan.FromMinutes(item.Pedido.TiempoCiclo));
            item.LblFrecuencia.Text        = FormatTimeSpan(TimeSpan.FromMinutes(item.Pedido.Frecuencia));
            item.LblMovilesNecesarios.Text = movilesNecesarios.ToString("0");
            item.HidId.Value   = item.Pedido.Id.ToString();
            item.LitStyle.Text = item.Pedido.Estado == Pedido.Estados.Pendiente ? "pendiente" : "generado";
            item.BtCambiarEnObra.OnClientClick    = string.Format("return confirm('{0}');", CultureManager.GetSystemMessage("CONFIRM_OPERATION"));
            item.BtCambiarHoraCarga.OnClientClick = string.Format("return confirm('{0}');", CultureManager.GetSystemMessage("CONFIRM_OPERATION"));
            item.BtGenerarTickets.OnClientClick   = string.Format("return confirm('{0}');", CultureManager.GetSystemMessage("CONFIRM_OPERATION"));
            item.BtGenerarTickets.Visible         = item.Pedido.Estado == Pedido.Estados.Pendiente;

            if (item.Pedido.Estado == Pedido.Estados.Pendiente)
            {
                _algunoPendiente = true;
            }

            var csv          = new List <string>();
            var cargaPorHora = GetCargaPorHora(item);

            foreach (var cargaHora in cargaPorHora)
            {
                var val    = cargaHora.Value;
                var toShow = val == 0 ? string.Empty : val.ToString();
                item.LitHoras.Text += string.Format(cell, toShow);
                csv.Add(toShow);

                if (val > 0)
                {
                    var hora = cargaHora.Key;

                    if (_volumenPorHora.ContainsKey(hora))
                    {
                        _volumenPorHora[hora] += val;
                    }
                    else
                    {
                        _volumenPorHora.Add(hora, val);
                    }
                }
            }

            _tiempoCiclos.Add(cantidad * item.Pedido.TiempoCiclo);
            CantidadTotal += cantidad;

            item.HidCsvLine.Value = string.Join(";", csv.ToArray());
        }
Example #14
0
        protected void BoundItem(RepeaterItemPedido item)
        {
            const string cell = "<td class=\"number\">{0}</td>";

            var tickets = DAOFactory.TicketDAO.GetByPedido(new[] { cbEmpresa.Selected },
                                                           new[] { cbLinea.Selected },
                                                           new[] { item.Pedido.Id })
                          .OrderBy(p => p.Vehiculo);

            Carga = Convert.ToDouble(tickets.First().CantidadCarga);
            var cantidad = item.Pedido.Cantidad + item.Pedido.CantidadAjuste;

            CantidadMixers = 0;
            var ultimoVehiculo = 0;

            foreach (var ticket in tickets)
            {
                if (ticket.Vehiculo != null && ticket.Vehiculo.Id != ultimoVehiculo)
                {
                    CantidadMixers++;
                    ultimoVehiculo = ticket.Vehiculo.Id;
                }
            }

            var movilesNecesarios = Math.Ceiling(Math.Min(cantidad / Carga, item.Pedido.TiempoCiclo * 1.0 / item.Pedido.Frecuencia));

            item.lblPedido.Text = item.Pedido.Codigo;
            item.lblPedido.Attributes.Add("id", item.Pedido.Id.ToString("#0"));
            item.lblHoraCarga.Text = item.Pedido.HoraCarga.ToDisplayDateTime().ToString("HH:mm");
            item.lblEnObra.Text    = item.Pedido.FechaEnObra.ToDisplayDateTime().ToString("HH:mm");
            item.lblEnObra.Attributes.Add("estado", item.Pedido.Estado == Pedido.Estados.Pendiente ? "0" : "1");
            item.lblCliente.Text           = item.Pedido.Cliente.Descripcion;
            item.lblPuntoEntrega.Text      = item.Pedido.PuntoEntrega.Descripcion;
            item.LblContacto.Text          = item.Pedido.Contacto;
            item.LblObservacion.Text       = item.Pedido.Observacion;
            item.lblProducto.Text          = item.Pedido.Producto != null ? item.Pedido.Producto.Descripcion : "";
            item.lblCantidad.Text          = cantidad.ToString("0.00");
            item.lblBomba.Text             = item.Pedido.NumeroBomba;
            item.LblEsMinimixer.Text       = item.Pedido.EsMinimixer ? CultureManager.GetLabel("SI") : CultureManager.GetLabel("NO");
            item.lblTiempoCiclo.Text       = FormatTimeSpan(TimeSpan.FromMinutes(item.Pedido.TiempoCiclo));
            item.lblFrecuencia.Text        = FormatTimeSpan(TimeSpan.FromMinutes(item.Pedido.Frecuencia));
            item.lblMovilesNecesarios.Text = movilesNecesarios.ToString("0");
            item.hidId.Value   = item.Pedido.Id.ToString("#0");
            item.litStyle.Text = item.Pedido.Estado == Pedido.Estados.Pendiente ? "pendiente" : "generado";

            var cargaPorHora = GetCargaPorHora(item);

            foreach (var cargaHora in cargaPorHora)
            {
                var val = cargaHora.Value;
                item.litHoras.Text += string.Format(cell, val == 0 ? string.Empty : val.ToString());

                if (val > 0)
                {
                    var hora = cargaHora.Key;

                    if (_volumenPorHora.ContainsKey(hora))
                    {
                        _volumenPorHora[hora] += val;
                    }
                    else
                    {
                        _volumenPorHora.Add(hora, val);
                    }
                }
            }

            _tiempoCiclos.Add(cantidad * item.Pedido.TiempoCiclo);
            CantidadTotal += cantidad;
        }