Exemplo n.º 1
0
        public static CorridaAutorizacionDto ToCorridaDto(CorridaAutorizacion corrida, List <TipoDocumento> tiposDoc, List <TipoComprobante> tiposComprobante, List <TipoConcepto> tiposConcepto)
        {
            CorridaAutorizacionDto dto = new CorridaAutorizacionDto();

            dto.Id              = corrida.Id;
            dto.Fecha           = corrida.Fecha;
            dto.Procesada       = corrida.Procesada;
            dto.NombreDeArchivo = Path.GetFileName(corrida.PathArchivo);
            dto.PathArchivo     = corrida.PathArchivo;

            if (tiposComprobante != null)
            {
                DetalleCabecera cabecera = corrida.DetalleCabeceras.FirstOrDefault();
                if (cabecera != null)
                {
                    TipoComprobante tipoComprobante = tiposComprobante.Where(c => c.CodigoAfip == cabecera.CbteTipo).First();
                    dto.TipoComprobante = string.Format("{0} - {1}", tipoComprobante.CodigoAfip, tipoComprobante.Descripcion);
                }
            }
            dto.ComprobantesAutorizados      = ToDetalleComprobateDtoList(corrida.DetalleComprobantes.Where(dc => dc.Resultado == ResultadoCbte.Aprobado && dc.CorridaId == corrida.Id).ToList(), tiposDoc, tiposConcepto);
            dto.ComprobantesConObservaciones = ToDetalleComprobateDtoList(corrida.DetalleComprobantes.Where(dc => dc.Resultado == ResultadoCbte.Rechazado && dc.CorridaId == corrida.Id).ToList(), tiposDoc, tiposConcepto);
            dto.Errores = ToDetalleErrorDtoList(corrida.DetalleErrores.Where(e => e.CorridaId == corrida.Id).ToList());
            dto.Eventos = ToDetalleEventoDtoList(corrida.DetalleEventos.Where(e => e.CorridaId == corrida.Id).ToList());

            return(dto);
        }
Exemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="corridaId"></param>
        /// <remarks>El metodo se ejecuta asincronicamente</remarks>
        public void EjecutarCorrida(long corridaId)
        {
            CorridaService corridaSvc = new CorridaService();

            var corridas = corridaSvc.ObtenerCorridas(new CorridaSearch()
            {
                CorridaId = corridaId
            });

            if (corridas.Count == 1)
            {
                CorridaAutorizacionDto corridaAutorizacionDto = corridas.Single();

                // Asigno el verdadero path
                // El path se forma con la corrida y la configuracion
                string basePath = ConfigurationManager.AppSettings["PathDestinoArchivosFactura"];
                basePath = Path.Combine(basePath, "ArchivosXml");
                basePath = Path.Combine(basePath, corridaId.ToString());
                basePath = Path.Combine(basePath, corridaAutorizacionDto.PathArchivo);
                corridaAutorizacionDto.PathArchivo = basePath;

                ProcesoAutorizador autorizador = new ProcesoAutorizador(true);
                autorizador.AutorizarComprobantes(corridaAutorizacionDto);
            }
        }
Exemplo n.º 3
0
        private void MostrarFinCorrida()
        {
            this.timerAutorizacion.Stop();
            this.progressBar.Value = 100;

            this.corridaDto = this.procesoCorridaSvc.ObtenerCorridas(new CorridaSearch()
            {
                CorridaId = this.corridaDto.Id
            }).Single();
            //this.corridaDto =
            if (corridaDto != null)
            {
                if (corridaDto.ComprobantesAutorizados != null)
                {
                    this.lblComprobantesAutorizados.Text = corridaDto.ComprobantesAutorizados.Count().ToString();
                }
                if (corridaDto.ComprobantesConObservaciones != null)
                {
                    this.lblComprobantesConObs.Text = corridaDto.ComprobantesConObservaciones.Count().ToString();
                }
                if (corridaDto.Errores != null)
                {
                    this.lblErroresEncontrados.Text = corridaDto.Errores.Count().ToString();
                }
                if (corridaDto.Eventos != null)
                {
                    this.lblEventos.Text = corridaDto.Eventos.Count().ToString();
                }
            }

            this.timerAutorizacion.Enabled    = false;
            this.btnExaminar.Enabled          = true;
            this.btnAutorizar.Enabled         = false;
            this.btnVerDetalleCorrida.Enabled = true;
        }
Exemplo n.º 4
0
 private void gridCorridas_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
 {
     try
     {
         if (this.gridCorridas.SelectedRows.Count > 0)
         {
             CorridaAutorizacionDto    corridaDto = this.gridCorridas.SelectedRows[0].DataBoundItem as CorridaAutorizacionDto;
             FormAutorizadorResultados frm        = new FormAutorizadorResultados(corridaDto);
             frm.ShowDialog(this);
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
Exemplo n.º 5
0
        private void AutorizarButton_Click(object sender, EventArgs e)
        {
            try
            {
                this.btnExaminar.Enabled  = false;
                this.btnAutorizar.Enabled = false;
                this.LogTextBox.Text      = string.Empty;
                lastLogId = null;
                this.txtNroCorrida.Text = string.Empty;

                // Validar Entrada
                if (!this.ValidarDatosDeEntrada())
                {
                    MessageBox.Show(this.validacionEntradaDatos.ToString(),
                                    "Validación Datos de entrada",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Exclamation);
                    return;
                }

                string origenPath = this.FileTextBox.Text.Trim();
                string fileName   = Path.GetFileName(origenPath);

                this.MostrarMensajeEnLog("Preparando ejecución....");

                this.corridaDto = procesoCorridaSvc.CrearNuevaCorrida(fileName);

                this.MostrarMensajeEnLog("Enviando archivos por FTP....");
                CopiarArchivoParaProcesarPorFTP(origenPath);
                this.MostrarMensajeEnLog("Archivos enviados al FTP.");
                this.lastLogId          = null;
                this.txtNroCorrida.Text = this.corridaDto.Id.ToString();

                this.MostrarMensajeEnLog("Iniciando ejecución asincrónica...");

                this.timerAutorizacion.Enabled = true;
                this.timerAutorizacion.Start();

                ThreadPool.QueueUserWorkItem(new WaitCallback(EjecutarCorridaCallBack), this.corridaDto.Id);
            }
            catch (Exception ex)
            {
                this.MostrarMensajeEnLog(ex.Message);
            }
        }
Exemplo n.º 6
0
        public CorridaAutorizacionDto CrearNuevaCorrida(string nombreDeArchivo)
        {
            CorridaAutorizacionDto      dto    = null;
            ProcesoCorridaServiceClient client = new ProcesoCorridaServiceClient();

            ClientCredentialHelper.SetCredentials(client.ClientCredentials);
            try
            {
                dto = client.CrearNuevaCorrida(nombreDeArchivo);
                client.Close();
            }
            catch
            {
                if (client.State != System.ServiceModel.CommunicationState.Closed)
                {
                    client.Abort();
                }

                throw;
            }

            return(dto);
        }
Exemplo n.º 7
0
 public FormAutorizadorResultados(CorridaAutorizacionDto corridaDto)
     : this()
 {
     this.corridaDto = corridaDto;
 }
Exemplo n.º 8
0
        public CorridaAutorizacionDto AutorizarComprobantes(CorridaAutorizacionDto corridaDto)
        {
            try
            {
                this.corridaDto = corridaDto;
                string pathArchivoOrigen = corridaDto.PathArchivo;

                if (string.IsNullOrEmpty(corridaDto.PathArchivo))
                {
                    this.Log("ERROR: No se ha ingresado el path del archivo");
                }

                // Cambio para el WSFEX

                bool procesarFacturaExportacion = false;
                using (StreamReader reader = new StreamReader(corridaDto.PathArchivo))
                {
                    string line = reader.ReadLine();
                    line = reader.ReadLine();
                    if (line.Contains("FacturaExportacion"))
                    {
                        procesarFacturaExportacion = true;
                    }
                    reader.Close();
                }

                if (procesarFacturaExportacion)
                {
                    corridaDto = AutorizarComprobantesParaWsFeX(this.corridaDto);
                }
                else
                {
                    // Fin Cambio para el WSFEX

                    // Marco la corrida como en proceso en la base de datos
                    if (this.corridaSvc.MarcarCorridaEnProceso(corridaDto.Id))
                    {
                        // Inicio Proceso
                        this.Log(string.Format("Iniciando procesamiento de archivo {0}...", this.nombreDeArchivo));

                        // Valido el Esquema de Xml
                        this.Log(string.Format("Validando esquema de archivo"));
                        string xmlSchemaPath = "";

                        if (!this.ValidarEsquemaXml(corridaDto.PathArchivo, xmlSchemaPath))
                        {
                            StringBuilder sb = new StringBuilder();
                            sb.AppendLine("ERROR: el formato del archivo es invalido");
                            sb.AppendLine(this.validacionesEsquema.ToString());
                            this.Log(sb.ToString());
                            return(null);
                        }

                        // Leo archivo XML y lo paso a string
                        this.Log("Leyendo archivo...");
                        string xmlString = LeerArchivo(corridaDto.PathArchivo);

                        // Reemplazo <Lote></Lote> por <FeCAEReq></FeCAEReq>
                        xmlString = xmlString.Replace("<Lote>", "<FECAERequest>").Replace("</Lote>", "</FECAERequest>");

                        // Deserealizo el XML y obtengo solo la parte del request
                        FECAERequest feCAERequest = null;
                        try
                        {
                            feCAERequest = DeserializarXml <FECAERequest>(xmlString);
                        }
                        catch (Exception ex)
                        {
                            this.Log("El formato del archivo es inválido.");
                            return(null);
                        }

                        // Obtengo Ticket de Autorizacion
                        this.Log("Iniciando comunicacion con la AFIP");
                        FEAuthRequest feAuthRequest = this.ObtenerTicket();

                        // Cargo los comprobantes que estan autorizados en la AFIP
                        // pero que no fueron cargados en la DB por problemas en
                        // la comunicacion
                        this.CargarComprobantesYaAutorizados(feAuthRequest, feCAERequest);

                        // Remover Comprobantes que ya han sido autorizados
                        string resultado = this.RemoverComprobantesAutorizados(feAuthRequest, feCAERequest);
                        if (!string.IsNullOrEmpty(resultado))
                        {
                            this.Log(resultado);
                            feCAERequest.FeCabReq.CantReg = feCAERequest.FeDetReq.Count();
                        }

                        if (feCAERequest.FeDetReq != null && feCAERequest.FeDetReq.Count() > 0)
                        {
                            // Autorizar Comprobantes con la AFIP
                            this.Log("Autorizando Comprobantes con la AFIP...");
                            FECAEResponse feCAEResponse = this.AutorizarComprobantes(feAuthRequest, feCAERequest);

                            // Proceso Resultado AFIP
                            this.Log("Procesando respuesta de la AFIP...");
                            corridaDto = this.corridaSvc.ProcesarCorrida(corridaDto, feCAEResponse);
                        }
                        else
                        {
                            // Todos los comprobantes del archivo ya tienen un CAE asignado
                            // y existen en DB
                            this.Log("Todos los comprobantes del archivo ya han sido autorizados");
                        }

                        // Muevo el archivo a una carpeta de procesados
                        GuardarArchivoProcesado(pathArchivoOrigen);

                        this.Log("Fin procesamiento de archivo.");
                    }
                    else
                    {
                        this.Log("La corrida ya se está ejecutando");
                    }
                }

                return(corridaDto);
            }
            catch (Exception ex)
            {
                string detalle = string.Format("ex.Message: {0} ex.StackTrace: {1}", ex.Message, ex.StackTrace);
                this.Log(string.Format("ERROR: Se ha producido un error. Contactese con el administrador. Error: {0}", ex.Message), detalle);
                return(null);
            }
            finally
            {
                this.Log(CorridaService.FinCorridaMsg);
            }
        }
Exemplo n.º 9
0
        public CorridaAutorizacionDto AutorizarComprobantesParaWsFeX(CorridaAutorizacionDto corridaDto)
        {
            try
            {
                this.corridaDto = corridaDto;
                string pathArchivoOrigen = corridaDto.PathArchivo;

                if (string.IsNullOrEmpty(corridaDto.PathArchivo))
                {
                    this.Log("ERROR: No se ha ingresado el path del archivo");
                }

                // Marco la corrida como en proceso en la base de datos
                if (this.corridaSvc.MarcarCorridaEnProceso(corridaDto.Id))
                {
                    // Inicio Proceso
                    this.Log(string.Format("Iniciando procesamiento de archivo {0}...", this.nombreDeArchivo));

                    // Valido el Esquema de Xml
                    this.Log(string.Format("Validando esquema de archivo"));
                    string xmlSchemaPath = "";

                    if (!this.ValidarEsquemaXml(corridaDto.PathArchivo, xmlSchemaPath))
                    {
                        StringBuilder sb = new StringBuilder();
                        sb.AppendLine("ERROR: el formato del archivo es invalido");
                        sb.AppendLine(this.validacionesEsquema.ToString());
                        this.Log(sb.ToString());
                        return(null);
                    }

                    // Leo archivo XML y lo paso a string
                    this.Log("Leyendo archivo...");
                    string xmlString = LeerArchivo(corridaDto.PathArchivo);

                    // Reemplazo <Lote></Lote> por <FeCAEReq></FeCAEReq>
                    xmlString = xmlString.Replace("<FacturaExportacion>", "<ClsFEXRequest>").Replace("</FacturaExportacion>", "</ClsFEXRequest>");

                    // Deserealizo el XML y obtengo solo la parte del request
                    ClsFEXRequest feXCAERequest = null;
                    try
                    {
                        feXCAERequest = DeserializarXml <ClsFEXRequest>(xmlString, "http://ar.gov.afip.dif.fexv1/");

                        //feXCAERequest = new ClsFEXRequest();
                        //feXCAERequest.Id = 1;
                        //feXCAERequest.Fecha_cbte = "20120820";
                        //feXCAERequest.Punto_vta = 19;
                        //feXCAERequest.Cbte_nro = 1;
                        //feXCAERequest.Tipo_expo = 1;
                        //feXCAERequest.Permiso_existente = "S";
                        //feXCAERequest.Permisos = new Permiso[2];
                        //feXCAERequest.Permisos[0] = new Permiso();
                        //feXCAERequest.Permisos[0].Dst_merc = 203;
                        //feXCAERequest.Permisos[1] = new Permiso();
                        //feXCAERequest.Permisos[1].Id_permiso = "09052EC01006154G";
                        //feXCAERequest.Permisos[1].Dst_merc = 202;
                        //feXCAERequest.Dst_cmp = 203;
                        //feXCAERequest.Cliente = "Joao Da Silva";
                        //feXCAERequest.Cuit_pais_cliente = 50000000016;
                        //feXCAERequest.Domicilio_cliente = "Rua 76 km 34.5 Alagoas";
                        //feXCAERequest.Id_impositivo = "PJ54482221-l";
                        //feXCAERequest.Moneda_Id = "012";
                        //feXCAERequest.Moneda_ctz = 0.51M;
                        //feXCAERequest.Obs_comerciales = "Sin observaciones";
                        //feXCAERequest.Imp_total = 500;
                        //feXCAERequest.Forma_pago = "Contado";
                        //feXCAERequest.Incoterms = "CIF";
                        //feXCAERequest.Incoterms_Ds = "Texto dic.";
                        //feXCAERequest.Idioma_cbte = 1;
                        //feXCAERequest.Items = new Item[1];
                        //feXCAERequest.Items[0] = new Item();
                        //feXCAERequest.Items[0].Pro_codigo = "PRO1";
                        //feXCAERequest.Items[0].Pro_ds = "Producto Tipo 1 Exportacion MERCOSUR ISO 9001";
                        //feXCAERequest.Items[0].Pro_qty = 2;
                        //feXCAERequest.Items[0].Pro_umed = 7;
                        //feXCAERequest.Items[0].Pro_precio_uni = 250;
                        //feXCAERequest.Items[0].Pro_total_item = 500;

                        //feXCAERequest.Cmps_asoc = new Cmp_asoc[0];

                        //var revisar = SerializarXml<ClsFEXRequest>(feXCAERequest);
                        //revisar = revisar.ToString();
                    }
                    catch (Exception ex)
                    {
                        this.Log("El formato del archivo es inválido.");
                        return(null);
                    }

                    // Obtengo Ticket de Autorizacion
                    this.Log("Iniciando comunicacion con la AFIP");
                    ClsFEXAuthRequest feXAuthRequest = this.ObtenerTicketWSFeX();

                    // Cargo los comprobantes que estan autorizados en la AFIP
                    // pero que no fueron cargados en la DB por problemas en
                    // la comunicacion
                    //-------------------------------------
                    //-------------------------------------
                    // IMPORTANTE!!!!!!
                    //-------------------------------------
                    //-------------------------------------
                    // El siguiente codigo tiene que refactorearse según como trabaja este nuevo servicio
                    // ByAd TODO: this.CargarComprobantesYaAutorizados(feAuthRequest, feCAERequest);


                    // Remover Comprobantes que ya han sido autorizados
                    //string resultado = this.RemoverComprobantesAutorizados(feAuthRequest, feCAERequest);
                    //if (!string.IsNullOrEmpty(resultado))
                    //{
                    //    this.Log(resultado);
                    //    feCAERequest.FeCabReq.CantReg = feCAERequest.FeDetReq.Count();
                    //}
                    //-------------------------------------
                    //-------------------------------------
                    //-------------------------------------

                    if (feXCAERequest != null)
                    {
                        // Autorizar Comprobantes con la AFIP
                        this.Log("Autorizando Comprobantes con la AFIP...");
                        FEXResponseAuthorize feXCAEResponse = this.AutorizarComprobantes(feXAuthRequest, feXCAERequest);

                        // Proceso Resultado AFIP
                        this.Log("Procesando respuesta de la AFIP...");
                        corridaDto = this.corridaSvc.ProcesarCorridaWsFeX(corridaDto, feXCAEResponse, feXCAERequest);
                    }
                    else
                    {
                        // Todos los comprobantes del archivo ya tienen un CAE asignado
                        // y existen en DB
                        this.Log("Todos los comprobantes del archivo ya han sido autorizados");
                    }

                    // Muevo el archivo a una carpeta de procesados
                    GuardarArchivoProcesado(pathArchivoOrigen);

                    this.Log("Fin procesamiento de archivo.");
                }
                else
                {
                    this.Log("La corrida ya se está ejecutando");
                }

                return(corridaDto);
            }
            catch (Exception ex)
            {
                string detalle = string.Format("ex.Message: {0} ex.StackTrace: {1}", ex.Message, ex.StackTrace);
                this.Log(string.Format("ERROR: Se ha producido un error. Contactese con el administrador. Error: {0}", ex.Message), detalle);
                return(null);
            }
            finally
            {
                this.Log(CorridaService.FinCorridaMsg);
            }
        }
Exemplo n.º 10
0
        public CorridaAutorizacionDto ProcesarCorrida(CorridaAutorizacionDto corridaDto, FECAEResponse feCAEResponse)
        {
            using (var ctx = new FacturaElectronicaEntities())
            {
                CorridaAutorizacion corrida = ctx.CorridaAutorizacions.Where(c => c.Id == corridaDto.Id).First();

                // Procesar Cabecera
                DetalleCabecera cabecera  = new DetalleCabecera();
                FECabResponse   feCabResp = feCAEResponse.FeCabResp;
                cabecera.CantReg    = feCabResp.CantReg;
                cabecera.CUIT       = feCabResp.Cuit;
                cabecera.CbteTipo   = feCabResp.CbteTipo;
                cabecera.FchProceso = DateTimeHelper.ConvertyyyyMMddhhmmssToDate(feCabResp.FchProceso);
                cabecera.Resultado  = feCabResp.Resultado;
                cabecera.PtoVta     = feCabResp.PtoVta;

                corrida.DetalleCabeceras.Add(cabecera);

                TipoComprobanteDto tipoCbteDto = cbteSvc.ObtenerTipoComprobantePorCodigoAfip(cabecera.CbteTipo);
                int tipoCbteId;
                if (tipoCbteDto != null)
                {
                    tipoCbteId = tipoCbteDto.Id;
                }

                if (feCAEResponse.FeDetResp != null && feCAEResponse.FeDetResp.Count() > 0)
                {
                    // Procesar Comprobantes
                    DetalleComprobante     detalleCbte       = null;
                    ObservacionComprobante observacionesCbte = null;
                    foreach (FECAEDetResponse cbte in feCAEResponse.FeDetResp)
                    {
                        detalleCbte           = new DetalleComprobante();
                        detalleCbte.Concepto  = cbte.Concepto;
                        detalleCbte.DocTipo   = cbte.DocTipo;
                        detalleCbte.DocNro    = cbte.DocNro;
                        detalleCbte.CbteDesde = cbte.CbteDesde;
                        detalleCbte.CbteHasta = cbte.CbteHasta;
                        detalleCbte.CbteFch   = DateTimeHelper.ConvertyyyyMMddToDate(cbte.CbteFch);
                        detalleCbte.Resultado = cbte.Resultado;


                        if (cbte.Resultado == ResultadoCbte.Aprobado)
                        {
                            detalleCbte.CAE       = cbte.CAE;
                            detalleCbte.CAEFchVto = DateTimeHelper.ConvertyyyyMMddToDate(cbte.CAEFchVto);

                            // Si fue aprobado agrego una entidad Comprobante
                            Comprobante comprobante = new Comprobante();
                            comprobante.CAE = detalleCbte.CAE;
                            comprobante.CAEFechaVencimiento = detalleCbte.CAEFchVto;
                            comprobante.CbteDesde           = detalleCbte.CbteDesde;
                            comprobante.CbteHasta           = detalleCbte.CbteHasta;
                            comprobante.CbteFecha           = detalleCbte.CbteFch;
                            comprobante.PtoVta          = cabecera.PtoVta;
                            comprobante.FechaDeCarga    = DateTime.Now;
                            comprobante.TipoComprobante = ctx.TipoComprobantes.Where(tc => tc.CodigoAfip == cabecera.CbteTipo).FirstOrDefault();
                            if (detalleCbte.DocTipo == 80) // CUIT
                            {
                                ClienteDto clienteDto = clienteSvc.ObtenerClientePorCuit(detalleCbte.DocNro);
                                if (clienteDto != null)
                                {
                                    comprobante.ClienteId = clienteDto.Id;
                                }
                            }
                            // #TODO: borrar
                            //EstadoComprobanteDto estadoDto = this.cbteSvc.ObtenerEstado(CodigoEstadoCbte.NoVisualizado);
                            //if (estadoDto != null)
                            //{
                            //    comprobante.EstadoId = estadoDto.Id;
                            //}
                            detalleCbte.Comprobantes.Add(comprobante);
                        }
                        else
                        {
                            if (cbte.Observaciones != null && cbte.Observaciones.Count() > 0)
                            {
                                foreach (Obs obs in cbte.Observaciones)
                                {
                                    observacionesCbte      = new ObservacionComprobante();
                                    observacionesCbte.Code = obs.Code;
                                    observacionesCbte.Msg  = obs.Msg;
                                    detalleCbte.ObservacionComprobantes.Add(observacionesCbte);
                                }
                            }
                        }
                        corrida.DetalleComprobantes.Add(detalleCbte);
                    }
                }
                if (feCAEResponse.Events != null && feCAEResponse.Events.Count() > 0)
                {
                    // Procesar Eventos
                    DetalleEvento detalleEvento = null;
                    foreach (Evt evento in feCAEResponse.Events)
                    {
                        detalleEvento      = new DetalleEvento();
                        detalleEvento.Code = evento.Code;
                        detalleEvento.Msg  = evento.Msg;
                        corrida.DetalleEventos.Add(detalleEvento);
                    }
                }
                if (feCAEResponse.Errors != null && feCAEResponse.Errors.Count() > 0)
                {
                    // Procesar Errores
                    DetalleError detalleError = null;
                    foreach (Err error in feCAEResponse.Errors)
                    {
                        detalleError      = new DetalleError();
                        detalleError.Code = error.Code;
                        detalleError.Msg  = error.Msg;
                        corrida.DetalleErrores.Add(detalleError);
                    }
                }

                corrida.Procesada = true;

                ctx.SaveChanges();
                return(ToCorridaDto(corrida, ctx.TipoDocumentoes.ToList(), ctx.TipoComprobantes.ToList(), ctx.TipoConceptoes.ToList()));
            }
        }
Exemplo n.º 11
0
        public CorridaAutorizacionDto ProcesarCorridaWsFeX(CorridaAutorizacionDto corridaDto, FEXResponseAuthorize feXCAEResponse, ClsFEXRequest feXCAERequest)
        {
            using (var ctx = new FacturaElectronicaEntities())
            {
                CorridaAutorizacion corrida = ctx.CorridaAutorizacions.Where(c => c.Id == corridaDto.Id).First();

                // Procesar Cabecera
                DetalleCabecera    cabecera  = new DetalleCabecera();
                ClsFEXOutAuthorize feCabResp = feXCAEResponse.FEXResultAuth;
                if (feCabResp != null)
                {
                    cabecera.CantReg    = 1; // ByAd: revisar
                    cabecera.CUIT       = feCabResp.Cuit;
                    cabecera.CbteTipo   = feCabResp.Cbte_tipo;
                    cabecera.FchProceso = DateTime.Now; // ByAd: revisar
                    cabecera.Resultado  = feCabResp.Resultado;
                    cabecera.PtoVta     = feCabResp.Punto_vta;

                    corrida.DetalleCabeceras.Add(cabecera);

                    TipoComprobanteDto tipoCbteDto = cbteSvc.ObtenerTipoComprobantePorCodigoAfip(cabecera.CbteTipo);
                    int tipoCbteId;
                    if (tipoCbteDto != null)
                    {
                        tipoCbteId = tipoCbteDto.Id;
                    }

                    // Procesar Comprobantes
                    DetalleComprobante     detalleCbte       = null;
                    ObservacionComprobante observacionesCbte = null;

                    detalleCbte           = new DetalleComprobante();
                    detalleCbte.Concepto  = 1; // ByAd revisar: aca es prdoucto, servicios o ambos
                    detalleCbte.DocTipo   = 80;
                    detalleCbte.DocNro    = feCabResp.Cuit;
                    detalleCbte.CbteDesde = feCabResp.Cbte_nro;
                    detalleCbte.CbteHasta = feCabResp.Cbte_nro;
                    detalleCbte.CbteFch   = DateTimeHelper.ConvertyyyyMMddToDate(feCabResp.Fch_cbte);
                    detalleCbte.Resultado = feCabResp.Resultado;

                    if (feCabResp.Resultado == ResultadoCbte.Aprobado)
                    {
                        detalleCbte.CAE       = feCabResp.Cae;
                        detalleCbte.CAEFchVto = DateTimeHelper.ConvertyyyyMMddToDate(feCabResp.Fch_venc_Cae);

                        // Si fue aprobado agrego una entidad Comprobante
                        Comprobante comprobante = new Comprobante();
                        comprobante.CAE = detalleCbte.CAE;
                        comprobante.CAEFechaVencimiento = detalleCbte.CAEFchVto;
                        comprobante.CbteDesde           = detalleCbte.CbteDesde;
                        comprobante.CbteHasta           = detalleCbte.CbteHasta;
                        comprobante.CbteFecha           = detalleCbte.CbteFch;
                        comprobante.PtoVta          = cabecera.PtoVta;
                        comprobante.FechaDeCarga    = DateTime.Now;
                        comprobante.TipoComprobante = ctx.TipoComprobantes.Where(tc => tc.CodigoAfip == cabecera.CbteTipo).FirstOrDefault();
                        if (detalleCbte.DocTipo == 80) // CUIT
                        {
                            ClienteDto clienteDto = clienteSvc.ObtenerClientePorCuit(detalleCbte.DocNro);
                            if (clienteDto != null)
                            {
                                comprobante.ClienteId = clienteDto.Id;
                            }
                        }
                        // #TODO: borrar
                        //EstadoComprobanteDto estadoDto = this.cbteSvc.ObtenerEstado(CodigoEstadoCbte.NoVisualizado);
                        //if (estadoDto != null)
                        //{
                        //    comprobante.EstadoId = estadoDto.Id;
                        //}
                        detalleCbte.Comprobantes.Add(comprobante);
                    }
                    else
                    {
                        if (!String.IsNullOrEmpty(feCabResp.Motivos_Obs))
                        {
                            observacionesCbte      = new ObservacionComprobante();
                            observacionesCbte.Code = 1; // ByAd: hardcodeado, ya que este tipo no recibe
                            observacionesCbte.Msg  = feCabResp.Motivos_Obs;
                            detalleCbte.ObservacionComprobantes.Add(observacionesCbte);
                        }
                    }

                    corrida.DetalleComprobantes.Add(detalleCbte);
                }

                if (feXCAEResponse.FEXEvents != null && !String.IsNullOrEmpty(feXCAEResponse.FEXEvents.EventMsg))
                {
                    // Procesar Eventos
                    DetalleEvento detalleEvento = null;
                    detalleEvento      = new DetalleEvento();
                    detalleEvento.Code = feXCAEResponse.FEXEvents.EventCode;
                    detalleEvento.Msg  = feXCAEResponse.FEXEvents.EventMsg;
                    corrida.DetalleEventos.Add(detalleEvento);
                }
                if (feXCAEResponse.FEXErr != null && !String.IsNullOrEmpty(feXCAEResponse.FEXErr.ErrMsg))
                {
                    // Procesar Errores
                    DetalleError detalleError = null;
                    detalleError      = new DetalleError();
                    detalleError.Code = feXCAEResponse.FEXErr.ErrCode;
                    detalleError.Msg  = feXCAEResponse.FEXErr.ErrMsg;
                    corrida.DetalleErrores.Add(detalleError);
                }

                corrida.Procesada = true;

                ctx.SaveChanges();
                return(ToCorridaDto(corrida, ctx.TipoDocumentoes.ToList(), ctx.TipoComprobantes.ToList(), ctx.TipoConceptoes.ToList()));
            }
        }