diff --git a/src/sw-sdk/Entities/IResponseHandler.cs b/src/sw-sdk/Entities/IResponseHandler.cs index 3ceecd5..6b0d670 100644 --- a/src/sw-sdk/Entities/IResponseHandler.cs +++ b/src/sw-sdk/Entities/IResponseHandler.cs @@ -1,14 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using SW.Entities; +using System; using System.Net; -using System.Text; namespace SW { internal interface IResponseHandler { - SW.Entities.Response GetResponse(WebRequest request); - SW.Entities.Response HandleException(Exception ex); + Response GetResponse(WebRequest request); + Response HandleException(Exception ex); } } diff --git a/src/sw-sdk/Helpers/DowloadFile.cs b/src/sw-sdk/Helpers/DowloadFile.cs new file mode 100644 index 0000000..7524696 --- /dev/null +++ b/src/sw-sdk/Helpers/DowloadFile.cs @@ -0,0 +1,71 @@ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using System.Xml; +using SW.Services.Stamp; + +namespace SW.Helpers +{ +static internal class DowloadFile +{ + public static async Task DowloadFileAsync(string url, HttpClientHandler proxy) + { + try + { + using (HttpClient client = new HttpClient(proxy)) + { + var result = await client.GetAsync(url); + return await TryGetFileAsync(result); + } + } + catch (HttpRequestException wex) + { + return new StampResponseV2() + { + message = wex.Message, + status = "error", + messageDetail = wex.StackTrace + }; + } + } + + internal static async Task TryGetFileAsync(HttpResponseMessage response) + { + try + { + if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.BadRequest) + { + return new StampResponseV2 + { + data = new Data_CFDI_TFD + { + cfdi = await response.Content.ReadAsStringAsync(), + tfd = null + }, + status = "error" + }; + } + else + return new StampResponseV2() + { + message = ((int)response.StatusCode).ToString(), + status = "error", + messageDetail = response.ReasonPhrase + }; + } + catch (Exception) + { + return new StampResponseV2() + { + message = ((int)response.StatusCode).ToString(), + status = "error", + messageDetail = response.ReasonPhrase + }; + } + } +} +} \ No newline at end of file diff --git a/src/sw-sdk/Helpers/EnumAcceptReject.cs b/src/sw-sdk/Helpers/EnumAcceptReject.cs index ca9b243..c058688 100644 --- a/src/sw-sdk/Helpers/EnumAcceptReject.cs +++ b/src/sw-sdk/Helpers/EnumAcceptReject.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace SW.Helpers +namespace SW.Helpers { public enum EnumAcceptReject { diff --git a/src/sw-sdk/Helpers/RequestHelper.cs b/src/sw-sdk/Helpers/RequestHelper.cs index ece3bb9..989cff5 100644 --- a/src/sw-sdk/Helpers/RequestHelper.cs +++ b/src/sw-sdk/Helpers/RequestHelper.cs @@ -1,10 +1,7 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Net; using System.Net.Http; -using System.Text; namespace SW.Helpers { @@ -51,10 +48,6 @@ internal static void AddFileToRequest(byte[] file, ref HttpWebRequest request) var endBoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--"); - - string formdataTemplate = "\r\n--" + boundary + - "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}"; - string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" + "Content-Type: application/octet-stream\r\n\r\n"; diff --git a/src/sw-sdk/Helpers/ResponseHelper.cs b/src/sw-sdk/Helpers/ResponseHelper.cs index d71461d..be2089b 100644 --- a/src/sw-sdk/Helpers/ResponseHelper.cs +++ b/src/sw-sdk/Helpers/ResponseHelper.cs @@ -1,90 +1,13 @@ -using SW.Services.AcceptReject; -using SW.Services.Account; -using SW.Services.Authentication; -using SW.Services.Cancelation; -using SW.Services.Csd; -using SW.Services.Pdf; -using SW.Services.Pendings; -using SW.Services.Relations; -using SW.Services.Stamp; -using SW.Services.Storage; -using SW.Services.Validate; -using sw_sdk.Services.Resend; +using SW.Entities; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; namespace SW.Helpers { internal static class ResponseHelper { - internal static AuthResponse ToAuthResponse(this Exception ex) + internal static T Response(this Exception ex) where T : Response, new() { - return new AuthResponse() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static AccountResponse ToAccountResponse(this Exception ex) - { - return new AccountResponse() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static CancelationResponse ToCancelationResponse(this Exception ex) - { - return new CancelationResponse() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static StampResponseV1 ToStampResponseV1(this Exception ex) - { - return new StampResponseV1() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static StampResponseV2 ToStampResponseV2(this Exception ex) - { - return new StampResponseV2() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static StampResponseV3 ToStampResponseV3(this Exception ex) - { - return new StampResponseV3() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static StampResponseV4 ToStampResponseV4(this Exception ex) - { - return new StampResponseV4() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static ValidateXmlResponse ToValidateXmlResponse(this Exception ex) - { - return new ValidateXmlResponse() + return new T() { message = ex.Message, status = "error", @@ -98,68 +21,5 @@ internal static string GetErrorDetail(this Exception ex) else return ""; } - internal static AcceptRejectResponse ToAcceptRejectResponse(this Exception ex) - { - return new AcceptRejectResponse() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static RelationsResponse ToRelationsResponse(this Exception ex) - { - return new RelationsResponse() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static PendingsResponse ToPendingsResponse(this Exception ex) - { - return new PendingsResponse() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static PdfResponse ToPdfResponse(this Exception ex) - { - return new PdfResponse() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static ResendResponse ToResendResponse(this Exception ex) - { - return new ResendResponse() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static UploadCsdResponse ToCargaCsdResponse(this Exception ex) - { - return new UploadCsdResponse() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } - internal static StorageResponse ToStorageResponse(this Exception ex) - { - return new StorageResponse() - { - message = ex.Message, - status = "error", - messageDetail = ex.GetErrorDetail() - }; - } } } diff --git a/src/sw-sdk/Helpers/StreamUtil.cs b/src/sw-sdk/Helpers/StreamUtil.cs index 28fc4c5..d959d5b 100644 --- a/src/sw-sdk/Helpers/StreamUtil.cs +++ b/src/sw-sdk/Helpers/StreamUtil.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; +using System.IO; namespace SW.Helpers { diff --git a/src/sw-sdk/Helpers/Validation.cs b/src/sw-sdk/Helpers/Validation.cs index e9cc18c..518d6c2 100644 --- a/src/sw-sdk/Helpers/Validation.cs +++ b/src/sw-sdk/Helpers/Validation.cs @@ -1,6 +1,4 @@ -using System.Net; - -namespace SW.Helpers +namespace SW.Helpers { public class Validation { diff --git a/src/sw-sdk/Helpers/XmlUtils.cs b/src/sw-sdk/Helpers/XmlUtils.cs index aa7ccff..69c51ef 100644 --- a/src/sw-sdk/Helpers/XmlUtils.cs +++ b/src/sw-sdk/Helpers/XmlUtils.cs @@ -1,14 +1,26 @@ using System; -using System.Collections.Generic; using System.Linq; using System.Text; -using System.Threading.Tasks; using System.Xml; namespace SW.Helpers { public static class XmlUtils { + internal static string GetUUIDFromTFD(string tfd) + { + try + { + XmlDocument doc = new XmlDocument(); + doc.LoadXml(tfd); + return doc.DocumentElement.Attributes.GetNamedItem("UUID").Value; + } + catch (Exception) + { + throw new ServicesException("No es posible obtener el UUID"); + } + } + public static string AddAddenda(string cfdiOriginal, string cfdiStamped,bool isb64) { string cfdi = cfdiStamped; diff --git a/src/sw-sdk/Services/AcceptReject/AcceptRejectResponseHandler.cs b/src/sw-sdk/Services/AcceptReject/AcceptRejectResponseHandler.cs index 4d3604e..7c04924 100644 --- a/src/sw-sdk/Services/AcceptReject/AcceptRejectResponseHandler.cs +++ b/src/sw-sdk/Services/AcceptReject/AcceptRejectResponseHandler.cs @@ -7,7 +7,7 @@ internal class AcceptRejectResponseHandler : ResponseHandler(); } } } diff --git a/src/sw-sdk/Services/Account/AccountResponseHandler.cs b/src/sw-sdk/Services/Account/AccountResponseHandler.cs index 8d7f6c4..025ee4b 100644 --- a/src/sw-sdk/Services/Account/AccountResponseHandler.cs +++ b/src/sw-sdk/Services/Account/AccountResponseHandler.cs @@ -7,7 +7,7 @@ internal class BalanceAccountResponseHandler : ResponseHandler { public override AccountResponse HandleException(Exception ex) { - return ex.ToAccountResponse(); + return ex.Response(); } } } diff --git a/src/sw-sdk/Services/Authentication/Authentication.cs b/src/sw-sdk/Services/Authentication/Authentication.cs index 0a72027..81b04e8 100644 --- a/src/sw-sdk/Services/Authentication/Authentication.cs +++ b/src/sw-sdk/Services/Authentication/Authentication.cs @@ -25,7 +25,7 @@ public override async System.Threading.Tasks.Task GetTokenAsync() } catch (Exception e) - { + { return _handler.HandleException(e); } } diff --git a/src/sw-sdk/Services/Authentication/AuthenticationResponseHandler.cs b/src/sw-sdk/Services/Authentication/AuthenticationResponseHandler.cs index 2042019..a322f2b 100644 --- a/src/sw-sdk/Services/Authentication/AuthenticationResponseHandler.cs +++ b/src/sw-sdk/Services/Authentication/AuthenticationResponseHandler.cs @@ -7,7 +7,7 @@ internal class AuthenticationResponseHandler : ResponseHandler { public override AuthResponse HandleException(Exception ex) { - return ex.ToAuthResponse(); + return ex.Response(); } } } diff --git a/src/sw-sdk/Services/Cancelation/CanelationResponseHandler.cs b/src/sw-sdk/Services/Cancelation/CanelationResponseHandler.cs index c2d3bc1..c885360 100644 --- a/src/sw-sdk/Services/Cancelation/CanelationResponseHandler.cs +++ b/src/sw-sdk/Services/Cancelation/CanelationResponseHandler.cs @@ -7,7 +7,7 @@ internal class CancelationResponseHandler : ResponseHandler { public override CancelationResponse HandleException(Exception ex) { - return ex.ToCancelationResponse(); + return ex.Response(); } } } diff --git a/src/sw-sdk/Services/Csd/CsdResponseHandler.cs b/src/sw-sdk/Services/Csd/CsdResponseHandler.cs index ff055cd..47fa622 100644 --- a/src/sw-sdk/Services/Csd/CsdResponseHandler.cs +++ b/src/sw-sdk/Services/Csd/CsdResponseHandler.cs @@ -11,7 +11,7 @@ internal class CsdResponseHandler : ResponseHandler { public override UploadCsdResponse HandleException(Exception ex) { - return ex.ToCargaCsdResponse(); + return ex.Response(); } } } diff --git a/src/sw-sdk/Services/Pdf/PdfResponseHandler.cs b/src/sw-sdk/Services/Pdf/PdfResponseHandler.cs index b921749..6050035 100644 --- a/src/sw-sdk/Services/Pdf/PdfResponseHandler.cs +++ b/src/sw-sdk/Services/Pdf/PdfResponseHandler.cs @@ -7,7 +7,7 @@ internal class PdfResponseHandler : ResponseHandler { public override PdfResponse HandleException(Exception ex) { - return ex.ToPdfResponse(); + return ex.Response(); } } } diff --git a/src/sw-sdk/Services/Pendings/PendingsResponseHandler.cs b/src/sw-sdk/Services/Pendings/PendingsResponseHandler.cs index 44e78d5..df6d7f7 100644 --- a/src/sw-sdk/Services/Pendings/PendingsResponseHandler.cs +++ b/src/sw-sdk/Services/Pendings/PendingsResponseHandler.cs @@ -7,7 +7,7 @@ internal class PendingsResponseHandler : ResponseHandler { public override PendingsResponse HandleException(Exception ex) { - return ex.ToPendingsResponse(); + return ex.Response(); } } } diff --git a/src/sw-sdk/Services/Relations/RelationsResponseHandler.cs b/src/sw-sdk/Services/Relations/RelationsResponseHandler.cs index 1be54d2..049faf8 100644 --- a/src/sw-sdk/Services/Relations/RelationsResponseHandler.cs +++ b/src/sw-sdk/Services/Relations/RelationsResponseHandler.cs @@ -7,7 +7,7 @@ internal class RelationsResponseHandler : ResponseHandler { public override RelationsResponse HandleException(Exception ex) { - return ex.ToRelationsResponse(); + return ex.Response(); } } } diff --git a/src/sw-sdk/Services/Resend/ResendResponseHandler.cs b/src/sw-sdk/Services/Resend/ResendResponseHandler.cs index 475399f..39e6447 100644 --- a/src/sw-sdk/Services/Resend/ResendResponseHandler.cs +++ b/src/sw-sdk/Services/Resend/ResendResponseHandler.cs @@ -1,15 +1,16 @@ using SW.Helpers; +using SW.Services; using System; using System.Collections.Generic; using System.Text; namespace sw_sdk.Services.Resend { - internal class ResendResponseHandler : SW.Services.ResponseHandler + internal class ResendResponseHandler : ResponseHandler { public override ResendResponse HandleException(Exception ex) { - return ex.ToResendResponse(); + return ex.Response(); } } } diff --git a/src/sw-sdk/Services/Resend/ResendService.cs b/src/sw-sdk/Services/Resend/ResendService.cs index 20eeb93..3b4a777 100644 --- a/src/sw-sdk/Services/Resend/ResendService.cs +++ b/src/sw-sdk/Services/Resend/ResendService.cs @@ -1,8 +1,4 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Text; +using System.Collections.Generic; using System.Threading.Tasks; namespace sw_sdk.Services.Resend diff --git a/src/sw-sdk/Services/ResponseHandler.cs b/src/sw-sdk/Services/ResponseHandler.cs index 56ae72a..90fd09d 100644 --- a/src/sw-sdk/Services/ResponseHandler.cs +++ b/src/sw-sdk/Services/ResponseHandler.cs @@ -2,11 +2,8 @@ using SW.Helpers; using System; using System.Collections.Generic; -using System.IO; -using System.Linq; using System.Net; using System.Net.Http; -using System.Text; using System.Threading.Tasks; namespace SW.Services diff --git a/src/sw-sdk/Services/Stamp/BaseStampV4XML.cs b/src/sw-sdk/Services/Stamp/BaseStampV4XML.cs new file mode 100644 index 0000000..6f41de7 --- /dev/null +++ b/src/sw-sdk/Services/Stamp/BaseStampV4XML.cs @@ -0,0 +1,64 @@ +using SW.Helpers; +using SW.Services.Storage; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace SW.Services.Stamp +{ + public abstract class BaseStampV4XML : StampService + { + private string _operation; + private string _apiUrl; + + public BaseStampV4XML(string url,string urlApi, string user, string password, string operation, string proxy, int proxyPort) : base(url, user, password, proxy, proxyPort) + { + _operation = operation; + _apiUrl = urlApi; + } + + public BaseStampV4XML(string url, string urlApi, string token, string operation, string proxy, int proxyPort) : base(url, token, proxy, proxyPort) + { + _operation = operation; + _apiUrl = urlApi; + } + + public virtual async Task TimbrarV2XMLAsync(string xml, string email = null, string customId = null, bool isb64 = false, string[] extras = null) + { + StampResponseHandlerV2XML handler = new StampResponseHandlerV2XML(xml); + + string format = isb64 ? "b64" : ""; + var xmlBytes = Encoding.UTF8.GetBytes(xml); + var headers = await GetHeadersAsync(email, customId, extras); + var content = GetMultipartContent(xmlBytes); + var proxy = Helpers.RequestHelper.ProxySettings(this.Proxy, this.ProxyPort); + + var response = await handler.GetPostResponseAsync(this.Url, + string.Format("v4/cfdi33/{0}/{1}/{2}", + _operation, + StampTypes.v2.ToString(), + format), headers, content, proxy); + + if(response.status == "error" && response.message == "CFDI3307 - Timbre duplicado. El customId proporcionado está duplicado.") + { + StorageResponseHandler storangeHandler = new StorageResponseHandler(); + string uuid = Helpers.XmlUtils.GetUUIDFromTFD(response.data.tfd); + var xmlFromStorange = await storangeHandler.GetResponseAsync(_apiUrl, + headers, $"datawarehouse/v1/live/{uuid}", + Helpers.RequestHelper.ProxySettings(this.Proxy, this.ProxyPort)); + + if(string.IsNullOrEmpty(xmlFromStorange.data.records[0].urlAckCfdi)) + throw new ServicesException("No es posible obtener el url para decargar el XML"); + + var dataResult = await Helpers.DowloadFile.DowloadFileAsync(xmlFromStorange.data.records[0].urlXml, + Helpers.RequestHelper.ProxySettings(this.Proxy, this.ProxyPort)); + dataResult.data.tfd = response.data.tfd; + dataResult.message = response.message; + + return dataResult; + } + return response; + } + } +} + diff --git a/src/sw-sdk/Services/Stamp/StampResponseHandler.cs b/src/sw-sdk/Services/Stamp/StampResponseHandler.cs index a852233..6a60931 100644 --- a/src/sw-sdk/Services/Stamp/StampResponseHandler.cs +++ b/src/sw-sdk/Services/Stamp/StampResponseHandler.cs @@ -11,7 +11,7 @@ internal class StampResponseHandlerV1 : ResponseHandler { public override StampResponseV1 HandleException(Exception ex) { - return ex.ToStampResponseV1(); + return ex.Response(); } } internal class StampResponseHandlerV2 : ResponseHandler @@ -34,7 +34,31 @@ public override async Task GetPostResponseAsync(string url, str public override StampResponseV2 HandleException(Exception ex) { - return ex.ToStampResponseV2(); + return ex.Response(); + } + } + + internal class StampResponseHandlerV2XML : ResponseHandler + { + public StampResponseHandlerV2XML() + { + } + + public StampResponseHandlerV2XML(string xmlOriginal) : base(xmlOriginal) + { + } + + public override async Task GetPostResponseAsync(string url, string path, Dictionary headers, HttpContent content, HttpClientHandler proxy) + { + var response = await base.GetPostResponseAsync(url, path, headers, content, proxy); + if (base.Has307AndAddenda(response, response.data)) + response.data.cfdi = base.GetCfdiData(response, response.data.cfdi, path.ToLower().EndsWith("b64")); + return response; + } + + public override StampResponseV2 HandleException(Exception ex) + { + return ex.Response(); } } internal class StampResponseHandlerV3 : ResponseHandler @@ -56,7 +80,7 @@ public override async Task GetPostResponseAsync(string url, str } public override StampResponseV3 HandleException(Exception ex) { - return ex.ToStampResponseV3(); + return ex.Response(); } } internal class StampResponseHandlerV4 : ResponseHandler @@ -78,7 +102,7 @@ public StampResponseHandlerV4(string xmlOriginal) : base(xmlOriginal) public override StampResponseV4 HandleException(Exception ex) { - return ex.ToStampResponseV4(); + return ex.Response(); } } } diff --git a/src/sw-sdk/Services/Stamp/StampV4XML.cs b/src/sw-sdk/Services/Stamp/StampV4XML.cs new file mode 100644 index 0000000..5800e8b --- /dev/null +++ b/src/sw-sdk/Services/Stamp/StampV4XML.cs @@ -0,0 +1,12 @@ +namespace SW.Services.Stamp +{ + public class StampV4XML : BaseStampV4XML + { + public StampV4XML(string url, string urlApi, string user, string password, int proxyPort = 0, string proxy = null) : base(url, urlApi, user, password, "stamp", proxy, proxyPort) + { + } + public StampV4XML(string url, string urlApi, string token, int proxyPort = 0, string proxy = null) : base(url, urlApi, token, "stamp", proxy, proxyPort) + { + } + } +} diff --git a/src/sw-sdk/Services/Storage/StorageResponseHandler.cs b/src/sw-sdk/Services/Storage/StorageResponseHandler.cs index 68a1a96..7d00215 100644 --- a/src/sw-sdk/Services/Storage/StorageResponseHandler.cs +++ b/src/sw-sdk/Services/Storage/StorageResponseHandler.cs @@ -7,7 +7,7 @@ internal class StorageResponseHandler : ResponseHandler { public override StorageResponse HandleException(Exception ex) { - return ex.ToStorageResponse(); + return ex.Response(); } } } diff --git a/src/sw-sdk/Services/Validate/ValidateResponseHandler.cs b/src/sw-sdk/Services/Validate/ValidateResponseHandler.cs index aad935d..aad32ac 100644 --- a/src/sw-sdk/Services/Validate/ValidateResponseHandler.cs +++ b/src/sw-sdk/Services/Validate/ValidateResponseHandler.cs @@ -7,7 +7,7 @@ internal class ValidateXmlResponseHandler : ResponseHandler { public override ValidateXmlResponse HandleException(Exception ex) { - return ex.ToValidateXmlResponse(); + return ex.Response(); } } } diff --git a/test/sdk-test/Helpers/BuildSettings.cs b/test/sdk-test/Helpers/BuildSettings.cs index c59385f..d78712d 100644 --- a/test/sdk-test/Helpers/BuildSettings.cs +++ b/test/sdk-test/Helpers/BuildSettings.cs @@ -7,6 +7,7 @@ namespace Test_SW.Helpers { class BuildSettings { + public string urlSAT = "https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc"; public string Url = "http://services.test.sw.com.mx"; public string UrlApi = "http://api.test.sw.com.mx"; public string User = "pruebas_ut@sw.com.mx"; diff --git a/test/sdk-test/Resources/CFDI33_Validacion_Servicio/cfdi33_ComercioExterior.xml b/test/sdk-test/Resources/CFDI33_Validacion_Servicio/cfdi33_ComercioExterior.xml index e0b930c..967a07e 100644 --- a/test/sdk-test/Resources/CFDI33_Validacion_Servicio/cfdi33_ComercioExterior.xml +++ b/test/sdk-test/Resources/CFDI33_Validacion_Servicio/cfdi33_ComercioExterior.xml @@ -1,5 +1,5 @@ - + diff --git a/test/sdk-test/Services/Account/Account_Test.cs b/test/sdk-test/Services/Account/Account_Test.cs index b2c5f03..f28102a 100644 --- a/test/sdk-test/Services/Account/Account_Test.cs +++ b/test/sdk-test/Services/Account/Account_Test.cs @@ -13,7 +13,7 @@ public class Account_Test_45 public async Task Account_Test_45_ConsultaDeSaldoByUserAsync() { var build = new BuildSettings(); - BalanceAccount account = new BalanceAccount("http://services.test.sw.com.mx", build.User, build.Password); + BalanceAccount account = new BalanceAccount("http://services.test.sw.com.mx", "demo", "123456789"); AccountResponse response = await account.ConsultarSaldoAsync(); if(response.status != "error") { diff --git a/test/sdk-test/Services/Resend/Resend_Test.cs b/test/sdk-test/Services/Resend/Resend_Test.cs index 9f3fcfd..1bc15eb 100644 --- a/test/sdk-test/Services/Resend/Resend_Test.cs +++ b/test/sdk-test/Services/Resend/Resend_Test.cs @@ -6,7 +6,7 @@ namespace sdk_test.Services.Resend { public class Resend_Test { - [Fact] + [Fact(Skip = "bug SMARTER-2687")] public async Task Resend_email() { var build = new BuildSettings(); diff --git a/test/sdk-test/Services/Stamp/StampV4XML_Test.cs b/test/sdk-test/Services/Stamp/StampV4XML_Test.cs new file mode 100644 index 0000000..279c452 --- /dev/null +++ b/test/sdk-test/Services/Stamp/StampV4XML_Test.cs @@ -0,0 +1,53 @@ +using System; +using System.IO; +using System.Text; +using SW.Services.Stamp; +using Test_SW.Helpers; +using Xunit; +using System.Threading.Tasks; + +namespace Test_SW.Services.Stamp_Test +{ + public class StampV4XML_Test + { + [Fact] + public async Task Stamp_Test_StampV4XMLV4_SameCustomID_byTokenAsync() + { + string CustomId = Guid.NewGuid().ToString(); + var build = new BuildSettings(); + BaseStampV4XML stamp = new StampV4XML(build.Url, build.UrlSWServices, build.Token); + var xml = GetXml(build); + var response = (StampResponseV2)await stamp.TimbrarV2XMLAsync(xml,null ,CustomId); + Assert.True(response.data != null, "El resultado data viene vacio."); + Assert.True(!string.IsNullOrEmpty(response.data.cfdi), "El resultado data.cfdi viene vacio."); + + xml = GetXml(build); + response = (StampResponseV2)await stamp.TimbrarV2XMLAsync(xml,null ,CustomId); + Assert.True(response.status == "error" && response.message == "CFDI3307 - Timbre duplicado. El customId proporcionado está duplicado."); + } + + [Fact] + public async Task Stamp_Test_StampV4XMLV4_DifCustomID_byTokenAsync() + { + string CustomIdfirstRequest = Guid.NewGuid().ToString(); + string CustomIdSecondRequest = Guid.NewGuid().ToString(); + var build = new BuildSettings(); + BaseStampV4XML stamp = new StampV4XML(build.Url, build.UrlSWServices ,build.Token); + var xml = GetXml(build); + var response = (StampResponseV2)await stamp.TimbrarV2XMLAsync(xml,null ,CustomIdfirstRequest); + Assert.True(response.data != null, "El resultado data viene vacio."); + + Assert.True(!string.IsNullOrEmpty(response.data.cfdi), "El resultado data.cfdi viene vacio."); + response = (StampResponseV2)await stamp.TimbrarV2XMLAsync(xml,null ,CustomIdSecondRequest); + + Assert.True(response.status == "error" && response.message == "307. El comprobante contiene un timbre previo."); + } + + private string GetXml(BuildSettings build) + { + var xml = Encoding.UTF8.GetString(File.ReadAllBytes("Resources/file.xml")); + xml = SignTools.SigXml(xml, Convert.FromBase64String(build.Pfx), build.CerPassword); + return xml; + } + } +}