protected override void Import(List <ImportRow> rows)
        {
            var procesados = 0;
            var erroneos   = 0;
            var index      = 0;
            var start      = DateTime.Now.Ticks;

            lblResult.Text = "";

            foreach (var row in rows)
            {
                try
                {
                    index++;

                    var codComercio    = GetValue(row, Fields.CodComercio.Value).Trim();
                    var nombreComercio = GetValue(row, Fields.NombreComercio.Value).Trim();
                    if (codComercio == string.Empty)
                    {
                        erroneos++;
                        Log("FILA ERRONEA", index, "COD. TALLER = VACIO");
                        continue;
                    }
                    var taller = DAOFactory.TallerDAO.GetByCode(codComercio);
                    if (taller == null)
                    {
                        erroneos++;
                        Log("FILA ERRONEA", index, "TALLER INEXISTENTE: " + codComercio + " - " + nombreComercio);
                        continue;
                    }

                    var nroCliente  = GetValue(row, Fields.NroCliente.Value).Trim();
                    var razonSocial = GetValue(row, Fields.RazonSocial.Value).Trim();
                    if (nroCliente == string.Empty)
                    {
                        erroneos++;
                        Log("FILA ERRONEA", index, "COD. CLIENTE = VACIO");
                        continue;
                    }
                    var empresa = DAOFactory.EmpresaDAO.FindByCodigo(nroCliente);
                    if (empresa == null)
                    {
                        erroneos++;
                        Log("FILA ERRONEA", index, "CLIENTE INEXISTENTE: " + nroCliente + " - " + razonSocial);
                        continue;
                    }

                    var patente = GetValue(row, Fields.Patente.Value).Trim();
                    if (patente == string.Empty)
                    {
                        erroneos++;
                        Log("FILA ERRONEA", index, "PATENTE = VACIO");
                        continue;
                    }
                    var vehiculo = DAOFactory.CocheDAO.FindByPatente(empresa.Id, patente);
                    if (vehiculo == null)
                    {
                        erroneos++;
                        Log("FILA ERRONEA", index, "VEHICULO INEXISTENTE: " + patente);
                        continue;
                    }

                    var empleado    = GetValue(row, Fields.Empleado.Value).Trim();
                    var responsable = empleado != string.Empty
                                          ? DAOFactory.EmpleadoDAO.FindByLegajo(empresa.Id, -1, empleado)
                                          : null;

                    var descripcion = GetValue(row, Fields.Descripcion.Value).Trim();
                    if (descripcion == string.Empty)
                    {
                        erroneos++;
                        Log("FILA ERRONEA", index, "NO EXISTE DESCRIPCION");
                        continue;
                    }
                    var    solicitud      = GetValue(row, Fields.Solicitud.Value).Trim();
                    var    nroPresupuesto = GetValue(row, Fields.NroPresupuesto.Value).Trim();
                    var    monto          = GetValue(row, Fields.Monto.Value).Trim();
                    double valor;
                    double.TryParse(monto, out valor);

                    var ingresoSolicitud = GetValue(row, Fields.IngresoSolicitud.Value).Trim();
                    if (ingresoSolicitud == string.Empty)
                    {
                        erroneos++;
                        Log("FILA ERRONEA", index, "SIN FECHA DE INGRESO DE SOLICITUD");
                        continue;
                    }
                    var dtIngresoSolicitud = DateTime.Parse(ingresoSolicitud).ToDataBaseDateTime();

                    var      fechaTurno = GetValue(row, Fields.FechaTurno.Value).Trim();
                    DateTime dtFt;
                    var      dtFechaTurno = DateTime.TryParse(fechaTurno, out dtFt) ? dtFt.ToDataBaseDateTime() : (DateTime?)null;

                    var      fechaRecepcion = GetValue(row, Fields.FechaRecepcion.Value).Trim();
                    DateTime dtRec;
                    var      dtFechaRecepcion = DateTime.TryParse(fechaRecepcion, out dtRec) ? dtRec.ToDataBaseDateTime() : (DateTime?)null;

                    var      primerPresupuesto      = GetValue(row, Fields.PrimerPresupuesto.Value).Trim();
                    var      fechaPrimerPresupuesto = GetValue(row, Fields.FechaPrimerPresupuesto.Value).Trim();
                    DateTime dtPrimerPres;
                    var      dtPromerPresupuesto = DateTime.TryParse(fechaPrimerPresupuesto, out dtPrimerPres) ? dtPrimerPres.ToDataBaseDateTime() : (DateTime?)null;

                    var      fechaPresupuestada = GetValue(row, Fields.FechaPresupuestada.Value).Trim();
                    DateTime dtPres;
                    var      dtFechaPresupuestada = DateTime.TryParse(fechaPresupuestada, out dtPres) ? dtPres.ToDataBaseDateTime() : (DateTime?)null;

                    var      fechaRecotizacion = GetValue(row, Fields.FechaRecotizacion.Value).Trim();
                    DateTime dtRecot;
                    var      dtFechaRecotizacion = DateTime.TryParse(fechaRecotizacion, out dtRecot) ? dtRecot.ToDataBaseDateTime() : (DateTime?)null;

                    var      fechaVerificacion = GetValue(row, Fields.FechaVerificacion.Value).Trim();
                    DateTime dtVerif;
                    var      dtFechaVerificacion = DateTime.TryParse(fechaVerificacion, out dtVerif) ? dtVerif.ToDataBaseDateTime() : (DateTime?)null;

                    var      fechaAprobacion = GetValue(row, Fields.FechaAprobacion.Value).Trim();
                    DateTime dtAprob;
                    var      dtFechaAprobacion = DateTime.TryParse(fechaAprobacion, out dtAprob) ? dtAprob.ToDataBaseDateTime() : (DateTime?)null;

                    var      fechaTrabajoTerminado = GetValue(row, Fields.FechaTrabajoTerminado.Value).Trim();
                    DateTime dtTrabajoTer;
                    var      dtFechaTrabajoTerminado = DateTime.TryParse(fechaTrabajoTerminado, out dtTrabajoTer) ? dtTrabajoTer.ToDataBaseDateTime() : (DateTime?)null;

                    var      fechaEntrega = GetValue(row, Fields.FechaEntrega.Value).Trim();
                    DateTime dtEnt;
                    var      dtFechaEntrega = DateTime.TryParse(fechaEntrega, out dtEnt) ? dtEnt.ToDataBaseDateTime() : (DateTime?)null;

                    var      fechaTrabajoAceptado = GetValue(row, Fields.FechaTrabajoAceptado.Value).Trim();
                    DateTime dtTrabajoAcep;
                    var      dtFechaTrabajoAceptado = DateTime.TryParse(fechaTrabajoAceptado, out dtTrabajoAcep) ? dtTrabajoAcep.ToDataBaseDateTime() : (DateTime?)null;

                    var estSolicitud = GetValue(row, Fields.EstadoSolicitud.Value).Trim();
                    if (estSolicitud == string.Empty)
                    {
                        erroneos++;
                        Log("FILA ERRONEA", index, "SIN ESTADO DE SOLICITUD");
                        continue;
                    }
                    var estadoSolicitud = -1;
                    switch (estSolicitud)
                    {
                    case "INGRESADA": estadoSolicitud = TicketMantenimiento.EstadosTicket.Ingresado; break;

                    case "APROBADA": estadoSolicitud = TicketMantenimiento.EstadosTicket.Aprobado; break;

                    case "TERMINADA": estadoSolicitud = TicketMantenimiento.EstadosTicket.Terminado; break;

                    case "TRABAJO ACEPTADO": estadoSolicitud = TicketMantenimiento.EstadosTicket.Aceptado; break;

                    case "TRABAJO NO ACEPTADO": estadoSolicitud = TicketMantenimiento.EstadosTicket.NoAceptado; break;

                    case "CANCELADA": estadoSolicitud = TicketMantenimiento.EstadosTicket.Cancelado; break;

                    default:
                    {
                        erroneos++;
                        Log("FILA ERRONEA", index, "ESTADO DE SOLICITUD NO ENCONTRADO: " + estadoSolicitud);
                        continue;
                    }
                    }

                    var estPresupuesto    = GetValue(row, Fields.EstadoPresupuesto.Value).Trim();
                    var estadoPresupuesto = TicketMantenimiento.EstadosPresupuesto.SinPresupuesto;
                    switch (estPresupuesto)
                    {
                    case "TRABAJO ACEPT. CLIENTE": estadoPresupuesto = TicketMantenimiento.EstadosPresupuesto.AceptadoCliente; break;

                    case "APROBADO": estadoPresupuesto = TicketMantenimiento.EstadosPresupuesto.Aprobado; break;

                    case "PRESUPUESTADA": estadoPresupuesto = TicketMantenimiento.EstadosPresupuesto.Presupuestado; break;

                    case "PEDIDO RECOTIZADO": estadoPresupuesto = TicketMantenimiento.EstadosPresupuesto.Recotizado; break;

                    case "TRABAJO TERMINADO": estadoPresupuesto = TicketMantenimiento.EstadosPresupuesto.Terminado; break;

                    case "VERIF. SIN APROBAR": estadoPresupuesto = TicketMantenimiento.EstadosPresupuesto.VerificadoSinAprobar; break;

                    case "CANCELADO": estadoPresupuesto = TicketMantenimiento.EstadosPresupuesto.Cancelado; break;
                    }

                    var nivelComp        = GetValue(row, Fields.NivelComplejidad.Value).Trim();
                    var nivelComplejidad = TicketMantenimiento.NivelesComplejidad.Baja;
                    switch (nivelComp)
                    {
                    case "Media": nivelComplejidad = TicketMantenimiento.NivelesComplejidad.Media; break;

                    case "Alta": nivelComplejidad = TicketMantenimiento.NivelesComplejidad.Alta; break;

                    case "Muy Alta": nivelComplejidad = TicketMantenimiento.NivelesComplejidad.MuyAlta; break;
                    }

                    var ticket = GetTicket(empresa, solicitud);

                    ticket.Taller                   = taller;
                    ticket.Vehiculo                 = vehiculo;
                    ticket.Empleado                 = responsable;
                    ticket.Descripcion              = descripcion;
                    ticket.Presupuesto              = nroPresupuesto;
                    ticket.Monto                    = valor;
                    ticket.FechaSolicitud           = dtIngresoSolicitud;
                    ticket.FechaTurno               = dtFechaTurno;
                    ticket.FechaRecepcion           = dtFechaRecepcion;
                    ticket.PrimerPresupuesto        = primerPresupuesto;
                    ticket.FechaPresupuestoOriginal = dtPromerPresupuesto;
                    ticket.FechaPresupuestada       = dtFechaPresupuestada;
                    ticket.FechaRecotizacion        = dtFechaRecotizacion;
                    ticket.FechaVerificacion        = dtFechaVerificacion;
                    ticket.FechaAprobacion          = dtFechaAprobacion;
                    ticket.FechaTrabajoTerminado    = dtFechaTrabajoTerminado;
                    ticket.FechaEntrega             = dtFechaEntrega;
                    ticket.FechaTrabajoAceptado     = dtFechaTrabajoAceptado;
                    ticket.Estado                   = (short)estadoSolicitud;
                    ticket.EstadoPresupuesto        = estadoPresupuesto;
                    ticket.NivelComplejidad         = nivelComplejidad;

                    var historia = new HistoriaTicketMantenimiento
                    {
                        Codigo                   = ticket.Codigo,
                        Descripcion              = ticket.Descripcion,
                        Empresa                  = ticket.Empresa,
                        Empleado                 = ticket.Empleado,
                        Estado                   = ticket.Estado,
                        EstadoPresupuesto        = ticket.EstadoPresupuesto,
                        Fecha                    = DateTime.UtcNow,
                        FechaAprobacion          = ticket.FechaAprobacion,
                        FechaEntrega             = ticket.FechaEntrega,
                        FechaPresupuestada       = ticket.FechaPresupuestada,
                        FechaPresupuestoOriginal = ticket.FechaPresupuestoOriginal,
                        FechaRecepcion           = ticket.FechaRecepcion,
                        FechaRecotizacion        = ticket.FechaRecotizacion,
                        FechaSolicitud           = ticket.FechaSolicitud,
                        FechaTrabajoAceptado     = ticket.FechaTrabajoAceptado,
                        FechaTrabajoTerminado    = ticket.FechaTrabajoTerminado,
                        FechaTurno               = ticket.FechaTurno,
                        FechaVerificacion        = ticket.FechaVerificacion,
                        Monto                    = ticket.Monto,
                        NivelComplejidad         = ticket.NivelComplejidad,
                        Presupuesto              = ticket.Presupuesto,
                        PrimerPresupuesto        = ticket.PrimerPresupuesto,
                        Taller                   = ticket.Taller,
                        TicketMantenimiento      = ticket,
                        Usuario                  = DAOFactory.UsuarioDAO.FindById(Usuario.Id),
                        Vehiculo                 = ticket.Vehiculo
                    };

                    ticket.Historia.Add(historia);

                    DAOFactory.TicketMantenimientoDAO.SaveOrUpdate(ticket);

                    procesados++;
                }
                catch (Exception)
                {
                    erroneos++;
                    Log("FILA ERRONEA", index, string.Empty);
                }
            }
            const int totalWidth = 200;
            var       percent    = index * 100 / rows.Count;

            litProgress.Text = string.Format(
                @"<div style='margin: auto; border: solid 1px #999999; background-color: #FFFFFF; width: {0}px; height: 10px;'>
                        <div style='background-color: #0000AA; width: {1}px; height: 10px; font-size: 8px; color: #CCCCCC;'>{2}%</div>
                    </div>",
                totalWidth, percent * totalWidth / 100, percent);
            lblDirs.Text = string.Format(Reporte,
                                         procesados + erroneos,
                                         rows.Count,
                                         procesados,
                                         rows.Count > 0 ? (procesados * 100.0 / rows.Count).ToString("0.00") : "0.00",
                                         erroneos,
                                         rows.Count > 0 ? (erroneos * 100.0 / rows.Count).ToString("0.00") : "0.00",
                                         TimeSpan.FromTicks(DateTime.Now.Ticks - start));
            panelProgress.Visible = true;
        }
        protected override void OnSave()
        {
            EditObject.Taller = cbTaller.Selected > 0 ? DAOFactory.TallerDAO.FindById(cbTaller.Selected) : null;
            if (dtInicio.SelectedDate.HasValue)
            {
                EditObject.FechaSolicitud = SecurityExtensions.ToDataBaseDateTime(dtInicio.SelectedDate.Value);
            }
            EditObject.Codigo           = txtCodigo.Text;
            EditObject.NivelComplejidad = (short)cbNivel.Selected;
            EditObject.Estado           = (short)cbEstado.Selected;
            EditObject.Empresa          = cbEmpresa.Selected > 0 ? DAOFactory.EmpresaDAO.FindById(cbEmpresa.Selected) : null;
            EditObject.Vehiculo         = cbVehiculo.Selected > 0 ? DAOFactory.CocheDAO.FindById(cbVehiculo.Selected) : null;
            EditObject.Empleado         = cbEmpleado.Selected > 0 ? DAOFactory.EmpleadoDAO.FindById(cbEmpleado.Selected) : null;

            EditObject.FechaTurno            = dtTurno.SelectedDate.HasValue ? SecurityExtensions.ToDataBaseDateTime(dtTurno.SelectedDate.Value) : (DateTime?)null;
            EditObject.FechaRecepcion        = dtRecepcion.SelectedDate.HasValue ? SecurityExtensions.ToDataBaseDateTime(dtRecepcion.SelectedDate.Value) : (DateTime?)null;
            EditObject.FechaVerificacion     = dtVerificacion.SelectedDate.HasValue ? SecurityExtensions.ToDataBaseDateTime(dtVerificacion.SelectedDate.Value) : (DateTime?)null;
            EditObject.FechaTrabajoTerminado = dtTrabajoTerminado.SelectedDate.HasValue ? SecurityExtensions.ToDataBaseDateTime(dtTrabajoTerminado.SelectedDate.Value) : (DateTime?)null;
            EditObject.FechaEntrega          = dtEntrega.SelectedDate.HasValue ? SecurityExtensions.ToDataBaseDateTime(dtEntrega.SelectedDate.Value) : (DateTime?)null;
            EditObject.FechaTrabajoAceptado  = dtTrabajoAceptado.SelectedDate.HasValue ? SecurityExtensions.ToDataBaseDateTime(dtTrabajoAceptado.SelectedDate.Value) : (DateTime?)null;

            EditObject.Presupuesto = txtPresupuesto.Text;
            double monto;

            double.TryParse(txtMonto.Text, out monto);
            EditObject.Monto = monto;
            EditObject.FechaPresupuestada       = dtPresupuesto.SelectedDate.HasValue ? SecurityExtensions.ToDataBaseDateTime(dtPresupuesto.SelectedDate.Value) : (DateTime?)null;
            EditObject.EstadoPresupuesto        = (short)cbEstadoPresupuesto.Selected;
            EditObject.PrimerPresupuesto        = txtPrimerPresupuesto.Text;
            EditObject.FechaPresupuestoOriginal = dtPrimerPresupuesto.SelectedDate.HasValue ? SecurityExtensions.ToDataBaseDateTime(dtPrimerPresupuesto.SelectedDate.Value) : (DateTime?)null;
            EditObject.FechaRecotizacion        = dtRecotizacion.SelectedDate.HasValue ? SecurityExtensions.ToDataBaseDateTime(dtRecotizacion.SelectedDate.Value) : (DateTime?)null;
            EditObject.FechaAprobacion          = dtAprobacion.SelectedDate.HasValue ? SecurityExtensions.ToDataBaseDateTime(dtAprobacion.SelectedDate.Value) : (DateTime?)null;
            EditObject.Descripcion = txtDescripcion.Text;

            var historia = new HistoriaTicketMantenimiento
            {
                Codigo                   = EditObject.Codigo,
                Descripcion              = EditObject.Descripcion,
                Empleado                 = EditObject.Empleado,
                Empresa                  = EditObject.Empresa,
                Estado                   = EditObject.Estado,
                EstadoPresupuesto        = EditObject.EstadoPresupuesto,
                Fecha                    = DateTime.UtcNow,
                FechaAprobacion          = EditObject.FechaAprobacion,
                FechaEntrega             = EditObject.FechaEntrega,
                FechaPresupuestada       = EditObject.FechaPresupuestada,
                FechaPresupuestoOriginal = EditObject.FechaPresupuestoOriginal,
                FechaRecepcion           = EditObject.FechaRecepcion,
                FechaRecotizacion        = EditObject.FechaRecotizacion,
                FechaSolicitud           = EditObject.FechaSolicitud,
                FechaTrabajoAceptado     = EditObject.FechaTrabajoAceptado,
                FechaTrabajoTerminado    = EditObject.FechaTrabajoTerminado,
                FechaTurno               = EditObject.FechaTurno,
                FechaVerificacion        = EditObject.FechaVerificacion,
                Monto                    = EditObject.Monto,
                NivelComplejidad         = EditObject.NivelComplejidad,
                Presupuesto              = EditObject.Presupuesto,
                PrimerPresupuesto        = EditObject.PrimerPresupuesto,
                Taller                   = EditObject.Taller,
                TicketMantenimiento      = EditObject,
                Usuario                  = DAOFactory.UsuarioDAO.FindById(Usuario.Id),
                Vehiculo                 = EditObject.Vehiculo
            };

            EditObject.Historia.Add(historia);

            DAOFactory.TicketMantenimientoDAO.SaveOrUpdate(EditObject);
        }