Repository: fineract Updated Branches: refs/heads/develop 18e85856f -> 0594cd516
Allow predefined SMS messages and Emails to be sent via existing SMS/Email implementations Allow SMS messages without SMS campaign to be saved Project: http://git-wip-us.apache.org/repos/asf/fineract/repo Commit: http://git-wip-us.apache.org/repos/asf/fineract/commit/dfc168d3 Tree: http://git-wip-us.apache.org/repos/asf/fineract/tree/dfc168d3 Diff: http://git-wip-us.apache.org/repos/asf/fineract/diff/dfc168d3 Branch: refs/heads/develop Commit: dfc168d3d7c7af2c3ec226fd2243bdc7bd41dea0 Parents: 17ff4b5 Author: Alex Ivanov <[email protected]> Authored: Mon Jun 12 20:20:26 2017 +0100 Committer: Alex Ivanov <[email protected]> Committed: Mon Jun 19 20:42:27 2017 +0100 ---------------------------------------------------------------------- .../infrastructure/core/domain/EmailDetail.java | 22 ++++----- .../GmailBackedPlatformEmailService.java | 51 +++++++++++--------- .../core/service/PlatformEmailService.java | 5 +- .../data/SmsMessageApiQueueResourceData.java | 9 ++++ .../infrastructure/sms/domain/SmsMessage.java | 2 +- .../SmsMessageScheduledJobService.java | 7 +++ .../SmsMessageScheduledJobServiceImpl.java | 23 +++++++++ .../domain/JpaUserDomainService.java | 7 +-- .../V329__sms-messages-without-campaign.sql | 20 ++++++++ 9 files changed, 105 insertions(+), 41 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/fineract/blob/dfc168d3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/EmailDetail.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/EmailDetail.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/EmailDetail.java index 435016c..83cad8b 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/EmailDetail.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/domain/EmailDetail.java @@ -20,24 +20,24 @@ package org.apache.fineract.infrastructure.core.domain; public class EmailDetail { - private final String organisationName; - private final String username; - private final String contactName; + private final String subject; + private final String body; private final String address; + private final String contactName; - public EmailDetail(final String organisationName, final String contactName, final String address, final String username) { - this.organisationName = organisationName; - this.contactName = contactName; + public EmailDetail(final String subject, final String body, final String address, final String contactName) { + this.subject = subject; + this.body = body; this.address = address; - this.username = username; + this.contactName = contactName; } - public String getOrganisationName() { - return this.organisationName; + public String getSubject() { + return subject; } - public String getUsername() { - return this.username; + public String getBody() { + return body; } public String getContactName() { http://git-wip-us.apache.org/repos/asf/fineract/blob/dfc168d3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/GmailBackedPlatformEmailService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/GmailBackedPlatformEmailService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/GmailBackedPlatformEmailService.java index 1b86477..fd0912c 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/GmailBackedPlatformEmailService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/GmailBackedPlatformEmailService.java @@ -39,7 +39,25 @@ public class GmailBackedPlatformEmailService implements PlatformEmailService { } @Override - public void sendToUserAccount(final EmailDetail emailDetail, final String unencodedPassword) { + public void sendToUserAccount(String organisationName, String contactName, + String address, String username, String unencodedPassword) { + + final String subject = "Welcome " + contactName + " to " + organisationName; + final String body = "You are receiving this email as your email account: " + + address + " has being used to create a user account for an organisation named [" + + organisationName + "] on Mifos.\n" + + "You can login using the following credentials:\nusername: " + username + "\n" + + "password: " + unencodedPassword + "\n" + + "You must change this password upon first log in using Uppercase, Lowercase, number and character.\n" + + "Thank you and welcome to the organisation."; + + final EmailDetail emailDetail = new EmailDetail(subject, body, address, contactName); + sendDefinedEmail(emailDetail); + + } + + @Override + public void sendDefinedEmail(EmailDetail emailDetails) { final Email email = new SimpleEmail(); final SMTPCredentialsData smtpCredentialsData = this.externalServicesReadPlatformService.getSMTPCredentials(); final String authuserName = smtpCredentialsData.getUsername(); @@ -51,32 +69,19 @@ public class GmailBackedPlatformEmailService implements PlatformEmailService { email.setAuthenticator(new DefaultAuthenticator(authuser, authpwd)); email.setDebug(false); // true if you want to debug email.setHostName(smtpCredentialsData.getHost()); - try { - if(smtpCredentialsData.isUseTLS()){ - email.getMailSession().getProperties().put("mail.smtp.starttls.enable", "true"); - } - email.setFrom(authuser, authuserName); - - final StringBuilder subjectBuilder = new StringBuilder().append("Welcome ").append(emailDetail.getContactName()) - .append(" to ").append(emailDetail.getOrganisationName()); - - email.setSubject(subjectBuilder.toString()); - final String sendToEmail = emailDetail.getAddress(); - - final StringBuilder messageBuilder = new StringBuilder().append("You are receiving this email as your email account: ") - .append(sendToEmail).append(" has being used to create a user account for an organisation named [") - .append(emailDetail.getOrganisationName()).append("] on Mifos.\n") - .append("You can login using the following credentials:\nusername: ").append(emailDetail.getUsername()).append("\n") - .append("password: ").append(unencodedPassword).append("\n") - .append("You must change this password upon first log in using Uppercase, Lowercase, number and character.\n") - .append("Thank you and welcome to the organisation."); + try { + if(smtpCredentialsData.isUseTLS()){ + email.getMailSession().getProperties().put("mail.smtp.starttls.enable", "true"); + } + email.setFrom(authuser, authuserName); - email.setMsg(messageBuilder.toString()); + email.setSubject(emailDetails.getSubject()); + email.setMsg(emailDetails.getBody()); - email.addTo(sendToEmail, emailDetail.getContactName()); + email.addTo(emailDetails.getAddress(), emailDetails.getContactName()); email.send(); - } catch (final EmailException e) { + } catch (EmailException e) { throw new PlatformEmailSendException(e); } } http://git-wip-us.apache.org/repos/asf/fineract/blob/dfc168d3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/PlatformEmailService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/PlatformEmailService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/PlatformEmailService.java index 843b55d..86453a8 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/PlatformEmailService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/PlatformEmailService.java @@ -22,6 +22,9 @@ import org.apache.fineract.infrastructure.core.domain.EmailDetail; public interface PlatformEmailService { - void sendToUserAccount(EmailDetail emailDetail, String unencodedPassword); + void sendToUserAccount(String organisationName,String contactName, + String address, String username, String unencodedPassword); + + void sendDefinedEmail(EmailDetail emailDetails); } http://git-wip-us.apache.org/repos/asf/fineract/blob/dfc168d3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/data/SmsMessageApiQueueResourceData.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/data/SmsMessageApiQueueResourceData.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/data/SmsMessageApiQueueResourceData.java index f932b05..902673d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/data/SmsMessageApiQueueResourceData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/data/SmsMessageApiQueueResourceData.java @@ -115,6 +115,15 @@ public class SmsMessageApiQueueResourceData { } /** + * Returns the JSOPN representation of the current object. + * @return the JSON representation of the current object + */ + public String toJsonString() { + Gson gson = new Gson(); + return gson.toJson(this); + } + + /** * @return JSON representation of the object **/ public static String toJsonString(Collection<SmsMessageApiQueueResourceData> smsResourceData) { http://git-wip-us.apache.org/repos/asf/fineract/blob/dfc168d3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/domain/SmsMessage.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/domain/SmsMessage.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/domain/SmsMessage.java index 9dff5c3..e589f00 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/domain/SmsMessage.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/domain/SmsMessage.java @@ -60,7 +60,7 @@ public class SmsMessage extends AbstractPersistableCustom<Long> { private Staff staff; @ManyToOne - @JoinColumn(name = "campaign_id", nullable = false) + @JoinColumn(name = "campaign_id", nullable = true) private SmsCampaign smsCampaign; @Column(name = "status_enum", nullable = false) http://git-wip-us.apache.org/repos/asf/fineract/blob/dfc168d3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobService.java index 8d3e545..1919210 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobService.java @@ -41,6 +41,13 @@ public interface SmsMessageScheduledJobService { public void sendTriggeredMessages(Map<SmsCampaign, Collection<SmsMessage>> smsDataMap); /** + * Sends a triggered batch of SMS messages to SMS gateway using specified provider. + * @param smsMessage the SMS messages to queue for sending. + * @param providerId the provider ID of the SMS gateway to be used + */ + void sendTriggeredMessage(Collection<SmsMessage> smsMessage, long providerId); + + /** * get delivery report from the SMS gateway **/ public void getDeliveryReports(); http://git-wip-us.apache.org/repos/asf/fineract/blob/dfc168d3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java index f75eadf..373af1d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java @@ -204,6 +204,29 @@ public class SmsMessageScheduledJobServiceImpl implements SmsMessageScheduledJob } } + @Override + public void sendTriggeredMessage(Collection<SmsMessage> smsMessages, long providerId) { + try { + Collection<SmsMessageApiQueueResourceData> apiQueueResourceDatas = new ArrayList<>(); + StringBuilder request = new StringBuilder(); + for(SmsMessage smsMessage : smsMessages) { + SmsMessageApiQueueResourceData apiQueueResourceData = + SmsMessageApiQueueResourceData.instance(smsMessage.getId(), null, + null, null, smsMessage.getMobileNo(), + smsMessage.getMessage(), providerId); + apiQueueResourceDatas.add(apiQueueResourceData); + smsMessage.setStatusType(SmsMessageStatusType.WAITING_FOR_DELIVERY_REPORT.getValue()); + } + this.smsMessageRepository.save(smsMessages); + request.append(SmsMessageApiQueueResourceData.toJsonString(apiQueueResourceDatas)); + logger.info("Sending triggered SMS to specific provider with request - " + request.toString()); + this.triggeredExecutorService.execute(new SmsTask(ThreadLocalContextUtil.getTenant(), + apiQueueResourceDatas)); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + } + /** * get SMS message delivery reports from the SMS gateway (or intermediate * gateway) http://git-wip-us.apache.org/repos/asf/fineract/blob/dfc168d3/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/JpaUserDomainService.java ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/JpaUserDomainService.java b/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/JpaUserDomainService.java index 18b182a..7c61699 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/JpaUserDomainService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/useradministration/domain/JpaUserDomainService.java @@ -18,7 +18,6 @@ */ package org.apache.fineract.useradministration.domain; -import org.apache.fineract.infrastructure.core.domain.EmailDetail; import org.apache.fineract.infrastructure.core.service.PlatformEmailService; import org.apache.fineract.infrastructure.security.service.PlatformPasswordEncoder; import org.springframework.beans.factory.annotation.Autowired; @@ -54,10 +53,8 @@ public class JpaUserDomainService implements UserDomainService { this.userRepository.saveAndFlush(appUser); if (sendPasswordToEmail.booleanValue()) { - final EmailDetail emailDetail = new EmailDetail(appUser.getOffice().getName(), appUser.getFirstname(), appUser.getEmail(), - appUser.getUsername()); - - this.emailService.sendToUserAccount(emailDetail, unencodedPassword); + this.emailService.sendToUserAccount(appUser.getOffice().getName(), + appUser.getFirstname(), appUser.getEmail(), appUser.getUsername(), unencodedPassword); } } http://git-wip-us.apache.org/repos/asf/fineract/blob/dfc168d3/fineract-provider/src/main/resources/sql/migrations/core_db/V329__sms-messages-without-campaign.sql ---------------------------------------------------------------------- diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V329__sms-messages-without-campaign.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V329__sms-messages-without-campaign.sql new file mode 100644 index 0000000..cb94fc3 --- /dev/null +++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V329__sms-messages-without-campaign.sql @@ -0,0 +1,20 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. +-- + +ALTER TABLE `sms_messages_outbound` CHANGE `campaign_id` `campaign_id` BIGINT(20) NULL DEFAULT NULL; \ No newline at end of file
