public static LoginTickets GetLoginTicketFromXML(XmlDocument document, LoginTicketRequests request) { string LoginTicketResponseNodeName = "loginTicketResponse"; string HeaderNodeName = "header"; string SourceNodeName = "source"; string DestinationNodeName = "destination"; string UniqueIDNodeName = "uniqueId"; string GenerationTimeNodeName = "generationTime"; string ExpirationTimeNodeName = "expirationTime"; string CredentialsNodeName = "credentials"; string TokenNodeName = "token"; string SignNodeName = "sign"; LoginTickets result = null; XmlNode headerNode = document[LoginTicketResponseNodeName][HeaderNodeName]; XmlNode credentialsNode = document[LoginTicketResponseNodeName][CredentialsNodeName]; DateTime generationTime = XmlConvert.ToDateTime(headerNode[GenerationTimeNodeName].InnerText, XmlDateTimeSerializationMode.RoundtripKind); DateTime expirationTime = XmlConvert.ToDateTime(headerNode[ExpirationTimeNodeName].InnerText, XmlDateTimeSerializationMode.RoundtripKind); long requestID = XmlConvert.ToInt64(headerNode[UniqueIDNodeName].InnerText); //TODO: validar que lo que devolvio el WS sea válido (expiration, source, destination, etc) result = new LoginTickets(requestID, request, generationTime, expirationTime, credentialsNode[TokenNodeName].InnerText, credentialsNode[SignNodeName].InnerText); //Save(result); return(result); }
private static LoginTickets GetLoginTicketFromXML(XmlDocument document, global::Entities.LoginTicketRequests request) { LoginTickets result = null; XmlNode headerNode = document[LoginTicketResponseNodeName][HeaderNodeName]; XmlNode credentialsNode = document[LoginTicketResponseNodeName][CredentialsNodeName]; DateTime generationTime = XmlConvert.ToDateTime(headerNode[GenerationTimeNodeName].InnerText, XmlDateTimeSerializationMode.RoundtripKind); DateTime expirationTime = XmlConvert.ToDateTime(headerNode[ExpirationTimeNodeName].InnerText, XmlDateTimeSerializationMode.RoundtripKind); long requestID = XmlConvert.ToInt64(headerNode[UniqueIDNodeName].InnerText); //TODO: validar que lo que devolvio el WS sea válido (expiration, source, destination, etc) result = new LoginTickets(requestID, request, generationTime, expirationTime, credentialsNode[TokenNodeName].InnerText, credentialsNode[SignNodeName].InnerText); return(result); }
private int?GetUltimoNroComprobante(Comprobantes comprobante) { LoginTickets loginTicket = GetLoginTicket(comprobante.Empresa); if (loginTicket != null) { FEAuthRequest authRequest = new FEAuthRequest(); authRequest.Token = loginTicket.Token; authRequest.Sign = loginTicket.Sign; authRequest.cuit = Convert.ToInt64(comprobante.Empresa.Cuit.Replace("-", "")); ComprobantesAdapter adapter = new ComprobantesAdapter(comprobante); Service service = new Service(); return(((FERecuperaLastCMPResponse)(service.FERecuperaLastCMPRequest(authRequest, adapter.GenerarFELastCMPtype()))).cbte_nro); } return(null); }
public LoginTickets GetCurrentLoginTicket(Empresas empresa) { LoginTickets result = null; ICriteria crit = DBConnection.Session.CreateCriteria(PersistentType); crit.Add(Expression.Le("GenerationTime", DateTime.Now)); crit.Add(Expression.Ge("ExpirationTime", DateTime.Now)); crit.CreateCriteria("LoginTicketRequest").Add(Expression.Eq("Empresa", empresa)); crit.SetMaxResults(1); IList results = crit.List(); if (results.Count > 0) { result = results[0] as LoginTickets; } return(result); }
private static long?GetUltimoId(Comprobantes comprobante) { LoginTickets loginTicket = GetLoginTicket(comprobante.Empresa); if (loginTicket != null) { FEAuthRequest authRequest = new FEAuthRequest(); authRequest.Token = loginTicket.Token; authRequest.Sign = loginTicket.Sign; authRequest.cuit = Convert.ToInt64(comprobante.Empresa.Cuit.Replace("-", "")); Service service = new Service(); /*FEUltNroResponse ultid = service.FEUltNroRequest(authRequest); * UltNroResponse nroo = ultid.nro; * vError err = ultid.RError;*/ return(((FEUltNroResponse)(service.FEUltNroRequest(authRequest))).nro.value); } return(null); }
public static string GetCAE(Comprobantes comprobante, out string logError, out string nroComprobante) { comprobante.Empresa = new Empresas(); comprobante.Empresa.Cuit = "33-67789425-9"; comprobante.Empresa.DNOrigen = "serialNumber=CUIT 33677894259,[email protected],CN=VISET,OU=VISET,O=VISET,ST=Buenos Aires,C=AR"; comprobante.Empresa.DNDestino = "CN=wsaahomo; O=afip; C=ar; serialNumber=CUIT 33693450239"; comprobante.Empresa.Id = Convert.ToInt32("2"); comprobante.Empresa.SenderName = "VISET"; comprobante.Empresa.CAI = "CAI1455"; comprobante.Empresa.CertificadoDestinoFileName = @"C:\Vero\Proyectos\MFD\MFDHOMO\Certificados\viset\CRT-root.cer"; comprobante.Empresa.CertificadoFileName = @"C:\Vero\Proyectos\MFD\MFDHOMO\Certificados\viset\viset.crt"; comprobante.Empresa.CertificadoPassword = "******"; comprobante.Empresa.LoginTicketFileName = @"C:\Vero\Proyectos\MFD\MFDHOMO\Certificados\viset\LoginTicketRequest.xml"; logError = String.Empty; string result = String.Empty; LoginTickets loginTicket = GetLoginTicket(comprobante.Empresa); nroComprobante = "-1"; if (loginTicket != null) { FEAuthRequest authRequest = new FEAuthRequest(); authRequest.Token = loginTicket.Token; authRequest.Sign = loginTicket.Sign; authRequest.cuit = Convert.ToInt64(comprobante.Empresa.Cuit.Replace("-", "")); ComprobantesAdapter adapter = new ComprobantesAdapter(comprobante); FERequest request = adapter.GenerarFERequest(comprobante.Id); Service service = new Service(); FEResponse response = service.FEAutRequest(authRequest, request); if (response.FedResp != null && response.FedResp[0].resultado == "R" && response.FedResp[0].motivo.StartsWith("11") && response.FedResp[0].cae == "NULL") { //Caso en que falla por correlatividad de comprobantes FERecuperaLastCMPResponse ultimoComEmitido = service.FERecuperaLastCMPRequest(authRequest, adapter.GenerarFELastCMPtype()); comprobante.NroCbante = comprobante.NroCbante.Substring(0, 5) + (ultimoComEmitido.cbte_nro + 1).ToString().PadLeft(8, '0'); adapter = new ComprobantesAdapter(comprobante); request = new FERequest(); //Generación de otro ID long idDate = DateTime.Now.Year * 10000000000; idDate += DateTime.Now.Month * 100000000; idDate += DateTime.Now.Day * 1000000; idDate += DateTime.Now.Hour * 10000; idDate += DateTime.Now.Minute * 100; idDate += DateTime.Now.Second; request = adapter.GenerarFERequest(idDate); service = new Service(); response = service.FEAutRequest(authRequest, request); } else { if (response.FedResp != null && response.FedResp[0].resultado == "R" && !String.IsNullOrEmpty(response.FedResp[0].motivo)) { ArrayList motivos = new ArrayList(); motivos.AddRange(response.FedResp[0].motivo.Split(";".ToCharArray())); StringBuilder logMotivos = new StringBuilder(); if (motivos.Contains("01")) { logMotivos.Append("01 \"La cuit informada no corresponde a un responsable inscripto en el iva activo\\n"); } if (motivos.Contains("02")) { logMotivos.Append("02 \"La cuit informada no se encuentra autorizada a emitir comprobantes electronicos originales o el periodo de inicio autorizado es posterior al de la generacion de la solicitud\"\n"); } if (motivos.Contains("03")) { logMotivos.Append("03 \"La cuit informada registra inconvenientes con el domicilio fiscal\"\n"); } if (motivos.Contains("04")) { logMotivos.Append("04 \"El punto de venta informado no se encuentra declarado para ser utilizado en el presente regimen\"\n"); } if (motivos.Contains("05")) { logMotivos.Append("05 \"La fecha del comprobante indicada no puede ser anterior en mas de cinco dias, si se trata de una venta, o anterior o posterior en mas de diez dias, si se trata de una prestacion de servicios, consecutivos de la fecha de remision del archivo art. 22 De la rg nro 2177-\"\n"); } if (motivos.Contains("06")) { logMotivos.Append("06 \"La cuit informada no se encuentra autorizada a emitir comprobantes clase \"a\"\"\n"); } if (motivos.Contains("07")) { logMotivos.Append("07 \"Para la clase de comprobante solicitado -comprobante clase a- debera consignar en el campo codigo de documento identificatorio del comprador el codigo \"80\"\n"); } if (motivos.Contains("08")) { logMotivos.Append("08 \"La cuit indicada en el campo nro de identificacion del comprador es invalida\"\n"); } if (motivos.Contains("09")) { logMotivos.Append("09 \"La cuit indicada en el campo nro de identificacion del comprador no existe en el padron unico de contribuyentes\"\n"); } if (motivos.Contains("10")) { logMotivos.Append("10 \"La cuit indicada en el campo nro de identificacion del comprador no corresponde a un responsable inscripto en el iva activo\"\n"); } if (motivos.Contains("11")) { logMotivos.Append("11 \"El nro de comprobante desde informado no es correlativo al ultimo nro de comprobante registrado/hasta solicitado para ese tipo de comprobante y punto de venta\"\n"); } if (motivos.Contains("12")) { logMotivos.Append("12 \"El rango informado se encuentra autorizado con anterioridad para la misma cuit, tipo de comprobante y punto de venta\"\n"); } if (motivos.Contains("13")) { logMotivos.Append("13 \"La cuit indicada se encuentra comprendida en el regimen establecido por la resolucion general nro 2177 y/o en el titulo I de la resolucion general nro 1361 art. 24 De la rg nro 2177\"\n"); } if (logMotivos.Length > 0) { logError = logMotivos.ToString(); } } } nroComprobante = comprobante.NroCbante; try { result = response.FedResp[0].cae; } catch (Exception ex) { nroComprobante = "-1"; result = ex.Message; } } return(result); }
private static LoginTickets GetLoginTicket(Empresas empresa) { LoginTickets result = null; string ntpServer; NTPClient ntp; if (loginTicketsBL != null) { result = loginTicketsBL.GetCurrentLoginTicket(empresa); ntpServer = GeneralSettings.Instance.NTPServer; } if (result == null) { //Sincronización de reloj por NTP ntp = new NTPClient("time.afip.gov.ar"); ntp.Connect(true); XmlDocument xmlDocument; LoginTicketRequests loginTicketRequest; //Generacion del Ticket de Requerimiento de Acceso if (loginTicketRequestsBL != null) { loginTicketRequest = loginTicketRequestsBL.GenerateLoginTicket(empresa); xmlDocument = loginTicketRequestsBL.GenerateLoginTicketRequestXML(loginTicketRequest); } else { loginTicketRequest = new LoginTicketRequests(empresa); xmlDocument = GenerateLoginTicketRequestXML(loginTicketRequest); } // Conversion del XML a bytes StringWriter sw = new StringWriter(); xmlDocument.WriteTo(new XmlTextWriter(sw)); byte[] loginTicketRequestXml = new ASCIIEncoding().GetBytes(sw.ToString()); //Firma del Ticket de Requerimiento de Acceso X509Certificate2 certOrigen = GetSenderCertificate(empresa); byte[] loginTicketRequestCMS = Sign(loginTicketRequestXml, certOrigen); //Codificacion a base 64 //string loginTicketRequestBase64 = Convert.ToBase64String(encryptedTicket); string loginTicketRequestBase64 = Convert.ToBase64String(loginTicketRequestCMS); //Transmisión del Ticket de Requerimiento de Acceso al WSAA LoginCMSService loginService = new LoginCMSService(); ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate); string loginServiceResponse = loginService.loginCms(loginTicketRequestBase64); //Extracción del Ticket de Acceso devuelto por el WSAA XmlDocument loginTicketXml = new XmlDocument(); loginTicketXml.LoadXml(loginServiceResponse); if (loginTicketRequestsBL != null) { result = loginTicketsBL.GetLoginTicketFromXML(loginTicketXml, loginTicketRequest); } else { result = GetLoginTicketFromXML(loginTicketXml, null); } } return(result); }
private static string GetCAE(Comprobantes comprobante, out string logError, out string nroComprobante, ref long idCabecera, bool autogenerarNroComprobante) { logError = String.Empty; string result = String.Empty; LoginTickets loginTicket = GetLoginTicket(comprobante.Empresa); nroComprobante = "-1"; if (loginTicket != null) { Service service = new Service(); //service.Timeout = 500000; FEAuthRequest authRequest = new FEAuthRequest(); authRequest.Token = loginTicket.Token; authRequest.Sign = loginTicket.Sign; authRequest.cuit = Convert.ToInt64(comprobante.Empresa.Cuit.Replace("-", "")); ComprobantesAdapter adapter = new ComprobantesAdapter(comprobante, comprobante.Empresa); //if (autogenerarNroComprobante) //{ // FERecuperaLastCMPResponse ultimoComEmitido = service.FERecuperaLastCMPRequest(authRequest, adapter.GenerarFELastCMPtype()); // comprobante.NroCbante = comprobante.Empresa.PuntoDeVenta.Value.ToString().PadLeft(4, '0')+"-" + (ultimoComEmitido.cbte_nro + 1).ToString().PadLeft(8, '0'); //} //idCabecera = comprobante.Id; FERequest request = adapter.GenerarFERequest(idCabecera); FEResponse response = null; try { response = service.FEAutRequest(authRequest, request); } catch (Exception ex) { throw ex; } if (autogenerarNroComprobante && response.FedResp != null && response.FedResp[0].resultado == "R" && response.FedResp[0].motivo.StartsWith("11") && response.FedResp[0].cae == "NULL") { FERecuperaLastCMPResponse ultimoComEmitido = service.FERecuperaLastCMPRequest(authRequest, adapter.GenerarFELastCMPtype()); comprobante.NroCbante = comprobante.Empresa.PuntoDeVenta.Value.ToString().PadLeft(4, '0') + "-" + (ultimoComEmitido.cbte_nro + 1).ToString().PadLeft(8, '0'); //Caso en que falla por correlatividad de comprobantes adapter = new ComprobantesAdapter(comprobante, comprobante.Empresa); request = new FERequest(); ////Generación de otro ID long idDate = DateTime.Now.Year * 10000000000; idDate += DateTime.Now.Month * 100000000; idDate += DateTime.Now.Day * 1000000; idDate += DateTime.Now.Hour * 10000; idDate += DateTime.Now.Minute * 100; idDate += DateTime.Now.Second; idCabecera = idDate; request = adapter.GenerarFERequest(idCabecera); service = new Service(); response = service.FEAutRequest(authRequest, request); } if (response.FedResp == null && response.RError != null) { return(response.RError.perrmsg); } if (response.FedResp != null && response.FedResp[0].resultado == "R" && !String.IsNullOrEmpty(response.FedResp[0].motivo)) { ArrayList motivos = new ArrayList(); motivos.AddRange(response.FedResp[0].motivo.Split(";".ToCharArray())); StringBuilder logMotivos = new StringBuilder(); if (motivos.Contains("01")) { logMotivos.Append("01 \"La cuit informada no corresponde a un responsable inscripto en el iva activo\\n"); } if (motivos.Contains("02")) { logMotivos.Append("02 \"La cuit informada no se encuentra autorizada a emitir comprobantes electronicos originales o el periodo de inicio autorizado es posterior al de la generacion de la solicitud\"\n"); } if (motivos.Contains("03")) { logMotivos.Append("03 \"La cuit informada registra inconvenientes con el domicilio fiscal\"\n"); } if (motivos.Contains("04")) { logMotivos.Append("04 \"El punto de venta informado no se encuentra declarado para ser utilizado en el presente regimen\"\n"); } if (motivos.Contains("05")) { logMotivos.Append("05 \"La fecha del comprobante indicada no puede ser anterior en mas de cinco dias, si se trata de una venta, o anterior o posterior en mas de diez dias, si se trata de una prestacion de servicios, consecutivos de la fecha de remision del archivo art. 22 De la rg nro 2177-\"\n"); } if (motivos.Contains("06")) { logMotivos.Append("06 \"La cuit informada no se encuentra autorizada a emitir comprobantes clase \"a\"\"\n"); } if (motivos.Contains("07")) { logMotivos.Append("07 \"Para la clase de comprobante solicitado -comprobante clase a- debera consignar en el campo codigo de documento identificatorio del comprador el codigo \"80\"\n"); } if (motivos.Contains("08")) { logMotivos.Append("08 \"La cuit indicada en el campo nro de identificacion del comprador es invalida\"\n"); } if (motivos.Contains("09")) { logMotivos.Append("09 \"La cuit indicada en el campo nro de identificacion del comprador no existe en el padron unico de contribuyentes\"\n"); } if (motivos.Contains("10")) { logMotivos.Append("10 \"La cuit indicada en el campo nro de identificacion del comprador no corresponde a un responsable inscripto en el iva activo\"\n"); } if (motivos.Contains("11")) { logMotivos.Append("11 \"El nro de comprobante desde informado no es correlativo al ultimo nro de comprobante registrado/hasta solicitado para ese tipo de comprobante y punto de venta\"\n"); } if (motivos.Contains("12")) { logMotivos.Append("12 \"El rango informado se encuentra autorizado con anterioridad para la misma cuit, tipo de comprobante y punto de venta\"\n"); } if (motivos.Contains("13")) { logMotivos.Append("13 \"La cuit indicada se encuentra comprendida en el regimen establecido por la resolucion general nro 2177 y/o en el titulo I de la resolucion general nro 1361 art. 24 De la rg nro 2177\"\n"); } if (logMotivos.Length > 0) { logError = logMotivos.ToString(); } } nroComprobante = comprobante.NroCbante; service.Dispose(); try { result = response.FedResp[0].cae; comprobante.IdCabeceraWS = idCabecera; try { CaeCounter wsCaeCounter = new CaeCounter(); bool produccion = !service.Url.Contains("h**o"); wsCaeCounter.SetCAEByCUIT(comprobante.Empresa.Cuit, result, comprobante.NroCbante, idCabecera, produccion); } catch (Exception ex) { string err = ex.Message; //Por el momento no se hace nada si falla el wsCaeCounter } } catch (Exception ex) { nroComprobante = "-1"; result = ex.Message; } } return(result); }