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