internal static IDialog <CardToCardTransfer> MakeRoot() { return(Chain.From(() => FormDialog.FromForm(CardToCardFormBuilder.MakeForm)) .Do(async(context, order) => { try { var completed = await order; var alfaService = new AlfabankService(); string expDate = completed.ValidThruYear.ToString() + ((int)completed.ValidThruMonth).ToString("D2"); string confirmationUrl = await alfaService.TransferMoney(completed.SourceCardNumber, expDate, completed.CVV, completed.DestinationCardNumber, completed.Amount); await context.PostAsync($"Осталось только подтвердить платеж. Перейдите по адресу {confirmationUrl}"); } catch (FormCanceledException <CardToCardTransfer> e) { string reply; if (e.InnerException == null) { reply = $"Вы прервали операцию, попробуем позже!"; } else { reply = "Извините, произошла ошибка. Попробуйте позже."; } await context.PostAsync(reply); } })); }
public static IForm <CardToCardTransfer> MakeForm() { FormBuilder <CardToCardTransfer> _order = new FormBuilder <CardToCardTransfer>(); ValidateAsyncDelegate <CardToCardTransfer> validateCard = async(state, value) => { var cardNumber = value as string; string errorMessage; ValidateResult result = new ValidateResult(); result.IsValid = CardValidator.IsCardValid(cardNumber, out errorMessage); result.Feedback = errorMessage; return(result); }; return(_order .Message("Добро пожаловать в сервис перевода денег с карты на карту!") .Field(nameof(CardToCardTransfer.SourceCardNumber), null, validateCard) .Field(nameof(CardToCardTransfer.Fee), state => false) .Field(nameof(CardToCardTransfer.ValidThruMonth)) .Field(nameof(CardToCardTransfer.ValidThruYear)) .Field(nameof(CardToCardTransfer.DestinationCardNumber), null, validateCard) .Field(nameof(CardToCardTransfer.CVV)) .Field(nameof(CardToCardTransfer.Amount), null, async(state, value) => { int amount = int.Parse(value.ToString()); var alfabankService = new AlfabankService(); string auth = await alfabankService.AuthorizePartner(); state.Fee = (double)await alfabankService.GetCommission(auth, state.SourceCardNumber, state.DestinationCardNumber, amount); ValidateResult result = new ValidateResult(); result.IsValid = true; return result; }) .Confirm("Вы хотите перевести {Amount} рублей с карты {SourceCardNumber} на карту {DestinationCardNumber}? Комиссия составит {Fee} рублей. (y/n)") .OnCompletionAsync(async(context, cardTocardTransfer) => { Debug.WriteLine("{0}", cardTocardTransfer); }) .Build()); }