/// <summary> /// Group the redeemed deal records by merchant /// </summary> /// <param name="records"> /// Collection of Outstanding Redeemed Deal Info Records /// </param> /// <returns> /// Dictionary of Merchant -> Redeemed Deals /// </returns> private static Dictionary <PtsMerchantInfo, Collection <OutstandingRedeemedDealInfo> > GroupByMerchant(Collection <OutstandingRedeemedDealInfo> records) { Dictionary <PtsMerchantInfo, Collection <OutstandingRedeemedDealInfo> > dictionary = new Dictionary <PtsMerchantInfo, Collection <OutstandingRedeemedDealInfo> >(); foreach (OutstandingRedeemedDealInfo outstandingRedeemedDealInfo in records) { PtsMerchantInfo merchantInfo = new PtsMerchantInfo() { PartnerMerchantId = outstandingRedeemedDealInfo.PartnerMerchantId, MerchantName = outstandingRedeemedDealInfo.MerchantName, ReimbursementTender = outstandingRedeemedDealInfo.ReimbursementTender }; Collection <OutstandingRedeemedDealInfo> existing; if (dictionary.ContainsKey(merchantInfo)) { existing = dictionary[merchantInfo]; existing.Add(outstandingRedeemedDealInfo); } else { existing = new Collection <OutstandingRedeemedDealInfo>(); existing.Add(outstandingRedeemedDealInfo); dictionary.Add(merchantInfo, existing); } } return(dictionary); }
/// <summary> /// Given a merchant name, this method builds a bing offers specific name exactly 25 characters long. /// </summary> /// <param name="merchantInfo"> /// Merchant information needed to build the merchant description. /// </param> /// <returns> /// result description /// </returns> private static string GetMerchantDescription(PtsMerchantInfo merchantInfo) { StringBuilder merchantDescriptionBuilder = new StringBuilder(); // Return the merchant description for the reward program indicated by the specified reimbursement tender. if ((merchantInfo.ReimbursementTender & ReimbursementTender.MicrosoftBurn) == ReimbursementTender.MicrosoftBurn) { merchantDescriptionBuilder.Append(EarnSource); } else { // BING OFFERS- is 12 character long. // So we need to get 13 more characters from merchant name string merchantName = merchantInfo.MerchantName.ToUpper(CultureInfo.InvariantCulture); int numberOfCharactersNeeded = MaxTransactionSourceLength - BingOffersSource.Length; merchantDescriptionBuilder.Append(BingOffersSource); if (!string.IsNullOrEmpty(merchantName)) { merchantDescriptionBuilder.Append(merchantName.Length > numberOfCharactersNeeded ? merchantName.Substring(0, numberOfCharactersNeeded) : merchantName); } } int diff = MaxTransactionSourceLength - merchantDescriptionBuilder.Length; if (diff > 0) { merchantDescriptionBuilder.Append(PtsConstants.FillerPad, diff); } return(merchantDescriptionBuilder.ToString()); }
/// <summary> /// Builds the PTS file representation for a descriptor record. /// </summary> /// <param name="record"> /// The record for which to build a PTS file representation. /// </param> /// <param name="recordSequenceNumber"> /// The record sequence number to place in the PTS file for the specified record. /// </param> /// <returns> /// The PTS file representation for a descriptor record. /// </returns> internal static string Build(PtsMerchantInfo record, int recordSequenceNumber) { StringBuilder result = new StringBuilder(PtsConstants.RecordLength); // Descriptor record ID result.Append(RecordId); // Transaction source result.Append(GetMerchantDescription(record)); // First filler result.Append(PtsConstants.FillerPad, FirstFillerLength); // Customer service phone number result.Append(CustomerServicePhoneNumber); // Provider state. result.Append(ProviderState); // Record sequence number string sequenceNumber = recordSequenceNumber.ToString(); result.Append(PtsConstants.RecordSequenceNumberPad, PtsConstants.RecordSequenceNumberLength - sequenceNumber.Length); result.Append(sequenceNumber); // Second filler result.Append(PtsConstants.FillerPad, SecondFillerLength); return(result.ToString()); }
/// <summary> /// Determines whether the specified object has equal values to this object in all fields. /// </summary> /// <param name="obj"> /// The object whose values to compare. /// </param> /// /// <returns> /// True if the two objects have the same values. /// </returns> public override bool Equals(object obj) { PtsMerchantInfo merchantInfo = (PtsMerchantInfo)obj; return(merchantInfo.PartnerMerchantId == PartnerMerchantId && merchantInfo.MerchantName == MerchantName && merchantInfo.ReimbursementTender == ReimbursementTender); }
/// <summary> /// Builds the PTS file representation for the specified record. /// </summary> /// <param name="record"> /// The record for which to build a PTS file representation. /// </param> /// <param name="submissionDate"> /// The submission date to specify within the PTS representation of the record. /// </param> /// <param name="submissionSequenceNumber"> /// The submission sequence number to place in the PTS file /// </param> /// <param name="recordSequenceNumber"> /// The record sequence number to place in the PTS file for the specified record. /// </param> /// <returns> /// The PTS file representation for the specified record. /// </returns> internal static string Build(PtsMerchantInfo record, DateTime submissionDate, int submissionSequenceNumber, int recordSequenceNumber) { StringBuilder result = new StringBuilder(PtsConstants.RecordLength); // Merchant record ID result.Append(RecordId); // Merchant ID result.Append(MerchantIdPad, MerchantIdLength - record.PartnerMerchantId.Length); result.Append(record.PartnerMerchantId); // Reference ID result.Append(ReferenceId); // Security code (instance 1) result.Append(SecurityCode); // Submission type result.Append(SubmissionType); // Submission date, Julian-style result.Append(submissionDate.ToString("yy")); int dayOfYear = submissionDate.DayOfYear; if (dayOfYear < 100) { result.Append("0"); } if (dayOfYear < 10) { result.Append("0"); } result.Append(dayOfYear); // Submission sequence number result.Append(submissionSequenceNumber); // Security code (instance 2) result.Append(SecurityCode); // Submission date, Gregorian-style result.Append(submissionDate.ToString("MMddyy")); // Record sequence number string sequenceNumber = recordSequenceNumber.ToString(); result.Append(PtsConstants.RecordSequenceNumberPad, PtsConstants.RecordSequenceNumberLength - sequenceNumber.Length); result.Append(sequenceNumber); // Filler (and unused fields) result.Append(PtsConstants.FillerPad, FillerLength); return(result.ToString()); }
/// <summary> /// Builds the PTS file representation for the specified record. /// </summary> /// <param name="records"> /// The records for which to build a PTS file. /// </param> /// <param name="submissionDate"> /// The submission date to specify within the PTS representation of the record. /// </param> /// <param name="submissionSequenceNumber"> /// The submission sequence number to place in the PTS file /// </param> /// <param name="forNonFirstDataPartners"> /// Will be set to True if PTS being built is for Non-FDC (like Visa) partners /// </param> /// <returns> /// The PTS file representation for the specified record. /// </returns> /// <remarks> /// Since FDC is not on Windows platform, we do not use AppendLine on StringBuilder. /// We instead mark \n as new line character, FDC will break on \r\n /// </remarks> public static string Build(Collection <OutstandingRedeemedDealInfo> records, DateTime submissionDate, int submissionSequenceNumber, bool forNonFirstDataPartners = false) { StringBuilder result = new StringBuilder(); int recordNumber = 1; int totalDiscountAmount = 0; Dictionary <PtsMerchantInfo, Collection <OutstandingRedeemedDealInfo> > recordsByMerchant = GroupByMerchant(records); foreach (KeyValuePair <PtsMerchantInfo, Collection <OutstandingRedeemedDealInfo> > keyValuePair in recordsByMerchant) { PtsMerchantInfo merchantInfo = keyValuePair.Key; result.Append(MerchantRecordPtsBuilder.Build(merchantInfo, submissionDate, submissionSequenceNumber, recordNumber++)); result.Append("\n"); result.Append(DescriptorRecordPtsBuilder.Build(merchantInfo, recordNumber++)); result.Append("\n"); // Append records for each detail record in turn. foreach (OutstandingRedeemedDealInfo detailRecord in keyValuePair.Value) { totalDiscountAmount += detailRecord.DiscountAmount; result.Append(SpecialConditionPtsBuilder.Build(detailRecord, recordNumber++, forNonFirstDataPartners)); result.Append("\n"); result.Append(AcquirerReferenceNumberPtsBuilder.Build(detailRecord, recordNumber++, forNonFirstDataPartners)); result.Append("\n"); result.Append(TokenizationPtsBuilder.Build(detailRecord, recordNumber++)); result.Append("\n"); result.Append(TransactionDetailPtsBuilder.Build(detailRecord, recordNumber++)); result.Append("\n"); } } // Append the total record. result.Append(TotalRecordPtsBuilder.Build(totalDiscountAmount, recordNumber)); result.Append("\n"); return(result.ToString()); }