Type[] types = {CalendarType.INSTANCE, CalendarType.INSTANCE, StringType.INSTANCE, CalendarType.INSTANCE, CalendarType.INSTANCE};
Calendar start = sanitizeStartDate(filter);
Calendar end = sanitizeEndDate(filter);
Object[] values = {start, end, PaymentStatus.CONFIRMED.name(), start, end};
String subQuery = "select max(payment_.id) from payment payment_ inner join charge charge1_ on payment_.charge_id=charge1_.id where payment_.type in ('"
+ PaymentType.CREDIT_CARD + "', '" + PaymentType.INSTALLMENT_CREDIT_CARD
+ "') and ((payment_.date >= ? and payment_.date < ? and payment_.status = ? and payment_.partial_refund = 0"
+ ") or (payment_.updated_on >= ? and payment_.updated_on < ? and payment_.status in('" + PaymentStatus.CUSTOMER_PAID_BACK + "', '"
+ PaymentStatus.BANK_PAID_BACK + "'))) group by charge1_.charge_group_id";
criteria.add(sqlRestriction("this_.id in (" + subQuery + ")", values, types));