Пример #1
0
        public override List <PaymentResult> EvaluatePaymentType(IEvaluateableClaim claim,
                                                                 List <PaymentResult> paymentResults, bool isCarveOut, bool isContractFilter)
        {
            if (PaymentTypeMedicareOp != null)
            {
                if (isCarveOut ||
                    (PaymentTypeMedicareOp.PayAtClaimLevel &&
                     !paymentResults.Any(
                         currentPaymentResult => currentPaymentResult.Line == null && currentPaymentResult.ServiceTypeId == PaymentTypeMedicareOp.ServiceTypeId)) ||
                    (!PaymentTypeMedicareOp.PayAtClaimLevel && paymentResults.Any(
                         currentPaymentResult =>
                         currentPaymentResult.Line != null &&
                         PaymentTypeMedicareOp.ValidLineIds.Contains(currentPaymentResult.Line.Value) &&
                         currentPaymentResult.AdjudicatedValue == null)))
                {
                    if (PaymentTypeMedicareOp != null)
                    {
                        MedicareOutPatientResult medicareOutPatientResult = GetMedicareOutPatientResult(claim);

                        paymentResults = PaymentTypeMedicareOp.PayAtClaimLevel
                            ? EvaluateAtClaimLevel(paymentResults, medicareOutPatientResult, isCarveOut)
                            : EvaluateAtLineLevel(claim, paymentResults, isCarveOut, medicareOutPatientResult);
                    }
                }
            }
            return(paymentResults);
        }
Пример #2
0
        /// <summary>
        /// Gets the result data.
        /// </summary>
        /// <param name="apcResultsData">The apc results data.</param>
        /// <returns></returns>
        private static MedicareOutPatientResult GetResultData(string apcResultsData)
        {
            MedicareOutPatientResult medicareOutPatientResult = new MedicareOutPatientResult
            {
                IsEditSuccess    = true,
                PricerErrorCodes = null
            };

            string vRecord = apcResultsData.Substring(0, 200);

            medicareOutPatientResult.ClaimId            = vRecord.Substring(1, 17).Trim();
            medicareOutPatientResult.TotalPaymentAmount = Convert.ToDouble(vRecord.Substring(53, 9), CultureInfo.InvariantCulture);

            string        wRecordFull    = apcResultsData.Substring(200, apcResultsData.Length - 200);
            int           lineItemsCount = (apcResultsData.Length - 200) / 200; //This will give the number of W Records
            List <string> wRecords       = SplitW(wRecordFull, 200).ToList();

            medicareOutPatientResult.ReturnCode = 0;
            medicareOutPatientResult.Message    = string.Empty;
            medicareOutPatientResult.LineItemMedicareDetails = new List <WRecordData>();

            if (wRecords.Count == lineItemsCount) //This ensures that the parsing if fine
            {
                foreach (string wRecord in wRecords)
                {
                    WRecordData wRecordData = new WRecordData {
                        LineItemId = Convert.ToInt32(wRecord.Substring(18, 3), CultureInfo.InvariantCulture)
                    };
                    string wholeNumber   = wRecord.Substring(21, 7);
                    string decimalNumber = wRecord.Substring(28, 2);
                    wRecordData.LinePaymentAmount = Convert.ToDouble(wholeNumber + "." + decimalNumber, CultureInfo.InvariantCulture);
                    wRecordData.ReturnCode        = 0;
                    wRecordData.ErrorMessage      = string.Empty;
                    medicareOutPatientResult.LineItemMedicareDetails.Add(wRecordData);
                }
            }
            else
            {
                return(null);
            }

            return(medicareOutPatientResult);
        }
Пример #3
0
        /// <summary>
        /// Gets the line level amount.
        /// </summary>
        /// <param name="medicareOutPatientResult">The medicare out patient result.</param>
        /// <param name="lineId">The line identifier.</param>
        /// <returns></returns>
        private static double?GetLineLevelAmount(MedicareOutPatientResult medicareOutPatientResult, int lineId)
        {
            double?resultAmount = null;

            if (medicareOutPatientResult != null && medicareOutPatientResult.IsEditSuccess && medicareOutPatientResult.IsPricerSuccess)
            {
                if (medicareOutPatientResult.LineItemMedicareDetails != null &&
                    medicareOutPatientResult.LineItemMedicareDetails.Count > 0 &&
                    medicareOutPatientResult.LineItemMedicareDetails.Any(q => q.LineItemId == lineId))
                {
                    WRecordData wRecordData =
                        medicareOutPatientResult.LineItemMedicareDetails.First(
                            q => q.LineItemId == lineId);
                    resultAmount = wRecordData.LinePaymentAmount;
                }
                else if (medicareOutPatientResult.ReturnCode == 0 &&
                         medicareOutPatientResult.Message == Constants.MessageMicrodyneOff)
                {
                    resultAmount = 0;
                }
            }

            return(resultAmount);
        }
Пример #4
0
        private static void GetInstanceMessage(bool isNetApc, int returnCode, MedicareOutPatientResult medicareOutPatientResult)
        {
            switch (returnCode)
            {
            case 5:
                medicareOutPatientResult.Message = Constants.MessageMajorClaimError;
                break;

            case 11:
                medicareOutPatientResult.Message = Constants.MessageApcActiveError;
                break;

            case 98:
                medicareOutPatientResult.Message = Constants.MessageSqlTableError;
                break;

            //Claim Level 'Error' Return Codes
            case 50:
                medicareOutPatientResult.Message = Constants.MessageWageIndexNotLocated;
                break;

            case 51:
                medicareOutPatientResult.Message = Constants.MessageWageIndexZero;
                break;

            case 52:
                medicareOutPatientResult.Message = Constants.MessageWageIndexError;
                break;

            case 53:
                medicareOutPatientResult.Message = Constants.MessageServiceDateError;
                break;

            case 54:
                medicareOutPatientResult.Message = Constants.MessageLesserServiceDate;
                break;

            case 55:
                medicareOutPatientResult.Message = Constants.MessageInvalidProviderNumber;
                break;

            case 56:
                medicareOutPatientResult.Message = Constants.MessageInvalidBeneficiaryAmount;
                break;

            case 90:
                medicareOutPatientResult.Message = Constants.MessageInputNumberError;
                break;

            case 95:
                medicareOutPatientResult.Message = Constants.MessageApcActivePricerError;
                break;

            //Reimbursement calculation is terminated for return codes > 50
            //Line Item Level 'Error' Return Codes
            case 30:
                medicareOutPatientResult.Message = Constants.MessageLineItemApcError;
                break;

            case 38:
                medicareOutPatientResult.Message = Constants.MessageLineItemDiscountFactorError;
                break;

            case 40:
                medicareOutPatientResult.Message = Constants.MessageLineItemStatusIndicatorError;
                break;

            case 48:
                medicareOutPatientResult.Message = Constants.MessageLineItemPaymentAdjustmentFlagError;
                break;

            //Line Item Level 'Processing' Return Codes
            case 20:
                medicareOutPatientResult.Message = Constants.MessageLinepaymentZero;
                break;

            case 22:
                medicareOutPatientResult.Message = Constants.MessageLineCoInsuranceLimitation;
                break;

            case 25:
                medicareOutPatientResult.Message = Constants.MessageLineReducedCoInsurance;
                break;

            case 41:
                medicareOutPatientResult.Message = Constants.MessageStatusIndicatorNotProcessed;
                break;

            case 42:
                medicareOutPatientResult.Message = Constants.MessageApcZero;
                break;

            case 43:
                medicareOutPatientResult.Message = Constants.MessagePaymentIndicatorError;
                break;

            case 44:
                medicareOutPatientResult.Message = Constants.MessageStatusIndicatorError;
                break;

            case 45:
                medicareOutPatientResult.Message = Constants.MessagePackagingFlagError;
                break;

            case 46:
                medicareOutPatientResult.Message = Constants.MessageLineItemReject;
                break;

            case 47:
                medicareOutPatientResult.Message = Constants.MessageLineFlag;
                break;

            case 49:
                medicareOutPatientResult.Message = Constants.MessagePaymentMethodFlag;
                break;

            default:
                if (isNetApc && returnCode == 1)
                {
                    medicareOutPatientResult.Message = Constants.MessageClaimError;
                }
                else if (!isNetApc && returnCode == 1)
                {
                    medicareOutPatientResult.Message = Constants.MessageLineSuccess;
                }
                else if (isNetApc && returnCode == 99)
                {
                    medicareOutPatientResult.Message = Constants.MessageApcActiveLicenseExpired;
                }
                else if (!isNetApc && returnCode == 99)
                {
                    medicareOutPatientResult.Message = Constants.MessageApcActivePricerLicenseExpired;
                }
                else if (returnCode == 100)
                {
                    medicareOutPatientResult.Message = Constants.MessageSqlError;
                }
                break;
            }
        }
Пример #5
0
        private MedicareOutPatientResult GetMedicareOutPatientResult(IEvaluateableClaim claim)
        {
            StringBuilder            inputData = new StringBuilder();
            MedicareOutPatientResult medicareOutPatientResult = new MedicareOutPatientResult();

            MicrodynApcEditInput microdynApcEditInput = claim.MicrodynApcEditInput;

            string dLine = string.Empty;
            string eLine = string.Empty;
            string cLine = _cRecordLogic.GetCRecordLine(microdynApcEditInput.CRecord);

            if (claim.StatementThru >= DateTime.Parse(Constants.IcdVersionDate, CultureInfo.InvariantCulture))
            {
                eLine = _eRecordLogic.GetERecordLine(microdynApcEditInput.ERecord);
            }
            else
            {
                dLine = _dRecordLogic.GetDRecordLine(microdynApcEditInput.DRecord);
            }
            string lLine = _lRecordLogic.GetLRecordLine(microdynApcEditInput.LRecords);

            if (GlobalConfigVariable.IsMicrodynEnabled)
            {
                inputData.Append(cLine);
                string diagnosisLine = (claim.StatementThru >= DateTime.Parse(Constants.IcdVersionDate, CultureInfo.InvariantCulture) ? eLine : dLine);
                inputData.Append(diagnosisLine);
                inputData.Append(lLine);

                if (inputData.Length !=
                    Constants.CRecordLength + Constants.DRecordLength +
                    (microdynApcEditInput.LRecords.Count * Constants.LRecordLength))
                {
                    medicareOutPatientResult.ReturnCode = 1;
                    medicareOutPatientResult.Message    = Constants.MessageClaimDataError;
                    if (GlobalConfigVariable.IsMicrodynLogEnabled)
                    {
                        if (claim.StatementThru >= DateTime.Parse(Constants.IcdVersionDate, CultureInfo.InvariantCulture))
                        {
                            Log.LogInfo(
                                string.Format(CultureInfo.InvariantCulture, DataIssueMessageFormatWithERecord,
                                              claim.ClaimId, cLine, Environment.NewLine,
                                              _cRecordLogic.ValidationErrors, Environment.NewLine,
                                              diagnosisLine, Environment.NewLine,
                                              _eRecordLogic.ValidationErrors, Environment.NewLine,
                                              lLine, Environment.NewLine,
                                              _lRecordLogic.ValidationErrors),
                                Constants.MicrodynApcEditDllResultsData);
                        }
                        else
                        {
                            Log.LogInfo(
                                string.Format(CultureInfo.InvariantCulture, DataIssueMessageFormatWithDRecord,
                                              claim.ClaimId, cLine, Environment.NewLine,
                                              _cRecordLogic.ValidationErrors, Environment.NewLine,
                                              diagnosisLine, Environment.NewLine,
                                              _dRecordLogic.ValidationErrors, Environment.NewLine,
                                              lLine, Environment.NewLine,
                                              _lRecordLogic.ValidationErrors),
                                Constants.MicrodynApcEditDllResultsData);
                        }
                    }
                    return(medicareOutPatientResult);
                }

                Instance.InputLineCount = microdynApcEditInput.LRecords.Count;
                Instance.InputData      = inputData.ToString();
                Instance.AutoDenyReject = false;

                Instance.APCEdit();

                if (Instance.APCErrorsFound)
                {
                    //Processing Unsuccessful - Edit errors found
                    //ResultsData contains claim and line item errors
                    medicareOutPatientResult.ReturnCode = Instance.ReturnCode;
                    GetInstanceMessage(true, Instance.ReturnCode, medicareOutPatientResult);
                    if (Instance.ResultsData.Length % 200 == 0)
                    {
                        medicareOutPatientResult.EditErrorCodes = GetResultMessageData(Instance.ResultsData);
                    }
                    medicareOutPatientResult.MicrodynEditReturnRemarks = "Error Code:" + medicareOutPatientResult.ReturnCode + "; " +
                                                                         medicareOutPatientResult.Message;
                    if (GlobalConfigVariable.IsMicrodynLogEnabled)
                    {
                        if (claim.StatementThru >= DateTime.Parse(Constants.IcdVersionDate, CultureInfo.InvariantCulture))
                        {
                            Log.LogInfo(
                                string.Format(CultureInfo.InvariantCulture, ApcErrorMessageFormatWithERecord, claim.ClaimId,
                                              medicareOutPatientResult.Message, Instance.ResultsData,
                                              string.IsNullOrEmpty(medicareOutPatientResult.EditErrorCodes)
                                       ? string.Empty
                                       : Constants.ErrorCodes + medicareOutPatientResult.EditErrorCodes,
                                              Environment.NewLine, cLine, Environment.NewLine, diagnosisLine, Environment.NewLine,
                                              lLine),
                                Constants.MicrodynApcEditDllResultsData);
                        }
                        else
                        {
                            Log.LogInfo(
                                string.Format(CultureInfo.InvariantCulture, ApcErrorMessageFormatWithDRecord, claim.ClaimId,
                                              medicareOutPatientResult.Message, Instance.ResultsData,
                                              string.IsNullOrEmpty(medicareOutPatientResult.EditErrorCodes)
                                        ? string.Empty
                                        : Constants.ErrorCodes + medicareOutPatientResult.EditErrorCodes,
                                              Environment.NewLine, cLine, Environment.NewLine, diagnosisLine, Environment.NewLine,
                                              lLine),
                                Constants.MicrodynApcEditDllResultsData);
                        }
                    }
                }
                else
                {
                    medicareOutPatientResult.IsEditSuccess = true;
                    string             inputDataString = Instance.PaymentInputData;
                    MedicareOutPatient objPatientData  = microdynApcEditInput.MedicareOutPatientRecord;
                    _apcPayDll = new NetAPCPay
                    {
                        InputLineCount          = microdynApcEditInput.LRecords.Count,
                        InputData               = inputDataString,
                        ProviderNumber          = objPatientData.Npi,
                        ServiceFromDate         = Convert.ToString(objPatientData.ServiceDate, CultureInfo.InvariantCulture),
                        BeneDeductible          = Convert.ToDouble(objPatientData.BeneDeductible),
                        BloodDeductiblePints    = Convert.ToInt32(objPatientData.BloodDeductiblePints),
                        AllowTerminatedProvider = Convert.ToBoolean(objPatientData.AllowTerminatorProvider, CultureInfo.InvariantCulture),
                        AdjustmentFactor        = Convert.ToDouble(objPatientData.AdjustFactor),
                        AdjustmentOption        = Convert.ToInt32(objPatientData.AdjustmentOptions)
                    };

                    _apcPayDll.APCCalc();
                    if (!_apcPayDll.CalcErrorsFound)
                    {
                        //No Errors found
                        //Parse the V and W records to get the out patient payment details
                        medicareOutPatientResult                 = GetResultData(_apcPayDll.ResultsData);
                        medicareOutPatientResult.ReturnCode      = 0;
                        medicareOutPatientResult.Message         = Constants.MessageNoError;
                        medicareOutPatientResult.IsPricerSuccess = true;
                    }
                    else
                    {
                        //Errors found in APC Payment calculation
                        medicareOutPatientResult.ReturnCode = _apcPayDll.ReturnCode;
                        GetInstanceMessage(false, _apcPayDll.ReturnCode, medicareOutPatientResult);
                        medicareOutPatientResult.PricerErrorCodes = medicareOutPatientResult.ReturnCode;
                        if (GlobalConfigVariable.IsMicrodynLogEnabled)
                        {
                            if (claim.StatementThru >= DateTime.Parse(Constants.IcdVersionDate, CultureInfo.InvariantCulture))
                            {
                                Log.LogInfo(
                                    string.Format(CultureInfo.InvariantCulture, ApcCalcMessageFormatWithERecord, claim.ClaimId, medicareOutPatientResult.Message,
                                                  medicareOutPatientResult.PricerErrorCodes == 0
                                      ? string.Empty
                                      : Constants.ErrorCodes + medicareOutPatientResult.PricerErrorCodes, _apcPayDll.ResultsData,
                                                  Environment.NewLine, cLine, Environment.NewLine, eLine, Environment.NewLine, lLine),
                                    Constants.MicrodynApcCalcDllResultsData);
                            }
                            else
                            {
                                Log.LogInfo(
                                    string.Format(CultureInfo.InvariantCulture, ApcCalcMessageFormatWithDRecord, claim.ClaimId, medicareOutPatientResult.Message,
                                                  medicareOutPatientResult.PricerErrorCodes == 0
                                       ? string.Empty
                                       : Constants.ErrorCodes + medicareOutPatientResult.PricerErrorCodes, _apcPayDll.ResultsData,
                                                  Environment.NewLine, cLine, Environment.NewLine, dLine, Environment.NewLine, lLine),
                                    Constants.MicrodynApcCalcDllResultsData);
                            }
                        }
                    }
                    _apcPayDll.Dispose();
                }
            }
            else
            {
                medicareOutPatientResult.ReturnCode         = 0;
                medicareOutPatientResult.TotalPaymentAmount = 0;
                medicareOutPatientResult.Message            = Constants.MessageMicrodyneOff;
                medicareOutPatientResult.IsEditSuccess      = true;
            }
            return(medicareOutPatientResult);
        }
Пример #6
0
        /// <summary>
        /// Evaluates at claim level.
        /// </summary>
        /// <param name="paymentResults">The payment results.</param>
        /// <param name="medicareOutPatientResult">The medicare out patient result.</param>
        /// <param name="isCarveOut">if set to <c>true</c> [is carve out].</param>
        /// <returns></returns>
        private List <PaymentResult> EvaluateAtClaimLevel(List <PaymentResult> paymentResults, MedicareOutPatientResult medicareOutPatientResult, bool isCarveOut)
        {
            PaymentResult claimPaymentResult = GetClaimLevelPaymentResult(paymentResults, isCarveOut);

            if (claimPaymentResult != null && medicareOutPatientResult != null)
            {
                //Update PaymentResult and set matching ServiceTypeId,PaymentTypeDetailId & PaymentTypeId
                Utilities.UpdatePaymentResult(claimPaymentResult, PaymentTypeMedicareOp.ServiceTypeId,
                                              PaymentTypeMedicareOp.PaymentTypeDetailId, PaymentTypeMedicareOp.PaymentTypeId);

                if (medicareOutPatientResult.IsEditSuccess && medicareOutPatientResult.IsPricerSuccess)
                {
                    if (PaymentTypeMedicareOp.OutPatient.HasValue)
                    {
                        double adjValue = (PaymentTypeMedicareOp.OutPatient.Value / 100) * medicareOutPatientResult.TotalPaymentAmount;
                        claimPaymentResult.AdjudicatedValue = adjValue;
                        claimPaymentResult.ClaimStatus      = (byte)Enums.AdjudicationOrVarianceStatuses.Adjudicated;
                    }
                    else
                    {
                        claimPaymentResult.ClaimStatus =
                            (byte)Enums.AdjudicationOrVarianceStatuses.AdjudicationErrorInvalidPaymentData;
                    }
                }
                else if (!medicareOutPatientResult.IsEditSuccess)
                {
                    claimPaymentResult.ClaimStatus               = (byte)Enums.AdjudicationOrVarianceStatuses.ClaimDataError;
                    claimPaymentResult.MicrodynEditErrorCodes    = medicareOutPatientResult.EditErrorCodes;
                    claimPaymentResult.MicrodynEditReturnRemarks = medicareOutPatientResult.MicrodynEditReturnRemarks;
                }
                else
                {
                    claimPaymentResult.ClaimStatus = (byte)Enums.AdjudicationOrVarianceStatuses.ClaimDataError;
                    claimPaymentResult.MicrodynPricerErrorCodes  = medicareOutPatientResult.PricerErrorCodes;
                    claimPaymentResult.MicrodynEditReturnRemarks = medicareOutPatientResult.MicrodynEditReturnRemarks;
                }
            }
            return(paymentResults);
        }
Пример #7
0
        /// <summary>
        /// Evaluates at line level.
        /// </summary>
        /// <param name="claim">The claim.</param>
        /// <param name="paymentResults">The payment results.</param>
        /// <param name="isCarveOut">if set to <c>true</c> [is carve out].</param>
        /// <param name="medicareOutPatientResult">The medicare out patient result.</param>
        /// <returns></returns>
        private List <PaymentResult> EvaluateAtLineLevel(IEvaluateableClaim claim, List <PaymentResult> paymentResults, bool isCarveOut, MedicareOutPatientResult medicareOutPatientResult)
        {
            foreach (ClaimCharge claimCharge in claim.ClaimCharges)
            {
                if (isCarveOut &&
                    paymentResults.Any(
                        currentPaymentResult =>
                        currentPaymentResult.Line == claimCharge.Line &&
                        currentPaymentResult.ServiceTypeId == PaymentTypeMedicareOp.ServiceTypeId))
                {
                    break;
                }

                if (PaymentTypeMedicareOp.ValidLineIds.Contains(claimCharge.Line) && paymentResults.Any(
                        currentPaymentResult =>
                        currentPaymentResult.Line == claimCharge.Line &&
                        (currentPaymentResult.AdjudicatedValue == null || isCarveOut)))
                {
                    PaymentResult paymentResult = GetPaymentResult(paymentResults, isCarveOut,
                                                                   claimCharge.Line);

                    //Update PaymentResult and set matching ServiceTypeId,PaymentTypeDetailId & PaymentTypeId
                    Utilities.UpdatePaymentResult(paymentResult, PaymentTypeMedicareOp.ServiceTypeId,
                                                  PaymentTypeMedicareOp.PaymentTypeDetailId, PaymentTypeMedicareOp.PaymentTypeId);

                    //Get Line level Adjudciated amount from medicareOutPatientResult
                    double?resultAmount = GetLineLevelAmount(medicareOutPatientResult, claimCharge.Line);

                    if (resultAmount.HasValue)
                    {
                        if (PaymentTypeMedicareOp.OutPatient.HasValue)
                        {
                            double adjValue = (PaymentTypeMedicareOp.OutPatient.Value / 100) *
                                              resultAmount.Value;
                            paymentResult.AdjudicatedValue = adjValue;
                            paymentResult.ClaimStatus      =
                                (byte)Enums.AdjudicationOrVarianceStatuses.Adjudicated;
                        }
                        else
                        {
                            paymentResult.ClaimStatus =
                                (byte)
                                Enums.AdjudicationOrVarianceStatuses
                                .AdjudicationErrorInvalidPaymentData;
                        }
                    }
                    else if (!medicareOutPatientResult.IsEditSuccess)
                    {
                        paymentResult.ClaimStatus =
                            (byte)Enums.AdjudicationOrVarianceStatuses.ClaimDataError;
                        paymentResult.MicrodynEditErrorCodes    = medicareOutPatientResult.EditErrorCodes;
                        paymentResult.MicrodynEditReturnRemarks = medicareOutPatientResult.MicrodynEditReturnRemarks;
                    }
                    else if (!medicareOutPatientResult.IsPricerSuccess)
                    {
                        paymentResult.ClaimStatus =
                            (byte)Enums.AdjudicationOrVarianceStatuses.ClaimDataError;
                        paymentResult.MicrodynPricerErrorCodes  = medicareOutPatientResult.PricerErrorCodes;
                        paymentResult.MicrodynEditReturnRemarks = medicareOutPatientResult.MicrodynEditReturnRemarks;
                    }
                }
            }

            return(paymentResults);
        }
        /// <summary>
        ///  Actual Method call for Microdyn output retrieval
        /// </summary>
        public MedicareOutPatientResult GetMedicareOutPatientResult(long claimId)
        {
            StringBuilder            inputData = new StringBuilder();
            MedicareOutPatientResult medicareOutPatientResult = new MedicareOutPatientResult();

            MicrodynApcEditInput microdynApcEditInput = _medicareOutPatientRepository.GetMicrodynApcEditInput(claimId);

            string cLine = GetCRecordLine(microdynApcEditInput.CRecord);
            string dLine = GetDRecordLine(microdynApcEditInput.DRecord);
            string lLine = GetLRecordLine(microdynApcEditInput.LRecords);

            if (GlobalConfigVariable.IsMicrodynEnabled)
            {
                if (!string.IsNullOrEmpty(cLine) && !string.IsNullOrEmpty(dLine) && !string.IsNullOrEmpty(lLine))
                {
                    int calcTotal = cLine.Length + dLine.Length + (microdynApcEditInput.LRecords.Count * 200);

                    inputData.Append(cLine);
                    inputData.Append(dLine);
                    inputData.Append(lLine);

                    if (inputData.Length != calcTotal)
                    {
                        medicareOutPatientResult.ReturnCode = 1;
                        medicareOutPatientResult.Message    = "Claim Data Errors Found";
                        return(medicareOutPatientResult);
                    }
                }
                else
                {
                    medicareOutPatientResult.ReturnCode = 1;
                    medicareOutPatientResult.Message    = "Claim Data Errors Found";
                    return(medicareOutPatientResult);
                }

                Instance.InputLineCount = microdynApcEditInput.LRecords.Count;
                Instance.InputData      = inputData.ToString();
                Instance.AutoDenyReject = false;

                Instance.APCEdit();

                if (GlobalConfigVariable.IsMicrodynLogEnabled)
                {
                    Log.LogInfo(Instance.ResultsData + "ClaimId-" + claimId, "MicrodynApcEditDllResultsData");
                    Log.LogInfo(Instance.PaymentInputData + "ClaimId-" + claimId, "MicrodynApcEditDllPaymentInputData");
                }
                if (Instance.APCErrorsFound)
                {
                    //Processing Unsuccessful - Edit errors found
                    //ResultsData contains claim and line item errors

                    switch (Instance.ReturnCode)
                    {
                    case 1:
                        medicareOutPatientResult.ReturnCode = 1;
                        medicareOutPatientResult.Message    = "Claim Errors Found";
                        break;

                    case 5:
                        medicareOutPatientResult.ReturnCode = 5;
                        medicareOutPatientResult.Message    = "Major claim errors found - processing suspended";
                        break;

                    case 11:
                        medicareOutPatientResult.ReturnCode = 11;
                        medicareOutPatientResult.Message    = "Misc. APCActive Error";
                        break;

                    case 98:
                        medicareOutPatientResult.ReturnCode = 98;
                        medicareOutPatientResult.Message    = "SQL tables corrupted or loaded incorrectly";
                        break;

                    case 99:
                        medicareOutPatientResult.ReturnCode = 99;
                        medicareOutPatientResult.Message    = "APCActive license id expired";
                        break;

                    case 100:
                        medicareOutPatientResult.ReturnCode = 100;
                        medicareOutPatientResult.Message    = "SQL data access error";
                        break;
                        // *** Ignore
                    }
                }
                else
                {
                    string inputDataString = Instance.PaymentInputData;

                    MedicareOutPatient objPatientData = microdynApcEditInput.MedicareOutPatientRecord;

                    _apcPayDll = new NetAPCPay
                    {
                        InputLineCount = microdynApcEditInput.LRecords.Count,
                        InputData      = inputDataString,

                        // Test data - this gives some value for the total payment amount
                        //InputLineCount = 25,
                        //InputData = @"T$11411-018       001Q00810012000120 T 1200 0000000010000017000020030303                                                                                                                                T$11411-018       002Q00810012000120 T 1200 0000000010000017000020030304                                                                                                                                T$11411-018       003Q00810012000120 T 1200 0000000010000017000020030318                                                                                                                                T$11411-018       004856100000000000 A 2100 0200000010000002098020030303                                                                                                                                T$11411-018       005856100000000000 A 2100 0200000010000002098020030318                                                                                                                                T$11411-018       006850250000000000 A 2100 0200000010000002625020030319                                                                                                                                T$11411-018       007856510000000000 A 2100 0200000010000001890020030319                                                                                                                                T$11411-018       008365400000000000 N 9101 0000000010000005000020030303                                                                                                                                T$11411-018       009907840035900359 X 1100 0000000020000010000020030303                                                                                                                                T$11411-018       010907840035900359 X 1100 0000000030000015000020030304                                                                                                                                T$11411-018       011365400000000000 N 9101 0000000010000005000020030318                                                                                                                                T$11411-018       012907840035900359 X 1100 0000000030000015000020030318                                                                                                                                T$11411-018       013J11000000000000 N 9101 0000000030000001395020030303                                                                                                                                T$11411-018       014J12000000000000 N 9101 0000000010000001885020030303                                                                                                                                T$11411-018       015J15630090500905 K 1100 0000000720001352160020030303                                                                                                                                T$11411-018       016J19400000000000 N 9101 0000000020000003660020030303                                                                                                                                T$11411-018       017J11000000000000 N 9101 0000000030000001395020030304                                                                                                                                T$11411-018       018J12000000000000 N 9101 0000000010000001885020030304                                                                                                                                T$11411-018       019J15630090500905 K 1100 0000000720001352160020030304                                                                                                                                T$11411-018       020J19400000000000 N 9101 0000000020000003660020030304                                                                                                                                T$11411-018       021J34870911509115 G 5100 1000000040000199400020030304                                                                                                                                T$11411-018       022J11000000000000 N 9101 0000000030000001395020030318                                                                                                                                T$11411-018       023J12000000000000 N 9101 0000000010000001885020030318                                                                                                                                T$11411-018       024J15630090500905 K 1100 0000000720001352160020030318                                                                                                                                T$11411-018       025J19400000000000 N 9101 0000000020000003660020030318                                                                                                                                ",
                        //ServiceFromDate = "03/03/2003",

                        ProviderNumber          = objPatientData.NPI,
                        ServiceFromDate         = Convert.ToString(objPatientData.ServiceDate),
                        BeneDeductible          = Convert.ToDouble(objPatientData.BeneDeductible),
                        BloodDeductiblePints    = Convert.ToInt32(objPatientData.BloodDeductiblePints),
                        AllowTerminatedProvider = Convert.ToBoolean(objPatientData.AllowTerminatorProvider),
                        AdjustmentFactor        = Convert.ToDouble(objPatientData.AdjustFactor),
                        AdjustmentOption        = Convert.ToInt32(objPatientData.AdjustmentOptions)
                    };

                    _apcPayDll.APCCalc();

                    if (!_apcPayDll.CalcErrorsFound)
                    {
                        //No Errors found
                        //Parse the V and W records to get the out patient payment details

                        medicareOutPatientResult            = GetResultData(_apcPayDll.ResultsData);
                        medicareOutPatientResult.ReturnCode = 0;
                        medicareOutPatientResult.Message    = "No errors Found";
                    }
                    else
                    {
                        //Errors found in APC Payment calculation
                        medicareOutPatientResult.ReturnCode = _apcPayDll.ReturnCode;
                        switch (_apcPayDll.ReturnCode)
                        {
                        //Claim Level 'Error' Return Codes
                        case 50:
                            medicareOutPatientResult.Message = "Wage Index not located ";
                            break;

                        case 51:
                            medicareOutPatientResult.Message = "Wage Index = 0 ";
                            break;

                        case 52:
                            medicareOutPatientResult.Message = "Provider file Wage Index reclassification code invalid or missing ";
                            break;

                        case 53:
                            medicareOutPatientResult.Message = "Service date not numeric or < 8/1/2000  Provider file waiver indicator = “Y”. Case cannot be processed. ";
                            break;

                        case 54:
                            medicareOutPatientResult.Message = "Service date < provider effective date ";
                            break;

                        case 55:
                            medicareOutPatientResult.Message = "Invalid provider number ";
                            break;

                        case 56:
                            medicareOutPatientResult.Message = "Invalid beneficiary deductible amount ";
                            break;

                        case 90:
                            medicareOutPatientResult.Message = "Input number of line items in error ";
                            break;

                        case 95:
                            medicareOutPatientResult.Message = "Misc. APCActive Pricer DLL error ";
                            break;

                        case 99:
                            medicareOutPatientResult.Message = "APCActive Pricer License is expired ";
                            break;

                        case 100:
                            medicareOutPatientResult.Message = "SQL data access error ";
                            break;

                        //Reimbursement calculation is terminated for return codes > 50

                        //Line Item Level 'Error' Return Codes

                        case 30:
                            medicareOutPatientResult.Message = "Line item APC is missing or invalid";
                            break;

                        case 38:
                            medicareOutPatientResult.Message = "Line item Discount factor is invalid";
                            break;

                        case 40:
                            medicareOutPatientResult.Message = "Line item Status Indicator is invalid";
                            break;

                        case 48:
                            medicareOutPatientResult.Message = "Line item Payment Adjustment Flag is invalid";
                            break;

                        //Line Item Level 'Processing' Return Codes

                        case 1:
                            medicareOutPatientResult.Message = " Line processed successfully ";
                            break;

                        case 20:
                            medicareOutPatientResult.Message = " Line processed but payment =0, all applied to deductible.  ";
                            break;

                        case 22:
                            medicareOutPatientResult.Message = " Daily coinsurance limitation – claim processed ";
                            break;

                        case 25:
                            medicareOutPatientResult.Message = " Line item has reduced coinsurance amount ";
                            break;

                        case 41:
                            medicareOutPatientResult.Message = " Status Indicator not processed by OPPS Pricer ";
                            break;

                        case 42:
                            medicareOutPatientResult.Message = " APC = 00000 ";
                            break;

                        case 43:
                            medicareOutPatientResult.Message = " Payment Indicator not = 1 or 5 thru 9 ";
                            break;

                        case 44:
                            medicareOutPatientResult.Message = " Status indicator = 'H', but payment indicator not = '6' ";
                            break;

                        case 45:
                            medicareOutPatientResult.Message = " Packaging flag <> '0' ";
                            break;

                        case 46:
                            medicareOutPatientResult.Message = " Line item denial/reject flag not = to 0 and line item action flag not = to 1 ";
                            break;

                        case 47:
                            medicareOutPatientResult.Message = " Line item action flag = 2 or 3 ";
                            break;

                        case 49:
                            medicareOutPatientResult.Message = " Payment Method Flag not = to 0 ";
                            break;
                        }
                        if (GlobalConfigVariable.IsMicrodynLogEnabled)
                        {
                            Log.LogInfo(medicareOutPatientResult.Message + "ClaimId-" + claimId, "MicrodynApcEditDllResultsData");
                        }
                    }

                    _apcPayDll.Dispose();
                }
            }
            else
            {
                medicareOutPatientResult.ReturnCode         = 0;
                medicareOutPatientResult.TotalPaymentAmount = 0;
                medicareOutPatientResult.Message            = "Microdyne Switched Off";
            }
            return(medicareOutPatientResult);
        }