public override ShetabPaymentReversal Reversal(string paymentCode)
        {
            var result = new ShetabPaymentReversal();

            result.BankType = this.BankType;

            int orderid;

            if (!int.TryParse(paymentCode, out orderid))
            {
                var  pec       = new ir.shaparak.pec.EShopService();
                byte pecStatus = 0;

                pec.PinReversal(Config.Credentials.Pin, orderid, orderid, ref pecStatus);

                result.Status    = pecStatus;
                result.Succeeded = (pecStatus == 0);
            }

            return(result);
        }
        public override Task <ShetabPaymentReversal> ReversalAsync(string paymentCode, CancellationToken cancellation)
        {
            var tcs = new TaskCompletionSource <ShetabPaymentReversal>();

            try
            {
                var pec = new ir.shaparak.pec.EShopService();

                pec.PinReversalCompleted += new PinReversalCompletedEventHandler((sender, args) =>
                {
                    if (args.Error != null)
                    {
                        tcs.TrySetException(args.Error);
                    }
                    else
                    if (!args.Cancelled)
                    {
                        try
                        {
                            var result = new ShetabPaymentReversal();

                            result.Status    = args.status;
                            result.Succeeded = (args.status == 0);
                            result.BankType  = this.BankType;

                            tcs.SetResult(result);
                        }
                        catch (Exception ex)
                        {
                            tcs.TrySetException(ex);
                        }
                    }
                    else
                    {
                        tcs.SetCanceled();
                    }

                    pec.Dispose();
                });

                byte pecStatus = 0;
                int  orderid   = 0;

                if (!int.TryParse(paymentCode, out orderid))
                {
                    var result = new ShetabPaymentReversal();

                    result.Status = (int)ParsianBankTranStatus.InvalidReversalOrder;

                    tcs.SetResult(result);
                }
                else
                {
                    cancellation.Register(() => pec.CancelAsync(paymentCode));

                    pec.PinReversalAsync(Config.Credentials.Pin, orderid, orderid, pecStatus, paymentCode);
                }
            }
            catch (Exception e)
            {
                tcs.SetException(e);
            }

            return(tcs.Task);
        }