private Form GetForm(SessionContext context, string purseNumber, long?id, PaymentNumberKind numberKind)
        {
            var template =
                TemplateLoader.LoadSubmitFormTemplate(context.ExtensionManager, ExtensionCatalog.FindMerchantTransfer);

            var origin =
                new AccountDropDownListOrigin(context.UnityContainer)
            {
                SelectedAccountNumber = purseNumber
            };

            origin.FilterCriteria.CurrencyCapabilities = CurrencyCapabilities.Invoice;

            var itemTemplates = AccountDisplayHelper.BuildAccountDropDownListItemTemplates(origin);

            var step1TemplateWrapper = new FindMerchantTransferFormTemplateWrapper.Step1(template);

            step1TemplateWrapper.Control1FromPurse.Items.Clear();
            step1TemplateWrapper.Control1FromPurse.Items.AddRange(itemTemplates);

            var form = new SubmitForm();

            ErrorFormDisplayHelper.ApplyErrorAction(context.ExtensionManager, form);

            var incomeValuesWrapperStep1 = new FindMerchantTransferFormValuesWrapper.Step1();

            if (id.HasValue)
            {
                incomeValuesWrapperStep1.Control2Number = id.Value;
            }

            incomeValuesWrapperStep1.Control3NumberType = numberKind.ToString();

            form.ApplyTemplate(template, incomeValuesWrapperStep1.CollectIncomeValues());

            form.WorkCallback = (step, list) =>
            {
                switch (step)
                {
                case 0:
                    var valuesWrapperStep1 = new FindMerchantTransferFormValuesWrapper.Step1(list);

                    var paymentService = context.UnityContainer.Resolve <IPaymentService>();

                    var merchantPayment = paymentService.FindPayment(valuesWrapperStep1.Control1FromPurse,
                                                                     valuesWrapperStep1.Control2Number,
                                                                     (PaymentNumberKind)Enum.Parse(typeof(PaymentNumberKind),
                                                                                                   valuesWrapperStep1.Control3NumberType));

                    var formattingService = context.UnityContainer.Resolve <IFormattingService>();

                    var records = new List <ResultRecord>();
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "System transfer ID"),
                                    merchantPayment.TransferId.ToString()));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "System invoice ID"),
                                    merchantPayment.InvoiceId.ToString()));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Amount"),
                                    formattingService.FormatAmount(merchantPayment.Amount)));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Creation time"),
                                    formattingService.FormatDateTime(merchantPayment.CreationTime)));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Description"),
                                    merchantPayment.Description ?? string.Empty));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Source purse"),
                                    merchantPayment.SourcePurse ?? string.Empty));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Source WMID"),
                                    formattingService.FormatIdentifier(merchantPayment.SourceIdentifier)));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Is Capitaller"),
                                    merchantPayment.IsCapitaller.ToString()));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Is enum"),
                                    merchantPayment.IsEnum.ToString()));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "IP Address"),
                                    merchantPayment.IPAddress?.ToString()));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Telepat phone"),
                                    merchantPayment.TelepatPhone ?? string.Empty));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Telepat method"),
                                    merchantPayment.TelepatMethod?.ToString() ?? string.Empty));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Paymer number"),
                                    merchantPayment.PaymerNumber ?? string.Empty));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Paymer email"),
                                    merchantPayment.PaymerEmail ?? string.Empty));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Paymer type"),
                                    merchantPayment.PaymerType.ToString()));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Cashier number"),
                                    merchantPayment.CashierNumber ?? string.Empty));
                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Cashier date"),
                                    merchantPayment.CashierDate?.ToString() ?? string.Empty));

                    var cashierAmountValue = string.Empty;

                    if (null != merchantPayment.CashierAmount)
                    {
                        cashierAmountValue = formattingService.FormatAmount(merchantPayment.CashierAmount.Value);
                    }

                    records.Add(new ResultRecord(
                                    Translator.Instance.Translate(ExtensionCatalog.FindMerchantTransfer, "Cashier amount"),
                                    cashierAmountValue));
                    // TODO [M] добавить SDP
                    // records.Add(new ResultRecord("sdp_type", merchantPayment.));

                    var valuesWrapperStep2 = new FindMerchantTransferFormValuesWrapper.Step2();
                    valuesWrapperStep2.Control1Payment = records.Select(r => new ListItemContent(r)).ToList();

                    return(valuesWrapperStep2.CollectIncomeValues());

                case 1:
                    return(new Dictionary <string, object>());

                default:
                    throw new InvalidOperationException("step == " + step);
                }
            };

            if (null != id)
            {
                form.Load += (sender, args) =>
                {
                    form.Submit();
                };
            }

            return(form);
        }
 public MerchantOperationObtainer(Purse targetPurse, uint paymentNumber, PaymentNumberKind numberType)
 {
     TargetPurse   = targetPurse;
     PaymentNumber = paymentNumber;
     NumberType    = numberType;
 }