private async Task <CFDIWrapperResult> CallServiceAsync(Format restType,
                                                                RestMethod restConstant, string token, Uri requestUri,
                                                                string serializedParameters)
        {
            CFDIWrapperResult cFDIWrapperResult = new CFDIWrapperResult()
            {
                status = "400", detail = "Error no controlado"
            };
            HttpClient client = new HttpClient();

            client.Timeout = TimeSpan.FromMinutes(40);
            string result = string.Empty;

            ConfigureEndPoints(requestUri);
            HttpRequestMessage reqmsg = new HttpRequestMessage();

            reqmsg.RequestUri = requestUri;
            reqmsg.Method     = new HttpMethod(restConstant.ToString("g"));
            reqmsg.Headers.TryAddWithoutValidation("token", token);

            if (reqmsg.Method == HttpMethod.Post || reqmsg.Method == HttpMethod.Put)
            {
                reqmsg.Content = new StringContent(serializedParameters, Encoding.UTF8, resolveContentType(restType));
            }
            var response = await client.SendAsync(reqmsg, HttpCompletionOption.ResponseContentRead);

            result = await response.Content.ReadAsStringAsync();

            if (!response.IsSuccessStatusCode)
            {
                if (!String.IsNullOrEmpty(result))
                {
                    cFDIWrapperResult = JsonConvert.DeserializeObject <CFDIWrapperResult>(result);
                }
                else
                {
                    throw new CotorraException(1000, "1000", "No se pudo conectar al servicio.", null);
                }
            }
            else
            {
                cFDIWrapperResult.detail = await response.Content.ReadAsStringAsync();
            }

            return(cFDIWrapperResult);
        }
        public async Task <CancelDocumentResult <ICFDINomProvider> > CancelStampingDocumentAsync(
            CancelDocumentResult <ICFDINomProvider> cancelDocumentResult)
        {
            //call service async
            CFDIWrapperResult result = null;
            var xmlSerialized        = JsonConvert.SerializeObject(cancelDocumentResult.CancelationXML);

            await CallServiceAsync(Format.JSON, RestMethod.POST, _cotorraiWrapperCFDIToken,
                                   new Uri($"{_cotorraiWrapperPACUrl}/fiscal/stamping/cancelrequest"), xmlSerialized)
            .ContinueWith((i) =>
            {
                if (i.Exception != null)
                {
                    throw i.Exception;
                }

                result = i.Result;
            });

            if (result.status == "400" && result.errors == null)
            {
                //TFD Fix string input :(
                var xmlAcknowledgement = result.detail.Remove(0, 1);
                xmlAcknowledgement = xmlAcknowledgement.Remove(xmlAcknowledgement.Length - 1, 1);
                xmlAcknowledgement = xmlAcknowledgement.Replace("\\\"", "\"");
                xmlAcknowledgement = xmlAcknowledgement.Replace("\\r\\n", "");
                cancelDocumentResult.WithErrors = false;
                cancelDocumentResult.CancelationAcknowledgmentReceipt = xmlAcknowledgement;
            }
            else if (result.status == "400" && result.errors != null)
            {
                cancelDocumentResult.WithErrors = true;
                cancelDocumentResult.Details    = result.errors.FirstOrDefault();
            }
            else
            {
                cancelDocumentResult.WithErrors = true;
                cancelDocumentResult.Details    = $"Ocurrió un error no esperado en el timbrado: {result.detail}";
            }

            return(cancelDocumentResult);
        }
        public async Task <SignDocumentResult <ICFDINomProvider> > StampDocumetAsync(
            SignDocumentResult <ICFDINomProvider> signDocumentResult, FiscalStampingVersion fiscalStampingVersion, string xml)
        {
            //call service async
            CFDIWrapperResult result = null;
            var xmlSerialized        = JsonConvert.SerializeObject(xml);

            await CallServiceAsync(Format.JSON, RestMethod.POST, _cotorraiWrapperCFDIToken,
                                   new Uri($"{_cotorraiWrapperPACUrl}/fiscal/stamping/stamp"), xmlSerialized)
            .ContinueWith((i) =>
            {
                if (i.Exception != null)
                {
                    throw i.Exception;
                }

                result = i.Result;
            });

            if (result.status == "400" && result.errors == null)
            {
                //TFD Fix string input :(
                var xmlTFD = result.detail.Remove(0, 1);
                xmlTFD = xmlTFD.Remove(xmlTFD.Length - 1, 1);
                xmlTFD = xmlTFD.Replace("\\\"", "\"");
                signDocumentResult.WithErrors = false;
                signDocumentResult.TFD        = xmlTFD;
            }
            else if (result.status == "400" && result.errors != null)
            {
                signDocumentResult.WithErrors = true;
                signDocumentResult.Details    = result.errors.FirstOrDefault();
            }
            else
            {
                signDocumentResult.WithErrors = true;
                signDocumentResult.Details    = $"Ocurrió un error no esperado en el timbrado: {result.detail}";
            }

            return(signDocumentResult);
        }