public Certificado(Estimado estimado, string usuario)
        {
            CertificadoDetDTO estDet;
            CertificadoSKUDTO estSKU;

            Cabecera = new CertificadoCabDTO(estimado.Cabecera);
            Lineas   = new List<CertificadoDetDTO>();

            foreach (var ordDet in estimado.Lineas)
            {
                estDet       = new CertificadoDetDTO(ordDet);
                estDet.RecId = 0;

                Lineas.Add(estDet);
            }

            SKUs = new List<CertificadoSKUDTO>();

            foreach (var ordSKU in estimado.SKUs)
            {
                estSKU       = new CertificadoSKUDTO(ordSKU);
                estSKU.RecId = 0;

                SKUs.Add(estSKU);
            }
        }
        private List<CertificadoDetDTO> PeriodosCopiar(DateTime fOrigenDesde, DateTime fOrigenHasta, DateTime fDestinoDesde, DateTime fDestinoHasta, List<CertificadoDetDTO> lineas)
        {
            List<CertificadoDetDTO> LineasOrigen = lineas;
            List<CertificadoDetDTO> LineasSeleccionadas = new List<CertificadoDetDTO>();
            List<CertificadoDetDTO> LineasDestino = lineas;

            FrecuenciaDTO frecuencia = CRUDHelper.Read(string.Format("IdentifFrecuencia = '{0}'", ucIdentifFrecuencia.SelectedValue), BusinessMapper.GetDaoByEntity(BusinessMapper.eEntities.Frecuencia));

            List<FrecuenciaDetDTO> frecuenciaDetalles = CRUDHelper.ReadAll(string.Format("IdentifFrecuencia = '{0}'", frecuencia.IdentifFrecuencia), BusinessMapper.GetDaoByEntity(BusinessMapper.eEntities.FrecuenciaDet));

            lineas = mycert.OrderBy(p => p.Dia).ThenBy(q => q.Hora).ThenBy(r => r.Salida).ToList();

            EspacioContDTO espacio = GetEspacioContenido();

            string[,] DiasSemana = { { "LUNES", "MARTES", "MIERCOLES", "JUEVES", "VIERNES", "SABADO", "DOMINGO" }, { "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY" } };

            var lineasACopiar = lineas.FindAll((x) => (x.Fecha.DayOfYear >= fOrigenDesde.DayOfYear  && x.Fecha.DayOfYear <= fOrigenHasta.DayOfYear ));

            DateTime origenM;
            // ARMADO DE LINEAS SELECCIONADAS //
            for (int i = 0; i <= LineasOrigen.Count - 1; i++)
            {
                origenM = new DateTime(LineasOrigen[i].Fecha.Year, LineasOrigen[i].Fecha.Month, LineasOrigen[i].Fecha.Day);

                if (origenM >= fOrigenDesde && origenM <= fOrigenHasta)
                {
                    LineasSeleccionadas.Add(lineas[i]);
                }
            }

            //ORDENA LAS LINEAS SELECCIONADAS
            LineasSeleccionadas = LineasSeleccionadas.OrderBy(o => o.Dia).ThenBy(p => p.Hora).ThenBy(q => q.Salida).ToList();

            //CALCULO CANTIDAD DE DIAS EN EL MES
            int DiasEnMes = System.DateTime.DaysInMonth(LineasOrigen[0].Fecha.Year, LineasOrigen[0].Fecha.Month);

            //CALCULO CUAL ES EL DIA DE LA SEMANA DEL 1 DEL MES
            int DiaSemana = Convert.ToInt32(Convert.ToDateTime( LineasOrigen[0].Fecha.Year.ToString() + "-" + LineasOrigen[0].Fecha.Month.ToString("00") + "-" + "01").DayOfWeek);

            // RECORRO UNO A UNO LOS DIAS DEL MES
            for (int i = 1; i <= DiasEnMes; i++)
            {
                // PREGUNTO SI EL DIA DEL MES ESTA DENTRO DEL RANGO DE DIAS SELECCIONADOS COMO DESTINO
                if (i >= fDestinoDesde.Day && i <= fDestinoHasta.Day)
                {
                    DateTime muleto = new DateTime(LineasSeleccionadas[0].Fecha.Year, LineasSeleccionadas[0].Fecha.Month, i);
                    string diamuleto = muleto.DayOfWeek.ToString().Trim().ToUpper();

                    for (int x = 0; x <= DiasSemana.Length - 1; x++)
                    {
                        if (DiasSemana[1, x].ToUpper() == diamuleto)
                        {
                            diamuleto = DiasSemana[0, x].ToUpper();

                            break;
                        }
                    }

                    var listamuleto = frecuenciaDetalles.FindAll(q => q.DiaSemana.Trim().ToUpper() == diamuleto);

                    if (listamuleto.Count > 0)
                    {
                        //BUSCO A VER SI EXISTEN LINEAS PREVIAS CON DATOS PARA ESA FECHA
                        var newList = LineasOrigen.FindAll(s => s.Fecha.Day == i);

                        DAO.CertificadoDetDAO odd = new DAO.CertificadoDetDAO();

                        int LastId = odd.GetLastRecId();

                        if (newList.Count > 0)
                            LineasDestino.RemoveAll(p => p.Fecha.Day == i);

                        //NO HAY DATOS PREEXISTENTES PARA ESE DIA DEL MES
                        DateTime diaActual = new DateTime(LineasOrigen[0].Fecha.Year, LineasOrigen[0].Fecha.Month, i);

                        // CREO UNA NUEVA LINEA CON LOS DATOS DE LA PRESELECCION PARA ESE DIA DE LA SEMANA
                        for (int j = 0; j <= LineasSeleccionadas.Count - 1; j++)
                        {
                            var miLineaSeleccionada = LineasSeleccionadas[j].DiaSemana.ToUpper().Trim().Replace("É", "E").Replace("Á", "A");
                            var lista = frecuenciaDetalles.FindAll(q => q.DiaSemana.Trim() == miLineaSeleccionada);

                            if (lista.Count == 1)
                            {
                                CertificadoDetDTO newLine = new CertificadoDetDTO();

                                LastId++;
                                newLine.DatareaId  = 0;
                                newLine.RecId      = LastId;
                                newLine.Costo      = LineasSeleccionadas[j].Costo;
                                newLine.CostoOp    = LineasSeleccionadas[j].CostoOp;
                                newLine.CostoOpUni = LineasSeleccionadas[j].CostoOpUni;
                                newLine.CostoUni   = LineasSeleccionadas[j].CostoUni;
                                newLine.Dia        = i;
                                newLine.Fecha      = new DateTime(LineasSeleccionadas[j].Fecha.Year, LineasSeleccionadas[j].Fecha.Month, i);

                                string dia = newLine.Fecha.DayOfWeek.ToString().ToUpper();

                                for (int k = 0; k <= DiasSemana.Length - 1; k++)
                                {
                                    if (DiasSemana[1, k].ToUpper() == dia)
                                    {
                                        newLine.DiaSemana = DiasSemana[0, k].ToUpper();
                                        break;
                                    }
                                }

                                newLine.Duracion     = LineasSeleccionadas[j].Duracion;
                                newLine.Hora         = LineasSeleccionadas[j].Hora;
                                newLine.IdentifAviso = LineasSeleccionadas[j].IdentifAviso;
                                newLine.PautaId      = LineasSeleccionadas[j].PautaId;
                                newLine.Salida       = LineasSeleccionadas[j].Salida;

                                LineasDestino.Add(newLine);
                            }
                        }
                    }
                }

                DiaSemana = DiaSemana == 7 ? 1 : DiaSemana++;
            }
            mycert = LineasDestino.OrderBy(p => p.Dia).ThenBy(q => q.Hora).ThenBy(r => r.Salida).ToList();

            lineas = LineasDestino;

            return lineas;
        }
        private List<CertificadoDetDTO> GenerarLineas(TimeSpan horaInicio, TimeSpan horaFin, IntervaloDTO intervalo, FrecuenciaDTO frecuenciaCab, AvisosDTO aviso, List<FrecuenciaDetDTO> frecuenciaDetalles)
        {
            List<CertificadoDetDTO> lineas        = mycert;
            List<CertificadoDetDTO> preExistentes = new List<CertificadoDetDTO>();

            if (intervalo == null)
            {
                intervalo             = new IntervaloDTO();
                intervalo.CantMinutos = Convert.ToDecimal(0);
            }

            if (Validaciones(horaInicio, horaFin, intervalo, frecuenciaCab, aviso, frecuenciaDetalles) == false)
            {
                RefreshAbmGrid(gv);
                return lineas;
            }

            TimeSpan incremento = TimeSpan.FromMinutes(Convert.ToDouble(intervalo.CantMinutos));
            TimeSpan horaTemp;
            CertificadoDetDTO linea;
            List<DateTime> periodo;

            try
            {
                //Obtengo la lista de los días partiedo de fechas o nombres de dia.
                if (frecuenciaCab.SemMes == "SEMANA")
                    periodo = Certificados.GetDatesByDayNames(deAnoMes.Date.Year, deAnoMes.Date.Month, GetDiasSeleccionados());
                else
                    periodo = Certificados.GetDatesByDayNumbers(deAnoMes.Date.Year, deAnoMes.Date.Month, GetDiasSeleccionados());

                foreach (DateTime fecha in periodo)
                {
                    horaTemp = horaInicio;

                    if (aviso.Duracion == 0)
                    {
                        incremento = new TimeSpan(0);
                    }
                    else if (aviso.Duracion == null)
                    {
                        incremento = new TimeSpan(0);
                    }

                    if (horaTemp.CompareTo(horaFin) == 0)
                    {
                        horaFin = horaFin.Add(TimeSpan.FromHours(1));
                        incremento = incremento.Add(TimeSpan.FromHours(1));
                    }

                    if (incremento.Minutes == 0 && ((horaTemp.CompareTo(horaFin) == 0)))
                    {
                        horaFin = horaFin.Add(TimeSpan.FromHours(1));
                        incremento = incremento.Add(TimeSpan.FromHours(1));
                    }
                    else if (incremento.Minutes == 0 && ((horaTemp.CompareTo(horaFin) == 1)))
                    {
                        horaFin = horaFin.Add(TimeSpan.FromHours(-1));
                    }

                    //Mientras no supere la hora hasta...
                    while (horaTemp.CompareTo(horaFin) < 0)
                    {
                        DateTime fechaTmp = new DateTime(fecha.Year, fecha.Month, fecha.Day, horaTemp.Hours, horaTemp.Minutes, horaTemp.Seconds);

                        linea           = new CertificadoDetDTO();
                        linea.RecId     = lineas.Count;
                        linea.Fecha     = fechaTmp;
                        linea.Hora      = horaTemp;
                        linea.Dia       = fecha.Day;
                        linea.DiaSemana = fecha.ToString("dddd", new CultureInfo("es-ES")).ToUpper().Trim();

                        if (aviso != null)
                        {
                            linea.IdentifAviso = aviso.IdentifAviso;
                            linea.Duracion     = aviso.Duracion;
                        }
                        else
                        {
                            linea.IdentifAviso = string.Empty;
                            linea.Duracion     = null;
                        }

                        linea.Salida = spSalidasInsertar.Number;

                        if (!lineas.Exists(
                            (x) => (x.Fecha == fechaTmp && x.Hora == horaTemp && x.Salida == linea.Salida && x.IdentifAviso == linea.IdentifAviso)))
                        {
                            lineas.Add(linea);
                        }
                        else
                        {
                            preExistentes.Add(linea);
                        }

                        horaTemp = horaTemp.Add(incremento);

                        if (aviso.Duracion == null || aviso.Duracion == 0)
                        {
                            horaTemp = horaFin;
                        }
                    }
                }
            }

            catch (Exception ex)
            {
                MsgErrorLinas(ex);
            }

            if (preExistentes.Count > 0)
            {
                lblErrorLineas.Text = "No se pudieron grabar todas las lineas. No olvide GRABAR antes de continuar.";
            }

            RefreshAbmGrid(gv);

            return lineas;
        }
        private List<CertificadoDetDTO> CopiarPeriodos(DateTime fOrigenDesde, DateTime fOrigenHasta, DateTime fDestinoDesde, List<CertificadoDetDTO> lineas)
        {
            bool preExistentesFlag = false;
            EspacioContDTO espacio = GetEspacioContenido();

            //Armo lista de elemtnos que SI reemplazo.
            //Busco en la coleccion, todas las lineas en el periodo, y con el aviso seleccionado.
            var lineasACopiar = lineas.FindAll(
                (x) =>
                    (x.Fecha >= fOrigenDesde
                    && x.Fecha <= fOrigenHasta
                    ));

            //Si encontre líneas a copiar...
            if (lineasACopiar.Count > 0)
            {
                CertificadoDetDTO nuevaLinea;
                DateTime fechaTmp;
                List<CertificadoDetDTO> lineasTmp     = new List<CertificadoDetDTO>();
                List<CertificadoDetDTO> preExistentes = new List<CertificadoDetDTO>();

                DateTime diasEnElFuturo = fOrigenDesde;
                int cantDias;
                fechaTmp = fDestinoDesde;

                cantDias = 0;
                //Por cada linea que encontre, genero una nueva e igual, x dias en el futuro.
                foreach (var linea in lineasACopiar)
                {
                    FrecuenciaDTO frecuencia                  = CRUDHelper.Read(string.Format("IdentifFrecuencia = '{0}'", ucIdentifFrecuencia.SelectedValue), BusinessMapper.GetDaoByEntity(BusinessMapper.eEntities.Frecuencia));
                    List<FrecuenciaDetDTO> frecuenciaDetalles = CRUDHelper.ReadAll(string.Format("IdentifFrecuencia = '{0}'", frecuencia.IdentifFrecuencia), BusinessMapper.GetDaoByEntity(BusinessMapper.eEntities.FrecuenciaDet));

                    nuevaLinea = new CertificadoDetDTO();
                    nuevaLinea.RecId     = NextTempRecId();
                    nuevaLinea.DatareaId = linea.DatareaId;

                    //cargo lineas nuevas

                    if (fOrigenDesde != linea.Fecha)
                    {
                        cantDias++;
                        //cantDias = Convert.ToInt32(linea.Fecha.DayOfYear) - Convert.ToInt32(diasEnElFuturo.DayOfYear);
                        diasEnElFuturo = linea.Fecha;
                        fechaTmp = fechaTmp.AddDays(cantDias);
                    }

                    nuevaLinea.Fecha = fDestinoDesde.AddDays(cantDias);
                    nuevaLinea.Dia = nuevaLinea.Fecha.Day;

                    string[] sDias = { "DOMINGO", "LUNES", "MARTES", "MIERCOLES", "JUEVES", "VIERNES", "SABADO" };

                    for (int x = 0; x <= 6; x++)
                    {
                        if ((int)nuevaLinea.Fecha.DayOfWeek == x)
                        {
                            nuevaLinea.DiaSemana = sDias[x];
                        }
                    }

                    //evito que se carguen datos fuera de los dias pautados
                    bool retval = false;
                    for (int k = 0; k <= frecuenciaDetalles.Count - 1; k++)
                    {
                        if (nuevaLinea.DiaSemana.Trim() == frecuenciaDetalles[k].DiaSemana.Trim())
                        {
                            retval = true;
                            break;
                        }
                    }

                    if (retval == false)
                    {
                        throw new Exception("No se puede grabar en dias de semana distintos a los pautados.");
                    }
                    ////////////////////////////////////////////////////////
                    nuevaLinea.Hora         = linea.Hora        ;
                    nuevaLinea.Costo        = linea.Costo       ;
                    nuevaLinea.CostoOp      = linea.CostoOp     ;
                    nuevaLinea.CostoOpUni   = linea.CostoOpUni  ;
                    nuevaLinea.CostoUni     = linea.CostoUni    ;
                    nuevaLinea.Duracion     = linea.Duracion    ;
                    nuevaLinea.IdentifAviso = linea.IdentifAviso;
                    nuevaLinea.PautaId      = linea.PautaId     ;
                    nuevaLinea.Salida       = linea.Salida      ;

                    foreach (CertificadoDetDTO l in lineas)
                    {
                        if (l.Fecha == fechaTmp.Date)
                        {
                            if (l.Hora == linea.Hora)
                            {
                                if (l.Salida == nuevaLinea.Salida)
                                {
                                    //preExistentes.Add(nuevaLinea);
                                    preExistentes.Add(linea);
                                }
                            }
                        }
                    }

                    lineasTmp.Add(nuevaLinea);//Agrego la nueva linea.
                }

                //Junto las dos listas (temporal y la que ya tenia).
                lineasTmp.AddRange(lineas);

                //Ordeno por fecha.
                lineasTmp.Sort((x, y) => DateTime.Compare(x.Fecha, y.Fecha));

                if (preExistentesFlag == true)
                {
                    lblErrorLineas.Text = "No se pudieron grabar todas las lineas. No olvide GRABAR antes de continuar.";
                }

                //Guardo la lista en el Viewstate.
                gv.DataSource = lineasTmp;
                return lineasTmp;
            }
            else
            {
                throw new Exception("No hay avisos para copiar dentro del rango seleccionado");
            }
        }