public static int LogContractPayment(Contract contract, string methodName, string rawData)
        {
            SupportedPlugin plugin = GetResellerPMPlugin(contract.ResellerId, methodName);

            //
            return(EcommerceProvider.WriteSupportedPluginLog(contract.ContractId, plugin.PluginId, 0, rawData));
        }
        internal static SystemPluginBase GetSystemPluginInstance(string contractId, SupportedPlugin plugin,
                                                                 bool setupPlugin)
        {
            Contract contract = ContractSystem.ContractController.GetContract(contractId);

            //
            return(GetSystemPluginInstance(contract, plugin, setupPlugin));
        }
        /// <summary>
        /// Gets contracts' payment provider
        /// </summary>
        /// <param name="contractInfo"></param>
        /// <param name="methodName"></param>
        /// <returns></returns>
        internal static SystemPluginBase GetContractPaymentMethod(Contract contractInfo, string methodName)
        {
            // Load supported plugin
            SupportedPlugin plugin = GetResellerPMPlugin(contractInfo.ResellerId, methodName);

            //
            return(GetSystemPluginInstance(contractInfo, plugin, true));
        }
        internal static SystemPluginBase GetSystemPluginInstance(int pluginId)
        {
            // load plugin
            SupportedPlugin plugin = GetSupportedPluginById(pluginId);

            //
            return(GetSystemPluginInstance(plugin));
        }
        internal static SupportedPlugin GetResellerPMPlugin(int resellerId, string methodName)
        {
            SupportedPlugin plugin = ObjectUtils.FillObjectFromDataReader <SupportedPlugin>(
                EcommerceProvider.GetResellerPMPlugin(resellerId, methodName));

            //
            if (plugin == null)
            {
                throw new Exception("RESELLER_PM_PLUGIN_NOT_FOUND");
            }
            //
            return(plugin);
        }
        internal static SystemPluginBase GetSystemPluginInstance(Contract contract, SupportedPlugin plugin,
                                                                 bool setupPlugin)
        {
            // load plugin
            SystemPluginBase pluginObj = GetSystemPluginInstance(plugin);

            //
            if (setupPlugin)
            {
                SetupSystemPlugin(contract.ResellerId, pluginObj);
            }
            //
            return(pluginObj);
        }
        internal static SystemPluginBase GetSystemPluginInstance(SupportedPlugin plugin)
        {
            // check plugin not empty
            if (plugin == null)
            {
                throw new ArgumentNullException("plugin");
            }
            // create system plugin instance
            SystemPluginBase pluginObj = (SystemPluginBase)Activator.CreateInstance(Type.GetType(plugin.TypeName));

            // copy fields
            pluginObj.PluginId   = plugin.PluginId;
            pluginObj.PluginName = plugin.PluginName;
            // return
            return(pluginObj);
        }
        public static CheckoutFormParams GetCheckoutFormParams(string contractId, int invoiceId,
                                                               string methodName, KeyValueBunch options)
        {
            Contract contractInfo = ContractSystem.ContractController.GetContract(contractId);

            // Impersonate
            ContractSystem.ContractController.ImpersonateAsContractReseller(contractInfo);
            //
            SupportedPlugin pmPlugin = GetResellerPMPlugin(contractInfo.ResellerId, methodName);

            //
            if (pmPlugin == null)
            {
                throw new Exception("Incorrect payment method has been specified");
            }
            // create instance of plugin
            IInteractivePaymentGatewayProvider provider = (IInteractivePaymentGatewayProvider)
                                                          SystemPluginController.GetSystemPluginInstance(contractInfo, pmPlugin, true);
            //
            Invoice userInvoice = InvoiceController.GetCustomerInvoiceInternally(invoiceId);
            //
            List <InvoiceItem> invoiceLines = InvoiceController.GetCustomerInvoiceItems(invoiceId);
            // load contract account
            ContractAccount account = ContractSystem.ContractController.GetContractAccountSettings(contractId);

            // build form parameters
            FormParameters formParams = new FormParameters();

            // copy reseller id
            formParams[FormParameters.CONTRACT] = userInvoice.ContractId;
            // copy invoice number
            formParams[FormParameters.INVOICE] = userInvoice.InvoiceId.ToString();
            // copy invoice amount
            formParams[FormParameters.AMOUNT] = userInvoice.Total.ToString("0.00");
            // copy invoice tax amount
            formParams[FormParameters.TAX_AMOUNT] = userInvoice.TaxAmount.ToString("0.00");
            // copy invoice currency
            formParams[FormParameters.CURRENCY] = userInvoice.Currency;

            // copy first name
            formParams[FormParameters.FIRST_NAME] = account[ContractAccount.FIRST_NAME];
            // copy last name
            formParams[FormParameters.LAST_NAME] = account[ContractAccount.LAST_NAME];
            // copy email
            formParams[FormParameters.EMAIL] = account[ContractAccount.EMAIL];
            // copy address
            formParams[FormParameters.ADDRESS] = account[ContractAccount.ADDRESS];
            // copy country
            formParams[FormParameters.COUNTRY] = account[ContractAccount.COUNTRY];
            // copy phone number
            formParams[FormParameters.PHONE] = account[ContractAccount.PHONE_NUMBER];
            // copy city
            formParams[FormParameters.CITY] = account[ContractAccount.CITY];
            // copy state
            formParams[FormParameters.STATE] = account[ContractAccount.STATE];
            // copy zip
            formParams[FormParameters.ZIP] = account[ContractAccount.ZIP];
            // copy options if any
            if (options != null)
            {
                foreach (string keyName in options.GetAllKeys())
                {
                    formParams[keyName] = options[keyName];
                }
            }

            // return result
            return(provider.GetCheckoutFormParams(formParams, invoiceLines.ToArray()));
        }