// end // to build optional data string /// <summary> /// Method ro build optiona data string /// </summary> /// <param name="sale">Sale</param> /// <param name="card">Credit card</param> /// <param name="tendCard">Tend card</param> public void Build_OptDataString(Sale sale, ref Credit_Card card, ref TenderCard tendCard) { if (sale.EMVVersion) { if (string.IsNullOrEmpty(card.OptDataProfileIDEMV)) { card.OptDataString = ""; return; } tendCard = new TenderCard { OptDataProfileID = card.OptDataProfileIDEMV }; } else { if (tendCard == null) { card.OptDataString = ""; return; } if (string.IsNullOrEmpty(tendCard.OptDataProfileID)) { card.OptDataString = ""; return; } } string strData = ""; Sale_Line sl = default(Sale_Line); var maxIdFuel = _cardService.GetMaxFuelId(tendCard.OptDataProfileID); var maxIdNonFuel = _cardService.GetMaxNonFuelId(tendCard.OptDataProfileID); var noFuelLines = _cardService.GetTotalOptionalData(tendCard.OptDataProfileID); var exemptDataCode = _cardService.GetOptionalDataCode(tendCard.OptDataProfileID); var strExemptDept = string.IsNullOrEmpty(exemptDataCode) ? "NOT DEFINED EXEMPTION" : exemptDataCode; var noNonFuelLines = _cardService.GetTotalNonFuelOptionalData(tendCard.OptDataProfileID); var arrFuelLines = new short[1]; var arrNonFuelLines = new short[1]; var arrExemptDeptLines = new short[1]; foreach (Sale_Line saleLine in sale.Sale_Lines) { sl = saleLine; if (sl.ProductIsFuel) { Array.Resize(ref arrFuelLines, arrFuelLines.Length - 1 + 1 + 1); arrFuelLines[arrFuelLines.Length - 1] = sl.Line_Num; } else if (sl.Dept != strExemptDept) { Array.Resize(ref arrNonFuelLines, arrNonFuelLines.Length - 1 + 1 + 1); arrNonFuelLines[arrNonFuelLines.Length - 1] = sl.Line_Num; } else if (sl.Dept == strExemptDept) { Array.Resize(ref arrExemptDeptLines, arrExemptDeptLines.Length - 1 + 1 + 1); arrExemptDeptLines[arrExemptDeptLines.Length - 1] = sl.Line_Num; } } var optionalDatas = _cardService.GetOptionalDatas(tendCard.OptDataProfileID); short fuelId = 0; short nonFuelId = 0; var ubFuel = (short)(arrFuelLines.Length - 1); var ubNonFuel = (short)(arrNonFuelLines.Length - 1); var maxFuel = (short)modStringPad.MinVal(ubFuel, noFuelLines); var maxNonFuel = (short)modStringPad.MinVal(ubNonFuel, noNonFuelLines); foreach (var optionalData in optionalDatas) { var taxCode = optionalData.Code; var strValue = ""; decimal total = 0; var id = Convert.ToInt32(optionalData.ID); Line_Tax lt; switch (id) { case 20: // Exemption Dept quantity foreach (Sale_Line saleLine in sale.Sale_Lines) { sl = saleLine; if (sl.Dept == strExemptDept) { total = total + (decimal)sl.Quantity; } } strValue = total.ToString(CultureInfo.InvariantCulture); break; case 22: // Exemption Dept amount foreach (Sale_Line saleLine in sale.Sale_Lines) { sl = saleLine; if (sl.Dept == strExemptDept) { total = total + sl.Amount; } } strValue = total.ToString(CultureInfo.InvariantCulture); break; case 24: // Total Transaction Amount strValue = sale.Sale_Totals.Gross.ToString(CultureInfo.InvariantCulture); break; case 101: // Fuel Product Code if (fuelId == 0) { fuelId++; } if (fuelId <= maxFuel) { strValue = _cardService.Get_ProductCode(tendCard.OptDataProfileID, sale.Sale_Lines[arrFuelLines[fuelId]].Stock_Code); } else { strValue = 0.ToString(); } break; case 108: // Fuel Price if (fuelId == 0) { fuelId++; } strValue = fuelId <= maxFuel ? sale.Sale_Lines[arrFuelLines[fuelId]].price.ToString(CultureInfo.InvariantCulture) : 0.ToString(); break; case 105: // Fuel Extended Amount if (fuelId == 0) { fuelId++; } strValue = fuelId <= maxFuel ? sale.Sale_Lines[arrFuelLines[fuelId]].Amount.ToString(CultureInfo.InvariantCulture) : 0.ToString(); break; case 107: // Fuel Quantity if (fuelId == 0) { fuelId++; } strValue = fuelId <= maxFuel ? sale.Sale_Lines[arrFuelLines[fuelId]].Quantity.ToString(CultureInfo.InvariantCulture) : 0.ToString(); break; case 109: // Fuel GST/HST Amount and Fuel PST Amount (Tax Code is based on Code field in OptData table) case 110: strValue = 0.ToString(); if (fuelId == 0) { fuelId++; } if (fuelId <= maxFuel) { foreach (Line_Tax lineTax in sale.Sale_Lines[arrFuelLines[fuelId]].Line_Taxes) { lt = lineTax; if (lt.Tax_Name == taxCode) { strValue = lt.Tax_Incl_Amount.ToString(CultureInfo.InvariantCulture); break; } } } else { strValue = 0.ToString(); } break; case 209: // Accumulated Fuel GST/HST Amount and Accumulated Fuel PST Amount (Tax Code is based on Code field in OptData table) case 210: foreach (Sale_Line saleLine in sale.Sale_Lines) { sl = saleLine; if (sl.ProductIsFuel) { foreach (Line_Tax lineTax in sl.Line_Taxes) { lt = lineTax; if (lt.Tax_Code == taxCode) { total = total + (decimal)lt.Tax_Incl_Amount; } } } } strValue = total.ToString(CultureInfo.InvariantCulture); break; case 301: // Non-Fuel Product Code if (nonFuelId == 0) { nonFuelId++; } if (nonFuelId <= maxNonFuel) { strValue = _cardService.Get_ProductCode(tendCard.OptDataProfileID, sale.Sale_Lines[arrNonFuelLines[nonFuelId]].Stock_Code); } else { strValue = 0.ToString(); } break; case 307: // Non-Fuel Quantity if (nonFuelId == 0) { nonFuelId++; } if (nonFuelId <= maxNonFuel) { strValue = sale.Sale_Lines[arrNonFuelLines[nonFuelId]].Quantity.ToString(CultureInfo.InvariantCulture); } else { strValue = 0.ToString(); } break; case 305: // Non-Fuel Extended Amount if (nonFuelId == 0) { nonFuelId++; } if (nonFuelId <= maxNonFuel) { strValue = sale.Sale_Lines[arrNonFuelLines[nonFuelId]].Amount.ToString(CultureInfo.InvariantCulture); } else { strValue = 0.ToString(); } break; case 314: // Non-Fuel Tax Description if (nonFuelId == 0) { nonFuelId++; } if (nonFuelId <= maxNonFuel) { strValue = sale.Sale_Lines[arrNonFuelLines[nonFuelId]].Line_Taxes.Count > 0 ? sale.Sale_Lines[arrNonFuelLines[nonFuelId]].Line_Taxes[1].Tax_Name : 0.ToString(); } else { strValue = 0.ToString(); } break; case 405: // Accumulated non-fuel extended amount total = 0; foreach (Sale_Line saleLine in sale.Sale_Lines) { sl = saleLine; if (!sl.ProductIsFuel) { total = total + sl.Amount; } } strValue = total.ToString(CultureInfo.InvariantCulture); break; case 415: // Accumulated Non-Fuel Tax Amount - includes exempted dept items total = 0; foreach (Sale_Line saleLine in sale.Sale_Lines) { sl = saleLine; if (!sl.ProductIsFuel) { foreach (Line_Tax lineTax in sl.Line_Taxes) { lt = lineTax; total = total + (decimal)lt.Tax_Incl_Amount + (decimal)lt.Tax_Added_Amount; } } } strValue = total.ToString(CultureInfo.InvariantCulture); break; case 121: // Non Fuel Product Code if (nonFuelId == 0) { nonFuelId++; } if (nonFuelId <= maxNonFuel) { strValue = _cardService.Get_ProductCode(tendCard.OptDataProfileID, sale.Sale_Lines[arrNonFuelLines[nonFuelId]].Stock_Code); } else { strValue = 0.ToString(); } break; case 102: // Fuel Description if (fuelId == 0) { fuelId++; } if (fuelId <= maxFuel) { strValue = sl.Description; } else { strValue = 0.ToString(); } break; case 103: // Fuel Service type break; case 2: // Merchant Terminal Prompt Data var promptSeq = _cardService.GetPromptSeq(tendCard.OptDataProfileID); if (promptSeq.HasValue) { strValue = card.CardPrompts[promptSeq.Value].PromptAnswer; } else { strValue = 0.ToString(); } break; case 3: // Card Prompt Code promptSeq = _cardService.GetPromptSeq(tendCard.OptDataProfileID); strValue = promptSeq.HasValue ? card.CardPrompts[promptSeq.Value].PromptAnswer : 0.ToString(); break; default: strValue = ""; break; } if (Convert.ToInt32(optionalData.ID) == maxIdFuel) { fuelId++; } if (Convert.ToInt32(optionalData.ID) == maxIdNonFuel) { nonFuelId++; } if (Convert.ToInt32(optionalData.ID) == 29) { strData = Convert.ToString(strData + new string(Strings.Chr(Convert.ToInt32(string.IsNullOrEmpty(optionalData.Format) ? "0" : optionalData.Format)), optionalData.Length)); } else { strData = strData + Convert.ToString(Format_Value(strValue, (short)optionalData.Length, (short)optionalData.Decimals, string.IsNullOrEmpty(optionalData.Alignment) ? "RIGHT" : optionalData.Alignment)); } } card.OptDataString = strData; //todo: // modStringPad.WriteToLogFile("Optional data string is " + strData) }
/// <summary> /// Method to get request string /// </summary> /// <param name="cc">Credit card</param> /// <param name="sale">Sale</param> /// <param name="trnType">Transaction type</param> /// <param name="cardType">Card type</param> /// <param name="amount">Amount</param> /// <param name="authCode">Auth code</param> /// <returns>Request string</returns> public string GetRequestString(ref Credit_Card cc, Sale sale, string trnType, string cardType, float amount, string authCode) { string str = ""; short pos = 0; //string strOptionalData; switch (trnType.Trim()) { case "SwipeInside": str = str + trnType.Trim() + "," + cardType.Trim() + ","; str = str + amount.ToString().Trim() + ",,,,,,,,,,,,,,,"; break; case "EODTerminal": //authcode as terminal ID - changed on 06/19/02 'Sajan str = str + trnType.Trim() + "," + cardType.Trim() + ",1,,,,," + authCode.Trim() + ",,,,,,,,,,,,Y,,,,,,,,,,,,,,"; break; case "CloseBatchInside": if (Strings.UCase(Convert.ToString(_policyManager.BankSystem)) == "GLOBAL") { if (cardType == "NoDebit") //Added by Mina - For no trans debit { str = str + trnType.Trim() + "," + cardType.Trim() + ",1,,,,,,,,,,,,,,,,,Y,,,,,,,,,,,,,,"; } else { str = str + trnType.Trim() + ",,1,,,,,,,,,,,,,,,,,Y,,,,,,,,,,,,,,"; } } else { str = str + trnType.Trim() + ",,1,,,,,,,,,,,,,,,,,Y,,,,,,,,,,,,,,"; } break; case "InitDebitInside": str = str + trnType.Trim() + "," + cardType.Trim() + ",,,,,,,,,,,,,,,,,"; break; default: if (trnType == "VoidInside") { str = trnType.Trim() + "," + cardType.Trim() + ",1,"; } else { str = trnType.Trim() + "," + cardType.Trim() + ",1,"; } str = str + Convert.ToString(sale.Sale_Num) + ",,,"; if (Strings.UCase(Convert.ToString(_policyManager.BankSystem)) == "GLOBAL") { if (trnType == "VoidInside" || trnType.ToUpper() == "SAFVOIDINSIDE") //Added by Mina : UCase(TrnType) = "SAFVOIDINSIDE" { str = str + Convert.ToString(sale.Void_Num) + ",,"; //void refnum } else { str = str + ",,"; //void refnum } } else { // if (trnType == "VoidInside") { str = str + Convert.ToString(sale.Void_Num) + ",,"; //void refnum } else { str = str + ",,"; //void refnum } } if (_policyManager.Version == "US") //Behriooz Oct25-05 { str = str + amount.ToString("0.00").Trim() + ","; // CStr(Int(Abs(Amount * 100)))) & "," } else { str = str + (double.Parse(amount.ToString("0.00")) * 100).ToString().Trim() + ","; // CStr(Int(Abs(Amount * 100)))) & "," } str = str + _creditCardManager.Language(ref cc).Substring(0, 1) + ",,"; //the following lines were added by Sajan if (!string.IsNullOrEmpty(cc.Track2)) { pos = (short)(cc.Track2.IndexOf("?") + 1); } var track2 = ""; if (pos != 0) { track2 = cc.Track2.Substring(0, pos - 1); } else { track2 = cc.Track2 ?? ""; } pos = (short)(track2.IndexOf(";") + 1); if (pos != 0) { track2 = track2.Substring(pos + 1 - 1); } if (string.IsNullOrEmpty(cc.Track2)) { track2 = (string.IsNullOrEmpty(cc.Cardnumber) ? string.Empty : cc.Cardnumber.Trim()) + "=" + (string.IsNullOrEmpty(cc.Expiry_Date) ? string.Empty : cc.Expiry_Date.Trim()); } str = str + track2 + ",,,"; if (!string.IsNullOrEmpty(authCode)) { if (_policyManager.EMVVersion) { str = str + authCode + ",,,,,"; } else { //shiny end - EMVVERSION str = str + authCode + ",,,,"; } } else { str = str + ",,,,,Y"; } if (cc.Crd_Type == "F") { str = str + ","; str = str + _creditCardManager.ProductCodes(sale.TillNumber) + ",,"; str = str + cc.Vechicle_Number + ","; str = Convert.ToString((string.IsNullOrEmpty(cc.ID_Number) ? str + cc.Driver_Number : str + cc.ID_Number) + ","); str = str + cc.Odometer_Number + ",,,"; str = str + cc.TerminalType + ",,"; // Terminal Type string temp_Policy_Name = "USE_PINPAD"; str = str + Convert.ToString(_policyManager.GetPol(temp_Policy_Name, null)) + ","; if (_policyManager.USE_PINPAD) { str = str + Convert.ToString(cc.AskDriverNo) + ","; str = str + Convert.ToString(cc.AskIdentificationNo) + ","; str = str + Convert.ToString(cc.AskOdometer) + ","; str = str + Convert.ToString(cc.AskVechicle) + ","; str = str + Convert.ToString(cc.AskProdRestrictCode) + ","; } else { str = str + "False,False,False,False,False,"; } str = str + cc.UsageCode + ","; // Nicolette, Jan 27 added a extra comma to match the number of commas send to STPS } else { str = str + new string(',', 16); } // Nicolette end //Shiny Nov9, 2009'EMVVERSION if (_policyManager.EMVVersion) //- only needed for credit { // str = str & IIf(cc.ManualCardProcess, "M", "") & "," str = str + Convert.ToString(cc.ManualCardProcess ? "M85" : "") + ","; // - added the POs trans timeout 85 to passing to TPS with Farhad's instruction } //shiny end // to assign optional data profile for any debit or credit card selected // for EMV version, TPS will drop th unnecessary optional data string sent by POS // debit cards are included because the cashier might select debit but the customer inserts a credit card if (cc.Crd_Type == "F" || cc.Crd_Type == "C" || cc.Crd_Type == "D") // added Or cc.Crd_Type = "C" for Crevier Visa { TenderCard tenderCard = _cardService.LoadTenderCard(cc.CardCode); Build_OptDataString(sale, ref cc, ref tenderCard); // optional data for fleet cards str = str + "," + cc.OptDataString; } else { str = str + ","; } break; } var returnValue = str; return(returnValue); }