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);
            }
        }
Beispiel #3
0
        /// <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));
        }