Resolving compilation issues with Email Campaigns Feature and resolving 322.2 migration script issue
Project: http://git-wip-us.apache.org/repos/asf/fineract/repo Commit: http://git-wip-us.apache.org/repos/asf/fineract/commit/4dbecc7f Tree: http://git-wip-us.apache.org/repos/asf/fineract/tree/4dbecc7f Diff: http://git-wip-us.apache.org/repos/asf/fineract/diff/4dbecc7f Branch: refs/heads/develop Commit: 4dbecc7f0eda0c519c0014e4864088b7a538c5f6 Parents: 2614ffd Author: Nazeer Hussain Shaik <[email protected]> Authored: Tue Nov 21 18:51:18 2017 +0530 Committer: Nazeer Hussain Shaik <[email protected]> Committed: Tue Nov 21 18:51:18 2017 +0530 ---------------------------------------------------------------------- .../commands/service/CommandWrapperBuilder.java | 3 +- .../campaigns/email/api/EmailApiResource.java | 70 +-- ...CampaignWritePlatformCommandHandlerImpl.java | 520 ++++++++++--------- .../email/service/EmailReadPlatformService.java | 7 +- .../service/EmailReadPlatformServiceImpl.java | 13 +- .../service/ReadReportingServiceImpl.java | 16 +- .../resources/META-INF/spring/appContext.xml | 7 +- .../core_db/V322_2__email_business_rules.sql | 85 ++- 8 files changed, 366 insertions(+), 355 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/fineract/blob/4dbecc7f/fineract-provider/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java b/fineract-provider/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java index a2ac7f0..359e427 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java +++ b/fineract-provider/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java @@ -3039,7 +3039,8 @@ public class CommandWrapperBuilder { this.entityId = adHocId; this.href = "/adhocquery/" + adHocId; this.json = "{}"; - + return this ; + } public CommandWrapperBuilder createEmail() { this.actionName = "CREATE"; this.entityName = "EMAIL"; http://git-wip-us.apache.org/repos/asf/fineract/blob/4dbecc7f/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailApiResource.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailApiResource.java index 575ee37..6bdae7b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/api/EmailApiResource.java @@ -29,9 +29,7 @@ import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSer import org.apache.fineract.infrastructure.core.service.Page; import org.apache.fineract.infrastructure.core.service.SearchParameters; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; -import org.apache.fineract.infrastructure.campaigns.email.data.EmailConfigurationData; import org.apache.fineract.infrastructure.campaigns.email.data.EmailData; -import org.apache.fineract.infrastructure.campaigns.email.service.EmailConfigurationReadPlatformService; import org.apache.fineract.infrastructure.campaigns.email.service.EmailReadPlatformService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; @@ -41,9 +39,9 @@ import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; + +import java.util.Collection; import java.util.Date; -import java.util.HashMap; -import java.util.Map; @Path("/email") @Consumes({ MediaType.APPLICATION_JSON }) @@ -58,71 +56,61 @@ public class EmailApiResource { private final DefaultToApiJsonSerializer<EmailData> toApiJsonSerializer; private final ApiRequestParameterHelper apiRequestParameterHelper; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; - private final EmailConfigurationReadPlatformService emailConfigurationReadPlatformService; @Autowired public EmailApiResource(final PlatformSecurityContext context, final EmailReadPlatformService readPlatformService, final DefaultToApiJsonSerializer<EmailData> toApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper, - final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService, - EmailConfigurationReadPlatformService emailConfigurationReadPlatformService) { + final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { this.context = context; this.readPlatformService = readPlatformService; this.toApiJsonSerializer = toApiJsonSerializer; this.apiRequestParameterHelper = apiRequestParameterHelper; this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; - this.emailConfigurationReadPlatformService = emailConfigurationReadPlatformService; } @GET - public String retrieveAllEmails(@Context final UriInfo uriInfo) { - + public String retrieveAllEmails(@Context final UriInfo uriInfo) { this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); - final Collection<EmailData> emailMessages = this.readPlatformService.retrieveAll(); - final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.toApiJsonSerializer.serialize(settings, emailMessages); } @GET @Path("pendingEmail") - public String retrievePendingEmail(@QueryParam("sqlSearch") final String sqlSearch, - @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, - @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) { + public String retrievePendingEmail(@QueryParam("sqlSearch") final String sqlSearch, @QueryParam("offset") final Integer offset, + @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy, + @QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) { this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); - - final SearchParameters searchParameters = SearchParameters.forEmailCampaign(sqlSearch, offset, limit, orderBy, sortOrder); - Page<EmailData> emailMessages = this.readPlatformService.retrieveAllPending(searchParameters); - + final SearchParameters searchParameters = SearchParameters.forEmailCampaign(sqlSearch, offset, limit, orderBy, sortOrder); + Collection<EmailData> emailMessages = this.readPlatformService.retrieveAllPending(searchParameters); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.toApiJsonSerializer.serialize(settings, emailMessages); } - + @GET @Path("sentEmail") - public String retrieveSentEmail(@QueryParam("sqlSearch") final String sqlSearch, - @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, - @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) { + public String retrieveSentEmail(@QueryParam("sqlSearch") final String sqlSearch, @QueryParam("offset") final Integer offset, + @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy, + @QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) { this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); - final SearchParameters searchParameters = SearchParameters.forEmailCampaign(sqlSearch, offset, limit, orderBy, sortOrder); - Page<EmailData> emailMessages = this.readPlatformService.retrieveAllSent(searchParameters); + final SearchParameters searchParameters = SearchParameters.forEmailCampaign(sqlSearch, offset, limit, orderBy, sortOrder); + Collection<EmailData> emailMessages = this.readPlatformService.retrieveAllSent(searchParameters); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.toApiJsonSerializer.serialize(settings, emailMessages); } - @GET @Path("messageByStatus") - public String retrieveAllEmailByStatus(@QueryParam("sqlSearch") final String sqlSearch, - @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, - @QueryParam("status") final Long status, - @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, - @QueryParam("fromDate") final DateParam fromDateParam, @QueryParam("toDate") final DateParam toDateParam, - @QueryParam("locale") final String locale, @QueryParam("dateFormat") final String dateFormat,@Context final UriInfo uriInfo) { + public String retrieveAllEmailByStatus(@QueryParam("sqlSearch") final String sqlSearch, @QueryParam("offset") final Integer offset, + @QueryParam("limit") final Integer limit, @QueryParam("status") final Integer status, + @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, + @QueryParam("fromDate") final DateParam fromDateParam, @QueryParam("toDate") final DateParam toDateParam, + @QueryParam("locale") final String locale, @QueryParam("dateFormat") final String dateFormat, @Context final UriInfo uriInfo) { this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); Date fromDate = null; @@ -133,30 +121,26 @@ public class EmailApiResource { if (toDateParam != null) { toDate = toDateParam.getDate("toDate", dateFormat, locale); } - - final SearchParameters searchParameters = SearchParameters.forEmailCampaign(sqlSearch, offset, limit, status, fromDate,toDate, orderBy, sortOrder); - Page<EmailData> emailMessages = this.readPlatformService.retrieveEmailByStatus(searchParameters); - + Page<EmailData> emailMessages = this.readPlatformService.retrieveEmailByStatus(limit, status, fromDate, toDate); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.toApiJsonSerializer.serialize(settings, emailMessages); } - + @GET @Path("failedEmail") - public String retrieveFailedEmail(@QueryParam("sqlSearch") final String sqlSearch, - @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, - @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) { + public String retrieveFailedEmail(@QueryParam("sqlSearch") final String sqlSearch, @QueryParam("offset") final Integer offset, + @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy, + @QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) { this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); - final SearchParameters searchParameters = SearchParameters.forEmailCampaign(sqlSearch, offset, limit, orderBy, sortOrder); - Page<EmailData> emailMessages = this.readPlatformService.retrieveAllFailed(searchParameters); + final SearchParameters searchParameters = SearchParameters.forEmailCampaign(sqlSearch, offset, limit, orderBy, sortOrder); + Collection<EmailData> emailMessages = this.readPlatformService.retrieveAllFailed(searchParameters); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.toApiJsonSerializer.serialize(settings, emailMessages); } - @POST public String create(final String apiRequestBodyAsJson) { http://git-wip-us.apache.org/repos/asf/fineract/blob/4dbecc7f/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java index 66bd97b..cada88b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailCampaignWritePlatformCommandHandlerImpl.java @@ -45,9 +45,6 @@ import org.apache.fineract.infrastructure.dataqueries.exception.ReportNotFoundEx import org.apache.fineract.infrastructure.dataqueries.service.GenericDataService; import org.apache.fineract.infrastructure.dataqueries.service.ReadReportingService; import org.apache.fineract.infrastructure.documentmanagement.contentrepository.FileSystemContentRepository; -import org.apache.fineract.infrastructure.reportmailingjob.data.ReportMailingJobEmailData; -import org.apache.fineract.infrastructure.reportmailingjob.domain.ReportMailingJob; -import org.apache.fineract.infrastructure.reportmailingjob.domain.ReportMailingJobEmailAttachmentFileFormat; import org.apache.fineract.infrastructure.reportmailingjob.helper.IPv4Helper; import org.apache.fineract.infrastructure.campaigns.email.data.EmailMessageWithAttachmentData; import org.apache.fineract.infrastructure.campaigns.email.domain.*; @@ -57,22 +54,17 @@ import org.apache.fineract.infrastructure.campaigns.email.exception.EmailCampaig import org.apache.fineract.infrastructure.jobs.annotation.CronTarget; import org.apache.fineract.infrastructure.jobs.exception.JobExecutionException; import org.apache.fineract.infrastructure.jobs.service.JobName; -import org.apache.fineract.infrastructure.jobs.service.SchedularWritePlatformService; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.infrastructure.campaigns.email.data.PreviewCampaignMessage; import org.apache.fineract.infrastructure.campaigns.email.data.EmailCampaignData; import org.apache.fineract.infrastructure.campaigns.email.data.EmailCampaignValidator; -import org.apache.fineract.organisation.staff.domain.Staff; import org.apache.fineract.portfolio.calendar.service.CalendarUtils; import org.apache.fineract.portfolio.client.domain.Client; import org.apache.fineract.portfolio.client.domain.ClientRepositoryWrapper; import org.apache.fineract.portfolio.loanaccount.domain.Loan; import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository; -import org.apache.fineract.portfolio.loanaccount.service.LoanReadPlatformService; import org.apache.fineract.portfolio.savings.domain.SavingsAccount; import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepository; -import org.apache.fineract.template.domain.TemplateRepository; -import org.apache.fineract.template.service.TemplateMergeService; import org.apache.fineract.useradministration.domain.AppUser; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -89,7 +81,6 @@ import java.util.*; @Service public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampaignWritePlatformService { - private final static Logger logger = LoggerFactory.getLogger(EmailCampaignWritePlatformCommandHandlerImpl.class); private final PlatformSecurityContext context; @@ -98,43 +89,33 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai private final EmailCampaignValidator emailCampaignValidator; private final EmailCampaignReadPlatformService emailCampaignReadPlatformService; private final ReportRepository reportRepository; - private final TemplateRepository templateRepository; - private final TemplateMergeService templateMergeService; private final EmailMessageRepository emailMessageRepository; private final ClientRepositoryWrapper clientRepositoryWrapper; - private final SchedularWritePlatformService schedularWritePlatformService; private final ReadReportingService readReportingService; private final GenericDataService genericDataService; private final FromJsonHelper fromJsonHelper; - private final ReportParameterUsageRepository reportParameterUsageRepository; private final LoanRepository loanRepository; private final SavingsAccountRepository savingsAccountRepository; private final EmailMessageJobEmailService emailMessageJobEmailService; - - - @Autowired - public EmailCampaignWritePlatformCommandHandlerImpl(final PlatformSecurityContext context, final EmailCampaignRepository emailCampaignRepository, - final EmailCampaignValidator emailCampaignValidator,final EmailCampaignReadPlatformService emailCampaignReadPlatformService,final ReportParameterUsageRepository reportParameterUsageRepository, - final ReportRepository reportRepository,final TemplateRepository templateRepository, final TemplateMergeService templateMergeService, - final EmailMessageRepository emailMessageRepository,final ClientRepositoryWrapper clientRepositoryWrapper,final SchedularWritePlatformService schedularWritePlatformService, - final ReadReportingService readReportingService, final GenericDataService genericDataService,final FromJsonHelper fromJsonHelper, - final LoanRepository loanRepository,final SavingsAccountRepository savingsAccountRepository,final EmailMessageJobEmailService emailMessageJobEmailService) { + public EmailCampaignWritePlatformCommandHandlerImpl(final PlatformSecurityContext context, + final EmailCampaignRepository emailCampaignRepository, final EmailCampaignValidator emailCampaignValidator, + final EmailCampaignReadPlatformService emailCampaignReadPlatformService, final ReportRepository reportRepository, + final EmailMessageRepository emailMessageRepository, final ClientRepositoryWrapper clientRepositoryWrapper, + final ReadReportingService readReportingService, final GenericDataService genericDataService, + final FromJsonHelper fromJsonHelper, final LoanRepository loanRepository, + final SavingsAccountRepository savingsAccountRepository, final EmailMessageJobEmailService emailMessageJobEmailService) { this.context = context; this.emailCampaignRepository = emailCampaignRepository; this.emailCampaignValidator = emailCampaignValidator; this.emailCampaignReadPlatformService = emailCampaignReadPlatformService; this.reportRepository = reportRepository; - this.templateRepository = templateRepository; - this.templateMergeService = templateMergeService; this.emailMessageRepository = emailMessageRepository; this.clientRepositoryWrapper = clientRepositoryWrapper; - this.schedularWritePlatformService = schedularWritePlatformService; this.readReportingService = readReportingService; this.genericDataService = genericDataService; this.fromJsonHelper = fromJsonHelper; - this.reportParameterUsageRepository = reportParameterUsageRepository; this.loanRepository = loanRepository; this.savingsAccountRepository = savingsAccountRepository; this.emailMessageJobEmailService = emailMessageJobEmailService; @@ -150,29 +131,24 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai final Long businessRuleId = command.longValueOfParameterNamed(EmailCampaignValidator.businessRuleId); - final Report businessRule = this.reportRepository.findOne(businessRuleId); - if(businessRule == null){ - throw new ReportNotFoundException(businessRuleId); - } + final Report businessRule = this.reportRepository.findOne(businessRuleId); + if (businessRule == null) { throw new ReportNotFoundException(businessRuleId); } final Long reportId = command.longValueOfParameterNamed(EmailCampaignValidator.stretchyReportId); - final Report report = this.reportRepository.findOne(reportId); - if(report == null){ - throw new ReportNotFoundException(reportId); - } - //find all report parameters and store them as json string + final Report report = this.reportRepository.findOne(reportId); + if (report == null) { throw new ReportNotFoundException(reportId); } + // find all report parameters and store them as json string final Set<ReportParameterUsage> reportParameterUsages = report.getReportParameterUsages(); - final Map<String,String> stretchyReportParams = new HashMap<>(); + final Map<String, String> stretchyReportParams = new HashMap<>(); - if(reportParameterUsages !=null && !reportParameterUsages.isEmpty()){ - for(final ReportParameterUsage reportParameterUsage : reportParameterUsages){ - stretchyReportParams.put(reportParameterUsage.getReportParameterName(),""); + if (reportParameterUsages != null && !reportParameterUsages.isEmpty()) { + for (final ReportParameterUsage reportParameterUsage : reportParameterUsages) { + stretchyReportParams.put(reportParameterUsage.getReportParameterName(), ""); } } - - EmailCampaign emailCampaign = EmailCampaign.instance(currentUser,businessRule,report,command); + EmailCampaign emailCampaign = EmailCampaign.instance(currentUser, businessRule, report, command); emailCampaign.setStretchyReportParamMap(new Gson().toJson(stretchyReportParams)); this.emailCampaignRepository.save(emailCampaign); @@ -182,28 +158,28 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai .withEntityId(emailCampaign.getId()) // .build(); } + @Transactional @Override public CommandProcessingResult update(final Long resourceId, final JsonCommand command) { - try{ - final AppUser currentUser = this.context.authenticatedUser(); - + try { + this.context.authenticatedUser(); this.emailCampaignValidator.validateForUpdate(command.json()); final EmailCampaign emailCampaign = this.emailCampaignRepository.findOne(resourceId); - if(emailCampaign == null){ throw new EmailCampaignNotFound(resourceId);} - if(emailCampaign.isActive()){ throw new EmailCampaignMustBeClosedToEditException(emailCampaign.getId());} + if (emailCampaign == null) { throw new EmailCampaignNotFound(resourceId); } + if (emailCampaign.isActive()) { throw new EmailCampaignMustBeClosedToEditException(emailCampaign.getId()); } final Map<String, Object> changes = emailCampaign.update(command); - if(changes.containsKey(EmailCampaignValidator.businessRuleId)){ + if (changes.containsKey(EmailCampaignValidator.businessRuleId)) { final Long newValue = command.longValueOfParameterNamed(EmailCampaignValidator.businessRuleId); final Report reportId = this.reportRepository.findOne(newValue); - if(reportId == null){ throw new ReportNotFoundException(newValue);} + if (reportId == null) { throw new ReportNotFoundException(newValue); } emailCampaign.updateBusinessRuleId(reportId); } - if(!changes.isEmpty()){ + if (!changes.isEmpty()) { this.emailCampaignRepository.saveAndFlush(emailCampaign); } return new CommandProcessingResultBuilder() // @@ -211,24 +187,24 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai .withEntityId(resourceId) // .with(changes) // .build(); - }catch(final DataIntegrityViolationException dve){ + } catch (final DataIntegrityViolationException dve) { handleDataIntegrityIssues(command, dve); return CommandProcessingResult.empty(); } } + @Transactional @Override public CommandProcessingResult delete(final Long resourceId) { - final AppUser currentUser = this.context.authenticatedUser(); - + this.context.authenticatedUser(); final EmailCampaign emailCampaign = this.emailCampaignRepository.findOne(resourceId); - if(emailCampaign == null){ throw new EmailCampaignNotFound(resourceId);} - if(emailCampaign.isActive()){ throw new EmailCampaignMustBeClosedToBeDeletedException(emailCampaign.getId());} + if (emailCampaign == null) { throw new EmailCampaignNotFound(resourceId); } + if (emailCampaign.isActive()) { throw new EmailCampaignMustBeClosedToBeDeletedException(emailCampaign.getId()); } /* - Do not delete but set a boolean is_visible to zero + * Do not delete but set a boolean is_visible to zero */ emailCampaign.delete(); this.emailCampaignRepository.saveAndFlush(emailCampaign); @@ -239,31 +215,34 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai } - private void insertDirectCampaignIntoEmailOutboundTable(final String emailParams, final String emailSubject, - final String messageTemplate,final String campaignName,final Long campaignId){ - try{ - HashMap<String,String> campaignParams = new ObjectMapper().readValue(emailParams, new TypeReference<HashMap<String,String>>(){}); + final String messageTemplate, final String campaignName, final Long campaignId) { + try { + HashMap<String, String> campaignParams = new ObjectMapper().readValue(emailParams, + new TypeReference<HashMap<String, String>>() {}); - HashMap<String,String> queryParamForRunReport = new ObjectMapper().readValue(emailParams, new TypeReference<HashMap<String,String>>(){}); + HashMap<String, String> queryParamForRunReport = new ObjectMapper().readValue(emailParams, + new TypeReference<HashMap<String, String>>() {}); - List<HashMap<String,Object>> runReportObject = this.getRunReportByServiceImpl(campaignParams.get("reportName"),queryParamForRunReport); + List<HashMap<String, Object>> runReportObject = this.getRunReportByServiceImpl(campaignParams.get("reportName"), + queryParamForRunReport); - if(runReportObject !=null){ - for(HashMap<String,Object> entry : runReportObject){ + if (runReportObject != null) { + for (HashMap<String, Object> entry : runReportObject) { String message = this.compileEmailTemplate(messageTemplate, campaignName, entry); - Integer clientId = (Integer)entry.get("id"); + Integer clientId = (Integer) entry.get("id"); EmailCampaign emailCampaign = this.emailCampaignRepository.findOne(campaignId); - Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId.longValue()); + Client client = this.clientRepositoryWrapper.findOneWithNotFoundDetection(clientId.longValue()); String emailAddress = client.emailAddress(); - if(emailAddress !=null && isValidEmail(emailAddress)) { - EmailMessage emailMessage = EmailMessage.pendingEmail(null,client,null,emailCampaign,emailSubject,message,emailAddress,campaignName); + if (emailAddress != null && isValidEmail(emailAddress)) { + EmailMessage emailMessage = EmailMessage.pendingEmail(null, client, null, emailCampaign, emailSubject, message, + emailAddress, campaignName); this.emailMessageRepository.save(emailMessage); } } } - }catch(final IOException e){ + } catch (final IOException e) { // TODO throw something here } @@ -288,42 +267,54 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai @Override @CronTarget(jobName = JobName.UPDATE_EMAIL_OUTBOUND_WITH_CAMPAIGN_MESSAGE) public void storeTemplateMessageIntoEmailOutBoundTable() throws JobExecutionException { - final Collection<EmailCampaignData> emailCampaignDataCollection = this.emailCampaignReadPlatformService.retrieveAllScheduleActiveCampaign(); - if(emailCampaignDataCollection != null){ - for(EmailCampaignData emailCampaignData : emailCampaignDataCollection){ + final Collection<EmailCampaignData> emailCampaignDataCollection = this.emailCampaignReadPlatformService + .retrieveAllScheduleActiveCampaign(); + if (emailCampaignDataCollection != null) { + for (EmailCampaignData emailCampaignData : emailCampaignDataCollection) { LocalDateTime tenantDateNow = tenantDateTime(); LocalDateTime nextTriggerDate = emailCampaignData.getNextTriggerDate().toLocalDateTime(); - logger.info("tenant time " + tenantDateNow.toString() + " trigger time "+nextTriggerDate.toString()); - if(nextTriggerDate.isBefore(tenantDateNow)){ - insertDirectCampaignIntoEmailOutboundTable(emailCampaignData.getParamValue(),emailCampaignData.getEmailSubject(), emailCampaignData.getMessage(),emailCampaignData.getCampaignName(),emailCampaignData.getId()); + logger.info("tenant time " + tenantDateNow.toString() + " trigger time " + nextTriggerDate.toString()); + if (nextTriggerDate.isBefore(tenantDateNow)) { + insertDirectCampaignIntoEmailOutboundTable(emailCampaignData.getParamValue(), emailCampaignData.getEmailSubject(), + emailCampaignData.getMessage(), emailCampaignData.getCampaignName(), emailCampaignData.getId()); this.updateTriggerDates(emailCampaignData.getId()); } } } } - private void updateTriggerDates(Long campaignId){ + private void updateTriggerDates(Long campaignId) { final EmailCampaign emailCampaign = this.emailCampaignRepository.findOne(campaignId); - if(emailCampaign == null){ - throw new EmailCampaignNotFound(campaignId); - } + if (emailCampaign == null) { throw new EmailCampaignNotFound(campaignId); } LocalDateTime nextTriggerDate = emailCampaign.getNextTriggerDate(); emailCampaign.setLastTriggerDate(nextTriggerDate.toDate()); - //calculate new trigger date and insert into next trigger date + // calculate new trigger date and insert into next trigger date /** - * next run time has to be in the future if not calculate a new future date + * next run time has to be in the future if not calculate a new future + * date */ - LocalDate nextRuntime = CalendarUtils.getNextRecurringDate(emailCampaign.getRecurrence(), emailCampaign.getNextTriggerDate().toLocalDate(), nextTriggerDate.toLocalDate()) ; - if(nextRuntime.isBefore(DateUtils.getLocalDateOfTenant())){ // means next run time is in the past calculate a new future date - nextRuntime = CalendarUtils.getNextRecurringDate(emailCampaign.getRecurrence(), emailCampaign.getNextTriggerDate().toLocalDate(),DateUtils.getLocalDateOfTenant()) ; + LocalDate nextRuntime = CalendarUtils.getNextRecurringDate(emailCampaign.getRecurrence(), + emailCampaign.getNextTriggerDate().toLocalDate(), nextTriggerDate.toLocalDate()); + if (nextRuntime.isBefore(DateUtils.getLocalDateOfTenant())) { // means + // next + // run + // time is + // in the + // past + // calculate + // a new + // future + // date + nextRuntime = CalendarUtils.getNextRecurringDate(emailCampaign.getRecurrence(), + emailCampaign.getNextTriggerDate().toLocalDate(), DateUtils.getLocalDateOfTenant()); } final LocalDateTime getTime = emailCampaign.getRecurrenceStartDateTime(); - final String dateString = nextRuntime.toString() + " " + getTime.getHourOfDay()+":"+getTime.getMinuteOfHour()+":"+getTime.getSecondOfMinute(); + final String dateString = nextRuntime.toString() + " " + getTime.getHourOfDay() + ":" + getTime.getMinuteOfHour() + ":" + + getTime.getSecondOfMinute(); final DateTimeFormatter simpleDateFormat = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); - final LocalDateTime newTriggerDateWithTime = LocalDateTime.parse(dateString,simpleDateFormat); - + final LocalDateTime newTriggerDateWithTime = LocalDateTime.parse(dateString, simpleDateFormat); emailCampaign.setNextTriggerDate(newTriggerDateWithTime.toDate()); this.emailCampaignRepository.saveAndFlush(emailCampaign); @@ -338,11 +329,7 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai final EmailCampaign emailCampaign = this.emailCampaignRepository.findOne(campaignId); - if(emailCampaign == null){ - throw new EmailCampaignNotFound(campaignId); - } - - + if (emailCampaign == null) { throw new EmailCampaignNotFound(campaignId); } final Locale locale = command.extractLocale(); final DateTimeFormatter fmt = DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale); @@ -352,28 +339,31 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai this.emailCampaignRepository.saveAndFlush(emailCampaign); - if(emailCampaign.isDirect()){ - insertDirectCampaignIntoEmailOutboundTable(emailCampaign.getParamValue(),emailCampaign.getEmailSubject(),emailCampaign.getEmailMessage(),emailCampaign.getCampaignName(), emailCampaign.getId()); - }else { + if (emailCampaign.isDirect()) { + insertDirectCampaignIntoEmailOutboundTable(emailCampaign.getParamValue(), emailCampaign.getEmailSubject(), + emailCampaign.getEmailMessage(), emailCampaign.getCampaignName(), emailCampaign.getId()); + } else { if (emailCampaign.isSchedule()) { /** - * if recurrence start date is in the future calculate - * next trigger date if not use recurrence start date us next trigger + * if recurrence start date is in the future calculate next + * trigger date if not use recurrence start date us next trigger * date when activating */ LocalDate nextTriggerDate = null; - if(emailCampaign.getRecurrenceStartDateTime().isBefore(tenantDateTime())){ - nextTriggerDate = CalendarUtils.getNextRecurringDate(emailCampaign.getRecurrence(), emailCampaign.getRecurrenceStartDate(), DateUtils.getLocalDateOfTenant()); - }else{ + if (emailCampaign.getRecurrenceStartDateTime().isBefore(tenantDateTime())) { + nextTriggerDate = CalendarUtils.getNextRecurringDate(emailCampaign.getRecurrence(), + emailCampaign.getRecurrenceStartDate(), DateUtils.getLocalDateOfTenant()); + } else { nextTriggerDate = emailCampaign.getRecurrenceStartDate(); } // to get time of tenant final LocalDateTime getTime = emailCampaign.getRecurrenceStartDateTime(); - final String dateString = nextTriggerDate.toString() + " " + getTime.getHourOfDay()+":"+getTime.getMinuteOfHour()+":"+getTime.getSecondOfMinute(); + final String dateString = nextTriggerDate.toString() + " " + getTime.getHourOfDay() + ":" + getTime.getMinuteOfHour() + ":" + + getTime.getSecondOfMinute(); final DateTimeFormatter simpleDateFormat = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); - final LocalDateTime nextTriggerDateWithTime = LocalDateTime.parse(dateString,simpleDateFormat); + final LocalDateTime nextTriggerDateWithTime = LocalDateTime.parse(dateString, simpleDateFormat); emailCampaign.setNextTriggerDate(nextTriggerDateWithTime.toDate()); this.emailCampaignRepository.saveAndFlush(emailCampaign); @@ -381,8 +371,8 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai } /* - if campaign is direct insert campaign message into email outbound table - else if its a schedule create a job process for it + * if campaign is direct insert campaign message into email outbound + * table else if its a schedule create a job process for it */ return new CommandProcessingResultBuilder() // .withCommandId(command.commandId()) // @@ -398,15 +388,13 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai this.emailCampaignValidator.validateClosedDate(command.json()); final EmailCampaign emailCampaign = this.emailCampaignRepository.findOne(campaignId); - if(emailCampaign == null){ - throw new EmailCampaignNotFound(campaignId); - } + if (emailCampaign == null) { throw new EmailCampaignNotFound(campaignId); } final Locale locale = command.extractLocale(); final DateTimeFormatter fmt = DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale); final LocalDate closureDate = command.localDateValueOfParameterNamed("closureDate"); - emailCampaign.close(currentUser,fmt,closureDate); + emailCampaign.close(currentUser, fmt, closureDate); this.emailCampaignRepository.saveAndFlush(emailCampaign); @@ -416,7 +404,8 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai .build(); } - private String compileEmailTemplate(final String textMessageTemplate,final String campaignName , final Map<String, Object> emailParams) { + private String compileEmailTemplate(final String textMessageTemplate, final String campaignName, + final Map<String, Object> emailParams) { final MustacheFactory mf = new DefaultMustacheFactory(); final Mustache mustache = mf.compile(new StringReader(textMessageTemplate), campaignName); @@ -426,22 +415,25 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai return stringWriter.toString(); } - private List<HashMap<String,Object>> getRunReportByServiceImpl(final String reportName,final Map<String, String> queryParams) throws IOException { - final String reportType ="report"; + @SuppressWarnings({ "unused", "rawtypes" }) + private List<HashMap<String, Object>> getRunReportByServiceImpl(final String reportName, final Map<String, String> queryParams) + throws IOException { + final String reportType = "report"; List<HashMap<String, Object>> resultList = new ArrayList<HashMap<String, Object>>(); - final GenericResultsetData results = this.readReportingService.retrieveGenericResultSetForSmsEmailCampaign(reportName, - reportType, queryParams); + final GenericResultsetData results = this.readReportingService.retrieveGenericResultSetForSmsEmailCampaign(reportName, reportType, + queryParams); final String response = this.genericDataService.generateJsonFromGenericResultsetData(results); - resultList = new ObjectMapper().readValue(response, new TypeReference<List<HashMap<String,Object>>>(){}); - //loop changes array date to string date - for(HashMap<String,Object> entry : resultList){ - for(Map.Entry<String,Object> map: entry.entrySet()){ + resultList = new ObjectMapper().readValue(response, new TypeReference<List<HashMap<String, Object>>>() {}); + // loop changes array date to string date + for (HashMap<String, Object> entry : resultList) { + for (Map.Entry<String, Object> map : entry.entrySet()) { String key = map.getKey(); - Object ob = map.getValue(); - if(ob instanceof ArrayList && ((ArrayList) ob).size() == 3){ - String changeArrayDateToStringDate = ((ArrayList) ob).get(2).toString() +"-"+((ArrayList) ob).get(1).toString() +"-"+((ArrayList) ob).get(0).toString(); - entry.put(key,changeArrayDateToStringDate); + Object ob = map.getValue(); + if (ob instanceof ArrayList && ((ArrayList) ob).size() == 3) { + String changeArrayDateToStringDate = ((ArrayList) ob).get(2).toString() + "-" + ((ArrayList) ob).get(1).toString() + "-" + + ((ArrayList) ob).get(0).toString(); + entry.put(key, changeArrayDateToStringDate); } } } @@ -451,36 +443,40 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai @Override public PreviewCampaignMessage previewMessage(final JsonQuery query) { PreviewCampaignMessage campaignMessage = null; - final AppUser currentUser = this.context.authenticatedUser(); + this.context.authenticatedUser(); this.emailCampaignValidator.validatePreviewMessage(query.json()); - final String emailParams = this.fromJsonHelper.extractStringNamed("paramValue", query.parsedJson()) ; + final String emailParams = this.fromJsonHelper.extractStringNamed("paramValue", query.parsedJson()); final String textMessageTemplate = this.fromJsonHelper.extractStringNamed("emailMessage", query.parsedJson()); - try{ - HashMap<String,String> campaignParams = new ObjectMapper().readValue(emailParams, new TypeReference<HashMap<String,String>>(){}); + try { + HashMap<String, String> campaignParams = new ObjectMapper().readValue(emailParams, + new TypeReference<HashMap<String, String>>() {}); - HashMap<String,String> queryParamForRunReport = new ObjectMapper().readValue(emailParams, new TypeReference<HashMap<String,String>>(){}); + HashMap<String, String> queryParamForRunReport = new ObjectMapper().readValue(emailParams, + new TypeReference<HashMap<String, String>>() {}); - List<HashMap<String,Object>> runReportObject = this.getRunReportByServiceImpl(campaignParams.get("reportName"),queryParamForRunReport); + List<HashMap<String, Object>> runReportObject = this.getRunReportByServiceImpl(campaignParams.get("reportName"), + queryParamForRunReport); - if(runReportObject !=null){ - for(HashMap<String,Object> entry : runReportObject){ + if (runReportObject != null) { + for (HashMap<String, Object> entry : runReportObject) { // add string object to campaignParam object - String textMessage = this.compileEmailTemplate(textMessageTemplate,"EmailCampaign", entry); - if(!textMessage.isEmpty()) { + String textMessage = this.compileEmailTemplate(textMessageTemplate, "EmailCampaign", entry); + if (!textMessage.isEmpty()) { final Integer totalMessage = runReportObject.size(); - campaignMessage = new PreviewCampaignMessage(textMessage,totalMessage); + campaignMessage = new PreviewCampaignMessage(textMessage, totalMessage); break; } } } - }catch(final IOException e){ + } catch (final IOException e) { // TODO throw something here } return campaignMessage; } + @Transactional @Override public CommandProcessingResult reactivateEmailCampaign(final Long campaignId, JsonCommand command) { @@ -491,51 +487,53 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai final EmailCampaign emailCampaign = this.emailCampaignRepository.findOne(campaignId); - if(emailCampaign == null){ throw new EmailCampaignNotFound(campaignId);} + if (emailCampaign == null) { throw new EmailCampaignNotFound(campaignId); } final Locale locale = command.extractLocale(); final DateTimeFormatter fmt = DateTimeFormat.forPattern(command.dateFormat()).withLocale(locale); final LocalDate reactivationDate = command.localDateValueOfParameterNamed("activationDate"); - emailCampaign.reactivate(currentUser,fmt,reactivationDate); + emailCampaign.reactivate(currentUser, fmt, reactivationDate); if (emailCampaign.isSchedule()) { /** - * if recurrence start date is in the future calculate - * next trigger date if not use recurrence start date us next trigger date when activating + * if recurrence start date is in the future calculate next trigger + * date if not use recurrence start date us next trigger date when + * activating */ LocalDate nextTriggerDate = null; - if(emailCampaign.getRecurrenceStartDateTime().isBefore(tenantDateTime())){ - nextTriggerDate = CalendarUtils.getNextRecurringDate(emailCampaign.getRecurrence(), emailCampaign.getRecurrenceStartDate(), DateUtils.getLocalDateOfTenant()); - }else{ + if (emailCampaign.getRecurrenceStartDateTime().isBefore(tenantDateTime())) { + nextTriggerDate = CalendarUtils.getNextRecurringDate(emailCampaign.getRecurrence(), emailCampaign.getRecurrenceStartDate(), + DateUtils.getLocalDateOfTenant()); + } else { nextTriggerDate = emailCampaign.getRecurrenceStartDate(); } // to get time of tenant final LocalDateTime getTime = emailCampaign.getRecurrenceStartDateTime(); - final String dateString = nextTriggerDate.toString() + " " + getTime.getHourOfDay()+":"+getTime.getMinuteOfHour()+":"+getTime.getSecondOfMinute(); + final String dateString = nextTriggerDate.toString() + " " + getTime.getHourOfDay() + ":" + getTime.getMinuteOfHour() + ":" + + getTime.getSecondOfMinute(); final DateTimeFormatter simpleDateFormat = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"); - final LocalDateTime nextTriggerDateWithTime = LocalDateTime.parse(dateString,simpleDateFormat); + final LocalDateTime nextTriggerDateWithTime = LocalDateTime.parse(dateString, simpleDateFormat); emailCampaign.setNextTriggerDate(nextTriggerDateWithTime.toDate()); this.emailCampaignRepository.saveAndFlush(emailCampaign); } - - return new CommandProcessingResultBuilder() // .withEntityId(emailCampaign.getId()) // .build(); } - private void handleDataIntegrityIssues(@SuppressWarnings("unused") final JsonCommand command, final DataIntegrityViolationException dve) { + private void handleDataIntegrityIssues(@SuppressWarnings("unused") final JsonCommand command, + final DataIntegrityViolationException dve) { final Throwable realCause = dve.getMostSpecificCause(); throw new PlatformDataIntegrityException("error.msg.email.campaign.unknown.data.integrity.issue", "Unknown data integrity issue with resource: " + realCause.getMessage()); } - private LocalDateTime tenantDateTime(){ + private LocalDateTime tenantDateTime() { LocalDateTime today = new LocalDateTime(); final FineractPlatformTenant tenant = ThreadLocalContextUtil.getTenant(); @@ -545,137 +543,164 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai today = new LocalDateTime(zone); } } - return today; + return today; } @Override @CronTarget(jobName = JobName.EXECUTE_EMAIL) public void sendEmailMessage() throws JobExecutionException { - if (IPv4Helper.applicationIsNotRunningOnLocalMachine()){ //remove when testing locally - final List<EmailMessage> emailMessages = this.emailMessageRepository.findByStatusType(EmailMessageStatusType.PENDING.getValue()); //retrieve all pending message - - for(final EmailMessage emailMessage : emailMessages) { + if (IPv4Helper.applicationIsNotRunningOnLocalMachine()) { // remove when + // testing + // locally + final List<EmailMessage> emailMessages = this.emailMessageRepository + .findByStatusType(EmailMessageStatusType.PENDING.getValue()); // retrieve + // all + // pending + // message + for (final EmailMessage emailMessage : emailMessages) { if (isValidEmail(emailMessage.getEmailAddress())) { + final EmailCampaign emailCampaign = this.emailCampaignRepository.findOne(emailMessage.getEmailCampaign().getId()); // - final EmailCampaign emailCampaign = this.emailCampaignRepository.findOne(emailMessage.getEmailCampaign().getId()); // + final ScheduledEmailAttachmentFileFormat emailAttachmentFileFormat = ScheduledEmailAttachmentFileFormat + .instance(emailCampaign.getEmailAttachmentFileFormat()); - final ScheduledEmailAttachmentFileFormat emailAttachmentFileFormat = ScheduledEmailAttachmentFileFormat.instance(emailCampaign.getEmailAttachmentFileFormat()); + final List<File> attachmentList = new ArrayList<>(); - final List<File> attachmentList = new ArrayList<>(); + final StringBuilder errorLog = new StringBuilder(); - final StringBuilder errorLog = new StringBuilder(); + // check if email attachment format exist + if (emailAttachmentFileFormat != null && Arrays.asList(ScheduledEmailAttachmentFileFormat.validValues()) + .contains(emailAttachmentFileFormat.getId())) { - //check if email attachment format exist - if (emailAttachmentFileFormat != null && Arrays.asList(ScheduledEmailAttachmentFileFormat.validValues()). - contains(emailAttachmentFileFormat.getId())) { + final Report stretchyReport = emailCampaign.getStretchyReport(); - final Report stretchyReport = emailCampaign.getStretchyReport(); + final String reportName = (stretchyReport != null) ? stretchyReport.getReportName() : null; - final String reportName = (stretchyReport != null) ? stretchyReport.getReportName() : null; + final HashMap<String, String> reportStretchyParams = this + .validateStretchyReportParamMap(emailCampaign.getStretchyReportParamMap()); - final HashMap<String, String> reportStretchyParams = this.validateStretchyReportParamMap(emailCampaign.getStretchyReportParamMap()); + // there is a probability that a client has one or more + // loans or savings therefore we need to send two or + // more attachments + if (reportStretchyParams.containsKey("selectLoan") || reportStretchyParams.containsKey("loanId")) { + // get all ids of the client loans + if (emailMessage.getClient() != null) { - // there is a probability that a client has one or more loans or savings therefore we need to send two or more attachments - if (reportStretchyParams.containsKey("selectLoan") || reportStretchyParams.containsKey("loanId")) { - //get all ids of the client loans - if (emailMessage.getClient() != null) { + final List<Loan> loans = this.loanRepository.findLoanByClientId(emailMessage.getClient().getId()); - final List<Loan> loans = this.loanRepository.findLoanByClientId(emailMessage.getClient().getId()); + HashMap<String, String> reportParams = this + .replaceStretchyParamsWithActualClientParams(reportStretchyParams, emailMessage.getClient()); - HashMap<String, String> reportParams = this.replaceStretchyParamsWithActualClientParams(reportStretchyParams, emailMessage.getClient()); + for (final Loan loan : loans) { + if (loan.isOpen()) { // only send attachment + // for active loan - for (final Loan loan : loans) { - if (loan.isOpen()) { // only send attachment for active loan + if (reportStretchyParams.containsKey("selectLoan")) { - if (reportStretchyParams.containsKey("selectLoan")) { + reportParams.put("SelectLoan", loan.getId().toString()); - reportParams.put("SelectLoan", loan.getId().toString()); + } else if (reportStretchyParams.containsKey("loanId")) { - } else if (reportStretchyParams.containsKey("loanId")) { - - reportParams.put("loanId", loan.getId().toString()); - } - File file = this.generateAttachments(emailCampaign, emailAttachmentFileFormat, reportParams, reportName, errorLog); + reportParams.put("loanId", loan.getId().toString()); + } + File file = this.generateAttachments(emailCampaign, emailAttachmentFileFormat, reportParams, + reportName, errorLog); - if (file != null) { - attachmentList.add(file); - } else { - errorLog.append(reportParams.toString()); - } + if (file != null) { + attachmentList.add(file); + } else { + errorLog.append(reportParams.toString()); } } - } - } else if (reportStretchyParams.containsKey("savingId")) { - if (emailMessage.getClient() != null) { - final List<SavingsAccount> savingsAccounts = this.savingsAccountRepository.findSavingAccountByClientId(emailMessage.getClient().getId()); + } + } else if (reportStretchyParams.containsKey("savingId")) { + if (emailMessage.getClient() != null) { + + final List<SavingsAccount> savingsAccounts = this.savingsAccountRepository + .findSavingAccountByClientId(emailMessage.getClient().getId()); - HashMap<String, String> reportParams = this.replaceStretchyParamsWithActualClientParams(reportStretchyParams, emailMessage.getClient()); + HashMap<String, String> reportParams = this + .replaceStretchyParamsWithActualClientParams(reportStretchyParams, emailMessage.getClient()); - for (final SavingsAccount savingsAccount : savingsAccounts) { + for (final SavingsAccount savingsAccount : savingsAccounts) { - if (savingsAccount.isActive()) { + if (savingsAccount.isActive()) { - reportParams.put("savingId", savingsAccount.getId().toString()); + reportParams.put("savingId", savingsAccount.getId().toString()); - File file = this.generateAttachments(emailCampaign, emailAttachmentFileFormat, reportParams, reportName, errorLog); + File file = this.generateAttachments(emailCampaign, emailAttachmentFileFormat, reportParams, + reportName, errorLog); - if (file != null) { - attachmentList.add(file); - } else { - errorLog.append(reportParams.toString()); - } + if (file != null) { + attachmentList.add(file); + } else { + errorLog.append(reportParams.toString()); } } } - } else { - if (emailMessage.getClient() != null) { + } + } else { + if (emailMessage.getClient() != null) { - HashMap<String, String> reportParams = this.replaceStretchyParamsWithActualClientParams(reportStretchyParams, emailMessage.getClient()); + HashMap<String, String> reportParams = this + .replaceStretchyParamsWithActualClientParams(reportStretchyParams, emailMessage.getClient()); - File file = this.generateAttachments(emailCampaign, emailAttachmentFileFormat, reportParams, reportName, errorLog); + File file = this.generateAttachments(emailCampaign, emailAttachmentFileFormat, reportParams, reportName, + errorLog); - if (file != null) { - attachmentList.add(file); - } else { - errorLog.append(reportParams.toString()); - } + if (file != null) { + attachmentList.add(file); + } else { + errorLog.append(reportParams.toString()); } } - } - final EmailMessageWithAttachmentData emailMessageWithAttachmentData = EmailMessageWithAttachmentData.createNew(emailMessage.getEmailAddress(), emailMessage.getMessage(), - emailMessage.getEmailSubject(), attachmentList); + } - if (!attachmentList.isEmpty() && attachmentList.size() > 0) { // only send email message if there is an attachment to it + final EmailMessageWithAttachmentData emailMessageWithAttachmentData = EmailMessageWithAttachmentData.createNew( + emailMessage.getEmailAddress(), emailMessage.getMessage(), emailMessage.getEmailSubject(), attachmentList); - this.emailMessageJobEmailService.sendEmailWithAttachment(emailMessageWithAttachmentData); + if (!attachmentList.isEmpty() && attachmentList.size() > 0) { // only + // send + // email + // message + // if + // there + // is + // an + // attachment + // to + // it - emailMessage.setStatusType(EmailMessageStatusType.SENT.getValue()); + this.emailMessageJobEmailService.sendEmailWithAttachment(emailMessageWithAttachmentData); - this.emailMessageRepository.save(emailMessage); - } else { - emailMessage.updateErrorMessage(errorLog.toString()); + emailMessage.setStatusType(EmailMessageStatusType.SENT.getValue()); - emailMessage.setStatusType(EmailMessageStatusType.FAILED.getValue()); + this.emailMessageRepository.save(emailMessage); + } else { + emailMessage.updateErrorMessage(errorLog.toString()); - this.emailMessageRepository.save(emailMessage); - } + emailMessage.setStatusType(EmailMessageStatusType.FAILED.getValue()); + + this.emailMessageRepository.save(emailMessage); + } } } } - } /** - * This generates the the report and converts it to a file by passing the parameters below + * This generates the the report and converts it to a file by passing the + * parameters below + * * @param emailCampaign * @param emailAttachmentFileFormat * @param reportParams @@ -684,9 +709,9 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai * @return */ private File generateAttachments(final EmailCampaign emailCampaign, final ScheduledEmailAttachmentFileFormat emailAttachmentFileFormat, - final Map<String, String> reportParams, final String reportName, final StringBuilder errorLog){ + final Map<String, String> reportParams, final String reportName, final StringBuilder errorLog) { - try{ + try { final ByteArrayOutputStream byteArrayOutputStream = this.readReportingService.generatePentahoReportAsOutputStream(reportName, emailAttachmentFileFormat.getValue(), reportParams, null, emailCampaign.getApprovedBy(), errorLog); @@ -700,8 +725,7 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai if (byteArrayOutputStream.size() == 0) { errorLog.append("Pentaho report processing failed, empty output stream created"); - } - else if (errorLog.length() == 0 && (byteArrayOutputStream.size() > 0)) { + } else if (errorLog.length() == 0 && (byteArrayOutputStream.size() > 0)) { final String fileName = fileNameWithoutExtension + "." + emailAttachmentFileFormat.getValue(); final File file = new File(fileName); @@ -711,59 +735,62 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai return file; } - }catch(IOException | PlatformDataIntegrityException e){ - errorLog.append("The ReportMailingJobWritePlatformServiceImpl.executeReportMailingJobs threw an IOException " - + "exception: " + e.getMessage() + " ---------- "); + } catch (IOException | PlatformDataIntegrityException e) { + errorLog.append("The ReportMailingJobWritePlatformServiceImpl.executeReportMailingJobs threw an IOException " + "exception: " + + e.getMessage() + " ---------- "); } return null; } /** - * This matches the the actual values to the key in the report stretchy parameters map + * This matches the the actual values to the key in the report stretchy + * parameters map + * * @param stretchyParams * @param client * @return */ - private HashMap<String,String> replaceStretchyParamsWithActualClientParams(final HashMap<String,String> stretchyParams,final Client client){ + private HashMap<String, String> replaceStretchyParamsWithActualClientParams(final HashMap<String, String> stretchyParams, + final Client client) { - HashMap<String,String> actualParams = new HashMap<>(); + HashMap<String, String> actualParams = new HashMap<>(); for (Map.Entry<String, String> entry : stretchyParams.entrySet()) { - if(entry.getKey().equals("selectOffice")){ - //most at times the reports are run by picking the office of the staff Id - if(client.getStaff() !=null){ - actualParams.put(entry.getKey(),client.getStaff().officeId().toString()); - }else { - actualParams.put(entry.getKey(), client.getOffice().getId().toString()); - } + if (entry.getKey().equals("selectOffice")) { + // most at times the reports are run by picking the office of + // the staff Id + if (client.getStaff() != null) { + actualParams.put(entry.getKey(), client.getStaff().officeId().toString()); + } else { + actualParams.put(entry.getKey(), client.getOffice().getId().toString()); + } - }else if(entry.getKey().equals("selectClient")){ + } else if (entry.getKey().equals("selectClient")) { - actualParams.put(entry.getKey(),client.getId().toString()); + actualParams.put(entry.getKey(), client.getId().toString()); - }else if(entry.getKey().equals("selectLoanofficer")){ + } else if (entry.getKey().equals("selectLoanofficer")) { - actualParams.put(entry.getKey(),client.getStaff().getId().toString()); + actualParams.put(entry.getKey(), client.getStaff().getId().toString()); - }else if(entry.getKey().equals("environementUrl")){ + } else if (entry.getKey().equals("environementUrl")) { - actualParams.put(entry.getKey(),entry.getKey()); - } + actualParams.put(entry.getKey(), entry.getKey()); + } } return actualParams; } + private HashMap<String, String> validateStretchyReportParamMap(final String stretchyParams) { - private HashMap<String,String> validateStretchyReportParamMap(final String stretchyParams){ - - HashMap<String,String> stretchyReportParamHashMap = new HashMap<>(); + HashMap<String, String> stretchyReportParamHashMap = new HashMap<>(); if (!StringUtils.isEmpty(stretchyParams)) { try { - stretchyReportParamHashMap = new ObjectMapper().readValue(stretchyParams, new TypeReference<HashMap<String,String>>(){}); + stretchyReportParamHashMap = new ObjectMapper().readValue(stretchyParams, new TypeReference<HashMap<String, String>>() {}); } - catch(Exception e) { + catch (Exception e) { stretchyReportParamHashMap = null; } } @@ -771,5 +798,4 @@ public class EmailCampaignWritePlatformCommandHandlerImpl implements EmailCampai return stretchyReportParamHashMap; } - } http://git-wip-us.apache.org/repos/asf/fineract/blob/4dbecc7f/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailReadPlatformService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailReadPlatformService.java index 6348023..961f969 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailReadPlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailReadPlatformService.java @@ -19,6 +19,7 @@ package org.apache.fineract.infrastructure.campaigns.email.service; import org.apache.fineract.infrastructure.core.service.Page; +import org.apache.fineract.infrastructure.core.service.SearchParameters; import org.apache.fineract.infrastructure.campaigns.email.data.EmailData; import java.util.Collection; @@ -31,13 +32,13 @@ public interface EmailReadPlatformService { EmailData retrieveOne(Long resourceId); - Collection<EmailData> retrieveAllPending(Integer limit); + Collection<EmailData> retrieveAllPending(final SearchParameters searchParameters); - Collection<EmailData> retrieveAllSent(Integer limit); + Collection<EmailData> retrieveAllSent(final SearchParameters searchParameters); Collection<EmailData> retrieveAllDelivered(Integer limit); - Collection<EmailData> retrieveAllFailed(Integer limit); + Collection<EmailData> retrieveAllFailed(final SearchParameters searchParameters); Page<EmailData> retrieveEmailByStatus(Integer limit, Integer status, Date dateFrom, Date dateTo); http://git-wip-us.apache.org/repos/asf/fineract/blob/4dbecc7f/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailReadPlatformServiceImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailReadPlatformServiceImpl.java index 98d4dfe..870251b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/email/service/EmailReadPlatformServiceImpl.java @@ -24,6 +24,7 @@ import org.apache.fineract.infrastructure.core.domain.JdbcSupport; import org.apache.fineract.infrastructure.core.service.Page; import org.apache.fineract.infrastructure.core.service.PaginationHelper; import org.apache.fineract.infrastructure.core.service.RoutingDataSource; +import org.apache.fineract.infrastructure.core.service.SearchParameters; import org.apache.fineract.infrastructure.campaigns.email.exception.EmailNotFoundException; import org.apache.fineract.infrastructure.campaigns.email.data.EmailData; import org.apache.fineract.infrastructure.campaigns.email.domain.EmailMessageEnumerations; @@ -129,8 +130,8 @@ public class EmailReadPlatformServiceImpl implements EmailReadPlatformService { } @Override - public Collection<EmailData> retrieveAllPending(final Integer limit) { - final String sqlPlusLimit = (limit > 0) ? " limit 0, " + limit : ""; + public Collection<EmailData> retrieveAllPending(final SearchParameters searchParameters) { + final String sqlPlusLimit = (searchParameters.getLimit() > 0) ? " limit 0, " + searchParameters.getLimit() : ""; final String sql = "select " + this.emailRowMapper.schema() + " where emo.status_enum = " + EmailMessageStatusType.PENDING.getValue() + sqlPlusLimit; @@ -138,8 +139,8 @@ public class EmailReadPlatformServiceImpl implements EmailReadPlatformService { } @Override - public Collection<EmailData> retrieveAllSent(final Integer limit) { - final String sqlPlusLimit = (limit > 0) ? " limit 0, " + limit : ""; + public Collection<EmailData> retrieveAllSent(final SearchParameters searchParameters) { + final String sqlPlusLimit = (searchParameters.getLimit() > 0) ? " limit 0, " + searchParameters.getLimit() : ""; final String sql = "select " + this.emailRowMapper.schema() + " where emo.status_enum = " + EmailMessageStatusType.SENT.getValue() + sqlPlusLimit; @@ -165,8 +166,8 @@ public class EmailReadPlatformServiceImpl implements EmailReadPlatformService { } @Override - public Collection<EmailData> retrieveAllFailed(final Integer limit) { - final String sqlPlusLimit = (limit > 0) ? " limit 0, " + limit : ""; + public Collection<EmailData> retrieveAllFailed(final SearchParameters searchParameters) { + final String sqlPlusLimit = (searchParameters.getLimit() > 0) ? " limit 0, " + searchParameters.getLimit() : ""; final String sql = "select " + this.emailRowMapper.schema() + " where emo.status_enum = " + EmailMessageStatusType.FAILED.getValue() + sqlPlusLimit; http://git-wip-us.apache.org/repos/asf/fineract/blob/4dbecc7f/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java index da0bc01..b7cd352 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java @@ -19,6 +19,7 @@ package org.apache.fineract.infrastructure.dataqueries.service; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; @@ -49,16 +50,6 @@ import org.apache.fineract.infrastructure.documentmanagement.contentrepository.F import org.apache.fineract.infrastructure.report.provider.ReportingProcessServiceProvider; import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext; import org.apache.fineract.useradministration.domain.AppUser; -import org.pentaho.reporting.engine.classic.core.DefaultReportEnvironment; -import org.pentaho.reporting.engine.classic.core.MasterReport; -import org.pentaho.reporting.engine.classic.core.ReportProcessingException; -import org.pentaho.reporting.engine.classic.core.modules.output.pageable.pdf.PdfReportUtil; -import org.pentaho.reporting.engine.classic.core.modules.output.table.csv.CSVReportUtil; -import org.pentaho.reporting.engine.classic.core.modules.output.table.html.HtmlReportUtil; -import org.pentaho.reporting.engine.classic.core.modules.output.table.xls.ExcelReportUtil; -import org.pentaho.reporting.libraries.resourceloader.Resource; -import org.pentaho.reporting.libraries.resourceloader.ResourceException; -import org.pentaho.reporting.libraries.resourceloader.ResourceManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -530,6 +521,8 @@ public class ReadReportingServiceImpl implements ReadReportingService { @Override public ByteArrayOutputStream generatePentahoReportAsOutputStream(final String reportName, final String outputTypeParam, final Map<String, String> queryParams, final Locale locale, final AppUser runReportAsUser, final StringBuilder errorLog) { + //This complete implementation should be moved to Pentaho Report Service + /* String outputType = "HTML"; if (StringUtils.isNotBlank(outputTypeParam)) { outputType = outputTypeParam; @@ -600,6 +593,9 @@ public class ReadReportingServiceImpl implements ReadReportingService { errorLog.append("ReadReportingServiceImpl.generatePentahoReportAsOutputStream method threw a PlatformDataIntegrityException " + "exception: No matching Output Type: " + outputType + " ---------- "); throw new PlatformDataIntegrityException("error.msg.invalid.outputType", "No matching Output Type: " + outputType); + + */ + return null ; } } http://git-wip-us.apache.org/repos/asf/fineract/blob/4dbecc7f/fineract-provider/src/main/resources/META-INF/spring/appContext.xml ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/resources/META-INF/spring/appContext.xml b/fineract-provider/src/main/resources/META-INF/spring/appContext.xml index e348d8a..3be04cf 100644 --- a/fineract-provider/src/main/resources/META-INF/spring/appContext.xml +++ b/fineract-provider/src/main/resources/META-INF/spring/appContext.xml @@ -51,13 +51,14 @@ org.apache.fineract.portfolio.savingsaccount.*, org.apache.fineract.portfolio.*, org.apache.fineract.useradministration.*, - org.apache.fineract.mix.*, + org.apache.fineract.mix.*, org.apache.fineract.notification.*, org.apache.fineract.template.*, org.apache.fineract.template.service.*, org.apache.fineract.useradministration.*, org.apache.fineract.batch, - org.apache.fineract.adhocquery.*"> + org.apache.fineract.adhocquery.*, + org.apache.fineract.infrastructure.campaigns.**"> <context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation" /> @@ -84,6 +85,8 @@ <jpa:repositories base-package="org.apache.fineract.infrastructure.campaigns.sms.domain" /> <jpa:repositories base-package="org.apache.fineract.adhocquery.domain" /> <jpa:repositories base-package="org.apache.fineract.notification.domain"/> + <jpa:repositories base-package="org.apache.fineract.infrastructure.campaigns.email.domain"/> + <import resource="infrastructure.xml" />
