public override void WriteXml(ref IaXmlWriter xml)
        {
            xml.WriteStartElement("function");
            xml.WriteAttribute("controlid", ControlId, true);

            xml.WriteStartElement("create");

            xml.WriteStartElement("arpymt");

            if (!string.IsNullOrWhiteSpace(UndepositedFundsGlAccountNo))
            {
                xml.WriteElement("undepositedaccountno", BankAccountId); // undepfundsacct
            }
            else
            {
                xml.WriteElement("financialentity", BankAccountId); // bankaccountid
            }

            xml.WriteElement("paymentmethod", PaymentMethod, true);
            xml.WriteElement("customerid", CustomerId, true);
            xml.WriteElement("docnumber", ReferenceNumber); // "refid"
            xml.WriteElement("description", Description);

            //if (ExchangeRateDate.HasValue)
            //{
            //    xml.WriteStartElement("exchratedate");
            //    xml.WriteDateSplitElements2(ExchangeRateDate.Value);
            //    xml.WriteEndElement(); //exchratedate
            //}

            if (!string.IsNullOrWhiteSpace(ExchangeRateType))
            {
                xml.WriteElement("exch_rate_type_id", ExchangeRateType); // "exchratetype"
            }
            else if (ExchangeRateValue.HasValue)
            {
                xml.WriteElement("exchange_rate", ExchangeRateValue); // "exchrate"
            }
            else if (!string.IsNullOrWhiteSpace(BaseCurrency) || !string.IsNullOrWhiteSpace(TransactionCurrency))
            {
                xml.WriteElement("exchratetype", ExchangeRateType, true);
            }

            xml.WriteStartElement("receiptdate");      // "datereceived"
            xml.WriteDateMMddyyyy(ReceivedDate.Value); // Required element
            xml.WriteEndElement();                     //receiptdate

            if (PaymentDate.HasValue)
            {
                xml.WriteStartElement("paymentdate");
                xml.WriteDateMMddyyyy(PaymentDate.Value);
                xml.WriteEndElement(); //paymentdate
            }

            xml.WriteElement("amounttopay", BasePaymentAmount, true);            // "translatedamount"
            xml.WriteElement("trx_amounttopay", TransactionPaymentAmount, true); // paymentamount

            xml.WriteElement("prbatch", SummaryRecordNo);                        // batchkey

            if (WhenPaidDate.HasValue)
            {
                xml.WriteStartElement("whenpaid");
                xml.WriteDateMMddyyyy(WhenPaidDate.Value);
                xml.WriteEndElement(); //paymentdate
            }

            xml.WriteElement("currency", TransactionCurrency);
            xml.WriteElement("basecurr", BaseCurrency);

            xml.WriteElement("undepositedaccountno", UndepositedFundsGlAccountNo);

            xml.WriteElement("overpaymentamount", OverpaymentAmount, true);
            xml.WriteElement("overpaymentlocationid", OverpaymentLocationId);     // "overpaylocid"
            xml.WriteElement("overpaymentdepartmentid", OverpaymentDepartmentId); // "overpaydeptid"

            xml.WriteElement("billtopayname", BillToPayName);

            //xml.WriteElement("cctype", CreditCardType);
            //xml.WriteElement("authcode", AuthorizationCode);

            if (ApplyToTransactions.Count > 0)
            {
                xml.WriteStartElement("arpymtdetails"); // "arpaymentitem"

                foreach (ArPaymentItem2 applyToTransaction in ApplyToTransactions)
                {
                    applyToTransaction.WriteXml(ref xml);
                }

                xml.WriteEndElement(); // arpymtdetails
            }

            // TODO online payment methods

            xml.WriteEndElement(); //create

            xml.WriteEndElement(); //arpymt

            xml.WriteEndElement(); //function
        }