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); }
/// <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); } }
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; }
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); } }
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); } }
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); }
public FormAutorizadorResultados(CorridaAutorizacionDto corridaDto) : this() { this.corridaDto = corridaDto; }
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); } }
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); } }
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())); } }
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())); } }