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);
        }
Beispiel #2
0
 public Task <CancelDocumentResult <ICFDINomProvider> > CancelStampingDocumentAsync(CancelDocumentResult <ICFDINomProvider> cancelDocumentResult)
 {
     throw new NotImplementedException();
 }
        /// <summary>
        /// CancelDocumetAsync
        /// </summary>
        /// <returns></returns>
        public async Task <CancelPayrollStampingResult> CancelDocumetAsync(CancelDocumentParams cancelDocumentParams)
        {
            var cancelPayrollStampingResult = new CancelPayrollStampingResult();

            try
            {
                //Get datetime from ZipCode of Employer
                var zipCodeManager = new ZipCodeManager(cancelDocumentParams.ZipCodes);
                (var zipcode, var datetimeFromZipCode) = await zipCodeManager.GetZipCode(cancelDocumentParams.IssuerZipCode);

                //Fill the cancelation object
                Cancelacion cancelacion = new Cancelacion();
                cancelacion.RfcEmisor = cancelDocumentParams.IssuerRFC;
                cancelacion.Fecha     = DateTime.Parse(string.Format("{0:s}", datetimeFromZipCode), CultureInfo.InvariantCulture);
                var cancelacionFolios = new List <CancelacionFolios>();
                var uuids             = cancelDocumentParams.CancelDocumentParamsDetails.Select(p => p.UUID).ToList();
                uuids.ForEach(p => cancelacionFolios.Add(new CancelacionFolios()
                {
                    UUID = p.ToString().ToLower()
                }));
                cancelacion.Folios = cancelacionFolios.ToArray();

                //Creates the cancelationXML
                var xmlCancelation = createCancelationXML(cancelDocumentParams, cancelacion);

                //Call PAC for cancelation
                var stampResult = new CancelDocumentResult <ICFDINomProvider>();
                stampResult.CancelationXML = xmlCancelation;
                stampResult.InstanceID     = cancelDocumentParams.InstanceID;
                IPACProvider pACProvider          = FactoryPACProvider.CreateInstanceFromConfig();
                var          cancelationPACResult = await pACProvider.CancelStampingDocumentAsync(stampResult);

                if (cancelationPACResult.WithErrors)
                {
                    cancelPayrollStampingResult.WithErrors = true;
                    cancelPayrollStampingResult.Message    = cancelationPACResult.Details;
                }
                else
                {
                    cancelPayrollStampingResult.WithErrors                        = false;
                    cancelPayrollStampingResult.CancelacionXMLRequest             = cancelationPACResult.CancelationXML;
                    cancelPayrollStampingResult.CancelacionXMLAcknowledgeResponse = cancelationPACResult.CancelationAcknowledgmentReceipt;

                    //Fill each UUID with the proper status
                    var acuse = SerializerXml.DeserializeObject <Acuse>(cancelationPACResult.CancelationAcknowledgmentReceipt);
                    acuse.Folios.ForEach(p =>
                    {
                        var detail = new CancelPayrollStampingResultDetail();

                        /*
                         * 201 - El folio se ha cancelado con éxito.
                         * 202 - El CFDI ya había sido cancelado previamente.
                         * 203 - UUID no corresponde al emisor.
                         * 204 - El CFDI no aplica para cancelación.
                         * 205 - El UUID no existe o no ha sido procesado por el SAT.
                         * 402 - El Contribuyente no se encuentra el la LCO o la validez de obligaciones se reporta como negativa.
                         */
                        if (p.EstatusUUID == "201" || p.EstatusUUID == "202") //estatus good
                        {
                            statusCancelationCodes.TryGetValue(p.EstatusUUID, out string message);
                            detail.Message = $"{p.EstatusUUID} : {message}";
                            detail.UUID    = Guid.Parse(p.UUID);
                            detail.PayrollStampingResultStatus = PayrollStampingResultStatus.Success;
                        }
                        else
                        {
                            statusCancelationCodes.TryGetValue(p.EstatusUUID, out string message);
                            detail.Message = $"Error al cancelar {p.EstatusUUID} : {message}";
                            detail.UUID    = Guid.Parse(p.UUID);
                            detail.PayrollStampingResultStatus = PayrollStampingResultStatus.Fail;
                        }
                        cancelPayrollStampingResult.CancelPayrollStampingResultDetails.Add(detail);
                    });
                }
            }
            catch (Exception ex)
            {
                cancelPayrollStampingResult.WithErrors = true;
                cancelPayrollStampingResult.Message    = $"Ocurrió un error no controlado en la cancelación: {ex.Message}";
            }

            return(cancelPayrollStampingResult);
        }