public wsfex.FEXResponseAuthorize FEXAuthRequest(RequestBatch docBatch, Settings oSettings ) { wsfex.ClsFEXRequest objFEXRequest = new wsfex.ClsFEXRequest(); wsfex.FEXResponseAuthorize objFEXResponseAuthorize = new wsfex.FEXResponseAuthorize(); wsfex.FEXResponse_LastID objFEXResponseLastID = null; DBEngine.SQLEngine sqlEngine = new FacturaElectronica.DBEngine.SQLEngine(); int i = 0; try { //Debug Line Utils.Utils.DebugLine(Utils.Utils.SerializeObject(objFEXAuthRequest), oSettings.PathDebug + "\\ClsFEXAuthRequest-" + DateTime.Now.Hour.ToString("00") + DateTime.Now.Minute.ToString("00") + DateTime.Now.Second.ToString("00") + DateTime.Now.Millisecond.ToString("000") + ".xml"); //Si no tiene identificador único hay que generarlo if (docBatch.BatchUniqueId == "AUTO") { objFEXResponseLastID = GetLastBatchUniqueId(); if (objFEXResponseLastID.FEXResultGet == null) { sqlEngine.LogError(docBatch.RequestHeaders[0].SQLID, "0", "Autorización", "Error AFIP al obtener el último nro de requerimiento (" + objFEXResponseLastID.FEXErr.ErrCode + ") " + objFEXResponseLastID.FEXErr.ErrMsg); } else { objFEXResponseLastID.FEXResultGet.Id = objFEXResponseLastID.FEXResultGet.Id + 1; docBatch.BatchUniqueId = (objFEXResponseLastID.FEXResultGet.Id).ToString(); //Guardar Unique Batch ID que luego se utilizara para reprocesos y obtener CAE sqlEngine.UpdateCabeceraBatchUniqueId(docBatch.RequestHeaders[0].SQLID, docBatch.BatchUniqueId); } } //Debug Line Utils.Utils.DebugLine(Utils.Utils.SerializeObject(docBatch), oSettings.PathDebug + "\\DocumentBatch-" + DateTime.Now.Hour.ToString("00") + DateTime.Now.Minute.ToString("00") + DateTime.Now.Second.ToString("00") + DateTime.Now.Millisecond.ToString("000") + ".xml"); string fieldName = ""; string seccionName = ""; try { seccionName = "Cabecera"; objFEXRequest.Id = (long)Convert.ToDouble(docBatch.BatchUniqueId); objFEXRequest.Tipo_cbte = Convert.ToInt16(docBatch.RequestHeaders[0].TipoComprobante); objFEXRequest.Punto_vta = Convert.ToInt16(docBatch.RequestHeaders[0].PuntoVenta); objFEXRequest.Cbte_nro = (long)Convert.ToDouble(docBatch.RequestHeaders[0].NroComprobanteDesde); objFEXRequest.Tipo_expo = Convert.ToInt16((docBatch.RequestHeaders[0].TipoExportacion == string.Empty) ? "1" : docBatch.RequestHeaders[0].TipoExportacion); if (objFEXRequest.Tipo_cbte == 19) objFEXRequest.Permiso_existente = (docBatch.RequestHeaders[0].PermisoExistente == string.Empty) ? "N" : docBatch.RequestHeaders[0].PermisoExistente; else objFEXRequest.Permiso_existente = string.Empty; objFEXRequest.Dst_cmp = Convert.ToInt16(docBatch.RequestHeaders[0].CompradorPais); objFEXRequest.Cliente = docBatch.RequestHeaders[0].CompradorRazonSocial; objFEXRequest.Domicilio_cliente = docBatch.RequestHeaders[0].CompradorDireccion; objFEXRequest.Moneda_Id = docBatch.RequestHeaders[0].CodigoMoneda; objFEXRequest.Moneda_ctz = Convert.ToDouble(docBatch.RequestHeaders[0].TasaCambio); objFEXRequest.Imp_total = Convert.ToDouble(docBatch.RequestHeaders[0].ImporteMonedaFacturacion); objFEXRequest.Idioma_cbte = Convert.ToInt16((docBatch.RequestHeaders[0].Idioma == string.Empty) ? "01" : docBatch.RequestHeaders[0].Idioma); objFEXRequest.Id_impositivo = docBatch.RequestHeaders[0].CompradorNroDocumento; objFEXRequest.Fecha_cbte = Convert.ToDateTime(docBatch.RequestHeaders[0].FechaComprobante).ToString("yyyyMMdd"); objFEXRequest.Forma_pago = docBatch.RequestHeaders[0].FormaPagoDescripcion; objFEXRequest.Obs = docBatch.RequestHeaders[0].Observaciones2; objFEXRequest.Obs_comerciales = docBatch.RequestHeaders[0].Observaciones1; objFEXRequest.Incoterms = docBatch.RequestHeaders[0].IncoTerms; objFEXRequest.Items = new FacturaElectronica.WebServices.wsfex.Item[Convert.ToInt32(docBatch.RequestHeaders[0].CantidadRegistrosDetalle)]; for (i = 0; i < objFEXRequest.Items.Length; i++) { seccionName = "Línea " + i.ToString(); objFEXRequest.Items[i] = new wsfex.Item(); objFEXRequest.Items[i].Pro_codigo = docBatch.RequestHeaders[0].RequestLines[i].CodigoProductoEmpresa; objFEXRequest.Items[i].Pro_ds = docBatch.RequestHeaders[0].RequestLines[i].Descripcion; objFEXRequest.Items[i].Pro_umed = Convert.ToInt32(docBatch.RequestHeaders[0].RequestLines[i].UnidadMedida); objFEXRequest.Items[i].Pro_qty = Convert.ToDouble(docBatch.RequestHeaders[0].RequestLines[i].Cantidad); objFEXRequest.Items[i].Pro_precio_uni = Convert.ToDouble(docBatch.RequestHeaders[0].RequestLines[i].ImportePrecioUnitarioMonedaFacturacion); objFEXRequest.Items[i].Pro_total_item = Convert.ToDouble(docBatch.RequestHeaders[0].RequestLines[i].ImporteSubtotalMonedaFacturacion); } } catch (Exception ex) { sqlEngine.LogError("0", "0", "Autorización", "Error al asignar el campo: " + seccionName + "." + fieldName + ", " + ex.Message); } //Debug Line Utils.Utils.DebugLine(Utils.Utils.SerializeObject(objFEXRequest), oSettings.PathDebug + "\\ClsFEXRequest-" + DateTime.Now.Hour.ToString("00") + DateTime.Now.Minute.ToString("00") + DateTime.Now.Second.ToString("00") + DateTime.Now.Millisecond.ToString("000") + ".xml"); objFEXResponseAuthorize = fexService.FEXAuthorize(objFEXAuthRequest, objFEXRequest); } catch (Exception ex) { int iElement = 0; if (i > 0) iElement = i - 1; else iElement = 0; sqlEngine.LogError(docBatch.RequestHeaders[iElement].SQLID, "0", "Autorización", "Error no conocido: (AfipFEX) " + ex.Message); objFEXResponseAuthorize.FEXErr = new FacturaElectronica.WebServices.wsfex.ClsFEXErr(); if (docBatch.BatchUniqueId == "AUTO" || objFEXResponseLastID.FEXResultGet == null) { objFEXResponseAuthorize.FEXErr.ErrCode = 667; objFEXResponseAuthorize.FEXErr.ErrMsg = ex.Message + "Error en AFIP al obtener el último nro de requerimiento (" + objFEXResponseLastID.FEXErr.ErrCode.ToString() + ") " + objFEXResponseLastID.FEXErr.ErrMsg; } else { objFEXResponseAuthorize.FEXErr.ErrCode = 668; objFEXResponseAuthorize.FEXErr.ErrMsg = ex.Message; sqlEngine.LogError(docBatch.RequestHeaders[iElement].SQLID, "0", "Autorización", "Error no conocido: (AfipFEX) " + ex.Message); } } return objFEXResponseAuthorize; }
public string ProcesarLoteFacturasExportacion(string EmpresaID, string xmlDocument) { #region Inicialización Settings oSettings = new Settings(EmpresaID); wsfex.Service afipFexService = new wsfex.Service(); afipFexService.Url = oSettings.UrlAFIPwsfex; wsfex.ClsFEXAuthRequest afipObjFEXAuthRequest = new wsfex.ClsFEXAuthRequest(); wsfex.FEXResponseAuthorize fexResponseAuthorize = new wsfex.FEXResponseAuthorize(); ResponseBatch batchResponse = new ResponseBatch(); RequestBatch loteDocs = new RequestBatch(); string SQLID = "0"; string estadoDocumento = string.Empty; string cae = string.Empty; string FechaVencimiento = string.Empty; string strEquivalenciaErrorFields = string.Empty; bool bRegistrarInicio = false; bool bEquivalenciaError = false; //Cargar el lote recibido loteDocs.LoadXMLString(xmlDocument); #endregion #region Registrar pedido try { bRegistrarInicio = sqlEngine.LogBatchStart(ref loteDocs); SQLID = loteDocs.RequestHeaders[0].SQLID; //DEBUG LINE if (Convert.ToBoolean(oSettings.ActivarDebug)) Utils.Utils.DebugLine(Utils.Utils.SerializeObject(loteDocs), oSettings.PathDebug + "\\" + SQLID + "-FERequestBatch-" + DateTime.Now.Hour.ToString("00") + DateTime.Now.Minute.ToString("00") + DateTime.Now.Second.ToString("00") + DateTime.Now.Millisecond.ToString("000") + ".xml"); } catch (Exception ex) { bRegistrarInicio = false; sqlEngine.LogError(SQLID, "0", "Procesando lote", "Error: " + ex.Message); } #endregion //Si pudo crear el registro en la base continuo if (bRegistrarInicio) { #region Verificar Login con AFIP AfipConnection afipConn = new AfipConnection("wsfex", oSettings); if (afipConn.ConnectionErrorDescription == string.Empty) { //Inicializo el objeto AuthRequest de la Afip afipObjFEXAuthRequest.Cuit = afipConn.Cuit; afipObjFEXAuthRequest.Sign = afipConn.Sign; afipObjFEXAuthRequest.Token = afipConn.Token; } else { try { sqlEngine.LogError(SQLID, "0", "AfipConnection", afipConn.ConnectionErrorDescription); sqlEngine.LogBatchEnd(SQLID, "Error", cae, FechaVencimiento); } catch (Exception ex) { sqlEngine.LogError(SQLID, "0", "FEService-AFIP Login", "Error: " + ex.Message); } } AfipFEX afipFEX = new AfipFEX(ref afipFexService, ref afipObjFEXAuthRequest, oSettings); #endregion if (afipConn.ConnectionErrorDescription == string.Empty) { #region Buscar Equivalencias bEquivalenciaError = BuscarEquivalencias(ref loteDocs, oSettings, ref strEquivalenciaErrorFields); #endregion //Si no hay errore de equivalencia continuo if (!bEquivalenciaError) { #region Realizar Validaciones #endregion #region Hacer el pedido a AFIP try { if (afipConn.IsConnected) { fexResponseAuthorize = afipFEX.FEXAuthRequest(loteDocs, oSettings); if (fexResponseAuthorize.FEXErr == null) { sqlEngine.LogError(SQLID, "0", "Respuesta AFIP", "AFIP no pudo procesar por un error previo. Vea el log de errores."); fexResponseAuthorize.FEXErr = new wsfex.ClsFEXErr(); fexResponseAuthorize.FEXErr.ErrCode = 0; fexResponseAuthorize.FEXErr.ErrMsg = "AFIP no pudo procesar por un error previo. Vea el log de errores."; } } else { sqlEngine.LogError(SQLID, "0", "Respuesta AFIP", "Sin Conexion. Descripcion: " + afipConn.ConnectionErrorDescription); fexResponseAuthorize.FEXErr = new wsfex.ClsFEXErr(); fexResponseAuthorize.FEXErr.ErrCode = 0; fexResponseAuthorize.FEXErr.ErrMsg = afipConn.ConnectionErrorDescription; } } catch (Exception ex) { sqlEngine.LogError(SQLID, "0", "Respuesta AFIP", "Error: " + ex.Message); } #endregion } } #region Armar y devolver respuesta //Armar info del lote if (fexResponseAuthorize.FEXResultAuth != null) { batchResponse.BatchUniqueId = loteDocs.BatchUniqueId; batchResponse.BatchUniqueId = fexResponseAuthorize.FEXResultAuth.Id.ToString(); batchResponse.CUITInformante = fexResponseAuthorize.FEXResultAuth.Cuit.ToString(); batchResponse.FechaCAE = fexResponseAuthorize.FEXResultAuth.Fch_venc_Cae; batchResponse.CantidadComprobantes = "1"; batchResponse.Resultado = fexResponseAuthorize.FEXResultAuth.Resultado; batchResponse.Reproceso = fexResponseAuthorize.FEXResultAuth.Reproceso; batchResponse.SonServicios = ""; batchResponse.CodigoError = fexResponseAuthorize.FEXErr.ErrCode.ToString(); batchResponse.MensajeError = fexResponseAuthorize.FEXErr.ErrMsg.ToString(); if (fexResponseAuthorize.FEXResultAuth.Reproceso.ToLower() == "s") { batchResponse.Resultado = "R"; batchResponse.Motivo = "12"; batchResponse.MotivoDescripcion = "EL RANGO INFORMADO SE ENCUENTRA AUTORIZADO CON ANTERIOIRIDAD PARA LA MISMA CUIT, TIPO DE COMPROBANTE Y PUNTO DE VENTA."; } else { batchResponse.Motivo = fexResponseAuthorize.FEXResultAuth.Motivos_Obs; batchResponse.MotivoDescripcion = ""; } //Armar info del documento ResponseHeader thisHeader = new ResponseHeader(); thisHeader.CAE = fexResponseAuthorize.FEXResultAuth.Cae; thisHeader.NroComprobanteDesde = fexResponseAuthorize.FEXResultAuth.Cbte_nro.ToString(); thisHeader.NroComprobanteHasta = fexResponseAuthorize.FEXResultAuth.Cbte_nro.ToString(); thisHeader.FechaComprobante = fexResponseAuthorize.FEXResultAuth.Fch_cbte; thisHeader.FechaVencimiento = fexResponseAuthorize.FEXResultAuth.Fch_venc_Cae; thisHeader.PuntoVenta = fexResponseAuthorize.FEXResultAuth.Punto_vta.ToString(); thisHeader.TipoComprobante = fexResponseAuthorize.FEXResultAuth.Tipo_cbte.ToString(); thisHeader.NroInternoERP = loteDocs.RequestHeaders[0].NroInternoERP; thisHeader.LetraComprobante = loteDocs.RequestHeaders[0].LetraComprobante; thisHeader.SQLID = loteDocs.RequestHeaders[0].SQLID; thisHeader.Resultado = fexResponseAuthorize.FEXResultAuth.Resultado; thisHeader.Importe = loteDocs.RequestHeaders[0].Importe; if (fexResponseAuthorize.FEXResultAuth.Reproceso.ToLower() == "s") { thisHeader.Resultado = "R"; thisHeader.Motivo = "12"; thisHeader.MotivoDescripcion = AfipFEX.GetMotivoDescripcion(thisHeader.Motivo, string.Empty); } else { thisHeader.Motivo = fexResponseAuthorize.FEXResultAuth.Motivos_Obs; thisHeader.MotivoDescripcion = ""; } batchResponse.ResponseHeaders.Add(thisHeader); } else { batchResponse.BatchUniqueId = "0"; batchResponse.CUITInformante = ""; batchResponse.FechaCAE = ""; batchResponse.CantidadComprobantes = "1"; batchResponse.Resultado = "R"; batchResponse.Motivo = ""; batchResponse.MotivoDescripcion = ""; batchResponse.Reproceso = ""; batchResponse.SonServicios = ""; if (fexResponseAuthorize.FEXErr != null) { batchResponse.CodigoError = fexResponseAuthorize.FEXErr.ErrCode.ToString(); batchResponse.MensajeError = fexResponseAuthorize.FEXErr.ErrMsg.ToString(); } else if (afipConn.ConnectionErrorDescription != string.Empty) { batchResponse.CodigoError = "669"; batchResponse.MensajeError = afipConn.ConnectionErrorDescription; } else if (bEquivalenciaError) { batchResponse.Resultado = "E"; batchResponse.CodigoError = "Equivalencias"; batchResponse.MensajeError = "No se encontró equivalencia con AFIP. Campos: " + strEquivalenciaErrorFields; } //Devolver los documentos originales ResponseHeader thisHeader = new ResponseHeader(); thisHeader.CAE = ""; thisHeader.NroComprobanteDesde = loteDocs.RequestHeaders[0].NroComprobanteDesde; thisHeader.NroComprobanteHasta = loteDocs.RequestHeaders[0].NroComprobanteHasta; thisHeader.FechaComprobante = loteDocs.RequestHeaders[0].FechaComprobante; thisHeader.FechaVencimiento = ""; thisHeader.Motivo = batchResponse.CodigoError; thisHeader.MotivoDescripcion = batchResponse.MensajeError; thisHeader.PuntoVenta = loteDocs.RequestHeaders[0].PuntoVenta; thisHeader.TipoComprobante = loteDocs.RequestHeaders[0].TipoComprobante; thisHeader.NroInternoERP = loteDocs.RequestHeaders[0].NroInternoERP; thisHeader.LetraComprobante = loteDocs.RequestHeaders[0].LetraComprobante; thisHeader.Resultado = "R"; thisHeader.SQLID = loteDocs.RequestHeaders[0].SQLID; batchResponse.ResponseHeaders.Add(thisHeader); } #endregion #region Registrar respuesta recibida if (batchResponse.Resultado == "A" || batchResponse.Resultado == "R") { switch (batchResponse.Resultado) { case "A": estadoDocumento = "Aceptado"; cae = batchResponse.ResponseHeaders[0].CAE; FechaVencimiento = batchResponse.ResponseHeaders[0].FechaVencimiento; break; case "R": estadoDocumento = "Rechazado"; cae = ""; FechaVencimiento = ""; break; } } else if (batchResponse.Reproceso.ToLower() == "s") { estadoDocumento = "Rechazado"; cae = batchResponse.ResponseHeaders[0].CAE; FechaVencimiento = batchResponse.ResponseHeaders[0].FechaVencimiento; } else { estadoDocumento = "Error"; cae = ""; FechaVencimiento = ""; } try { sqlEngine.LogBatchEnd(SQLID, estadoDocumento, cae, FechaVencimiento); } catch (Exception ex) { sqlEngine.LogError(SQLID, "0", "Respuesta Recibida", "Error: " + ex.Message); } #endregion } return batchResponse.GetXMLString(); }