Пример #1
0
        public Dictionary <long, List <PaymentResult> > AdjudicateClaim(List <EvaluateableClaim> evaluateableClaims, List <Contract> contracts, long taskId)
        {
            //Update Medicare object (L,C,D and Medicare Record)
            evaluateableClaims = _evaluateableClaimLogic.UpdateEvaluateableClaims(evaluateableClaims);

            //Update Contract Condition for each contract
            if (contracts != null)
            {
                for (int contractIndex = 0; contractIndex < contracts.Count; contractIndex++)
                {
                    lock (contracts)
                    {
                        contracts[contractIndex] = _contractLogic.UpdateContractCondition(contracts[contractIndex]);
                    }
                }
            }

            Dictionary <long, List <PaymentResult> > paymentResultDictionary = new Dictionary <long, List <PaymentResult> >();

            // make sure claim IDs are distinct before this loop; could call claims.Distinct() with custom comparer,
            // but should really do this in data access layer
            if (evaluateableClaims != null)
            {
                foreach (EvaluateableClaim claim in evaluateableClaims)
                {
                    paymentResultDictionary.Add(claim.ClaimId, new List <PaymentResult>());
                    //Initialize payment result.
                    List <PaymentResult> paymentResults = _paymentResultLogic.GetPaymentResults(claim);
                    //check Basic ClaimData is valid or not

                    paymentResults = _evaluateableClaimLogic.Evaluate(claim, paymentResults, false, false);
                    //Get claim level payment result
                    PaymentResult overAllClaimPaymentResult = paymentResults.FirstOrDefault(
                        payment => payment.Line == null && payment.ServiceTypeId == null);

                    if (overAllClaimPaymentResult != null && (overAllClaimPaymentResult.ClaimStatus !=
                                                              (byte)
                                                              Enums.AdjudicationOrVarianceStatuses
                                                              .AdjudicationErrorMissingServiceLine &&
                                                              overAllClaimPaymentResult.ClaimStatus !=
                                                              (byte)Enums.AdjudicationOrVarianceStatuses.ClaimDataError))
                    {
                        paymentResults = UpdateConditions(contracts, taskId, claim, paymentResults,
                                                          overAllClaimPaymentResult);
                    }
                    //If the paymentResults is null, remove claim details from paymentResultDictionary, so that claim gets early exit and  payment results does not overwrite.
                    if (paymentResults != null)
                    {
                        //Update Payment Results for a claim
                        paymentResultDictionary[claim.ClaimId] = paymentResults;
                    }
                    else
                    {
                        paymentResultDictionary.Remove(claim.ClaimId);
                    }
                }
            }
            return(paymentResultDictionary);
        }