public CreditScorecard assessCreditRisk()

in scorecard-plugin/src/main/java/org/apache/fineract/portfolio/creditscorecard/service/CreditScorecardWritePlatformServiceImpl.java [159:311]


    public CreditScorecard assessCreditRisk(final Loan loan) {
        final CreditScorecard scorecard = loan.getScorecard();

        if (scorecard != null) {
            final String scoringMethod = scorecard.getScoringMethod();
            final String scoringModel = scorecard.getScoringModel();

            if (scoringMethod.equalsIgnoreCase("ruleBased")) {

                final RuleBasedScorecard ruleBasedScorecard = scorecard.getRuleBasedScorecard();

                final List<FeatureCriteriaScore> criteriaScores = ruleBasedScorecard.getCriteriaScores();

                for (final FeatureCriteriaScore criteriaScore : criteriaScores) {

                    final LoanProductScorecardFeature lpFeature = criteriaScore.getFeature();

                    final FeatureConfiguration featureConfig = lpFeature.getFeatureConfiguration();

                    final EnumOptionData dataType = lpFeature.getScorecardFeature().getDataType();

                    final List<FeatureCriteria> featureCriteriaList = lpFeature.getFeatureCriteria();

                    for (final FeatureCriteria featureCriteria : featureCriteriaList) {

                        final String value = criteriaScore.getValue();

                        if (value != null) {

                            if (dataType.getValue().equalsIgnoreCase("string")) {

                                if (value.equalsIgnoreCase(featureCriteria.getCriteria())) {
                                    final BigDecimal score = featureCriteria.getScore().multiply(featureConfig.getWeightage());
                                    final String color = featureConfig.getColorFromScore(score);
                                    criteriaScore.setScore(score, color);
                                    break;

                                }

                            } else if (dataType.getValue().equalsIgnoreCase("numeric")) {

                                final String criteria = featureCriteria.getCriteria().strip();

                                final float min = Float.parseFloat(criteria.substring(0, criteria.indexOf("-")).strip());
                                final float max = Float.parseFloat(criteria.substring(criteria.indexOf("-") + 1).strip());

                                final float floatValue = Float.parseFloat(value);

                                if (floatValue >= min && floatValue <= max) {
                                    final BigDecimal score = featureCriteria.getScore().multiply(featureConfig.getWeightage());
                                    final String color = featureConfig.getColorFromScore(score);
                                    criteriaScore.setScore(score, color);
                                    break;

                                }

                            }

                        }

                    }

                }

                BigDecimal scorecardScore = BigDecimal.ZERO;
                int greenCount = 0;
                int amberCount = 0;
                int redCount = 0;
                for (final FeatureCriteriaScore ctScore : criteriaScores) {
                    scorecardScore = scorecardScore.add(ctScore.getScore());

                    if (ctScore.getColor().equalsIgnoreCase("green")) {
                        greenCount += 1;

                    } else if (ctScore.getColor().equalsIgnoreCase("amber")) {
                        amberCount += 1;

                    } else if (ctScore.getColor().equalsIgnoreCase("red")) {
                        redCount += 1;

                    }

                }

                String scorecardColor = "amber";
                if (greenCount > amberCount && greenCount > redCount) {
                    scorecardColor = "green";

                } else if (redCount >= greenCount && redCount >= amberCount) {
                    scorecardColor = "red";

                }

                ruleBasedScorecard.setScore(scorecardScore, scorecardColor);

                return scorecard;

            } else {

                this.initScorecardClient();

                if (scoringMethod.equalsIgnoreCase("ml")) {

                    final MLScorecard mlScorecard = scorecard.getMlScorecard();

                    final MLScorecardFields loanScorecardFields = mlScorecard.getScorecardFields();

                    final PredictionResponse response = this.fetchScorecard(loanScorecardFields, scoringModel);

                    if (response != null) {
                        mlScorecard.setPredictionResponse(BigDecimal.valueOf(response.getProbability()),
                            response.getLabel(), response.getRequestId());
                    }

                } else if (scoringMethod.equalsIgnoreCase("stat")) {

                    final StatScorecard statScorecard = scorecard.getStatScorecard();

                    final MLScorecardFields loanScorecardFields = statScorecard.getScorecardFields();

                    final PredictionResponse response = this.fetchScorecard(loanScorecardFields, scoringModel);

                    if (response != null) {
                        final String method = response.getMethod();
                        final String color = response.getColor();
                        final BigDecimal probability = BigDecimal.valueOf(response.getProbability());

                        BigDecimal wilikis = null;
                        BigDecimal pillaisTrace = null;
                        BigDecimal hotelling = null;
                        BigDecimal roys = null;

                        if (method.equalsIgnoreCase("manova")) {
                            wilikis = BigDecimal.valueOf(response.getWilkisLambda());
                            pillaisTrace = BigDecimal.valueOf(response.getPillaisTrace());
                            hotelling = BigDecimal.valueOf(response.getHotellingTawley());
                            roys = BigDecimal.valueOf(response.getRoysReatestRoots());
                        }
                        statScorecard.setPredictionResponse(method, color, probability, wilikis, pillaisTrace, hotelling, roys);
                    }

                }
            }

        } else {
            return null;

        }

        this.scorecardRepository.save(scorecard);

        return scorecard;
    }