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