@Override public void generateIvrAndSmsStatisticReportsFromDate(LocalDate startDate) { List<CallDetailRecord> callDetailRecords = new ArrayList<>(); if (startDate == null) { callDetailRecords = callDetailRecordDataService.findByCallStatus( EbodacConstants.IVR_CALL_DETAIL_RECORD_STATUS_INITIATED); } else { LocalDate now = DateUtil.now().toLocalDate(); for (LocalDate date = startDate; date.isBefore(now); date = date.plusDays(1)) { String dateString = SIMPLE_DATE_FORMATTER.print(date); callDetailRecords.addAll( callDetailRecordDataService.findByMotechTimestampAndCallStatus( dateString, EbodacConstants.IVR_CALL_DETAIL_RECORD_STATUS_INITIATED)); } } Config config = configService.getConfig(); Set<String> reportsToUpdate = config.getIvrAndSmsStatisticReportsToUpdate(); config.setIvrAndSmsStatisticReportsToUpdate(null); configService.updateConfig(config); if (startDate != null && !reportsToUpdate.isEmpty()) { callDetailRecords.addAll(callDetailRecordDataService.findByMotechCallIds(reportsToUpdate)); } for (CallDetailRecord callDetailRecord : callDetailRecords) { try { createIvrAndSmsStatisticReport(callDetailRecord); reportsToUpdate.remove(callDetailRecord.getMotechCallId()); } catch (EbodacReportException e) { LOGGER.warn(e.getMessage()); } } config = configService.getConfig(); reportsToUpdate.addAll(config.getIvrAndSmsStatisticReportsToUpdate()); config.setIvrAndSmsStatisticReportsToUpdate(reportsToUpdate); configService.updateConfig(config); }