private List<WrappedBooking> categorize(List<Booking> bookings, List<Rule> customRules) { List<BookingMatcher> incomingRules = new ArrayList<>(); List<BookingMatcher> expensesRules = new ArrayList<>(); customRules.forEach(customRule -> { try { BookingMatcher matcher = customRule.getSimilarityMatchType() == null ? createExpressionMatcher(customRule) : createSimilarityMatcher(customRule); if (customRule.isIncoming()) { incomingRules.add(matcher); } else { expensesRules.add(matcher); } } catch (Exception e) { log.warn("invalid customRule [{}]", customRule.getRuleId()); } }); incomingRules.addAll(analyticsConfigProvider.getIncomingRules()); expensesRules.addAll(analyticsConfigProvider.getExpensesRules()); List<Modifier> modifier = new ArrayList<>(); modifier.add(new RulesModifier(expensesRules, booking -> booking.getAmount() == null || booking.getAmount().compareTo(new BigDecimal("0.00")) < 0 )); modifier.add(new RulesModifier(incomingRules, booking -> booking.getAmount() != null && booking.getAmount().compareTo(new BigDecimal("0.00")) >= 0 )); modifier.add(new PaypalReceiverModifier()); return new CategorizationService().categorize(bookings, modifier); }
@Override public boolean match(WrappedBooking wrappedBooking) { switch (rule.getSimilarityMatchType()) { case IBAN: return StringUtils.equalsIgnoreCase(rule.getExpression(), wrappedBooking.getBankConnection()); case REFERENCE_NAME: if (wrappedBooking.getReferenceName() != null) { Double result = JARO_WINKLER.apply(rule.getExpression(), wrappedBooking.getReferenceName().toLowerCase()); if (result >= MIN_DISTANCE) { log.debug("similarity expression {} compared with {} resulted in score {}", rule.getExpression(), wrappedBooking.getReferenceName().toLowerCase(), result); } return result >= MIN_DISTANCE; } return false; case PURPOSE: Double result = JARO_WINKLER.apply(rule.getExpression(), normalize(wrappedBooking.getPurpose())); if (result >= MIN_DISTANCE) { log.debug("similarity expression {} compared with {} resulted in score {}", rule.getExpression(), normalize(wrappedBooking.getPurpose()), result); } return result >= MIN_DISTANCE; } throw new IllegalArgumentException("missing match type"); }