public Batch_Sale_Build_Result Sale_Build(Batch_Sale_Build_Details details)
        {
            // Transaction Type, Transaction Ref, Card Holder, Card Number, Expiry Date MMYYYY, Budget Period (00 -> 60), Amount (cents)
            string cdata = "<![CDATA[";

            foreach (var detail in details.Lines)
            {
                string expdate = (detail.CardExpiryMonth < 10 ? "0" + detail.CardExpiryMonth : detail.CardExpiryMonth.ToString()) + detail.CardExpiryYear.ToString();
                cdata += string.Format("'{0}','{1}','{2}','{3}','{4}','{5}','{6}' {7}", "A",
                                       detail.LineIdentifier, detail.CardBankName, detail.CardBankNumber, expdate, 0, ((int)(detail.Amount * 100)).ToString(), Environment.NewLine);
            }
            cdata += "]]>";

            var file = string.Format
                       (
                "<protocol ver='4.0' pgid='{0}' pwd='{1}'><batchtx bref='{2}' cur='{3}'> {4} </batchtx></protocol> ",
                PayGateID, Password, details.BatchIdentifier, details.BatchCurrency, cdata
                       );

            return(new Batch_Sale_Build_Result
            {
                isBuildSuccess = true,
                RequestFile = file
            });
        }
Ejemplo n.º 2
0
        public Batch_Sale_Build_Result Sale_Build(Batch_Sale_Build_Details details)
        {
            if (details.Lines.Count <= 0)
            {
                throw new Exception("Cannot create an empty batch");
            }

            //pre validation
            StringBuilder batch_csv_string_V = new StringBuilder(); //validation csv


            var fileheader = string.Format("H\t{0}\t1\t{1}\t{2}\t{3}\t24ade73c-98cf-47b3-99be-cc7b867b3080\r\n",
                                           ServiceKey, ServiceType, details.BatchIdentifier, details.ActionDate.ToString("yyyyMMdd"));

            var filekey = string.Format("K\t101\t102\t131\t132\t133\t134\t135\t136\t162\t301\t302\t303\r\n");

            StringBuilder batch_csv_string_lines = new StringBuilder();

            #region Build Lines

            foreach (var row in details.Lines)
            {
                string BankBranchCode = "0";

                if (!String.IsNullOrEmpty(row.BankBranch))
                {
                    BankBranchCode = row.BankBranch;

                    if (BankBranchCode.Length > 6)
                    {
                        throw new Exception("Branch code MUST contain 6 digits");
                    }

                    while (BankBranchCode.Length < 6)
                    {
                        BankBranchCode = "0" + BankBranchCode;
                    }
                }

                string AccRef      = row.ExtRef;
                string AccName     = row.CardBankName;
                string BankAccName = row.CardBankName;
                string AccType     = "0";
                string BranchCode  = BankBranchCode;
                string AccNum      = !String.IsNullOrEmpty(row.CardBankNumber) ? row.CardBankNumber : "0";
                string ContractAmt = row.Amount >= 0 ? ((int)(row.Amount * 100)).ToString("F0") : "0";
                string BatchAmount = ContractAmt;
                string Extra1      = row.LineIdentifier;      //line (paymentID)
                string Extra2      = row.ExtRef;              //customer (customerID)
                string Extra3      = details.BatchIdentifier; //batch (batchID)

                if (!row.isCreditCard)
                {
                    switch (row.BankAccountType)
                    {
                    case ("Current"):
                    case ("Checking"):
                    case ("Cheque"):
                    {
                        AccType = "1";
                    }
                    break;

                    case ("Savings"):
                    {
                        AccType = "2";
                    }
                    break;

                    case ("Transmission"):
                    {
                        AccType = "3";
                    }
                    break;

                    default:
                    {
                        throw new Exception("Account Type Invalid");
                    }
                    }
                }

                var transaction = string.Format("T\t{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}\t{9}\t{10}\t{11}\r\n",
                                                AccRef, AccName, 1, BankAccName, AccType, BranchCode, 0, AccNum, ContractAmt, Extra1, Extra2, Extra3);

                batch_csv_string_lines.Append(transaction);
            }
            #endregion

            var filefooter = string.Format("F\t{0}\t{1}\t{2}\r\n",
                                           details.Lines.Count, details.Lines.Sum(r => r.Amount * 100).ToString("F0"), 9999);

            //validation CSV
            batch_csv_string_V.Append(fileheader);
            batch_csv_string_V.Append(filekey);
            batch_csv_string_V.Append(batch_csv_string_lines.ToString());
            batch_csv_string_V.Append(filefooter);

            return(new Batch_Sale_Build_Result {
                RequestFile = batch_csv_string_V.ToString(), isBuildSuccess = true
            });
        }
Ejemplo n.º 3
0
        //public string GenerateDebitRef(string ExtRef)
        //{
        //    string Ref = ExtRef;

        //    var total = ExtRef.Length;

        //    if (total < 10)
        //    {
        //        var amountofpadding = 10 - total;
        //        for (int i = 0; i < amountofpadding; i++)
        //        {
        //            Ref += "0";
        //        }
        //    }

        //    if (Ref.Length > 10)
        //    {
        //        Ref = Ref.Substring(0, 10);
        //    }

        //    return Ref;
        //}

        public Batch_Sale_Build_Result Sale_Build(Batch_Sale_Build_Details details)
        {
            foreach (var item in details.Lines)
            {
                if (string.IsNullOrWhiteSpace(item.ExtRef))
                {
                    item.ExtRef = item.LineIdentifier;
                }
            }

            details.ComputeMerchantExtRefs(true, 10, true, true);

            // validate Action dates
            var validate_result = batchOptions.ActionDate_Validator(details.InvalidActionDates).Validate_Date(details.ActionDate);

            if (!validate_result.isValid)
            {
                return(new Batch_Sale_Build_Result
                {
                    isBuildSuccess = false,
                    ErrorMessage = validate_result.ErrorText
                });
            }

            // build xml

            string item_xml = "<?xml version='1.0' encoding='UTF-8'?>";

            item_xml += "<newsub>";

            foreach (var item in details.Lines)
            {
                var descrip = item.Memo;
                if (string.IsNullOrEmpty(descrip))
                {
                    if (item.ExtRef != item.MerchantExtRef)
                    {
                        descrip = item.ExtRef;
                    }
                }

                item_xml += "<debit>";

                item_xml += "<adate>" + details.ActionDate.ToString("ddMMyyyy") + "</adate>";
                item_xml += "<debitref>" + CleanUpRef(item.MerchantExtRef) + "</debitref>";
                item_xml += "<accholder>" + CleanUpSymbols(item.CardBankName) + "</accholder>";
                item_xml += "<description>" + CleanUpSymbols(item.LineIdentifier) + "</description>";
                item_xml += "<bankname>" + CleanUpSymbols(item.Bank) + "</bankname>";
                item_xml += "<bankacc>" + CleanUpSymbols(item.CardBankNumber) + "</bankacc>";
                item_xml += "<bankbranch>" + "" + "</bankbranch>";
                item_xml += "<bankcode>" + CleanUpSymbols(item.BankBranch) + "</bankcode>";
                item_xml += "<bankacctype>0</bankacctype>"; //0 means auto determine
                item_xml += "<amount>" + item.Amount.ToString("F2") + "</amount>";
                item_xml += "<hmessage>" + CleanUpSymbols(item.LineIdentifier) + "</hmessage>";

                item_xml += "</debit>";
            }

            item_xml += "</newsub>";

            Dictionary <string, string> qs_data = new Dictionary <string, string>();

            qs_data.Add("f", "newsub");
            qs_data.Add("p", "1");
            qs_data.Add("cref", cref);
            qs_data.Add("debtorref", details.BatchIdentifier);
            qs_data.Add("adate", details.ActionDate.ToString("ddMMyyyy"));
            qs_data.Add("records", details.Lines.Count.ToString());
            qs_data.Add("amount", details.Lines.Sum(r => r.Amount).ToString("F2"));
            qs_data.Add("xmltype", "1");

            var jdata = new JavaScriptSerializer().Serialize(qs_data);

            return(new Batch_Sale_Build_Result
            {
                isBuildSuccess = true,
                RequestParams = jdata,
                RequestFile = item_xml
            });
        }
Ejemplo n.º 4
0
        public Batch_Sale_Build_Result Sale_Build(Batch_Sale_Build_Details details)
        {
            #region Error Condition Checking
            if (BankAccountEnabled && CreditCardEnabled)
            {
                throw new Exception("Mixed batching not allowed by gateway");
            }

            if (!BankAccountEnabled && !CreditCardEnabled)
            {
                throw new Exception("Gateway not set up for any service");
            }
            #endregion

            //root element
            XElement root = new XElement("debitorder");

            #region Common Detail Processing
            string ServiceTypeNumber = "";
            switch (ServiceType)
            {
            case ("OneDay"):
            {
                ServiceTypeNumber = "2";
            }
            break;

            case ("TwoDay"):
            {
                ServiceTypeNumber = "3";
            }
            break;

            case ("SameDay"): //not required here but put here just for understanding purposes
            default:          //auto assume same day
            {
                ServiceTypeNumber = "1";
            }
            break;
            }

            int totalTransactions = details.Lines.Count;

            if (totalTransactions <= 0)
            {
                throw new Exception("Cannot create empty batch");
            }

            string ActionDateS = details.ActionDate.ToString("yyMMdd");
            #endregion

            #region Header Creation
            //start header creation
            XElement header = new XElement("header");
            header.Add(new XElement("merchantno", MerchantUID));
            header.Add(new XElement("applicationid", PaymentApplicationUID));
            header.Add(new XElement("servicetype", ServiceTypeNumber));
            header.Add(new XElement("totaltransactions", totalTransactions));
            header.Add(new XElement("firstactiondate", ActionDateS));
            header.Add(new XElement("lastactiondate", ActionDateS));
            #endregion

            root.Add(header);

            //start items creation
            var items = details.Lines;
            for (int i = 1; i <= totalTransactions; i++) //create for loop starting at 1 for sequencing
            {
                var      item        = items[i - 1];
                XElement transaction = new XElement("transaction");

                if (BankAccountEnabled)
                {
                    #region Using Debit Order XML 1.3.4
                    string AccTypeNumber = "";
                    switch (item.BankAccountType)
                    {
                    case ("Current"):
                    case ("Checking"):
                    case ("Cheque"):
                    {
                        AccTypeNumber = "1";
                    }
                    break;

                    case ("Savings"):
                    {
                        AccTypeNumber = "2";
                    }
                    break;

                    case ("Transmission"):
                    {
                        AccTypeNumber = "3";
                    }
                    break;

                    default:
                    {
                        throw new Exception("Account Type Invalid");
                    }
                    }

                    transaction.Add(new XElement("sequencenumber", i));
                    transaction.Add(new XElement("branchcode", item.BankBranch));
                    transaction.Add(new XElement("accounttype", AccTypeNumber));
                    transaction.Add(new XElement("accountno", item.CardBankNumber));
                    transaction.Add(new XElement("debitamount", item.Amount.ToString("F2")));
                    transaction.Add(new XElement("debitdate", ActionDateS));
                    transaction.Add(new XElement("debitreference", item.LineIdentifier));
                    transaction.Add(new XElement("accountholder", item.CardBankName));
                    transaction.Add(new XElement("transactionrefno", item.LineIdentifier));
                    #endregion
                }
                else if (CreditCardEnabled)
                {
                    #region Using Collections 2.2.2
                    transaction.Add(new XElement("sequencenumber", i));
                    transaction.Add(new XElement("clientpin", item.TokenPIN));
                    transaction.Add(new XElement("clientuci", item.Token));
                    transaction.Add(new XElement("clientuid", item.ExtRef));
                    transaction.Add(new XElement("debitamount", item.Amount.ToString("F2")));
                    transaction.Add(new XElement("debitdate", ActionDateS));
                    transaction.Add(new XElement("debitreference", item.LineIdentifier));
                    transaction.Add(new XElement("creditcardexpirymonth", item.CardExpiryMonth));
                    transaction.Add(new XElement("creditcardexpiryyear", item.CardExpiryYear));
                    transaction.Add(new XElement("transactionrefno", item.LineIdentifier));
                    #endregion
                }

                //add transaction
                root.Add(transaction);
            }

            #region Footer Creation
            //start footer creation
            XElement footer = new XElement("footer");
            footer.Add(new XElement("totaltransactions", totalTransactions));
            footer.Add(new XElement("firstactiondate", ActionDateS));
            footer.Add(new XElement("lastactiondate", ActionDateS));
            footer.Add(new XElement("debittotal", details.Lines.Sum(s => s.Amount).ToString("F2")));
            #endregion

            root.Add(footer);

            return(new Batch_Sale_Build_Result
            {
                isBuildSuccess = true,
                RequestFile = root.ToString(SaveOptions.DisableFormatting)

                              /*
                               * Disable formatting used to avoid unnecessary adding of carriage returns and spaces,
                               * which if there will cause errors posting batch
                               */
            });
        }