public void ParsePrepareForSpecimenResponse() { HL7Parser p = new HL7Parser(); ParserResult pResult = null; string m = @"MSH|^~\&|||||20190322144038||EAR^U08^EAR_U08|89900867-5efc-4393-8dc2-c11baa88683f||2.5.1|||||||||PrepareForSpecimenResponse EQU||20190322144144 ECD||LO^Prepare^ASTM|Y SAC|||123 ECR|OK^Command completed successfully^HL70387"; Assert.DoesNotThrow(() => { pResult = p.Parse(m); }); Assert.That(pResult.MessageAccepted); EquipmentCommandResponse request = pResult.ParsedMessage as EquipmentCommandResponse; Assert.IsFalse(request.IsAcknowledge); Assert.IsNotNull(request); Assert.AreEqual(nameof(GeneralAcknowledgment), request.ExpectedAckID); Assert.AreEqual(string.Empty, request.ExpectedResponseID); Assert.AreEqual(request.GetValue("MSH-9-1"), "EAR"); Assert.AreEqual(request.GetValue("MSH-9-2"), "U08"); Assert.AreEqual(nameof(PrepareForSpecimenResponse), request.GetValue("MSH-21-1")); Assert.AreEqual("89900867-5efc-4393-8dc2-c11baa88683f", request.GetValue("MSH-10")); Assert.AreEqual(request.GetValue("COMMAND/ECD-2-1"), "LO"); Assert.That(pResult.IsAcknowledge.HasValue && !pResult.IsAcknowledge.Value); GeneralAcknowledgment ack = pResult.Acknowledge as GeneralAcknowledgment; Assert.IsNotNull(ack); Assert.That(string.IsNullOrEmpty(ack.ExpectedResponseID)); Assert.That(string.IsNullOrEmpty(ack.ExpectedAckID)); Assert.AreEqual(ack.GetValue("MSA-1"), "AA"); Assert.AreEqual(ack.GetValue("MSA-2"), "89900867-5efc-4393-8dc2-c11baa88683f"); Assert.AreEqual(ack.GetValue("MSH-9-1"), "ACK"); Assert.AreEqual(ack.GetValue("MSH-9-2"), "U08"); Assert.AreEqual(nameof(GeneralAcknowledgment), ack.GetValue("MSH-21-1")); }
private void ProcessAcknowledgement() { // Deserialize ack file into an ack object. AcknowledgmentParser acknowledgmentParser = new AcknowledgmentParser(Context.Log); Acknowledgment acknowledgment = acknowledgmentParser.Parse(AcknowledgmentFileName, AcknowledgmentFileStream); Collection <int> successfullyRedeemedReferenceNumbers = new Collection <int>(); Collection <int> rejectedByPartnerReferenceNumbers = new Collection <int>(); Collection <int> successfullyGrantedRewards = new Collection <int>(); Collection <int> rejectedRewards = new Collection <int>(); if (acknowledgment != null) { // if we have general ack records to process, get the first one // We should ideally have only one B record, and we will log warning in parsing code otherwise. if (acknowledgment.GeneralAcknowledgments.Count > 0) { GeneralAcknowledgment generalAcknowledgment = acknowledgment.GeneralAcknowledgments[0]; if (generalAcknowledgment.AcknowledgementCode != AcknowledgmentConstants.SuccessfulSubmissionAckCode) { // log failure and return Context.Log.Warning( "The PTS file submission was rejected. Details: \r\n:" + "Record Seq Number : {0} \r\n" + "Received Acknowledgment Code : {1} \r\n" + "Sumission Id : {2} \r\n", (int)ResultCode.SubmissionRejected, generalAcknowledgment.RecordSequenceNumber, generalAcknowledgment.AcknowledgementCode, generalAcknowledgment.SubmissionId); return; } } // process each Detail Ack Record. foreach (DetailAcknowledgment detailAcknowledgment in acknowledgment.DetailAcknowledgments) { if (detailAcknowledgment != null) { // No overflow because reference number will never be more than int range. int referenceNumber = Convert.ToInt32(detailAcknowledgment.ReferenceNumber); // add all the successfull if (detailAcknowledgment.AcknowledgementCode == AcknowledgmentConstants.SuccessfulRedemptionAckCode) { if (String.Equals(detailAcknowledgment.MerchantDescriptor, ReferredRedemptionRewardsMerchantDescriptor, StringComparison.OrdinalIgnoreCase) == false) { successfullyRedeemedReferenceNumbers.Add(referenceNumber); } else { successfullyGrantedRewards.Add(referenceNumber); } } else { Context.Log.Warning( "Deal with reference number {0} was not accepted by the partner. " + "We expected AcknowledgmentCode of {1} but we got {2}", (int)ResultCode.RedeemedDealRejectedByPartner, referenceNumber, AcknowledgmentConstants.SuccessfulRedemptionAckCode, detailAcknowledgment.AcknowledgementCode); if (String.Equals(detailAcknowledgment.MerchantDescriptor, ReferredRedemptionRewardsMerchantDescriptor, StringComparison.OrdinalIgnoreCase) == false) { rejectedByPartnerReferenceNumbers.Add(referenceNumber); } else { rejectedRewards.Add(referenceNumber); } } } } } if (successfullyRedeemedReferenceNumbers.Count > 0) { UpdateRedeemedDeals(successfullyRedeemedReferenceNumbers, CreditStatus.CreditGranted); WorkerActions.UpdateOutstandingReferredRedemptionRewards(successfullyGrantedRewards, RewardPayoutStatus.Paid, RewardOperations, Context); } if (rejectedByPartnerReferenceNumbers.Count > 0) { UpdateRedeemedDeals(rejectedByPartnerReferenceNumbers, CreditStatus.RejectedByPartner); WorkerActions.UpdateOutstandingReferredRedemptionRewards(rejectedRewards, RewardPayoutStatus.Rescinded, RewardOperations, Context); } }
/// <summary> /// Parses given record and creates instance of <see cref="GeneralAcknowledgment"/> /// </summary> /// <remarks> /// Some fields are Signed Values listed as S9(x) [Always positive] /// Here x is number of digits and least significant digit is in EBCDIC !! /// So S9(4) means the field has 4 digits with LSD in EBCDIC. /// One more example: /// S9(6)V99 means total 8 digits, of which last two are decimal places and LSD in EBCDIC. /// </remarks> /// <param name="record"></param> /// <param name="recordNumber"></param> /// <returns></returns> internal GeneralAcknowledgment Parse(string record, int recordNumber) { SignedValueConverter signedValueConverter = new SignedValueConverter();; GeneralAcknowledgment generalAcknowledgment = new GeneralAcknowledgment(); RecordNumber = recordNumber; int recordPos = 0; bool recordValid = true; string stringField = null; string convertedString; long convertedNum; ParsingUtilities parsingUtilities = new ParsingUtilities(RecordTypeDescriptor, RecordNumber, FileName, AcknowledgmentConstants.TimeFieldLength, Log); // RecordId recordValid = parsingUtilities.VerifyString(record, ref recordPos, "Record ID", RecordType, AcknowledgmentConstants.RecordTypeLength, recordValid); // SalesDepositAmount : S9(7)V99 recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, AcknowledgmentConstants.SalesDepositAmountLength, recordValid); recordValid = signedValueConverter.TryGetNumberFromSignedData(stringField, out convertedNum); generalAcknowledgment.SalesDepositAmount = (decimal)convertedNum / 100; // CreditAmount : S9(7)V99 recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, AcknowledgmentConstants.CreditAmountLength, recordValid); recordValid = signedValueConverter.TryGetNumberFromSignedData(stringField, out convertedNum); generalAcknowledgment.CreditAmount = (decimal)convertedNum / 100; // Cash Advance Deposit Amount : S9(7)V99 recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, AcknowledgmentConstants.CashAdvanceDepositAmountLength, recordValid); recordValid = signedValueConverter.TryGetNumberFromSignedData(stringField, out convertedNum); generalAcknowledgment.CashAdvanceDepositAmount = (decimal)convertedNum / 100; // Acknowledgment Code : S9(4) recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, AcknowledgmentConstants.AcknowledgmentCodeLength, recordValid); recordValid = signedValueConverter.TryGetNumberFromSignedData(stringField, out convertedNum); // We will not get overflow as ack code is at most 4 digits long generalAcknowledgment.AcknowledgementCode = Convert.ToInt32(convertedNum); // FiveSpaceFiller recordValid = parsingUtilities.VerifyString(record, ref recordPos, "Filler", FiveSpaceFiller, AcknowledgmentConstants.FiveSpaceFillerLength, recordValid); // Record Sequence Number : S9(6) recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, AcknowledgmentConstants.RecordSequenceNumberLength, recordValid); recordValid = signedValueConverter.TryGetNumberFromSignedData(stringField, out convertedNum); generalAcknowledgment.RecordSequenceNumber = convertedNum; // Submission Id : S9(9) recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, AcknowledgmentConstants.SubmissionID, recordValid); recordValid = signedValueConverter.TryGetStringFromSignedData(stringField, out convertedString); generalAcknowledgment.SubmissionId = convertedString; // EightSpaceFiller recordValid = parsingUtilities.VerifyString(record, ref recordPos, "Filler", EightSpaceFiller, AcknowledgmentConstants.EightSpaceFillerLength, recordValid); // Deposit Authorization Request Amount : S9(7)V99 recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, AcknowledgmentConstants.DepositAuthorizationRequestAmountLength, recordValid); recordValid = signedValueConverter.TryGetNumberFromSignedData(stringField, out convertedNum); generalAcknowledgment.DepositAuthorizationRequestAmount = (decimal)convertedNum / 100; // Cash Advance Deposit Auth Request Amount : S9(7)V99 recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, AcknowledgmentConstants.CashAdvanceDepositAuthRequestAmountLength, recordValid); recordValid = signedValueConverter.TryGetNumberFromSignedData(stringField, out convertedNum); generalAcknowledgment.CashAdvanceDepositAuthAmount = (decimal)convertedNum / 100; // Follow-up Ack Indicator recordValid = parsingUtilities.PopulateString(record, ref recordPos, out stringField, AcknowledgmentConstants.FollowupAckIndicatorLength, recordValid); generalAcknowledgment.FollowUpAcknowledgmentIndicator = stringField; // Single Space Filler recordValid = parsingUtilities.VerifyString(record, ref recordPos, "Filler", SingleSpaceFiller, AcknowledgmentConstants.SingleSpaceFillerLength, recordValid); // If the record is not valid, return a null value. if (recordValid == false) { generalAcknowledgment = null; } return(generalAcknowledgment); }
public void A_CreateAndParsePrepareForSpecimenAcquisition() { PrepareForSpecimenRequest prepare = new PrepareForSpecimenRequest(); Assert.AreEqual(nameof(PrepareForSpecimenRequest), prepare.MessageID); Assert.AreEqual("2.5.1", prepare.HL7Version); Assert.AreEqual(nameof(GeneralAcknowledgment), prepare.ExpectedAckID); Assert.AreEqual(nameof(PrepareForSpecimenResponse), prepare.ExpectedResponseID); Assert.AreEqual("U07", prepare.TriggerEvent); Assert.AreEqual("EAC", prepare.MessageCode); Assert.AreEqual("EAR_U08", prepare.ExpectedResponseType); Assert.AreEqual("ACK_U07", prepare.ExpectedAckType); Assert.IsFalse(prepare.IsAcknowledge); Assert.IsTrue(Regex.Match(prepare.ControlID, pattern, RegexOptions.IgnoreCase).Success); string prepareRcv = @"MSH|^~\&|||||20190322123829||EAC^U07^EAC_U07|728d2456-339c-4d34-b7ad-c41b1e4cff34||2.5.1|||||||||PrepareForSpecimenRequest| EQU||20190322123829 ECD||LO^Prepare^ASTM|Y SAC|||123"; ParserResult result = parser.Parse(prepareRcv); Assert.IsNotNull(result); Assert.IsTrue(result.MessageAccepted); Assert.IsTrue(result.IsAcknowledge.HasValue && !result.IsAcknowledge.Value); Assert.IsNotNull(result.ParsedMessage); Assert.IsTrue(result.ParsedMessage is PrepareForSpecimenRequest); PrepareForSpecimenRequest prepareForSpecimen = (PrepareForSpecimenRequest)result.ParsedMessage; Assert.IsTrue(prepareForSpecimen.GetValue("/COMMAND(0)/SPECIMEN_CONTAINER/SAC-3") == "123"); Assert.IsTrue(prepareForSpecimen.MessageID == "PrepareForSpecimenRequest"); Assert.IsTrue(prepareForSpecimen.MessageID == typeof(PrepareForSpecimenRequest).Name); Assert.IsTrue(prepareForSpecimen.HL7Version == "2.5.1"); //Assert.IsTrue(prepare.ProcessingID == "P"); Assert.AreEqual(nameof(GeneralAcknowledgment), prepareForSpecimen.ExpectedAckID); Assert.AreEqual(nameof(PrepareForSpecimenResponse), prepareForSpecimen.ExpectedResponseID); Assert.IsFalse(prepareForSpecimen.IsAcknowledge); Assert.AreEqual("728d2456-339c-4d34-b7ad-c41b1e4cff34", prepareForSpecimen.ControlID); //Assert.AreEqual("20190322123829", prepareForSpecimen.MessageDateTime.ToString("yyyyMMddHHmmss")); //ARANGE & ACT GeneralAcknowledgment ack = result.Acknowledge as GeneralAcknowledgment; //ASSERTS Assert.IsNotNull(ack); //Assert.IsTrue(ack.AckType == AckTypes.AA); Assert.IsTrue(ack.MessageID == "GeneralAcknowledgment"); Assert.IsTrue(ack.TriggerEvent == "U07"); Assert.IsTrue(ack.MessageCode == "ACK"); Assert.IsTrue(prepare.HL7Version == "2.5.1"); Assert.IsTrue(ack.ExpectedAckID == ""); Assert.AreEqual(string.Empty, ack.ExpectedAckID); Assert.AreEqual(string.Empty, ack.ExpectedResponseID); Assert.AreEqual(string.Empty, ack.ExpectedResponseType); Assert.AreEqual(string.Empty, ack.ExpectedAckType); Assert.IsTrue(ack.IsAcknowledge); var regex1 = new Regex(@"(?im)^[{(]?[0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?$"); //StringAssert.Matches(ack.MessageID, regex1, "The MSH-10 shoul be a guid"); Assert.IsTrue(ack.IsAckForRequest(prepareForSpecimen)); }