/// <summary>
        /// Parses a data record.
        /// </summary>
        /// <remarks>
        /// A null item may be added.
        /// </remarks>
        private void ParseDataRecord()
        {
            RebateConfirmationData rebateConfirmationData = RebateConfirmationDataParser.Parse(Line, NumberOfDataRecords++);

            if (rebateConfirmationData == null)
            {
                Log.Error("Record in line #{0} from file \"{1}\" could not be parsed.", null,
                          (int)ResultCode.CorruptSettlementRecord, LineNumber, FileName);
            }

            RebateConfirmation.DataRecords.Add(rebateConfirmationData);
        }
        /// <summary>
        /// Processes the rebate confirmation file.
        /// </summary>
        private void ProcessRebateConfirmation()
        {
            // Deserialize rebate confirmation file into a RebateConfirmation object.
            RebateConfirmationParser rebateConfirmationParser = new RebateConfirmationParser(Context.Log);
            RebateConfirmation       rebateConfirmation       = rebateConfirmationParser.Parse(FileName, Stream);

            if (rebateConfirmation != null)
            {
                for (int count = 0; count < rebateConfirmation.DataRecords.Count; count++)
                {
                    RebateConfirmationData rebateConfirmationData = rebateConfirmation.DataRecords[count];
                    if (rebateConfirmationData != null)
                    {
                        // Mark the redemption as RejectedByPartner.
                        Context[Key.RebateConfirmationData] = rebateConfirmationData;
                        ResultCode result = RedeemedDealOperations.MarkRejectedByMasterCard();

                        // Log warning if needed.
                        switch (result)
                        {
                        case ResultCode.MatchingRedeemedDealNotFound:
                            Context.Log.Warning("RebateConfirmationData record #{0} could not be marked RejectedByPartner, because " +
                                                "no matching redemption record could be found.", (int)result, count + 1);
                            break;

                        case ResultCode.MultipleMatchingRedeemedDealsFound:
                            Context.Log.Warning("More than one matching redemption record matched RebateConfirmationData record " +
                                                "#{0}. One of these was marked RejectedByPartner, but since the data is " +
                                                "ambiguous, it may not correspond to the correct redemption.", (int)result, count + 1);
                            break;

                        case ResultCode.RedeemedDealFoundIsInexactMatch:
                            Context.Log.Warning("A matching redemption record for RebateConfirmationData record #{0} was marked " +
                                                "RejectedByPartner, but the record was not an exact match.", (int)result, count + 1);
                            break;
                        }
                        ;
                    }
                }
            }
        }
        /// <summary>
        /// Parses the specified record text into a rebate confirmation data record if possible.
        /// </summary>
        /// <param name="record">
        /// The record text to parse into a rebate confirmation data record.
        /// </param>
        /// <param name="recordNumber">
        /// The number of the record of this type from the extract file being parsed.
        /// </param>
        /// <returns>
        /// * The RebateConfirmationData object if successful.
        /// * Else returns null.
        /// </returns>
        internal RebateConfirmationData Parse(string record,
                                              int recordNumber)
        {
            RebateConfirmationData result = new RebateConfirmationData();

            int      recordPos    = 0;
            bool     recordValid  = true;
            string   stringField  = null;
            decimal  decimalField = Decimal.MinValue;
            DateTime dateField    = DateTime.MinValue;

            ParsingUtilities parsingUtilities = new ParsingUtilities("Rebate Confirmation File Data Record", recordNumber, FileName,
                                                                     RebateConfirmationConstants.TimeFieldLength, Log);

            // RecordType
            recordValid = parsingUtilities.VerifyString(record, ref recordPos, "Record Type", RecordType, RebateConfirmationConstants.RecordTypeLength, recordValid);

            // Bank customer number.
            recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, RebateConfirmationConstants.BankCustomerNumberLength, recordValid);
            result.BankCustomerNumber = stringField;

            // Bank account number.
            recordValid = parsingUtilities.VerifyString(record, ref recordPos, "Bank Account Number", EmptyBankAccountNumber,
                                                        RebateConfirmationConstants.BankAccountNumberLength, false, recordValid);

            // Bank product code.
            recordValid            = parsingUtilities.PopulateString(record, ref recordPos, out stringField, RebateConfirmationConstants.BankProductCodeLength, recordValid);
            result.BankProductCode = stringField;

            // Transaction description.
            recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, RebateConfirmationConstants.TransactionDescriptionLength, recordValid);
            result.TransactionDescription = stringField;

            // Rebate amount.
            recordValid = parsingUtilities.PopulateDecimal(record, ref recordPos, "Rebate Amount", out decimalField, RebateConfirmationConstants.RebateAmountLength,
                                                           recordValid);
            result.RebateAmount = decimalField;

            // Exception reason code.
            recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, RebateConfirmationConstants.ExceptionReasonCodeLength, recordValid);
            ExceptionReasonCode exceptionReasonCode;

            switch (stringField)
            {
            case "A":
                exceptionReasonCode = ExceptionReasonCode.AccountNotFound;
                break;

            case "C":
                exceptionReasonCode = ExceptionReasonCode.CustomerNotFound;
                break;

            case "I":
                exceptionReasonCode = ExceptionReasonCode.InvalidAccount;
                break;

            case "M":
                exceptionReasonCode = ExceptionReasonCode.MultipleAccountsFound;
                break;

            case "O":
                exceptionReasonCode = ExceptionReasonCode.Others;
                break;

            case "R":
                exceptionReasonCode = ExceptionReasonCode.InvalidAccountCountry;
                break;

            default:
                Log.Warning("Error parsing record in line #{0} from file \"{1}\". Encountered unrecognized exception reason code \"{2}\".",
                            (int)ResultCode.ExpectedValueNotFound, recordNumber, FileName, stringField);
                exceptionReasonCode = ExceptionReasonCode.Unrecognized;
                recordValid         = false;
                break;
            }
            result.ExceptionReasonCode = exceptionReasonCode;

            // Exception reason description.
            recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, RebateConfirmationConstants.ExceptionReasonDescriptionLength, recordValid);
            result.ExceptionReasonDescription = stringField;

            // Rebate file send date.
            recordValid = parsingUtilities.PopulateDateTime(record, ref recordPos, "Rebate File Send Date", out dateField, false, false, recordValid);
            result.RebateFileSendDate = dateField;

            // Transaction sequence number.
            recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, RebateConfirmationConstants.TransactionSequenceNumberLength, recordValid);
            result.TransactionSequenceNumber = stringField;

            // Record end
            parsingUtilities.VerifyRecordEnd(record, ref recordPos, FillerLength, false, recordValid);

            // If the record is not valid, return a null value.
            if (recordValid == false)
            {
                result = null;
            }

            return(result);
        }