Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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());
        }
Пример #3
0
        /// <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());
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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());
        }
Пример #6
0
        /// <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());
        }