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 }); }
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 }); }
//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 }); }
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 */ }); }